[
  {
    "path": ".eslintignore",
    "content": "/vendor\n/node_modules\n/cloudfunctions/ARDemo/cloud-functions-tools/test/svrkit-utils/example\n/cloudfunctions/ARDemo/wx-server-sdk-wxg-service/index.js\n/miniprogram/packageSkylineExamples\n/miniprogram/_commons/0.js\n/miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf\n/miniprogram/packageAPI/components/tdesign-miniprogram\n/miniprogram/packageAPI/pages/ar/gaussian-splatting/util/gl-matrix-min.js\n/miniprogram/packageChatTool/components/tdesign-miniprogram"
  },
  {
    "path": ".eslintrc.js",
    "content": "module.exports = {\n  extends: [\n    'airbnb-base',\n    'plugin:promise/recommended'\n  ],\n  parserOptions: {\n    ecmaVersion: 9,\n    ecmaFeatures: {\n      jsx: false\n    },\n    sourceType: 'module'\n  },\n  env: {\n    es6: true,\n    node: true,\n    jest: true\n  },\n  plugins: [\n    'import',\n    'node',\n    'promise'\n  ],\n  rules: {\n    'arrow-parens': 'off',\n    'comma-dangle': [\n      'error',\n      'only-multiline'\n    ],\n    complexity: ['error', 10],\n    'func-names': 'off',\n    'global-require': 'off',\n    'handle-callback-err': [\n      'error',\n      '^(err|error)$'\n    ],\n    'import/no-unresolved': [\n      'error',\n      {\n        caseSensitive: true,\n        commonjs: true,\n        ignore: ['^[^.]']\n      }\n    ],\n    'import/prefer-default-export': 'off',\n    'linebreak-style': 'off',\n    'no-catch-shadow': 'error',\n    'no-continue': 'off',\n    'no-div-regex': 'warn',\n    'no-else-return': 'off',\n    'no-param-reassign': 'off',\n    'no-plusplus': 'off',\n    'no-shadow': 'off',\n    // enable console for this project\n    'no-console': 'off',\n    'no-multi-assign': 'off',\n    'no-underscore-dangle': 'off',\n    'node/no-deprecated-api': 'error',\n    'node/process-exit-as-throw': 'error',\n    'object-curly-spacing': [\n      'error',\n      'always'\n    ],\n    'operator-linebreak': [\n      'error',\n      'after',\n      {\n        overrides: {\n          ':': 'before',\n          '?': 'before'\n        }\n      }\n    ],\n    'prefer-arrow-callback': 'off',\n    'prefer-destructuring': 'off',\n    'prefer-template': 'off',\n    'quote-props': [\n      1,\n      'as-needed',\n      {\n        unnecessary: true\n      }\n    ],\n    semi: [\n      'error',\n      'never'\n    ]\n  },\n  globals: {\n    window: true,\n    document: true,\n    App: true,\n    Page: true,\n    Component: true,\n    Behavior: true,\n    wx: true,\n    worker: true,\n    getApp: true\n  }\n}\n"
  },
  {
    "path": ".github/workflows/pr-lint-check.yml",
    "content": "name: PR Lint Check\n\non:\n  pull_request:\n    branches: [ master ]\n\njobs:\n  eslint-changed:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: '20'\n\n      - name: Install dependencies\n        run: npm install\n\n      - name: Get changed files\n        id: changed-files\n        uses: tj-actions/changed-files@v46\n        with:\n          since_last_remote_commit: 'true'\n\n      - name: Filter JavaScript files\n        id: filter-js\n        run: |\n          changed_js_files=$(echo '${{ steps.changed-files.outputs.all_changed_files }}' | grep -E '\\.(js|ts|jsx|tsx)$' || true)\n          echo \"changed_js_files=${changed_js_files}\" >> $GITHUB_OUTPUT\n\n      - name: Run ESLint on changed JS files\n        if: ${{ steps.filter-js.outputs.changed_js_files != '' }}\n        run: |\n          echo \"Changed JS files: ${{ steps.filter-js.outputs.changed_js_files }}\"\n          npx eslint ${{ steps.filter-js.outputs.changed_js_files }}\n"
  },
  {
    "path": ".gitignore",
    "content": "*swp\n.idea\n.DS_Store\npackage-lock.json\n\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nnode_modules\nminiprogram_npm\n\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"miniprogram/packageSkylineExamples\"]\n\tpath = miniprogram/packageSkylineExamples\n\turl = https://github.com/wechat-miniprogram/awesome-skyline.git\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 wechat-miniprogram\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# 微信小程序示例\n微信小程序示例源码，欢迎扫描以下小程序码体验。\n\n> 提示：请使用微信开发者工具或微信客户端 6.7.2 及以上版本运行。\n\n<img width=\"200\" src=\"https://res.wx.qq.com/op_res/QqOF7ydl0dkpq-orpebXL-gBspr08VjoFOFGrWvKF9IULLhfT9XhnsSKlvc0gI8d\">\n\n## 使用\n\n```\nnpm run init\n```\n完成上述步骤后，使用微信开发者工具，点击【工具-构建npm】\n\n使用[微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)打开该示例代码，云开发环境搭建请参考[云开发示例说明](https://github.com/wechat-miniprogram/miniprogram-demo/blob/master/miniprogram/page/cloud/README.md)。\n\n\n## 贡献\n\n如果你有 bug 反馈或其他任何建议，欢迎提 issue 给我们。\n\n如果你愿意一起来完善小程序示例，欢迎通过 PR 的方式贡献代码。为了保证代码风格的统一，在编写代码之前，请在项目根目录miniprogram下运行以下命令安装依赖：\n\n```\nnpm install\n```\n同时，确保你的代码可以通过 Lint 检查：\n```\nnpm run lint\n```\n\n## 截图\n\n<img width=\"375\" src=\"https://res.wx.qq.com/op_res/0_vsSii5DaG-1hoXcqmBCT_tPShgSPKi3_FBVuVj1tu1ZdZD8lwYNrSQm3mdswI2\">"
  },
  {
    "path": "build/ci.js",
    "content": "import path from 'path'\nimport { fileURLToPath } from 'url'\nimport fs from 'fs'\nimport ci from 'miniprogram-ci'\nimport packageJson from '../package.json' with { type: 'json' }\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\nconst privateKeyPath = path.resolve(__dirname, './key')\n\n// 检查私钥文件是否已存在\nif (!fs.existsSync(privateKeyPath)) {\n  const privateKeyContent = process.env.WX_PRIVATE_KEY\n  if (!privateKeyContent) {\n    throw new Error('未找到私钥内容，请确保已正确配置 GitHub Secrets')\n  }\n  console.log('>>>>写入私钥文件：', privateKeyPath);\n  fs.writeFileSync(privateKeyPath, privateKeyContent)\n}\n\nconst project = new ci.Project({\n  appid: 'wxe5f52902cf4de896',\n  type: 'miniProgram',\n  projectPath: path.resolve(__dirname, '../'),\n  privateKeyPath: path.resolve(__dirname, './key'),\n  ignores: [path.resolve(__dirname, '../miniprogram/node_modules/**/*')]\n})\nconst robotNumber = 2\nconst params = {\n  onProgressUpdate: console.log,\n  robot: robotNumber,\n  version: packageJson.version,\n  desc: packageJson.bundleDescription,\n  setting: {\n    es7: true,\n    minifyJS: true,\n    minifyWXML: true,\n    minifyWXSS: true,\n    codeProtect: false,\n    autoPrefixWXSS: true,\n    ignoreUploadUnusedFiles: true\n  },\n}\nawait ci.packNpm(project, {})\nci.upload({\n  project,\n  ...params\n}).then(res => {\n  console.debug('>>>>upload res', res)\n}).catch(err => {\n  console.error('>>>>upload error', err)\n  throw err\n}).finally(() => {\n  // 删除临时私钥文件\n  fs.unlinkSync(privateKeyPath)\n})\n\n\n"
  },
  {
    "path": "cloudfunctions/ARDemo/README.md",
    "content": "# 三维识别与重建云服务\n\n## proto更新\n\n### 依赖安装\n\n```\n// ARModel 下\ntnpm install --save-dev @tencent/cloud-functions-tools@latest\n```\n\n### 基于 proto 文件生成脚本逻辑\n```\n// ARModel 下\nnpm run svrkit\n```\n\n## 服务更新\n\n```\n1. 安装 ARModel 下本地 npm 依赖\n\n2. 云函数环境切为 test环境\n\n3. ARModel 右键上传所有文件（由于有@tencent的子包）\n```"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/bin/svrkit-utils",
    "content": "#!/usr/bin/env node\nconst path = require('path')\nconst yargs = require('yargs')\n\nyargs\n  .usage('Usage: $0 -c [config] -o [output]')\n  .example('$0 -c ./svrkit.config.js -o ./svrkit-utils.js')\n  .alias('c', 'config')\n  .describe('c', 'svrkit config js file path')\n  .alias('o', 'output')\n  .describe('o', 'svrkit-utils output file path, defaults to svrkit-utils.js under the same folder of svrkit config file')\n  .describe('--keep-case', 'keeps field casing instead of converting to camcel case')\n  .demandOption(['c'])\n  .help('h')\n  .alias('h', 'help')\n  .argv\n\nconst cli = require(path.join(__dirname, '../cli/svrkit-utils.js'))\nconst ret = cli.main(process.argv.slice(2))\n\nif (typeof ret === 'number') {\n  process.exit(ret)\n}\n"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/cli/svrkit-utils-template.js",
    "content": "function generate(options) {\n  if (!options) {\n    throw new Error('options must be provided')\n  }\n\n  const { serviceName, funcName, data } = options\n\n  const serviceConfig = config.find(c => c.serviceName === serviceName)\n  if (!serviceConfig) {\n    throw new Error('service not found')\n  }\n\n  if (!serviceConfig.functions[funcName]) {\n    throw new Error('function not found')\n  }\n\n  const reqProtoName = serviceConfig.functions[funcName].req\n  const reqProto = proto[reqProtoName]\n\n  if (!reqProto) {\n    throw new Error('request proto not found')\n  }\n\n  const resProtoName = serviceConfig.functions[funcName].res\n  const resProto = resProtoName && proto[resProtoName]\n\n  const reqProtoVerifyErr = reqProto.verify(data)\n  if (reqProtoVerifyErr) {\n    throw new Error(`verify proto data error: ${reqProtoVerifyErr}`)\n  }\n\n  const reqProtoJSON = protoJSON.nested[reqProtoName]\n\n  if (reqProtoJSON && reqProtoJSON.fields) {\n    if (Object.prototype.toString.call(data).slice(8, -1) === 'Object') {\n      for (const key in data) {\n        if (!reqProtoJSON.fields[key]) {\n          throw new Error(`'${key}' doesn't exist in '${reqProtoName}' proto, valid keys are ${Object.keys(reqProtoJSON.fields)}`)\n        }\n      }\n    } else {\n      throw new Error('data must be object')\n    }\n  }\n\n  return {\n    data: {\n      serviceName,\n      funcName,\n      magic: serviceConfig.magic,\n      cmdid: serviceConfig.functions[funcName].cmdid,\n      existResp: Boolean(resProto),\n      reqBodyBuffer: reqProto.encode(data).finish(),\n    },\n    reqProto,\n    resProto,\n    decode: buf => resProto && resProto.decode(buf)\n  }\n}\n\nfunction generateV2(options) {\n  if (!options) {\n    throw new Error('options must be provided')\n  }\n\n  const { apiName, data } = options\n\n  const apiConfig = config.find(c => c.apiName === apiName)\n\n  const reqProtoName = apiConfig.req\n  const reqProto = proto[reqProtoName]\n\n  if (!reqProto) {\n    throw new Error('request proto not found')\n  }\n\n  const resProtoName = apiConfig.res\n  const resProto = proto[resProtoName]\n\n  const reqProtoVerifyErr = reqProto.verify(data)\n  if (reqProtoVerifyErr) {\n    throw new Error(`verify proto data error: ${reqProtoVerifyErr}`)\n  }\n\n  const reqProtoJSON = protoJSON.nested[reqProtoName]\n\n  if (reqProtoJSON && reqProtoJSON.fields) {\n    if (Object.prototype.toString.call(data).slice(8, -1) === 'Object') {\n      for (const key in data) {\n        if (!reqProtoJSON.fields[key]) {\n          throw new Error(`'${key}' doesn't exist in '${reqProtoName}' proto, valid keys are ${Object.keys(reqProtoJSON.fields)}`)\n        }\n      }\n    } else {\n      throw new Error('data must be object')\n    }\n  }\n\n  return {\n    data: {\n      apiName,\n      reqBodyBuffer: reqProto.encode(data).finish(),\n    },\n    reqProto,\n    resProto,\n    decode: buf => resProto && resProto.decode(buf)\n  }\n}\n\nmodule.exports = {\n  generate,\n  generateV2,\n}\n"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/cli/svrkit-utils.js",
    "content": "const fs = require('fs')\nconst path = require('path')\nconst yargs = require('yargs')\nconst chalk = require('chalk')\nconst debug = require('debug')('cli')\nconst pbjs = require('protobufjs/cli/pbjs')\n\nconst log = (...msg) => {\n  console.log(chalk.blue('svrkit-utils'), ...msg)\n}\n\nfunction main() {\n  debug('process.cwd', process.cwd())\n  debug('yargs.argv', yargs.argv)\n\n  if (yargs.argv.config) {\n    const configPath = path.resolve(process.cwd(), yargs.argv.config)\n    const config = require(configPath)\n\n    const protos = config.map(c => path.resolve(path.dirname(configPath), c.proto))\n\n    if (yargs.argv.output) {\n      if (!yargs.argv.output.endsWith('.js')) {\n        throw new Error('output file name must ends with .js')\n      }\n    }\n\n    const outputDest = yargs.argv.output || path.resolve(path.dirname(configPath), 'svrkit-utils.js')\n    const outputFileName = path.basename(outputDest)\n    const outputFilePath = path.resolve(process.cwd(), outputDest)\n\n    debug('outputDest', outputDest)\n    debug('outputFilePath', outputFilePath)\n\n    const staticModuleFileName = `${outputFileName.slice(0, -3)}.static.js`\n    const staticModuleFilePath = path.resolve(path.dirname(outputFilePath), staticModuleFileName)\n\n    const staticJsonFileName = `${outputFileName.slice(0, -3)}.static.json`\n    const staticJsonFilePath = path.resolve(path.dirname(outputFilePath), staticJsonFileName)\n\n    log('generating static module')\n    const pbjsArgs = ['-t', 'static-module', '-w', 'commonjs', '-l', 'eslint-disable', '-o', staticModuleFilePath, ...protos]\n\n    if (yargs.argv.keepCase) {\n      pbjsArgs.unshift('--keep-case')\n    }\n\n    pbjs.main(pbjsArgs, (err, out) => {\n      if (err) {\n        throw err\n      }\n\n      const staticModuleContent = fs.readFileSync(staticModuleFilePath, 'utf8')\n      fs.writeFileSync(staticModuleFilePath, `// #lizard forgives\n${staticModuleContent}`, 'utf8')\n\n      log('static module generated')\n\n      log('generating json descriptors')\n      pbjs.main(['-t', 'json', '-o', staticJsonFilePath, ...protos], (err, out) => {\n        if (err) {\n          throw err\n        }\n\n        log('json descriptors generated')\n\n        try {\n          const protoUtils = fs.readFileSync(path.join(__dirname, './svrkit-utils-template.js'), 'utf8')\n\n          let svrkitConfigRelativePath = path.relative(path.dirname(outputDest), configPath)\n          if (!svrkitConfigRelativePath.startsWith('.')) {\n            svrkitConfigRelativePath = `./${svrkitConfigRelativePath}`\n          }\n\n          const output = `\nconst config = require('${svrkitConfigRelativePath}')\nconst proto = require('./${staticModuleFileName}')\nconst protoJSON = require('./${staticJsonFileName}')\n${protoUtils}\n`\n\n          fs.writeFileSync(outputFilePath, output, 'utf8')\n\n          log(`${outputFileName} generated`)\n        } catch (err) {\n          throw err\n        }\n      })\n    })\n  } else {\n    throw new Error('config file must be provided')\n  }\n}\n\nmodule.exports = {\n  main,\n}\n"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/package.json",
    "content": "{\n  \"name\": \"@tencent/cloud-functions-tools\",\n  \"version\": \"1.5.1\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"alankldeng\",\n  \"license\": \"ISC\",\n  \"bin\": {\n    \"svrkit-utils\": \"bin/svrkit-utils\"\n  },\n  \"dependencies\": {\n    \"chalk\": \"^2.4.1\",\n    \"debug\": \"^4.1.0\",\n    \"protobufjs\": \"^6.8.8\",\n    \"yargs\": \"^12.0.5\"\n  }\n}\n"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/test/svrkit-utils/example/bundle.js",
    "content": "/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\n\"use strict\";\n\nvar $protobuf = require(\"protobufjs/minimal\");\n\n// Common aliases\nvar $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\n\n// Exported root namespace\nvar $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n\n$root.GenWxaCloudTmpCodeReq = (function() {\n\n    /**\n     * Properties of a GenWxaCloudTmpCodeReq.\n     * @exports IGenWxaCloudTmpCodeReq\n     * @interface IGenWxaCloudTmpCodeReq\n     * @property {number|null} [CloudPlatform] GenWxaCloudTmpCodeReq CloudPlatform\n     * @property {number|null} [AppUin] GenWxaCloudTmpCodeReq AppUin\n     * @property {number|null} [UserUin] GenWxaCloudTmpCodeReq UserUin\n     */\n\n    /**\n     * Constructs a new GenWxaCloudTmpCodeReq.\n     * @exports GenWxaCloudTmpCodeReq\n     * @classdesc Represents a GenWxaCloudTmpCodeReq.\n     * @implements IGenWxaCloudTmpCodeReq\n     * @constructor\n     * @param {IGenWxaCloudTmpCodeReq=} [properties] Properties to set\n     */\n    function GenWxaCloudTmpCodeReq(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GenWxaCloudTmpCodeReq CloudPlatform.\n     * @member {number} CloudPlatform\n     * @memberof GenWxaCloudTmpCodeReq\n     * @instance\n     */\n    GenWxaCloudTmpCodeReq.prototype.CloudPlatform = 0;\n\n    /**\n     * GenWxaCloudTmpCodeReq AppUin.\n     * @member {number} AppUin\n     * @memberof GenWxaCloudTmpCodeReq\n     * @instance\n     */\n    GenWxaCloudTmpCodeReq.prototype.AppUin = 0;\n\n    /**\n     * GenWxaCloudTmpCodeReq UserUin.\n     * @member {number} UserUin\n     * @memberof GenWxaCloudTmpCodeReq\n     * @instance\n     */\n    GenWxaCloudTmpCodeReq.prototype.UserUin = 0;\n\n    /**\n     * Creates a new GenWxaCloudTmpCodeReq instance using the specified properties.\n     * @function create\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {IGenWxaCloudTmpCodeReq=} [properties] Properties to set\n     * @returns {GenWxaCloudTmpCodeReq} GenWxaCloudTmpCodeReq instance\n     */\n    GenWxaCloudTmpCodeReq.create = function create(properties) {\n        return new GenWxaCloudTmpCodeReq(properties);\n    };\n\n    /**\n     * Encodes the specified GenWxaCloudTmpCodeReq message. Does not implicitly {@link GenWxaCloudTmpCodeReq.verify|verify} messages.\n     * @function encode\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {IGenWxaCloudTmpCodeReq} message GenWxaCloudTmpCodeReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GenWxaCloudTmpCodeReq.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.CloudPlatform != null && message.hasOwnProperty(\"CloudPlatform\"))\n            writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.CloudPlatform);\n        if (message.AppUin != null && message.hasOwnProperty(\"AppUin\"))\n            writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.AppUin);\n        if (message.UserUin != null && message.hasOwnProperty(\"UserUin\"))\n            writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.UserUin);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GenWxaCloudTmpCodeReq message, length delimited. Does not implicitly {@link GenWxaCloudTmpCodeReq.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {IGenWxaCloudTmpCodeReq} message GenWxaCloudTmpCodeReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GenWxaCloudTmpCodeReq.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GenWxaCloudTmpCodeReq message from the specified reader or buffer.\n     * @function decode\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GenWxaCloudTmpCodeReq} GenWxaCloudTmpCodeReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GenWxaCloudTmpCodeReq.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GenWxaCloudTmpCodeReq();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.CloudPlatform = reader.uint32();\n                break;\n            case 2:\n                message.AppUin = reader.uint32();\n                break;\n            case 3:\n                message.UserUin = reader.uint32();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GenWxaCloudTmpCodeReq message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GenWxaCloudTmpCodeReq} GenWxaCloudTmpCodeReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GenWxaCloudTmpCodeReq.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GenWxaCloudTmpCodeReq message.\n     * @function verify\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GenWxaCloudTmpCodeReq.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.CloudPlatform != null && message.hasOwnProperty(\"CloudPlatform\"))\n            if (!$util.isInteger(message.CloudPlatform))\n                return \"CloudPlatform: integer expected\";\n        if (message.AppUin != null && message.hasOwnProperty(\"AppUin\"))\n            if (!$util.isInteger(message.AppUin))\n                return \"AppUin: integer expected\";\n        if (message.UserUin != null && message.hasOwnProperty(\"UserUin\"))\n            if (!$util.isInteger(message.UserUin))\n                return \"UserUin: integer expected\";\n        return null;\n    };\n\n    /**\n     * Creates a GenWxaCloudTmpCodeReq message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GenWxaCloudTmpCodeReq} GenWxaCloudTmpCodeReq\n     */\n    GenWxaCloudTmpCodeReq.fromObject = function fromObject(object) {\n        if (object instanceof $root.GenWxaCloudTmpCodeReq)\n            return object;\n        var message = new $root.GenWxaCloudTmpCodeReq();\n        if (object.CloudPlatform != null)\n            message.CloudPlatform = object.CloudPlatform >>> 0;\n        if (object.AppUin != null)\n            message.AppUin = object.AppUin >>> 0;\n        if (object.UserUin != null)\n            message.UserUin = object.UserUin >>> 0;\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GenWxaCloudTmpCodeReq message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {GenWxaCloudTmpCodeReq} message GenWxaCloudTmpCodeReq\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GenWxaCloudTmpCodeReq.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.CloudPlatform = 0;\n            object.AppUin = 0;\n            object.UserUin = 0;\n        }\n        if (message.CloudPlatform != null && message.hasOwnProperty(\"CloudPlatform\"))\n            object.CloudPlatform = message.CloudPlatform;\n        if (message.AppUin != null && message.hasOwnProperty(\"AppUin\"))\n            object.AppUin = message.AppUin;\n        if (message.UserUin != null && message.hasOwnProperty(\"UserUin\"))\n            object.UserUin = message.UserUin;\n        return object;\n    };\n\n    /**\n     * Converts this GenWxaCloudTmpCodeReq to JSON.\n     * @function toJSON\n     * @memberof GenWxaCloudTmpCodeReq\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GenWxaCloudTmpCodeReq.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GenWxaCloudTmpCodeReq;\n})();\n\n$root.GenWxaCloudTmpCodeResp = (function() {\n\n    /**\n     * Properties of a GenWxaCloudTmpCodeResp.\n     * @exports IGenWxaCloudTmpCodeResp\n     * @interface IGenWxaCloudTmpCodeResp\n     * @property {string|null} [TmpCode] GenWxaCloudTmpCodeResp TmpCode\n     */\n\n    /**\n     * Constructs a new GenWxaCloudTmpCodeResp.\n     * @exports GenWxaCloudTmpCodeResp\n     * @classdesc Represents a GenWxaCloudTmpCodeResp.\n     * @implements IGenWxaCloudTmpCodeResp\n     * @constructor\n     * @param {IGenWxaCloudTmpCodeResp=} [properties] Properties to set\n     */\n    function GenWxaCloudTmpCodeResp(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GenWxaCloudTmpCodeResp TmpCode.\n     * @member {string} TmpCode\n     * @memberof GenWxaCloudTmpCodeResp\n     * @instance\n     */\n    GenWxaCloudTmpCodeResp.prototype.TmpCode = \"\";\n\n    /**\n     * Creates a new GenWxaCloudTmpCodeResp instance using the specified properties.\n     * @function create\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {IGenWxaCloudTmpCodeResp=} [properties] Properties to set\n     * @returns {GenWxaCloudTmpCodeResp} GenWxaCloudTmpCodeResp instance\n     */\n    GenWxaCloudTmpCodeResp.create = function create(properties) {\n        return new GenWxaCloudTmpCodeResp(properties);\n    };\n\n    /**\n     * Encodes the specified GenWxaCloudTmpCodeResp message. Does not implicitly {@link GenWxaCloudTmpCodeResp.verify|verify} messages.\n     * @function encode\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {IGenWxaCloudTmpCodeResp} message GenWxaCloudTmpCodeResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GenWxaCloudTmpCodeResp.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.TmpCode != null && message.hasOwnProperty(\"TmpCode\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).string(message.TmpCode);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GenWxaCloudTmpCodeResp message, length delimited. Does not implicitly {@link GenWxaCloudTmpCodeResp.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {IGenWxaCloudTmpCodeResp} message GenWxaCloudTmpCodeResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GenWxaCloudTmpCodeResp.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GenWxaCloudTmpCodeResp message from the specified reader or buffer.\n     * @function decode\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GenWxaCloudTmpCodeResp} GenWxaCloudTmpCodeResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GenWxaCloudTmpCodeResp.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GenWxaCloudTmpCodeResp();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.TmpCode = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GenWxaCloudTmpCodeResp message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GenWxaCloudTmpCodeResp} GenWxaCloudTmpCodeResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GenWxaCloudTmpCodeResp.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GenWxaCloudTmpCodeResp message.\n     * @function verify\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GenWxaCloudTmpCodeResp.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.TmpCode != null && message.hasOwnProperty(\"TmpCode\"))\n            if (!$util.isString(message.TmpCode))\n                return \"TmpCode: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates a GenWxaCloudTmpCodeResp message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GenWxaCloudTmpCodeResp} GenWxaCloudTmpCodeResp\n     */\n    GenWxaCloudTmpCodeResp.fromObject = function fromObject(object) {\n        if (object instanceof $root.GenWxaCloudTmpCodeResp)\n            return object;\n        var message = new $root.GenWxaCloudTmpCodeResp();\n        if (object.TmpCode != null)\n            message.TmpCode = String(object.TmpCode);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GenWxaCloudTmpCodeResp message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {GenWxaCloudTmpCodeResp} message GenWxaCloudTmpCodeResp\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GenWxaCloudTmpCodeResp.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults)\n            object.TmpCode = \"\";\n        if (message.TmpCode != null && message.hasOwnProperty(\"TmpCode\"))\n            object.TmpCode = message.TmpCode;\n        return object;\n    };\n\n    /**\n     * Converts this GenWxaCloudTmpCodeResp to JSON.\n     * @function toJSON\n     * @memberof GenWxaCloudTmpCodeResp\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GenWxaCloudTmpCodeResp.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GenWxaCloudTmpCodeResp;\n})();\n\n$root.GetWeAppMemberByUserReq = (function() {\n\n    /**\n     * Properties of a GetWeAppMemberByUserReq.\n     * @exports IGetWeAppMemberByUserReq\n     * @interface IGetWeAppMemberByUserReq\n     * @property {number|null} [useruin] GetWeAppMemberByUserReq useruin\n     * @property {number|null} [type] GetWeAppMemberByUserReq type\n     * @property {number|null} [status] GetWeAppMemberByUserReq status\n     */\n\n    /**\n     * Constructs a new GetWeAppMemberByUserReq.\n     * @exports GetWeAppMemberByUserReq\n     * @classdesc Represents a GetWeAppMemberByUserReq.\n     * @implements IGetWeAppMemberByUserReq\n     * @constructor\n     * @param {IGetWeAppMemberByUserReq=} [properties] Properties to set\n     */\n    function GetWeAppMemberByUserReq(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GetWeAppMemberByUserReq useruin.\n     * @member {number} useruin\n     * @memberof GetWeAppMemberByUserReq\n     * @instance\n     */\n    GetWeAppMemberByUserReq.prototype.useruin = 0;\n\n    /**\n     * GetWeAppMemberByUserReq type.\n     * @member {number} type\n     * @memberof GetWeAppMemberByUserReq\n     * @instance\n     */\n    GetWeAppMemberByUserReq.prototype.type = 0;\n\n    /**\n     * GetWeAppMemberByUserReq status.\n     * @member {number} status\n     * @memberof GetWeAppMemberByUserReq\n     * @instance\n     */\n    GetWeAppMemberByUserReq.prototype.status = 0;\n\n    /**\n     * Creates a new GetWeAppMemberByUserReq instance using the specified properties.\n     * @function create\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {IGetWeAppMemberByUserReq=} [properties] Properties to set\n     * @returns {GetWeAppMemberByUserReq} GetWeAppMemberByUserReq instance\n     */\n    GetWeAppMemberByUserReq.create = function create(properties) {\n        return new GetWeAppMemberByUserReq(properties);\n    };\n\n    /**\n     * Encodes the specified GetWeAppMemberByUserReq message. Does not implicitly {@link GetWeAppMemberByUserReq.verify|verify} messages.\n     * @function encode\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {IGetWeAppMemberByUserReq} message GetWeAppMemberByUserReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetWeAppMemberByUserReq.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.useruin != null && message.hasOwnProperty(\"useruin\"))\n            writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.useruin);\n        if (message.type != null && message.hasOwnProperty(\"type\"))\n            writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.type);\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.status);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GetWeAppMemberByUserReq message, length delimited. Does not implicitly {@link GetWeAppMemberByUserReq.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {IGetWeAppMemberByUserReq} message GetWeAppMemberByUserReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetWeAppMemberByUserReq.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GetWeAppMemberByUserReq message from the specified reader or buffer.\n     * @function decode\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GetWeAppMemberByUserReq} GetWeAppMemberByUserReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetWeAppMemberByUserReq.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GetWeAppMemberByUserReq();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.useruin = reader.uint32();\n                break;\n            case 2:\n                message.type = reader.uint32();\n                break;\n            case 3:\n                message.status = reader.uint32();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GetWeAppMemberByUserReq message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GetWeAppMemberByUserReq} GetWeAppMemberByUserReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetWeAppMemberByUserReq.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GetWeAppMemberByUserReq message.\n     * @function verify\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GetWeAppMemberByUserReq.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.useruin != null && message.hasOwnProperty(\"useruin\"))\n            if (!$util.isInteger(message.useruin))\n                return \"useruin: integer expected\";\n        if (message.type != null && message.hasOwnProperty(\"type\"))\n            if (!$util.isInteger(message.type))\n                return \"type: integer expected\";\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            if (!$util.isInteger(message.status))\n                return \"status: integer expected\";\n        return null;\n    };\n\n    /**\n     * Creates a GetWeAppMemberByUserReq message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GetWeAppMemberByUserReq} GetWeAppMemberByUserReq\n     */\n    GetWeAppMemberByUserReq.fromObject = function fromObject(object) {\n        if (object instanceof $root.GetWeAppMemberByUserReq)\n            return object;\n        var message = new $root.GetWeAppMemberByUserReq();\n        if (object.useruin != null)\n            message.useruin = object.useruin >>> 0;\n        if (object.type != null)\n            message.type = object.type >>> 0;\n        if (object.status != null)\n            message.status = object.status >>> 0;\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GetWeAppMemberByUserReq message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {GetWeAppMemberByUserReq} message GetWeAppMemberByUserReq\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GetWeAppMemberByUserReq.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.useruin = 0;\n            object.type = 0;\n            object.status = 0;\n        }\n        if (message.useruin != null && message.hasOwnProperty(\"useruin\"))\n            object.useruin = message.useruin;\n        if (message.type != null && message.hasOwnProperty(\"type\"))\n            object.type = message.type;\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            object.status = message.status;\n        return object;\n    };\n\n    /**\n     * Converts this GetWeAppMemberByUserReq to JSON.\n     * @function toJSON\n     * @memberof GetWeAppMemberByUserReq\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GetWeAppMemberByUserReq.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GetWeAppMemberByUserReq;\n})();\n\n$root.WeAppMemberInfo = (function() {\n\n    /**\n     * Properties of a WeAppMemberInfo.\n     * @exports IWeAppMemberInfo\n     * @interface IWeAppMemberInfo\n     * @property {number|null} [type] WeAppMemberInfo type\n     * @property {number|null} [weappuin] WeAppMemberInfo weappuin\n     * @property {number|null} [useruin] WeAppMemberInfo useruin\n     * @property {number|null} [status] WeAppMemberInfo status\n     * @property {number|null} [createtime] WeAppMemberInfo createtime\n     * @property {number|null} [updatetime] WeAppMemberInfo updatetime\n     * @property {string|null} [ticket] WeAppMemberInfo ticket\n     */\n\n    /**\n     * Constructs a new WeAppMemberInfo.\n     * @exports WeAppMemberInfo\n     * @classdesc Represents a WeAppMemberInfo.\n     * @implements IWeAppMemberInfo\n     * @constructor\n     * @param {IWeAppMemberInfo=} [properties] Properties to set\n     */\n    function WeAppMemberInfo(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * WeAppMemberInfo type.\n     * @member {number} type\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.type = 0;\n\n    /**\n     * WeAppMemberInfo weappuin.\n     * @member {number} weappuin\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.weappuin = 0;\n\n    /**\n     * WeAppMemberInfo useruin.\n     * @member {number} useruin\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.useruin = 0;\n\n    /**\n     * WeAppMemberInfo status.\n     * @member {number} status\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.status = 0;\n\n    /**\n     * WeAppMemberInfo createtime.\n     * @member {number} createtime\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.createtime = 0;\n\n    /**\n     * WeAppMemberInfo updatetime.\n     * @member {number} updatetime\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.updatetime = 0;\n\n    /**\n     * WeAppMemberInfo ticket.\n     * @member {string} ticket\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.ticket = \"\";\n\n    /**\n     * Creates a new WeAppMemberInfo instance using the specified properties.\n     * @function create\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {IWeAppMemberInfo=} [properties] Properties to set\n     * @returns {WeAppMemberInfo} WeAppMemberInfo instance\n     */\n    WeAppMemberInfo.create = function create(properties) {\n        return new WeAppMemberInfo(properties);\n    };\n\n    /**\n     * Encodes the specified WeAppMemberInfo message. Does not implicitly {@link WeAppMemberInfo.verify|verify} messages.\n     * @function encode\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {IWeAppMemberInfo} message WeAppMemberInfo message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    WeAppMemberInfo.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.type != null && message.hasOwnProperty(\"type\"))\n            writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.type);\n        if (message.weappuin != null && message.hasOwnProperty(\"weappuin\"))\n            writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.weappuin);\n        if (message.useruin != null && message.hasOwnProperty(\"useruin\"))\n            writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.useruin);\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.status);\n        if (message.createtime != null && message.hasOwnProperty(\"createtime\"))\n            writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.createtime);\n        if (message.updatetime != null && message.hasOwnProperty(\"updatetime\"))\n            writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.updatetime);\n        if (message.ticket != null && message.hasOwnProperty(\"ticket\"))\n            writer.uint32(/* id 7, wireType 2 =*/58).string(message.ticket);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified WeAppMemberInfo message, length delimited. Does not implicitly {@link WeAppMemberInfo.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {IWeAppMemberInfo} message WeAppMemberInfo message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    WeAppMemberInfo.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a WeAppMemberInfo message from the specified reader or buffer.\n     * @function decode\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {WeAppMemberInfo} WeAppMemberInfo\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    WeAppMemberInfo.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.WeAppMemberInfo();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.type = reader.uint32();\n                break;\n            case 2:\n                message.weappuin = reader.uint32();\n                break;\n            case 3:\n                message.useruin = reader.uint32();\n                break;\n            case 4:\n                message.status = reader.uint32();\n                break;\n            case 5:\n                message.createtime = reader.uint32();\n                break;\n            case 6:\n                message.updatetime = reader.uint32();\n                break;\n            case 7:\n                message.ticket = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a WeAppMemberInfo message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {WeAppMemberInfo} WeAppMemberInfo\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    WeAppMemberInfo.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a WeAppMemberInfo message.\n     * @function verify\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    WeAppMemberInfo.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.type != null && message.hasOwnProperty(\"type\"))\n            if (!$util.isInteger(message.type))\n                return \"type: integer expected\";\n        if (message.weappuin != null && message.hasOwnProperty(\"weappuin\"))\n            if (!$util.isInteger(message.weappuin))\n                return \"weappuin: integer expected\";\n        if (message.useruin != null && message.hasOwnProperty(\"useruin\"))\n            if (!$util.isInteger(message.useruin))\n                return \"useruin: integer expected\";\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            if (!$util.isInteger(message.status))\n                return \"status: integer expected\";\n        if (message.createtime != null && message.hasOwnProperty(\"createtime\"))\n            if (!$util.isInteger(message.createtime))\n                return \"createtime: integer expected\";\n        if (message.updatetime != null && message.hasOwnProperty(\"updatetime\"))\n            if (!$util.isInteger(message.updatetime))\n                return \"updatetime: integer expected\";\n        if (message.ticket != null && message.hasOwnProperty(\"ticket\"))\n            if (!$util.isString(message.ticket))\n                return \"ticket: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates a WeAppMemberInfo message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {WeAppMemberInfo} WeAppMemberInfo\n     */\n    WeAppMemberInfo.fromObject = function fromObject(object) {\n        if (object instanceof $root.WeAppMemberInfo)\n            return object;\n        var message = new $root.WeAppMemberInfo();\n        if (object.type != null)\n            message.type = object.type >>> 0;\n        if (object.weappuin != null)\n            message.weappuin = object.weappuin >>> 0;\n        if (object.useruin != null)\n            message.useruin = object.useruin >>> 0;\n        if (object.status != null)\n            message.status = object.status >>> 0;\n        if (object.createtime != null)\n            message.createtime = object.createtime >>> 0;\n        if (object.updatetime != null)\n            message.updatetime = object.updatetime >>> 0;\n        if (object.ticket != null)\n            message.ticket = String(object.ticket);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a WeAppMemberInfo message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {WeAppMemberInfo} message WeAppMemberInfo\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    WeAppMemberInfo.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.type = 0;\n            object.weappuin = 0;\n            object.useruin = 0;\n            object.status = 0;\n            object.createtime = 0;\n            object.updatetime = 0;\n            object.ticket = \"\";\n        }\n        if (message.type != null && message.hasOwnProperty(\"type\"))\n            object.type = message.type;\n        if (message.weappuin != null && message.hasOwnProperty(\"weappuin\"))\n            object.weappuin = message.weappuin;\n        if (message.useruin != null && message.hasOwnProperty(\"useruin\"))\n            object.useruin = message.useruin;\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            object.status = message.status;\n        if (message.createtime != null && message.hasOwnProperty(\"createtime\"))\n            object.createtime = message.createtime;\n        if (message.updatetime != null && message.hasOwnProperty(\"updatetime\"))\n            object.updatetime = message.updatetime;\n        if (message.ticket != null && message.hasOwnProperty(\"ticket\"))\n            object.ticket = message.ticket;\n        return object;\n    };\n\n    /**\n     * Converts this WeAppMemberInfo to JSON.\n     * @function toJSON\n     * @memberof WeAppMemberInfo\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    WeAppMemberInfo.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return WeAppMemberInfo;\n})();\n\n$root.WeAppMemberInfoList = (function() {\n\n    /**\n     * Properties of a WeAppMemberInfoList.\n     * @exports IWeAppMemberInfoList\n     * @interface IWeAppMemberInfoList\n     * @property {Array.<IWeAppMemberInfo>|null} [infos] WeAppMemberInfoList infos\n     */\n\n    /**\n     * Constructs a new WeAppMemberInfoList.\n     * @exports WeAppMemberInfoList\n     * @classdesc Represents a WeAppMemberInfoList.\n     * @implements IWeAppMemberInfoList\n     * @constructor\n     * @param {IWeAppMemberInfoList=} [properties] Properties to set\n     */\n    function WeAppMemberInfoList(properties) {\n        this.infos = [];\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * WeAppMemberInfoList infos.\n     * @member {Array.<IWeAppMemberInfo>} infos\n     * @memberof WeAppMemberInfoList\n     * @instance\n     */\n    WeAppMemberInfoList.prototype.infos = $util.emptyArray;\n\n    /**\n     * Creates a new WeAppMemberInfoList instance using the specified properties.\n     * @function create\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {IWeAppMemberInfoList=} [properties] Properties to set\n     * @returns {WeAppMemberInfoList} WeAppMemberInfoList instance\n     */\n    WeAppMemberInfoList.create = function create(properties) {\n        return new WeAppMemberInfoList(properties);\n    };\n\n    /**\n     * Encodes the specified WeAppMemberInfoList message. Does not implicitly {@link WeAppMemberInfoList.verify|verify} messages.\n     * @function encode\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {IWeAppMemberInfoList} message WeAppMemberInfoList message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    WeAppMemberInfoList.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.infos != null && message.infos.length)\n            for (var i = 0; i < message.infos.length; ++i)\n                $root.WeAppMemberInfo.encode(message.infos[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n        return writer;\n    };\n\n    /**\n     * Encodes the specified WeAppMemberInfoList message, length delimited. Does not implicitly {@link WeAppMemberInfoList.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {IWeAppMemberInfoList} message WeAppMemberInfoList message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    WeAppMemberInfoList.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a WeAppMemberInfoList message from the specified reader or buffer.\n     * @function decode\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {WeAppMemberInfoList} WeAppMemberInfoList\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    WeAppMemberInfoList.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.WeAppMemberInfoList();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                if (!(message.infos && message.infos.length))\n                    message.infos = [];\n                message.infos.push($root.WeAppMemberInfo.decode(reader, reader.uint32()));\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a WeAppMemberInfoList message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {WeAppMemberInfoList} WeAppMemberInfoList\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    WeAppMemberInfoList.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a WeAppMemberInfoList message.\n     * @function verify\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    WeAppMemberInfoList.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.infos != null && message.hasOwnProperty(\"infos\")) {\n            if (!Array.isArray(message.infos))\n                return \"infos: array expected\";\n            for (var i = 0; i < message.infos.length; ++i) {\n                var error = $root.WeAppMemberInfo.verify(message.infos[i]);\n                if (error)\n                    return \"infos.\" + error;\n            }\n        }\n        return null;\n    };\n\n    /**\n     * Creates a WeAppMemberInfoList message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {WeAppMemberInfoList} WeAppMemberInfoList\n     */\n    WeAppMemberInfoList.fromObject = function fromObject(object) {\n        if (object instanceof $root.WeAppMemberInfoList)\n            return object;\n        var message = new $root.WeAppMemberInfoList();\n        if (object.infos) {\n            if (!Array.isArray(object.infos))\n                throw TypeError(\".WeAppMemberInfoList.infos: array expected\");\n            message.infos = [];\n            for (var i = 0; i < object.infos.length; ++i) {\n                if (typeof object.infos[i] !== \"object\")\n                    throw TypeError(\".WeAppMemberInfoList.infos: object expected\");\n                message.infos[i] = $root.WeAppMemberInfo.fromObject(object.infos[i]);\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a WeAppMemberInfoList message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {WeAppMemberInfoList} message WeAppMemberInfoList\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    WeAppMemberInfoList.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.arrays || options.defaults)\n            object.infos = [];\n        if (message.infos && message.infos.length) {\n            object.infos = [];\n            for (var j = 0; j < message.infos.length; ++j)\n                object.infos[j] = $root.WeAppMemberInfo.toObject(message.infos[j], options);\n        }\n        return object;\n    };\n\n    /**\n     * Converts this WeAppMemberInfoList to JSON.\n     * @function toJSON\n     * @memberof WeAppMemberInfoList\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    WeAppMemberInfoList.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return WeAppMemberInfoList;\n})();\n\nmodule.exports = $root;\n"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/test/svrkit-utils/example/proto/demo.proto",
    "content": "message ApiDemoReq\n{\n    optional string str = 2;\n}\n\nmessage ApiDemoResp\n{\n    optional string str = 2;\n}"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/test/svrkit-utils/example/proto/mmbizsafecenter.proto",
    "content": "message GetWeAppMemberByUserReq\n{\n    optional uint32 useruin = 1;\n    optional uint32 type = 2; //1:管理员 2:运营者 3:开发人员 4:体验者\n    optional uint32 status = 3; //SAFECENTER_WEAPP_STATUS_XXX\n}\nmessage WeAppMemberInfo\n{\n    optional uint32 type = 1;\n    optional uint32 weappuin = 2;\n    optional uint32 useruin = 3;\n    optional uint32 status = 4;\n    optional uint32 createtime = 5;\n    optional uint32 updatetime = 6;\n    optional string ticket = 7;\n}\nmessage WeAppMemberInfoList\n{\n    repeated WeAppMemberInfo infos = 1;\n}"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/test/svrkit-utils/example/proto/mmbizwxatmpcode.proto",
    "content": "message GenWxaCloudTmpCodeReq\n{\n    optional uint32 CloudPlatform = 1;\n    optional uint32 AppUin = 2;\n    optional uint32 UserUin = 3;\n}\n\nmessage GenWxaCloudTmpCodeResp\n{\n    optional string TmpCode = 1;\n}"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/test/svrkit-utils/example/proto-utils.js",
    "content": "const config = require('./svrkit.config.js')\nconst proto = require('./bundle.js')\n\nfunction generate(options) {\n  if (!options) {\n    throw new Error('options must be provided')\n  }\n\n  const { serviceName, funcName, data } = options\n\n  const serviceConfig = config.find(c => c.serviceName === serviceName) \n  if (!serviceConfig) {\n    throw new Error('service not found')\n  }\n\n  if (!serviceConfig.functions[funcName]) {\n    throw new Error('function not found')\n  }\n\n  const reqProto = proto[serviceConfig.functions[funcName].req]\n  const resProto = proto[serviceConfig.functions[funcName].res]\n\n  return {\n    data: {\n      serviceName,\n      funcName,\n      magic: serviceConfig.magic,\n      cmdid: serviceConfig.functions[funcName].cmdid,\n      existResp: serviceConfig.functions[funcName].existResp,\n      reqBodyBuffer: reqProto.encode(data),\n    },\n    decode: buf => resProto.decode(resProto)\n  }\n}\n\nmodule.exports = {\n  generate,\n}\n"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/test/svrkit-utils/example/svrkit-utils.js",
    "content": "\nconst config = require('./svrkit.config.js')\nconst proto = require('./svrkit-utils.static.js')\nconst protoJSON = require('./svrkit-utils.static.json')\n\nfunction generate(options) {\n  if (!options) {\n    throw new Error('options must be provided')\n  }\n\n  const { serviceName, funcName, data } = options\n\n  const serviceConfig = config.find(c => c.serviceName === serviceName) \n  if (!serviceConfig) {\n    throw new Error('service not found')\n  }\n\n  if (!serviceConfig.functions[funcName]) {\n    throw new Error('function not found')\n  }\n\n  const reqProtoName = serviceConfig.functions[funcName].req\n  const reqProto = proto[reqProtoName]\n\n  if (!reqProto) {\n    throw new Error('request proto not found')\n  }\n\n  const resProtoName = serviceConfig.functions[funcName].res\n  const resProto = resProtoName && proto[resProtoName]\n\n  const reqProtoVerifyErr = reqProto.verify(data)\n  if (reqProtoVerifyErr) {\n    throw new Error(`verify proto data error: ${reqProtoVerifyErr}`)\n  }\n\n  const reqProtoJSON = protoJSON.nested[reqProtoName]\n\n  if (reqProtoJSON && reqProtoJSON.fields) {\n    if (Object.prototype.toString.call(data).slice(8, -1) === 'Object') {\n      for (const key in data) {\n        if (!reqProtoJSON.fields[key]) {\n          throw new Error(`'${key}' doesn't exist in '${reqProtoName}' proto, valid keys are ${Object.keys(reqProtoJSON.fields)}`)\n        }\n      } \n    } else {\n      throw new Error('data must be object')\n    }\n  }\n\n  return {\n    data: {\n      serviceName,\n      funcName,\n      magic: serviceConfig.magic,\n      cmdid: serviceConfig.functions[funcName].cmdid,\n      existResp: Boolean(resProto),\n      reqBodyBuffer: reqProto.encode(data).finish(),\n    },\n    reqProto,\n    resProto,\n    decode: buf => resProto && resProto.decode(buf)\n  }\n}\n\nfunction generateV2(options) {\n  if (!options) {\n    throw new Error('options must be provided')\n  }\n\n  const { apiName, data } = options\n\n  const apiConfig = config.find(c => c.apiName === apiName)\n\n  const reqProtoName = apiConfig.req\n  const reqProto = proto[reqProtoName]\n\n  if (!reqProto) {\n    throw new Error('request proto not found')\n  }\n\n  const resProtoName = apiConfig.res\n  const resProto = proto[resProtoName]\n\n  const reqProtoVerifyErr = reqProto.verify(data)\n  if (reqProtoVerifyErr) {\n    throw new Error(`verify proto data error: ${reqProtoVerifyErr}`)\n  }\n\n  const reqProtoJSON = protoJSON.nested[reqProtoName]\n\n  if (reqProtoJSON && reqProtoJSON.fields) {\n    if (Object.prototype.toString.call(data).slice(8, -1) === 'Object') {\n      for (const key in data) {\n        if (!reqProtoJSON.fields[key]) {\n          throw new Error(`'${key}' doesn't exist in '${reqProtoName}' proto, valid keys are ${Object.keys(reqProtoJSON.fields)}`)\n        }\n      } \n    } else {\n      throw new Error('data must be object')\n    }\n  }\n\n  return {\n    data: {\n      apiName,\n      reqBodyBuffer: reqProto.encode(data).finish(),\n    },\n    reqProto,\n    resProto,\n    decode: buf => resProto && resProto.decode(buf)\n  }\n}\n\nmodule.exports = {\n  generate,\n  generateV2,\n}\n\n"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/test/svrkit-utils/example/svrkit-utils.static.js",
    "content": "// #lizard forgives\n/*eslint-disable*/\n\"use strict\";\n\nvar $protobuf = require(\"protobufjs/minimal\");\n\n// Common aliases\nvar $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\n\n// Exported root namespace\nvar $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n\n$root.ApiDemoReq = (function() {\n\n    /**\n     * Properties of an ApiDemoReq.\n     * @exports IApiDemoReq\n     * @interface IApiDemoReq\n     * @property {string|null} [str] ApiDemoReq str\n     */\n\n    /**\n     * Constructs a new ApiDemoReq.\n     * @exports ApiDemoReq\n     * @classdesc Represents an ApiDemoReq.\n     * @implements IApiDemoReq\n     * @constructor\n     * @param {IApiDemoReq=} [properties] Properties to set\n     */\n    function ApiDemoReq(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * ApiDemoReq str.\n     * @member {string} str\n     * @memberof ApiDemoReq\n     * @instance\n     */\n    ApiDemoReq.prototype.str = \"\";\n\n    /**\n     * Creates a new ApiDemoReq instance using the specified properties.\n     * @function create\n     * @memberof ApiDemoReq\n     * @static\n     * @param {IApiDemoReq=} [properties] Properties to set\n     * @returns {ApiDemoReq} ApiDemoReq instance\n     */\n    ApiDemoReq.create = function create(properties) {\n        return new ApiDemoReq(properties);\n    };\n\n    /**\n     * Encodes the specified ApiDemoReq message. Does not implicitly {@link ApiDemoReq.verify|verify} messages.\n     * @function encode\n     * @memberof ApiDemoReq\n     * @static\n     * @param {IApiDemoReq} message ApiDemoReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiDemoReq.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.str != null && message.hasOwnProperty(\"str\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).string(message.str);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified ApiDemoReq message, length delimited. Does not implicitly {@link ApiDemoReq.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof ApiDemoReq\n     * @static\n     * @param {IApiDemoReq} message ApiDemoReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiDemoReq.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes an ApiDemoReq message from the specified reader or buffer.\n     * @function decode\n     * @memberof ApiDemoReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {ApiDemoReq} ApiDemoReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiDemoReq.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ApiDemoReq();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 2:\n                message.str = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes an ApiDemoReq message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof ApiDemoReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {ApiDemoReq} ApiDemoReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiDemoReq.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies an ApiDemoReq message.\n     * @function verify\n     * @memberof ApiDemoReq\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    ApiDemoReq.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.str != null && message.hasOwnProperty(\"str\"))\n            if (!$util.isString(message.str))\n                return \"str: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates an ApiDemoReq message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof ApiDemoReq\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {ApiDemoReq} ApiDemoReq\n     */\n    ApiDemoReq.fromObject = function fromObject(object) {\n        if (object instanceof $root.ApiDemoReq)\n            return object;\n        var message = new $root.ApiDemoReq();\n        if (object.str != null)\n            message.str = String(object.str);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from an ApiDemoReq message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof ApiDemoReq\n     * @static\n     * @param {ApiDemoReq} message ApiDemoReq\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    ApiDemoReq.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults)\n            object.str = \"\";\n        if (message.str != null && message.hasOwnProperty(\"str\"))\n            object.str = message.str;\n        return object;\n    };\n\n    /**\n     * Converts this ApiDemoReq to JSON.\n     * @function toJSON\n     * @memberof ApiDemoReq\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    ApiDemoReq.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return ApiDemoReq;\n})();\n\n$root.ApiDemoResp = (function() {\n\n    /**\n     * Properties of an ApiDemoResp.\n     * @exports IApiDemoResp\n     * @interface IApiDemoResp\n     * @property {string|null} [str] ApiDemoResp str\n     */\n\n    /**\n     * Constructs a new ApiDemoResp.\n     * @exports ApiDemoResp\n     * @classdesc Represents an ApiDemoResp.\n     * @implements IApiDemoResp\n     * @constructor\n     * @param {IApiDemoResp=} [properties] Properties to set\n     */\n    function ApiDemoResp(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * ApiDemoResp str.\n     * @member {string} str\n     * @memberof ApiDemoResp\n     * @instance\n     */\n    ApiDemoResp.prototype.str = \"\";\n\n    /**\n     * Creates a new ApiDemoResp instance using the specified properties.\n     * @function create\n     * @memberof ApiDemoResp\n     * @static\n     * @param {IApiDemoResp=} [properties] Properties to set\n     * @returns {ApiDemoResp} ApiDemoResp instance\n     */\n    ApiDemoResp.create = function create(properties) {\n        return new ApiDemoResp(properties);\n    };\n\n    /**\n     * Encodes the specified ApiDemoResp message. Does not implicitly {@link ApiDemoResp.verify|verify} messages.\n     * @function encode\n     * @memberof ApiDemoResp\n     * @static\n     * @param {IApiDemoResp} message ApiDemoResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiDemoResp.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.str != null && message.hasOwnProperty(\"str\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).string(message.str);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified ApiDemoResp message, length delimited. Does not implicitly {@link ApiDemoResp.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof ApiDemoResp\n     * @static\n     * @param {IApiDemoResp} message ApiDemoResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiDemoResp.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes an ApiDemoResp message from the specified reader or buffer.\n     * @function decode\n     * @memberof ApiDemoResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {ApiDemoResp} ApiDemoResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiDemoResp.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ApiDemoResp();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 2:\n                message.str = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes an ApiDemoResp message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof ApiDemoResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {ApiDemoResp} ApiDemoResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiDemoResp.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies an ApiDemoResp message.\n     * @function verify\n     * @memberof ApiDemoResp\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    ApiDemoResp.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.str != null && message.hasOwnProperty(\"str\"))\n            if (!$util.isString(message.str))\n                return \"str: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates an ApiDemoResp message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof ApiDemoResp\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {ApiDemoResp} ApiDemoResp\n     */\n    ApiDemoResp.fromObject = function fromObject(object) {\n        if (object instanceof $root.ApiDemoResp)\n            return object;\n        var message = new $root.ApiDemoResp();\n        if (object.str != null)\n            message.str = String(object.str);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from an ApiDemoResp message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof ApiDemoResp\n     * @static\n     * @param {ApiDemoResp} message ApiDemoResp\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    ApiDemoResp.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults)\n            object.str = \"\";\n        if (message.str != null && message.hasOwnProperty(\"str\"))\n            object.str = message.str;\n        return object;\n    };\n\n    /**\n     * Converts this ApiDemoResp to JSON.\n     * @function toJSON\n     * @memberof ApiDemoResp\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    ApiDemoResp.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return ApiDemoResp;\n})();\n\n$root.GenWxaCloudTmpCodeReq = (function() {\n\n    /**\n     * Properties of a GenWxaCloudTmpCodeReq.\n     * @exports IGenWxaCloudTmpCodeReq\n     * @interface IGenWxaCloudTmpCodeReq\n     * @property {number|null} [CloudPlatform] GenWxaCloudTmpCodeReq CloudPlatform\n     * @property {number|null} [AppUin] GenWxaCloudTmpCodeReq AppUin\n     * @property {number|null} [UserUin] GenWxaCloudTmpCodeReq UserUin\n     */\n\n    /**\n     * Constructs a new GenWxaCloudTmpCodeReq.\n     * @exports GenWxaCloudTmpCodeReq\n     * @classdesc Represents a GenWxaCloudTmpCodeReq.\n     * @implements IGenWxaCloudTmpCodeReq\n     * @constructor\n     * @param {IGenWxaCloudTmpCodeReq=} [properties] Properties to set\n     */\n    function GenWxaCloudTmpCodeReq(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GenWxaCloudTmpCodeReq CloudPlatform.\n     * @member {number} CloudPlatform\n     * @memberof GenWxaCloudTmpCodeReq\n     * @instance\n     */\n    GenWxaCloudTmpCodeReq.prototype.CloudPlatform = 0;\n\n    /**\n     * GenWxaCloudTmpCodeReq AppUin.\n     * @member {number} AppUin\n     * @memberof GenWxaCloudTmpCodeReq\n     * @instance\n     */\n    GenWxaCloudTmpCodeReq.prototype.AppUin = 0;\n\n    /**\n     * GenWxaCloudTmpCodeReq UserUin.\n     * @member {number} UserUin\n     * @memberof GenWxaCloudTmpCodeReq\n     * @instance\n     */\n    GenWxaCloudTmpCodeReq.prototype.UserUin = 0;\n\n    /**\n     * Creates a new GenWxaCloudTmpCodeReq instance using the specified properties.\n     * @function create\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {IGenWxaCloudTmpCodeReq=} [properties] Properties to set\n     * @returns {GenWxaCloudTmpCodeReq} GenWxaCloudTmpCodeReq instance\n     */\n    GenWxaCloudTmpCodeReq.create = function create(properties) {\n        return new GenWxaCloudTmpCodeReq(properties);\n    };\n\n    /**\n     * Encodes the specified GenWxaCloudTmpCodeReq message. Does not implicitly {@link GenWxaCloudTmpCodeReq.verify|verify} messages.\n     * @function encode\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {IGenWxaCloudTmpCodeReq} message GenWxaCloudTmpCodeReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GenWxaCloudTmpCodeReq.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.CloudPlatform != null && message.hasOwnProperty(\"CloudPlatform\"))\n            writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.CloudPlatform);\n        if (message.AppUin != null && message.hasOwnProperty(\"AppUin\"))\n            writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.AppUin);\n        if (message.UserUin != null && message.hasOwnProperty(\"UserUin\"))\n            writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.UserUin);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GenWxaCloudTmpCodeReq message, length delimited. Does not implicitly {@link GenWxaCloudTmpCodeReq.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {IGenWxaCloudTmpCodeReq} message GenWxaCloudTmpCodeReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GenWxaCloudTmpCodeReq.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GenWxaCloudTmpCodeReq message from the specified reader or buffer.\n     * @function decode\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GenWxaCloudTmpCodeReq} GenWxaCloudTmpCodeReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GenWxaCloudTmpCodeReq.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GenWxaCloudTmpCodeReq();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.CloudPlatform = reader.uint32();\n                break;\n            case 2:\n                message.AppUin = reader.uint32();\n                break;\n            case 3:\n                message.UserUin = reader.uint32();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GenWxaCloudTmpCodeReq message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GenWxaCloudTmpCodeReq} GenWxaCloudTmpCodeReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GenWxaCloudTmpCodeReq.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GenWxaCloudTmpCodeReq message.\n     * @function verify\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GenWxaCloudTmpCodeReq.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.CloudPlatform != null && message.hasOwnProperty(\"CloudPlatform\"))\n            if (!$util.isInteger(message.CloudPlatform))\n                return \"CloudPlatform: integer expected\";\n        if (message.AppUin != null && message.hasOwnProperty(\"AppUin\"))\n            if (!$util.isInteger(message.AppUin))\n                return \"AppUin: integer expected\";\n        if (message.UserUin != null && message.hasOwnProperty(\"UserUin\"))\n            if (!$util.isInteger(message.UserUin))\n                return \"UserUin: integer expected\";\n        return null;\n    };\n\n    /**\n     * Creates a GenWxaCloudTmpCodeReq message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GenWxaCloudTmpCodeReq} GenWxaCloudTmpCodeReq\n     */\n    GenWxaCloudTmpCodeReq.fromObject = function fromObject(object) {\n        if (object instanceof $root.GenWxaCloudTmpCodeReq)\n            return object;\n        var message = new $root.GenWxaCloudTmpCodeReq();\n        if (object.CloudPlatform != null)\n            message.CloudPlatform = object.CloudPlatform >>> 0;\n        if (object.AppUin != null)\n            message.AppUin = object.AppUin >>> 0;\n        if (object.UserUin != null)\n            message.UserUin = object.UserUin >>> 0;\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GenWxaCloudTmpCodeReq message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GenWxaCloudTmpCodeReq\n     * @static\n     * @param {GenWxaCloudTmpCodeReq} message GenWxaCloudTmpCodeReq\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GenWxaCloudTmpCodeReq.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.CloudPlatform = 0;\n            object.AppUin = 0;\n            object.UserUin = 0;\n        }\n        if (message.CloudPlatform != null && message.hasOwnProperty(\"CloudPlatform\"))\n            object.CloudPlatform = message.CloudPlatform;\n        if (message.AppUin != null && message.hasOwnProperty(\"AppUin\"))\n            object.AppUin = message.AppUin;\n        if (message.UserUin != null && message.hasOwnProperty(\"UserUin\"))\n            object.UserUin = message.UserUin;\n        return object;\n    };\n\n    /**\n     * Converts this GenWxaCloudTmpCodeReq to JSON.\n     * @function toJSON\n     * @memberof GenWxaCloudTmpCodeReq\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GenWxaCloudTmpCodeReq.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GenWxaCloudTmpCodeReq;\n})();\n\n$root.GenWxaCloudTmpCodeResp = (function() {\n\n    /**\n     * Properties of a GenWxaCloudTmpCodeResp.\n     * @exports IGenWxaCloudTmpCodeResp\n     * @interface IGenWxaCloudTmpCodeResp\n     * @property {string|null} [TmpCode] GenWxaCloudTmpCodeResp TmpCode\n     */\n\n    /**\n     * Constructs a new GenWxaCloudTmpCodeResp.\n     * @exports GenWxaCloudTmpCodeResp\n     * @classdesc Represents a GenWxaCloudTmpCodeResp.\n     * @implements IGenWxaCloudTmpCodeResp\n     * @constructor\n     * @param {IGenWxaCloudTmpCodeResp=} [properties] Properties to set\n     */\n    function GenWxaCloudTmpCodeResp(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GenWxaCloudTmpCodeResp TmpCode.\n     * @member {string} TmpCode\n     * @memberof GenWxaCloudTmpCodeResp\n     * @instance\n     */\n    GenWxaCloudTmpCodeResp.prototype.TmpCode = \"\";\n\n    /**\n     * Creates a new GenWxaCloudTmpCodeResp instance using the specified properties.\n     * @function create\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {IGenWxaCloudTmpCodeResp=} [properties] Properties to set\n     * @returns {GenWxaCloudTmpCodeResp} GenWxaCloudTmpCodeResp instance\n     */\n    GenWxaCloudTmpCodeResp.create = function create(properties) {\n        return new GenWxaCloudTmpCodeResp(properties);\n    };\n\n    /**\n     * Encodes the specified GenWxaCloudTmpCodeResp message. Does not implicitly {@link GenWxaCloudTmpCodeResp.verify|verify} messages.\n     * @function encode\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {IGenWxaCloudTmpCodeResp} message GenWxaCloudTmpCodeResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GenWxaCloudTmpCodeResp.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.TmpCode != null && message.hasOwnProperty(\"TmpCode\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).string(message.TmpCode);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GenWxaCloudTmpCodeResp message, length delimited. Does not implicitly {@link GenWxaCloudTmpCodeResp.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {IGenWxaCloudTmpCodeResp} message GenWxaCloudTmpCodeResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GenWxaCloudTmpCodeResp.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GenWxaCloudTmpCodeResp message from the specified reader or buffer.\n     * @function decode\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GenWxaCloudTmpCodeResp} GenWxaCloudTmpCodeResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GenWxaCloudTmpCodeResp.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GenWxaCloudTmpCodeResp();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.TmpCode = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GenWxaCloudTmpCodeResp message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GenWxaCloudTmpCodeResp} GenWxaCloudTmpCodeResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GenWxaCloudTmpCodeResp.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GenWxaCloudTmpCodeResp message.\n     * @function verify\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GenWxaCloudTmpCodeResp.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.TmpCode != null && message.hasOwnProperty(\"TmpCode\"))\n            if (!$util.isString(message.TmpCode))\n                return \"TmpCode: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates a GenWxaCloudTmpCodeResp message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GenWxaCloudTmpCodeResp} GenWxaCloudTmpCodeResp\n     */\n    GenWxaCloudTmpCodeResp.fromObject = function fromObject(object) {\n        if (object instanceof $root.GenWxaCloudTmpCodeResp)\n            return object;\n        var message = new $root.GenWxaCloudTmpCodeResp();\n        if (object.TmpCode != null)\n            message.TmpCode = String(object.TmpCode);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GenWxaCloudTmpCodeResp message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GenWxaCloudTmpCodeResp\n     * @static\n     * @param {GenWxaCloudTmpCodeResp} message GenWxaCloudTmpCodeResp\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GenWxaCloudTmpCodeResp.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults)\n            object.TmpCode = \"\";\n        if (message.TmpCode != null && message.hasOwnProperty(\"TmpCode\"))\n            object.TmpCode = message.TmpCode;\n        return object;\n    };\n\n    /**\n     * Converts this GenWxaCloudTmpCodeResp to JSON.\n     * @function toJSON\n     * @memberof GenWxaCloudTmpCodeResp\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GenWxaCloudTmpCodeResp.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GenWxaCloudTmpCodeResp;\n})();\n\n$root.GetWeAppMemberByUserReq = (function() {\n\n    /**\n     * Properties of a GetWeAppMemberByUserReq.\n     * @exports IGetWeAppMemberByUserReq\n     * @interface IGetWeAppMemberByUserReq\n     * @property {number|null} [useruin] GetWeAppMemberByUserReq useruin\n     * @property {number|null} [type] GetWeAppMemberByUserReq type\n     * @property {number|null} [status] GetWeAppMemberByUserReq status\n     */\n\n    /**\n     * Constructs a new GetWeAppMemberByUserReq.\n     * @exports GetWeAppMemberByUserReq\n     * @classdesc Represents a GetWeAppMemberByUserReq.\n     * @implements IGetWeAppMemberByUserReq\n     * @constructor\n     * @param {IGetWeAppMemberByUserReq=} [properties] Properties to set\n     */\n    function GetWeAppMemberByUserReq(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GetWeAppMemberByUserReq useruin.\n     * @member {number} useruin\n     * @memberof GetWeAppMemberByUserReq\n     * @instance\n     */\n    GetWeAppMemberByUserReq.prototype.useruin = 0;\n\n    /**\n     * GetWeAppMemberByUserReq type.\n     * @member {number} type\n     * @memberof GetWeAppMemberByUserReq\n     * @instance\n     */\n    GetWeAppMemberByUserReq.prototype.type = 0;\n\n    /**\n     * GetWeAppMemberByUserReq status.\n     * @member {number} status\n     * @memberof GetWeAppMemberByUserReq\n     * @instance\n     */\n    GetWeAppMemberByUserReq.prototype.status = 0;\n\n    /**\n     * Creates a new GetWeAppMemberByUserReq instance using the specified properties.\n     * @function create\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {IGetWeAppMemberByUserReq=} [properties] Properties to set\n     * @returns {GetWeAppMemberByUserReq} GetWeAppMemberByUserReq instance\n     */\n    GetWeAppMemberByUserReq.create = function create(properties) {\n        return new GetWeAppMemberByUserReq(properties);\n    };\n\n    /**\n     * Encodes the specified GetWeAppMemberByUserReq message. Does not implicitly {@link GetWeAppMemberByUserReq.verify|verify} messages.\n     * @function encode\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {IGetWeAppMemberByUserReq} message GetWeAppMemberByUserReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetWeAppMemberByUserReq.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.useruin != null && message.hasOwnProperty(\"useruin\"))\n            writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.useruin);\n        if (message.type != null && message.hasOwnProperty(\"type\"))\n            writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.type);\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.status);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GetWeAppMemberByUserReq message, length delimited. Does not implicitly {@link GetWeAppMemberByUserReq.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {IGetWeAppMemberByUserReq} message GetWeAppMemberByUserReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetWeAppMemberByUserReq.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GetWeAppMemberByUserReq message from the specified reader or buffer.\n     * @function decode\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GetWeAppMemberByUserReq} GetWeAppMemberByUserReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetWeAppMemberByUserReq.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GetWeAppMemberByUserReq();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.useruin = reader.uint32();\n                break;\n            case 2:\n                message.type = reader.uint32();\n                break;\n            case 3:\n                message.status = reader.uint32();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GetWeAppMemberByUserReq message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GetWeAppMemberByUserReq} GetWeAppMemberByUserReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetWeAppMemberByUserReq.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GetWeAppMemberByUserReq message.\n     * @function verify\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GetWeAppMemberByUserReq.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.useruin != null && message.hasOwnProperty(\"useruin\"))\n            if (!$util.isInteger(message.useruin))\n                return \"useruin: integer expected\";\n        if (message.type != null && message.hasOwnProperty(\"type\"))\n            if (!$util.isInteger(message.type))\n                return \"type: integer expected\";\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            if (!$util.isInteger(message.status))\n                return \"status: integer expected\";\n        return null;\n    };\n\n    /**\n     * Creates a GetWeAppMemberByUserReq message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GetWeAppMemberByUserReq} GetWeAppMemberByUserReq\n     */\n    GetWeAppMemberByUserReq.fromObject = function fromObject(object) {\n        if (object instanceof $root.GetWeAppMemberByUserReq)\n            return object;\n        var message = new $root.GetWeAppMemberByUserReq();\n        if (object.useruin != null)\n            message.useruin = object.useruin >>> 0;\n        if (object.type != null)\n            message.type = object.type >>> 0;\n        if (object.status != null)\n            message.status = object.status >>> 0;\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GetWeAppMemberByUserReq message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GetWeAppMemberByUserReq\n     * @static\n     * @param {GetWeAppMemberByUserReq} message GetWeAppMemberByUserReq\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GetWeAppMemberByUserReq.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.useruin = 0;\n            object.type = 0;\n            object.status = 0;\n        }\n        if (message.useruin != null && message.hasOwnProperty(\"useruin\"))\n            object.useruin = message.useruin;\n        if (message.type != null && message.hasOwnProperty(\"type\"))\n            object.type = message.type;\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            object.status = message.status;\n        return object;\n    };\n\n    /**\n     * Converts this GetWeAppMemberByUserReq to JSON.\n     * @function toJSON\n     * @memberof GetWeAppMemberByUserReq\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GetWeAppMemberByUserReq.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GetWeAppMemberByUserReq;\n})();\n\n$root.WeAppMemberInfo = (function() {\n\n    /**\n     * Properties of a WeAppMemberInfo.\n     * @exports IWeAppMemberInfo\n     * @interface IWeAppMemberInfo\n     * @property {number|null} [type] WeAppMemberInfo type\n     * @property {number|null} [weappuin] WeAppMemberInfo weappuin\n     * @property {number|null} [useruin] WeAppMemberInfo useruin\n     * @property {number|null} [status] WeAppMemberInfo status\n     * @property {number|null} [createtime] WeAppMemberInfo createtime\n     * @property {number|null} [updatetime] WeAppMemberInfo updatetime\n     * @property {string|null} [ticket] WeAppMemberInfo ticket\n     */\n\n    /**\n     * Constructs a new WeAppMemberInfo.\n     * @exports WeAppMemberInfo\n     * @classdesc Represents a WeAppMemberInfo.\n     * @implements IWeAppMemberInfo\n     * @constructor\n     * @param {IWeAppMemberInfo=} [properties] Properties to set\n     */\n    function WeAppMemberInfo(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * WeAppMemberInfo type.\n     * @member {number} type\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.type = 0;\n\n    /**\n     * WeAppMemberInfo weappuin.\n     * @member {number} weappuin\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.weappuin = 0;\n\n    /**\n     * WeAppMemberInfo useruin.\n     * @member {number} useruin\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.useruin = 0;\n\n    /**\n     * WeAppMemberInfo status.\n     * @member {number} status\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.status = 0;\n\n    /**\n     * WeAppMemberInfo createtime.\n     * @member {number} createtime\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.createtime = 0;\n\n    /**\n     * WeAppMemberInfo updatetime.\n     * @member {number} updatetime\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.updatetime = 0;\n\n    /**\n     * WeAppMemberInfo ticket.\n     * @member {string} ticket\n     * @memberof WeAppMemberInfo\n     * @instance\n     */\n    WeAppMemberInfo.prototype.ticket = \"\";\n\n    /**\n     * Creates a new WeAppMemberInfo instance using the specified properties.\n     * @function create\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {IWeAppMemberInfo=} [properties] Properties to set\n     * @returns {WeAppMemberInfo} WeAppMemberInfo instance\n     */\n    WeAppMemberInfo.create = function create(properties) {\n        return new WeAppMemberInfo(properties);\n    };\n\n    /**\n     * Encodes the specified WeAppMemberInfo message. Does not implicitly {@link WeAppMemberInfo.verify|verify} messages.\n     * @function encode\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {IWeAppMemberInfo} message WeAppMemberInfo message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    WeAppMemberInfo.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.type != null && message.hasOwnProperty(\"type\"))\n            writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.type);\n        if (message.weappuin != null && message.hasOwnProperty(\"weappuin\"))\n            writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.weappuin);\n        if (message.useruin != null && message.hasOwnProperty(\"useruin\"))\n            writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.useruin);\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.status);\n        if (message.createtime != null && message.hasOwnProperty(\"createtime\"))\n            writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.createtime);\n        if (message.updatetime != null && message.hasOwnProperty(\"updatetime\"))\n            writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.updatetime);\n        if (message.ticket != null && message.hasOwnProperty(\"ticket\"))\n            writer.uint32(/* id 7, wireType 2 =*/58).string(message.ticket);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified WeAppMemberInfo message, length delimited. Does not implicitly {@link WeAppMemberInfo.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {IWeAppMemberInfo} message WeAppMemberInfo message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    WeAppMemberInfo.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a WeAppMemberInfo message from the specified reader or buffer.\n     * @function decode\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {WeAppMemberInfo} WeAppMemberInfo\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    WeAppMemberInfo.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.WeAppMemberInfo();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.type = reader.uint32();\n                break;\n            case 2:\n                message.weappuin = reader.uint32();\n                break;\n            case 3:\n                message.useruin = reader.uint32();\n                break;\n            case 4:\n                message.status = reader.uint32();\n                break;\n            case 5:\n                message.createtime = reader.uint32();\n                break;\n            case 6:\n                message.updatetime = reader.uint32();\n                break;\n            case 7:\n                message.ticket = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a WeAppMemberInfo message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {WeAppMemberInfo} WeAppMemberInfo\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    WeAppMemberInfo.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a WeAppMemberInfo message.\n     * @function verify\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    WeAppMemberInfo.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.type != null && message.hasOwnProperty(\"type\"))\n            if (!$util.isInteger(message.type))\n                return \"type: integer expected\";\n        if (message.weappuin != null && message.hasOwnProperty(\"weappuin\"))\n            if (!$util.isInteger(message.weappuin))\n                return \"weappuin: integer expected\";\n        if (message.useruin != null && message.hasOwnProperty(\"useruin\"))\n            if (!$util.isInteger(message.useruin))\n                return \"useruin: integer expected\";\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            if (!$util.isInteger(message.status))\n                return \"status: integer expected\";\n        if (message.createtime != null && message.hasOwnProperty(\"createtime\"))\n            if (!$util.isInteger(message.createtime))\n                return \"createtime: integer expected\";\n        if (message.updatetime != null && message.hasOwnProperty(\"updatetime\"))\n            if (!$util.isInteger(message.updatetime))\n                return \"updatetime: integer expected\";\n        if (message.ticket != null && message.hasOwnProperty(\"ticket\"))\n            if (!$util.isString(message.ticket))\n                return \"ticket: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates a WeAppMemberInfo message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {WeAppMemberInfo} WeAppMemberInfo\n     */\n    WeAppMemberInfo.fromObject = function fromObject(object) {\n        if (object instanceof $root.WeAppMemberInfo)\n            return object;\n        var message = new $root.WeAppMemberInfo();\n        if (object.type != null)\n            message.type = object.type >>> 0;\n        if (object.weappuin != null)\n            message.weappuin = object.weappuin >>> 0;\n        if (object.useruin != null)\n            message.useruin = object.useruin >>> 0;\n        if (object.status != null)\n            message.status = object.status >>> 0;\n        if (object.createtime != null)\n            message.createtime = object.createtime >>> 0;\n        if (object.updatetime != null)\n            message.updatetime = object.updatetime >>> 0;\n        if (object.ticket != null)\n            message.ticket = String(object.ticket);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a WeAppMemberInfo message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof WeAppMemberInfo\n     * @static\n     * @param {WeAppMemberInfo} message WeAppMemberInfo\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    WeAppMemberInfo.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.type = 0;\n            object.weappuin = 0;\n            object.useruin = 0;\n            object.status = 0;\n            object.createtime = 0;\n            object.updatetime = 0;\n            object.ticket = \"\";\n        }\n        if (message.type != null && message.hasOwnProperty(\"type\"))\n            object.type = message.type;\n        if (message.weappuin != null && message.hasOwnProperty(\"weappuin\"))\n            object.weappuin = message.weappuin;\n        if (message.useruin != null && message.hasOwnProperty(\"useruin\"))\n            object.useruin = message.useruin;\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            object.status = message.status;\n        if (message.createtime != null && message.hasOwnProperty(\"createtime\"))\n            object.createtime = message.createtime;\n        if (message.updatetime != null && message.hasOwnProperty(\"updatetime\"))\n            object.updatetime = message.updatetime;\n        if (message.ticket != null && message.hasOwnProperty(\"ticket\"))\n            object.ticket = message.ticket;\n        return object;\n    };\n\n    /**\n     * Converts this WeAppMemberInfo to JSON.\n     * @function toJSON\n     * @memberof WeAppMemberInfo\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    WeAppMemberInfo.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return WeAppMemberInfo;\n})();\n\n$root.WeAppMemberInfoList = (function() {\n\n    /**\n     * Properties of a WeAppMemberInfoList.\n     * @exports IWeAppMemberInfoList\n     * @interface IWeAppMemberInfoList\n     * @property {Array.<IWeAppMemberInfo>|null} [infos] WeAppMemberInfoList infos\n     */\n\n    /**\n     * Constructs a new WeAppMemberInfoList.\n     * @exports WeAppMemberInfoList\n     * @classdesc Represents a WeAppMemberInfoList.\n     * @implements IWeAppMemberInfoList\n     * @constructor\n     * @param {IWeAppMemberInfoList=} [properties] Properties to set\n     */\n    function WeAppMemberInfoList(properties) {\n        this.infos = [];\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * WeAppMemberInfoList infos.\n     * @member {Array.<IWeAppMemberInfo>} infos\n     * @memberof WeAppMemberInfoList\n     * @instance\n     */\n    WeAppMemberInfoList.prototype.infos = $util.emptyArray;\n\n    /**\n     * Creates a new WeAppMemberInfoList instance using the specified properties.\n     * @function create\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {IWeAppMemberInfoList=} [properties] Properties to set\n     * @returns {WeAppMemberInfoList} WeAppMemberInfoList instance\n     */\n    WeAppMemberInfoList.create = function create(properties) {\n        return new WeAppMemberInfoList(properties);\n    };\n\n    /**\n     * Encodes the specified WeAppMemberInfoList message. Does not implicitly {@link WeAppMemberInfoList.verify|verify} messages.\n     * @function encode\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {IWeAppMemberInfoList} message WeAppMemberInfoList message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    WeAppMemberInfoList.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.infos != null && message.infos.length)\n            for (var i = 0; i < message.infos.length; ++i)\n                $root.WeAppMemberInfo.encode(message.infos[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n        return writer;\n    };\n\n    /**\n     * Encodes the specified WeAppMemberInfoList message, length delimited. Does not implicitly {@link WeAppMemberInfoList.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {IWeAppMemberInfoList} message WeAppMemberInfoList message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    WeAppMemberInfoList.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a WeAppMemberInfoList message from the specified reader or buffer.\n     * @function decode\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {WeAppMemberInfoList} WeAppMemberInfoList\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    WeAppMemberInfoList.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.WeAppMemberInfoList();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                if (!(message.infos && message.infos.length))\n                    message.infos = [];\n                message.infos.push($root.WeAppMemberInfo.decode(reader, reader.uint32()));\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a WeAppMemberInfoList message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {WeAppMemberInfoList} WeAppMemberInfoList\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    WeAppMemberInfoList.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a WeAppMemberInfoList message.\n     * @function verify\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    WeAppMemberInfoList.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.infos != null && message.hasOwnProperty(\"infos\")) {\n            if (!Array.isArray(message.infos))\n                return \"infos: array expected\";\n            for (var i = 0; i < message.infos.length; ++i) {\n                var error = $root.WeAppMemberInfo.verify(message.infos[i]);\n                if (error)\n                    return \"infos.\" + error;\n            }\n        }\n        return null;\n    };\n\n    /**\n     * Creates a WeAppMemberInfoList message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {WeAppMemberInfoList} WeAppMemberInfoList\n     */\n    WeAppMemberInfoList.fromObject = function fromObject(object) {\n        if (object instanceof $root.WeAppMemberInfoList)\n            return object;\n        var message = new $root.WeAppMemberInfoList();\n        if (object.infos) {\n            if (!Array.isArray(object.infos))\n                throw TypeError(\".WeAppMemberInfoList.infos: array expected\");\n            message.infos = [];\n            for (var i = 0; i < object.infos.length; ++i) {\n                if (typeof object.infos[i] !== \"object\")\n                    throw TypeError(\".WeAppMemberInfoList.infos: object expected\");\n                message.infos[i] = $root.WeAppMemberInfo.fromObject(object.infos[i]);\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a WeAppMemberInfoList message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof WeAppMemberInfoList\n     * @static\n     * @param {WeAppMemberInfoList} message WeAppMemberInfoList\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    WeAppMemberInfoList.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.arrays || options.defaults)\n            object.infos = [];\n        if (message.infos && message.infos.length) {\n            object.infos = [];\n            for (var j = 0; j < message.infos.length; ++j)\n                object.infos[j] = $root.WeAppMemberInfo.toObject(message.infos[j], options);\n        }\n        return object;\n    };\n\n    /**\n     * Converts this WeAppMemberInfoList to JSON.\n     * @function toJSON\n     * @memberof WeAppMemberInfoList\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    WeAppMemberInfoList.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return WeAppMemberInfoList;\n})();\n\nmodule.exports = $root;\n"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/test/svrkit-utils/example/svrkit-utils.static.json",
    "content": "{\n  \"nested\": {\n    \"ApiDemoReq\": {\n      \"fields\": {\n        \"str\": {\n          \"type\": \"string\",\n          \"id\": 2\n        }\n      }\n    },\n    \"ApiDemoResp\": {\n      \"fields\": {\n        \"str\": {\n          \"type\": \"string\",\n          \"id\": 2\n        }\n      }\n    },\n    \"GenWxaCloudTmpCodeReq\": {\n      \"fields\": {\n        \"CloudPlatform\": {\n          \"type\": \"uint32\",\n          \"id\": 1\n        },\n        \"AppUin\": {\n          \"type\": \"uint32\",\n          \"id\": 2\n        },\n        \"UserUin\": {\n          \"type\": \"uint32\",\n          \"id\": 3\n        }\n      }\n    },\n    \"GenWxaCloudTmpCodeResp\": {\n      \"fields\": {\n        \"TmpCode\": {\n          \"type\": \"string\",\n          \"id\": 1\n        }\n      }\n    },\n    \"GetWeAppMemberByUserReq\": {\n      \"fields\": {\n        \"useruin\": {\n          \"type\": \"uint32\",\n          \"id\": 1\n        },\n        \"type\": {\n          \"type\": \"uint32\",\n          \"id\": 2\n        },\n        \"status\": {\n          \"type\": \"uint32\",\n          \"id\": 3\n        }\n      }\n    },\n    \"WeAppMemberInfo\": {\n      \"fields\": {\n        \"type\": {\n          \"type\": \"uint32\",\n          \"id\": 1\n        },\n        \"weappuin\": {\n          \"type\": \"uint32\",\n          \"id\": 2\n        },\n        \"useruin\": {\n          \"type\": \"uint32\",\n          \"id\": 3\n        },\n        \"status\": {\n          \"type\": \"uint32\",\n          \"id\": 4\n        },\n        \"createtime\": {\n          \"type\": \"uint32\",\n          \"id\": 5\n        },\n        \"updatetime\": {\n          \"type\": \"uint32\",\n          \"id\": 6\n        },\n        \"ticket\": {\n          \"type\": \"string\",\n          \"id\": 7\n        }\n      }\n    },\n    \"WeAppMemberInfoList\": {\n      \"fields\": {\n        \"infos\": {\n          \"rule\": \"repeated\",\n          \"type\": \"WeAppMemberInfo\",\n          \"id\": 1\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "cloudfunctions/ARDemo/cloud-functions-tools/test/svrkit-utils/example/svrkit.config.js",
    "content": "module.exports = [\n  {\n    proto: './proto/demo.proto',\n    apiName: 'demo',\n    req: 'ApiDemoReq',\n    res: 'ApiDemoResp'\n  },\n  {\n    proto: './proto/mmbizwxatmpcode.proto',\n    serviceName: 'MMBizWxaCloud',\n    magic: 13299,\n    functions: {\n      GenWxaCloudTmpCode: {\n        cmdid: 3,\n        req: 'GenWxaCloudTmpCodeReq',\n        res: 'GenWxaCloudTmpCodeResp',\n      },\n    }\n  },\n  {\n    proto: './proto/mmbizsafecenter.proto',\n    serviceName: 'mmbizsafecenter',\n    magic: 12085,\n    functions: {\n      GetWeAppMemberByUser: {\n        cmdid: 73,\n        req: 'GetWeAppMemberByUserReq',\n        res: 'WeAppMemberInfoList',\n      },\n    }\n  },\n]"
  },
  {
    "path": "cloudfunctions/ARDemo/config.json",
    "content": "{\n  \"permissions\": {\n    \"openapi\": [\n    ]\n  }\n}"
  },
  {
    "path": "cloudfunctions/ARDemo/index.js",
    "content": "// 云函数入口文件\nconst cloud = require('wx-server-sdk')\nconst wxgService = require('./wx-server-sdk-wxg-service')\nconst svrkitUtils = require('./svrkit-utils.js')\n\ncloud.registerService(wxgService)\ncloud.init()\n\n// 云函数入口函数\nexports.main = async (event, context) => {\n  const wxContext = cloud.getWXContext()\n  const bizuin = wxContext.APPUIN\n  switch (event.type) {\n    case 'GenerateARModel':\n      return await cloud.callWXSvrkit({\n        pbInstance: svrkitUtils.generate({\n          serviceName: 'Mmbizwxaintpar',\n          funcName: 'GenerateARModel',\n          data: {\n            bizuin,\n            name: event.name,\n            url: event.url,\n            algoType: event.algoType,\n            getmesh: event.getMesh,\n            gettexture: event.getTexture\n          },\n        }),\n        timeout: 30000,\n      })\n    case 'GetARModel':\n      return await cloud.callWXSvrkit({\n        pbInstance: svrkitUtils.generate({\n          serviceName: 'Mmbizwxaintpar',\n          funcName: 'GetARModel',\n          data: {\n            bizuin,\n            cosid: event.cosid,\n            modelType: event.modelType,\n            needData: event.needData,\n            useIntranet: event.useIntranet,\n            expireTime: event.expireTime\n          },\n        }),\n        timeout: 30000,\n      })\n    // GetARModelList 废弃，完全依赖本地缓存\n    // case \"GetARModelList\":\n    //   return await cloud.callWXSvrkit({\n    //     pbInstance: svrkitUtils.generate({\n    //       serviceName: \"Mmbizwxaintpar\",\n    //       funcName: \"GetARModelList\",\n    //       data: {\n    //         bizuin: bizuin,\n    //         modelStatus: event.modelStatus,\n    //         algoType: event.algoType\n    //       },\n    //     }),\n    //     timeout: 30000,\n    //   });\n  }\n}\n"
  },
  {
    "path": "cloudfunctions/ARDemo/package.json",
    "content": "{\n  \"name\": \"ARDemo\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"svrkit\": \"svrkit-utils --config ./svrkit.config.js --output ./svrkit-utils.js\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"^2.6.3\"\n  },\n  \"devDependencies\": {\n    \"@tencent/cloud-functions-tools\": \"^1.7.0\"\n  }\n}\n"
  },
  {
    "path": "cloudfunctions/ARDemo/proto/mmbizwxaintparDemo.proto",
    "content": "enum enARModelStatus\n{\n    ARModel_Status_Default = 0;\n    ARModel_Status_Init = 1;\n    ARModel_Status_Sparse_Finished = 2;\n    ARModel_Status_3d_Finished = 3;\n    ARModel_Status_Object_Finished = 4;\n    ARModel_Status_Marker_Finished = 5;\n    ARModel_Status_Fail = 100;   \n}\n\nenum enARAlgorithmType\n{\n    Algorithm_Type_3D_Object = 1;\n    Algorithm_Type_3D_Marker = 2;\n}\n\nenum enARModelType\n{\n    ARModel_Type_Sparse = 1;\n    ARModel_Type_3D = 2;\n    ARModel_Type_Marker = 3;\n}\n\nmessage ModelCos\n{\n    message ModelCosId\n    {\n        optional enARModelType model_type = 1;\n        optional string model_cosid = 2;\n        optional string errmsg = 3;\n    }\n    repeated ModelCosId model_list = 1;\n}\n\nmessage ARModel\n{\n    //option(mmbizintpkv.KvTableID) = 493;\n    option(mmbizintpkv.KvTableTestID) = 916;\n    optional string cosid = 1;  // 原始文件的cosid\n    optional uint32 bizuin = 2;\n    optional string name = 3; // 原始文件的名称\n    optional uint32 upload_time = 4;\n    optional enARModelStatus model_status = 5;\n    optional enARAlgorithmType algo_type = 6;\n    optional ModelCos model_cos = 7;\n}\n\nmessage GetARModelListReq\n{\n    optional uint32 bizuin = 1;\n    optional uint32 model_status = 2;  // enARModelStatus\n    optional uint32 start_time = 3;\n    optional uint32 end_time = 4;\n    optional uint32 offset = 5;\n    optional uint32 limit = 6;\n    optional uint32 algo_type = 7;  // enARAlgorithmType\n}\n\nmessage GetARModelListResp\n{\n    repeated ARModel model_list = 1;\n}\n\n\nmessage GenerateARModelReq\n{\n    optional uint32 bizuin = 1;\n    optional string name = 2;\n    optional bytes buffer = 3;\n    optional string url = 4;\n    optional enARAlgorithmType algo_type = 5;\n    optional uint32 lod = 6[default=0];  // 重建模型精度, 最高精度为0, 取1,2,3时精度依次下降\n    optional bool getmesh = 7[default=false];\n    optional bool gettexture = 8[default=false];\n}\n\nmessage GenerateARModelResp\n{\n    optional string url = 1;\n    optional string host = 2;\n    optional string cosid = 3;\n    optional uint32 lod = 4[default=0];\n    optional bool getmesh = 5[default=false];\n    optional bool gettexture = 6[default=false];\n}\n\nmessage ARModelData\n{\n    optional bytes mesh_model = 1;  // 文本(点面信息)\n    optional bytes texture_model = 2; // 图像png\n    optional bytes preview = 3;\n    optional bytes mesh_blob = 4; // obj二进制, getmesh = true时返回\n    optional bytes texture_blob = 5; // 纹理二进制, gettexture = true时返回\n}\n\nmessage GetARModelReq\n{\n    optional uint32 bizuin = 1;\n    optional string cosid = 2;\n    optional uint32 model_type = 3; // 1:稀疏点云  2:3d模型 3:Marker模型\n    optional uint32 need_data = 4[default=1]; // 0:不需要数据 1:需要数据\n    optional uint32 use_intranet = 5[default=0]; // 当need_data为0时生效 0:生成外网链接 1:内网链接\n    optional uint32 expire_time = 6; // url过期时间,默认5分钟,单位为秒,最长1800\n}\n\nmessage GetARModelResp\n{\n    optional ARModelData model_data = 1;\n    optional string url = 2;\n    optional string host = 3;\n    optional string errMsg = 4;\n    optional uint32 expire_time = 5;\n    optional uint32 status = 6; // 0 生成中 1 生成成功 2 过期 3 生成失败\n}\n"
  },
  {
    "path": "cloudfunctions/ARDemo/svrkit-utils.js",
    "content": "const config = require('./svrkit.config.js')\nconst proto = require('./svrkit-utils.static.js')\nconst protoJSON = require('./svrkit-utils.static.json')\n\nfunction getProto(proto, serviceName, protoName) {\n  if (proto[protoName]) {\n    return proto[protoName]\n  }\n\n  if (proto[serviceName] && proto[serviceName][protoName]) {\n    return proto[serviceName][protoName]\n  }\n\n  /** 处理 mmpayolcirclemodel.QueryActivityReq 的形式 */\n  const [realServiceName, realProtoName] = protoName.split('.')\n  if (proto[realServiceName]) {\n    return proto[realServiceName][realProtoName]\n  }\n\n  return undefined\n}\n\nfunction generate(options) {\n  if (!options) {\n    throw new Error('options must be provided')\n  }\n\n  const { serviceName, funcName, data } = options\n\n  const serviceConfig = config.find(c => c.serviceName === serviceName)\n  if (!serviceConfig) {\n    throw new Error('service not found')\n  }\n\n  if (!serviceConfig.functions[funcName]) {\n    throw new Error('function not found')\n  }\n\n  const reqProtoName = serviceConfig.functions[funcName].req\n  const reqProto = getProto(proto, serviceName, reqProtoName)\n\n  if (!reqProto) {\n    throw new Error('request proto not found')\n  }\n\n  const resProtoName = serviceConfig.functions[funcName].res\n  const resProto = resProtoName && getProto(proto, serviceName, resProtoName)\n\n  const reqProtoVerifyErr = reqProto.verify(data)\n  if (reqProtoVerifyErr) {\n    throw new Error(`verify proto data error: ${reqProtoVerifyErr}`)\n  }\n\n  const reqProtoJSON = protoJSON.nested[reqProtoName]\n\n  if (reqProtoJSON && reqProtoJSON.fields) {\n    if (Object.prototype.toString.call(data).slice(8, -1) === 'Object') {\n      for (const key in data) {\n        if (!reqProtoJSON.fields[key]) {\n          throw new Error(`'${key}' doesn't exist in '${reqProtoName}' proto, valid keys are ${Object.keys(reqProtoJSON.fields)}`)\n        }\n      }\n    } else {\n      throw new Error('data must be object')\n    }\n  }\n\n  return {\n    data: {\n      serviceName,\n      funcName,\n      magic: serviceConfig.magic,\n      cmdid: serviceConfig.functions[funcName].cmdid,\n      existResp: Boolean(resProto),\n      reqBodyBuffer: reqProto.encode(data).finish(),\n    },\n    reqProto,\n    resProto,\n    decode: buf => resProto && resProto.decode(buf)\n  }\n}\n\nfunction generateV2(options) {\n  if (!options) {\n    throw new Error('options must be provided')\n  }\n\n  const { apiName, data } = options\n\n  const apiConfig = config.find(c => c.apiName === apiName)\n\n  const reqProtoName = apiConfig.req\n  const reqProto = proto[reqProtoName]\n\n  if (!reqProto) {\n    throw new Error('request proto not found')\n  }\n\n  const resProtoName = apiConfig.res\n  const resProto = proto[resProtoName]\n\n  const reqProtoVerifyErr = reqProto.verify(data)\n  if (reqProtoVerifyErr) {\n    throw new Error(`verify proto data error: ${reqProtoVerifyErr}`)\n  }\n\n  const reqProtoJSON = protoJSON.nested[reqProtoName]\n\n  if (reqProtoJSON && reqProtoJSON.fields) {\n    if (Object.prototype.toString.call(data).slice(8, -1) === 'Object') {\n      for (const key in data) {\n        if (!reqProtoJSON.fields[key]) {\n          throw new Error(`'${key}' doesn't exist in '${reqProtoName}' proto, valid keys are ${Object.keys(reqProtoJSON.fields)}`)\n        }\n      }\n    } else {\n      throw new Error('data must be object')\n    }\n  }\n\n  return {\n    data: {\n      apiName,\n      reqBodyBuffer: reqProto.encode(data).finish(),\n    },\n    reqProto,\n    resProto,\n    decode: buf => resProto && resProto.decode(buf)\n  }\n}\n\nmodule.exports = {\n  generate,\n  generateV2,\n}\n"
  },
  {
    "path": "cloudfunctions/ARDemo/svrkit-utils.static.js",
    "content": "// #lizard forgives\n/*eslint-disable*/\n\"use strict\";\n\nvar $protobuf = require(\"protobufjs/minimal\");\n\n// Common aliases\nvar $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\n\n// Exported root namespace\nvar $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n\n/**\n * enARModelStatus enum.\n * @exports enARModelStatus\n * @enum {number}\n * @property {number} ARModel_Status_Default=0 ARModel_Status_Default value\n * @property {number} ARModel_Status_Init=1 ARModel_Status_Init value\n * @property {number} ARModel_Status_Sparse_Finished=2 ARModel_Status_Sparse_Finished value\n * @property {number} ARModel_Status_3d_Finished=3 ARModel_Status_3d_Finished value\n * @property {number} ARModel_Status_Object_Finished=4 ARModel_Status_Object_Finished value\n * @property {number} ARModel_Status_Marker_Finished=5 ARModel_Status_Marker_Finished value\n * @property {number} ARModel_Status_Fail=100 ARModel_Status_Fail value\n */\n$root.enARModelStatus = (function() {\n    var valuesById = {}, values = Object.create(valuesById);\n    values[valuesById[0] = \"ARModel_Status_Default\"] = 0;\n    values[valuesById[1] = \"ARModel_Status_Init\"] = 1;\n    values[valuesById[2] = \"ARModel_Status_Sparse_Finished\"] = 2;\n    values[valuesById[3] = \"ARModel_Status_3d_Finished\"] = 3;\n    values[valuesById[4] = \"ARModel_Status_Object_Finished\"] = 4;\n    values[valuesById[5] = \"ARModel_Status_Marker_Finished\"] = 5;\n    values[valuesById[100] = \"ARModel_Status_Fail\"] = 100;\n    return values;\n})();\n\n/**\n * enARAlgorithmType enum.\n * @exports enARAlgorithmType\n * @enum {number}\n * @property {number} Algorithm_Type_3D_Object=1 Algorithm_Type_3D_Object value\n * @property {number} Algorithm_Type_3D_Marker=2 Algorithm_Type_3D_Marker value\n */\n$root.enARAlgorithmType = (function() {\n    var valuesById = {}, values = Object.create(valuesById);\n    values[valuesById[1] = \"Algorithm_Type_3D_Object\"] = 1;\n    values[valuesById[2] = \"Algorithm_Type_3D_Marker\"] = 2;\n    return values;\n})();\n\n/**\n * enARModelType enum.\n * @exports enARModelType\n * @enum {number}\n * @property {number} ARModel_Type_Sparse=1 ARModel_Type_Sparse value\n * @property {number} ARModel_Type_3D=2 ARModel_Type_3D value\n * @property {number} ARModel_Type_Marker=3 ARModel_Type_Marker value\n */\n$root.enARModelType = (function() {\n    var valuesById = {}, values = Object.create(valuesById);\n    values[valuesById[1] = \"ARModel_Type_Sparse\"] = 1;\n    values[valuesById[2] = \"ARModel_Type_3D\"] = 2;\n    values[valuesById[3] = \"ARModel_Type_Marker\"] = 3;\n    return values;\n})();\n\n$root.ModelCos = (function() {\n\n    /**\n     * Properties of a ModelCos.\n     * @exports IModelCos\n     * @interface IModelCos\n     * @property {Array.<ModelCos.IModelCosId>|null} [modelList] ModelCos modelList\n     */\n\n    /**\n     * Constructs a new ModelCos.\n     * @exports ModelCos\n     * @classdesc Represents a ModelCos.\n     * @implements IModelCos\n     * @constructor\n     * @param {IModelCos=} [properties] Properties to set\n     */\n    function ModelCos(properties) {\n        this.modelList = [];\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * ModelCos modelList.\n     * @member {Array.<ModelCos.IModelCosId>} modelList\n     * @memberof ModelCos\n     * @instance\n     */\n    ModelCos.prototype.modelList = $util.emptyArray;\n\n    /**\n     * Creates a new ModelCos instance using the specified properties.\n     * @function create\n     * @memberof ModelCos\n     * @static\n     * @param {IModelCos=} [properties] Properties to set\n     * @returns {ModelCos} ModelCos instance\n     */\n    ModelCos.create = function create(properties) {\n        return new ModelCos(properties);\n    };\n\n    /**\n     * Encodes the specified ModelCos message. Does not implicitly {@link ModelCos.verify|verify} messages.\n     * @function encode\n     * @memberof ModelCos\n     * @static\n     * @param {IModelCos} message ModelCos message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ModelCos.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.modelList != null && message.modelList.length)\n            for (var i = 0; i < message.modelList.length; ++i)\n                $root.ModelCos.ModelCosId.encode(message.modelList[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n        return writer;\n    };\n\n    /**\n     * Encodes the specified ModelCos message, length delimited. Does not implicitly {@link ModelCos.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof ModelCos\n     * @static\n     * @param {IModelCos} message ModelCos message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ModelCos.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a ModelCos message from the specified reader or buffer.\n     * @function decode\n     * @memberof ModelCos\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {ModelCos} ModelCos\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ModelCos.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ModelCos();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                if (!(message.modelList && message.modelList.length))\n                    message.modelList = [];\n                message.modelList.push($root.ModelCos.ModelCosId.decode(reader, reader.uint32()));\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a ModelCos message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof ModelCos\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {ModelCos} ModelCos\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ModelCos.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a ModelCos message.\n     * @function verify\n     * @memberof ModelCos\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    ModelCos.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.modelList != null && message.hasOwnProperty(\"modelList\")) {\n            if (!Array.isArray(message.modelList))\n                return \"modelList: array expected\";\n            for (var i = 0; i < message.modelList.length; ++i) {\n                var error = $root.ModelCos.ModelCosId.verify(message.modelList[i]);\n                if (error)\n                    return \"modelList.\" + error;\n            }\n        }\n        return null;\n    };\n\n    /**\n     * Creates a ModelCos message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof ModelCos\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {ModelCos} ModelCos\n     */\n    ModelCos.fromObject = function fromObject(object) {\n        if (object instanceof $root.ModelCos)\n            return object;\n        var message = new $root.ModelCos();\n        if (object.modelList) {\n            if (!Array.isArray(object.modelList))\n                throw TypeError(\".ModelCos.modelList: array expected\");\n            message.modelList = [];\n            for (var i = 0; i < object.modelList.length; ++i) {\n                if (typeof object.modelList[i] !== \"object\")\n                    throw TypeError(\".ModelCos.modelList: object expected\");\n                message.modelList[i] = $root.ModelCos.ModelCosId.fromObject(object.modelList[i]);\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a ModelCos message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof ModelCos\n     * @static\n     * @param {ModelCos} message ModelCos\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    ModelCos.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.arrays || options.defaults)\n            object.modelList = [];\n        if (message.modelList && message.modelList.length) {\n            object.modelList = [];\n            for (var j = 0; j < message.modelList.length; ++j)\n                object.modelList[j] = $root.ModelCos.ModelCosId.toObject(message.modelList[j], options);\n        }\n        return object;\n    };\n\n    /**\n     * Converts this ModelCos to JSON.\n     * @function toJSON\n     * @memberof ModelCos\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    ModelCos.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    ModelCos.ModelCosId = (function() {\n\n        /**\n         * Properties of a ModelCosId.\n         * @memberof ModelCos\n         * @interface IModelCosId\n         * @property {enARModelType|null} [modelType] ModelCosId modelType\n         * @property {string|null} [modelCosid] ModelCosId modelCosid\n         * @property {string|null} [errmsg] ModelCosId errmsg\n         */\n\n        /**\n         * Constructs a new ModelCosId.\n         * @memberof ModelCos\n         * @classdesc Represents a ModelCosId.\n         * @implements IModelCosId\n         * @constructor\n         * @param {ModelCos.IModelCosId=} [properties] Properties to set\n         */\n        function ModelCosId(properties) {\n            if (properties)\n                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                    if (properties[keys[i]] != null)\n                        this[keys[i]] = properties[keys[i]];\n        }\n\n        /**\n         * ModelCosId modelType.\n         * @member {enARModelType} modelType\n         * @memberof ModelCos.ModelCosId\n         * @instance\n         */\n        ModelCosId.prototype.modelType = 1;\n\n        /**\n         * ModelCosId modelCosid.\n         * @member {string} modelCosid\n         * @memberof ModelCos.ModelCosId\n         * @instance\n         */\n        ModelCosId.prototype.modelCosid = \"\";\n\n        /**\n         * ModelCosId errmsg.\n         * @member {string} errmsg\n         * @memberof ModelCos.ModelCosId\n         * @instance\n         */\n        ModelCosId.prototype.errmsg = \"\";\n\n        /**\n         * Creates a new ModelCosId instance using the specified properties.\n         * @function create\n         * @memberof ModelCos.ModelCosId\n         * @static\n         * @param {ModelCos.IModelCosId=} [properties] Properties to set\n         * @returns {ModelCos.ModelCosId} ModelCosId instance\n         */\n        ModelCosId.create = function create(properties) {\n            return new ModelCosId(properties);\n        };\n\n        /**\n         * Encodes the specified ModelCosId message. Does not implicitly {@link ModelCos.ModelCosId.verify|verify} messages.\n         * @function encode\n         * @memberof ModelCos.ModelCosId\n         * @static\n         * @param {ModelCos.IModelCosId} message ModelCosId message or plain object to encode\n         * @param {$protobuf.Writer} [writer] Writer to encode to\n         * @returns {$protobuf.Writer} Writer\n         */\n        ModelCosId.encode = function encode(message, writer) {\n            if (!writer)\n                writer = $Writer.create();\n            if (message.modelType != null && Object.hasOwnProperty.call(message, \"modelType\"))\n                writer.uint32(/* id 1, wireType 0 =*/8).int32(message.modelType);\n            if (message.modelCosid != null && Object.hasOwnProperty.call(message, \"modelCosid\"))\n                writer.uint32(/* id 2, wireType 2 =*/18).string(message.modelCosid);\n            if (message.errmsg != null && Object.hasOwnProperty.call(message, \"errmsg\"))\n                writer.uint32(/* id 3, wireType 2 =*/26).string(message.errmsg);\n            return writer;\n        };\n\n        /**\n         * Encodes the specified ModelCosId message, length delimited. Does not implicitly {@link ModelCos.ModelCosId.verify|verify} messages.\n         * @function encodeDelimited\n         * @memberof ModelCos.ModelCosId\n         * @static\n         * @param {ModelCos.IModelCosId} message ModelCosId message or plain object to encode\n         * @param {$protobuf.Writer} [writer] Writer to encode to\n         * @returns {$protobuf.Writer} Writer\n         */\n        ModelCosId.encodeDelimited = function encodeDelimited(message, writer) {\n            return this.encode(message, writer).ldelim();\n        };\n\n        /**\n         * Decodes a ModelCosId message from the specified reader or buffer.\n         * @function decode\n         * @memberof ModelCos.ModelCosId\n         * @static\n         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n         * @param {number} [length] Message length if known beforehand\n         * @returns {ModelCos.ModelCosId} ModelCosId\n         * @throws {Error} If the payload is not a reader or valid buffer\n         * @throws {$protobuf.util.ProtocolError} If required fields are missing\n         */\n        ModelCosId.decode = function decode(reader, length) {\n            if (!(reader instanceof $Reader))\n                reader = $Reader.create(reader);\n            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ModelCos.ModelCosId();\n            while (reader.pos < end) {\n                var tag = reader.uint32();\n                switch (tag >>> 3) {\n                case 1:\n                    message.modelType = reader.int32();\n                    break;\n                case 2:\n                    message.modelCosid = reader.string();\n                    break;\n                case 3:\n                    message.errmsg = reader.string();\n                    break;\n                default:\n                    reader.skipType(tag & 7);\n                    break;\n                }\n            }\n            return message;\n        };\n\n        /**\n         * Decodes a ModelCosId message from the specified reader or buffer, length delimited.\n         * @function decodeDelimited\n         * @memberof ModelCos.ModelCosId\n         * @static\n         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n         * @returns {ModelCos.ModelCosId} ModelCosId\n         * @throws {Error} If the payload is not a reader or valid buffer\n         * @throws {$protobuf.util.ProtocolError} If required fields are missing\n         */\n        ModelCosId.decodeDelimited = function decodeDelimited(reader) {\n            if (!(reader instanceof $Reader))\n                reader = new $Reader(reader);\n            return this.decode(reader, reader.uint32());\n        };\n\n        /**\n         * Verifies a ModelCosId message.\n         * @function verify\n         * @memberof ModelCos.ModelCosId\n         * @static\n         * @param {Object.<string,*>} message Plain object to verify\n         * @returns {string|null} `null` if valid, otherwise the reason why it is not\n         */\n        ModelCosId.verify = function verify(message) {\n            if (typeof message !== \"object\" || message === null)\n                return \"object expected\";\n            if (message.modelType != null && message.hasOwnProperty(\"modelType\"))\n                switch (message.modelType) {\n                default:\n                    return \"modelType: enum value expected\";\n                case 1:\n                case 2:\n                case 3:\n                    break;\n                }\n            if (message.modelCosid != null && message.hasOwnProperty(\"modelCosid\"))\n                if (!$util.isString(message.modelCosid))\n                    return \"modelCosid: string expected\";\n            if (message.errmsg != null && message.hasOwnProperty(\"errmsg\"))\n                if (!$util.isString(message.errmsg))\n                    return \"errmsg: string expected\";\n            return null;\n        };\n\n        /**\n         * Creates a ModelCosId message from a plain object. Also converts values to their respective internal types.\n         * @function fromObject\n         * @memberof ModelCos.ModelCosId\n         * @static\n         * @param {Object.<string,*>} object Plain object\n         * @returns {ModelCos.ModelCosId} ModelCosId\n         */\n        ModelCosId.fromObject = function fromObject(object) {\n            if (object instanceof $root.ModelCos.ModelCosId)\n                return object;\n            var message = new $root.ModelCos.ModelCosId();\n            switch (object.modelType) {\n            case \"ARModel_Type_Sparse\":\n            case 1:\n                message.modelType = 1;\n                break;\n            case \"ARModel_Type_3D\":\n            case 2:\n                message.modelType = 2;\n                break;\n            case \"ARModel_Type_Marker\":\n            case 3:\n                message.modelType = 3;\n                break;\n            }\n            if (object.modelCosid != null)\n                message.modelCosid = String(object.modelCosid);\n            if (object.errmsg != null)\n                message.errmsg = String(object.errmsg);\n            return message;\n        };\n\n        /**\n         * Creates a plain object from a ModelCosId message. Also converts values to other types if specified.\n         * @function toObject\n         * @memberof ModelCos.ModelCosId\n         * @static\n         * @param {ModelCos.ModelCosId} message ModelCosId\n         * @param {$protobuf.IConversionOptions} [options] Conversion options\n         * @returns {Object.<string,*>} Plain object\n         */\n        ModelCosId.toObject = function toObject(message, options) {\n            if (!options)\n                options = {};\n            var object = {};\n            if (options.defaults) {\n                object.modelType = options.enums === String ? \"ARModel_Type_Sparse\" : 1;\n                object.modelCosid = \"\";\n                object.errmsg = \"\";\n            }\n            if (message.modelType != null && message.hasOwnProperty(\"modelType\"))\n                object.modelType = options.enums === String ? $root.enARModelType[message.modelType] : message.modelType;\n            if (message.modelCosid != null && message.hasOwnProperty(\"modelCosid\"))\n                object.modelCosid = message.modelCosid;\n            if (message.errmsg != null && message.hasOwnProperty(\"errmsg\"))\n                object.errmsg = message.errmsg;\n            return object;\n        };\n\n        /**\n         * Converts this ModelCosId to JSON.\n         * @function toJSON\n         * @memberof ModelCos.ModelCosId\n         * @instance\n         * @returns {Object.<string,*>} JSON object\n         */\n        ModelCosId.prototype.toJSON = function toJSON() {\n            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n        };\n\n        return ModelCosId;\n    })();\n\n    return ModelCos;\n})();\n\n$root.ARModel = (function() {\n\n    /**\n     * Properties of a ARModel.\n     * @exports IARModel\n     * @interface IARModel\n     * @property {string|null} [cosid] ARModel cosid\n     * @property {number|null} [bizuin] ARModel bizuin\n     * @property {string|null} [name] ARModel name\n     * @property {number|null} [uploadTime] ARModel uploadTime\n     * @property {enARModelStatus|null} [modelStatus] ARModel modelStatus\n     * @property {enARAlgorithmType|null} [algoType] ARModel algoType\n     * @property {IModelCos|null} [modelCos] ARModel modelCos\n     */\n\n    /**\n     * Constructs a new ARModel.\n     * @exports ARModel\n     * @classdesc Represents a ARModel.\n     * @implements IARModel\n     * @constructor\n     * @param {IARModel=} [properties] Properties to set\n     */\n    function ARModel(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * ARModel cosid.\n     * @member {string} cosid\n     * @memberof ARModel\n     * @instance\n     */\n    ARModel.prototype.cosid = \"\";\n\n    /**\n     * ARModel bizuin.\n     * @member {number} bizuin\n     * @memberof ARModel\n     * @instance\n     */\n    ARModel.prototype.bizuin = 0;\n\n    /**\n     * ARModel name.\n     * @member {string} name\n     * @memberof ARModel\n     * @instance\n     */\n    ARModel.prototype.name = \"\";\n\n    /**\n     * ARModel uploadTime.\n     * @member {number} uploadTime\n     * @memberof ARModel\n     * @instance\n     */\n    ARModel.prototype.uploadTime = 0;\n\n    /**\n     * ARModel modelStatus.\n     * @member {enARModelStatus} modelStatus\n     * @memberof ARModel\n     * @instance\n     */\n    ARModel.prototype.modelStatus = 0;\n\n    /**\n     * ARModel algoType.\n     * @member {enARAlgorithmType} algoType\n     * @memberof ARModel\n     * @instance\n     */\n    ARModel.prototype.algoType = 1;\n\n    /**\n     * ARModel modelCos.\n     * @member {IModelCos|null|undefined} modelCos\n     * @memberof ARModel\n     * @instance\n     */\n    ARModel.prototype.modelCos = null;\n\n    /**\n     * Creates a new ARModel instance using the specified properties.\n     * @function create\n     * @memberof ARModel\n     * @static\n     * @param {IARModel=} [properties] Properties to set\n     * @returns {ARModel} ARModel instance\n     */\n    ARModel.create = function create(properties) {\n        return new ARModel(properties);\n    };\n\n    /**\n     * Encodes the specified ARModel message. Does not implicitly {@link ARModel.verify|verify} messages.\n     * @function encode\n     * @memberof ARModel\n     * @static\n     * @param {IARModel} message ARModel message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ARModel.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.cosid != null && Object.hasOwnProperty.call(message, \"cosid\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).string(message.cosid);\n        if (message.bizuin != null && Object.hasOwnProperty.call(message, \"bizuin\"))\n            writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.bizuin);\n        if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n            writer.uint32(/* id 3, wireType 2 =*/26).string(message.name);\n        if (message.uploadTime != null && Object.hasOwnProperty.call(message, \"uploadTime\"))\n            writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.uploadTime);\n        if (message.modelStatus != null && Object.hasOwnProperty.call(message, \"modelStatus\"))\n            writer.uint32(/* id 5, wireType 0 =*/40).int32(message.modelStatus);\n        if (message.algoType != null && Object.hasOwnProperty.call(message, \"algoType\"))\n            writer.uint32(/* id 6, wireType 0 =*/48).int32(message.algoType);\n        if (message.modelCos != null && Object.hasOwnProperty.call(message, \"modelCos\"))\n            $root.ModelCos.encode(message.modelCos, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();\n        return writer;\n    };\n\n    /**\n     * Encodes the specified ARModel message, length delimited. Does not implicitly {@link ARModel.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof ARModel\n     * @static\n     * @param {IARModel} message ARModel message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ARModel.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a ARModel message from the specified reader or buffer.\n     * @function decode\n     * @memberof ARModel\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {ARModel} ARModel\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ARModel.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ARModel();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.cosid = reader.string();\n                break;\n            case 2:\n                message.bizuin = reader.uint32();\n                break;\n            case 3:\n                message.name = reader.string();\n                break;\n            case 4:\n                message.uploadTime = reader.uint32();\n                break;\n            case 5:\n                message.modelStatus = reader.int32();\n                break;\n            case 6:\n                message.algoType = reader.int32();\n                break;\n            case 7:\n                message.modelCos = $root.ModelCos.decode(reader, reader.uint32());\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a ARModel message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof ARModel\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {ARModel} ARModel\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ARModel.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a ARModel message.\n     * @function verify\n     * @memberof ARModel\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    ARModel.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.cosid != null && message.hasOwnProperty(\"cosid\"))\n            if (!$util.isString(message.cosid))\n                return \"cosid: string expected\";\n        if (message.bizuin != null && message.hasOwnProperty(\"bizuin\"))\n            if (!$util.isInteger(message.bizuin))\n                return \"bizuin: integer expected\";\n        if (message.name != null && message.hasOwnProperty(\"name\"))\n            if (!$util.isString(message.name))\n                return \"name: string expected\";\n        if (message.uploadTime != null && message.hasOwnProperty(\"uploadTime\"))\n            if (!$util.isInteger(message.uploadTime))\n                return \"uploadTime: integer expected\";\n        if (message.modelStatus != null && message.hasOwnProperty(\"modelStatus\"))\n            switch (message.modelStatus) {\n            default:\n                return \"modelStatus: enum value expected\";\n            case 0:\n            case 1:\n            case 2:\n            case 3:\n            case 4:\n            case 5:\n            case 100:\n                break;\n            }\n        if (message.algoType != null && message.hasOwnProperty(\"algoType\"))\n            switch (message.algoType) {\n            default:\n                return \"algoType: enum value expected\";\n            case 1:\n            case 2:\n                break;\n            }\n        if (message.modelCos != null && message.hasOwnProperty(\"modelCos\")) {\n            var error = $root.ModelCos.verify(message.modelCos);\n            if (error)\n                return \"modelCos.\" + error;\n        }\n        return null;\n    };\n\n    /**\n     * Creates a ARModel message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof ARModel\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {ARModel} ARModel\n     */\n    ARModel.fromObject = function fromObject(object) {\n        if (object instanceof $root.ARModel)\n            return object;\n        var message = new $root.ARModel();\n        if (object.cosid != null)\n            message.cosid = String(object.cosid);\n        if (object.bizuin != null)\n            message.bizuin = object.bizuin >>> 0;\n        if (object.name != null)\n            message.name = String(object.name);\n        if (object.uploadTime != null)\n            message.uploadTime = object.uploadTime >>> 0;\n        switch (object.modelStatus) {\n        case \"ARModel_Status_Default\":\n        case 0:\n            message.modelStatus = 0;\n            break;\n        case \"ARModel_Status_Init\":\n        case 1:\n            message.modelStatus = 1;\n            break;\n        case \"ARModel_Status_Sparse_Finished\":\n        case 2:\n            message.modelStatus = 2;\n            break;\n        case \"ARModel_Status_3d_Finished\":\n        case 3:\n            message.modelStatus = 3;\n            break;\n        case \"ARModel_Status_Object_Finished\":\n        case 4:\n            message.modelStatus = 4;\n            break;\n        case \"ARModel_Status_Marker_Finished\":\n        case 5:\n            message.modelStatus = 5;\n            break;\n        case \"ARModel_Status_Fail\":\n        case 100:\n            message.modelStatus = 100;\n            break;\n        }\n        switch (object.algoType) {\n        case \"Algorithm_Type_3D_Object\":\n        case 1:\n            message.algoType = 1;\n            break;\n        case \"Algorithm_Type_3D_Marker\":\n        case 2:\n            message.algoType = 2;\n            break;\n        }\n        if (object.modelCos != null) {\n            if (typeof object.modelCos !== \"object\")\n                throw TypeError(\".ARModel.modelCos: object expected\");\n            message.modelCos = $root.ModelCos.fromObject(object.modelCos);\n        }\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a ARModel message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof ARModel\n     * @static\n     * @param {ARModel} message ARModel\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    ARModel.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.cosid = \"\";\n            object.bizuin = 0;\n            object.name = \"\";\n            object.uploadTime = 0;\n            object.modelStatus = options.enums === String ? \"ARModel_Status_Default\" : 0;\n            object.algoType = options.enums === String ? \"Algorithm_Type_3D_Object\" : 1;\n            object.modelCos = null;\n        }\n        if (message.cosid != null && message.hasOwnProperty(\"cosid\"))\n            object.cosid = message.cosid;\n        if (message.bizuin != null && message.hasOwnProperty(\"bizuin\"))\n            object.bizuin = message.bizuin;\n        if (message.name != null && message.hasOwnProperty(\"name\"))\n            object.name = message.name;\n        if (message.uploadTime != null && message.hasOwnProperty(\"uploadTime\"))\n            object.uploadTime = message.uploadTime;\n        if (message.modelStatus != null && message.hasOwnProperty(\"modelStatus\"))\n            object.modelStatus = options.enums === String ? $root.enARModelStatus[message.modelStatus] : message.modelStatus;\n        if (message.algoType != null && message.hasOwnProperty(\"algoType\"))\n            object.algoType = options.enums === String ? $root.enARAlgorithmType[message.algoType] : message.algoType;\n        if (message.modelCos != null && message.hasOwnProperty(\"modelCos\"))\n            object.modelCos = $root.ModelCos.toObject(message.modelCos, options);\n        return object;\n    };\n\n    /**\n     * Converts this ARModel to JSON.\n     * @function toJSON\n     * @memberof ARModel\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    ARModel.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return ARModel;\n})();\n\n$root.GetARModelListReq = (function() {\n\n    /**\n     * Properties of a GetARModelListReq.\n     * @exports IGetARModelListReq\n     * @interface IGetARModelListReq\n     * @property {number|null} [bizuin] GetARModelListReq bizuin\n     * @property {number|null} [modelStatus] GetARModelListReq modelStatus\n     * @property {number|null} [startTime] GetARModelListReq startTime\n     * @property {number|null} [endTime] GetARModelListReq endTime\n     * @property {number|null} [offset] GetARModelListReq offset\n     * @property {number|null} [limit] GetARModelListReq limit\n     * @property {number|null} [algoType] GetARModelListReq algoType\n     */\n\n    /**\n     * Constructs a new GetARModelListReq.\n     * @exports GetARModelListReq\n     * @classdesc Represents a GetARModelListReq.\n     * @implements IGetARModelListReq\n     * @constructor\n     * @param {IGetARModelListReq=} [properties] Properties to set\n     */\n    function GetARModelListReq(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GetARModelListReq bizuin.\n     * @member {number} bizuin\n     * @memberof GetARModelListReq\n     * @instance\n     */\n    GetARModelListReq.prototype.bizuin = 0;\n\n    /**\n     * GetARModelListReq modelStatus.\n     * @member {number} modelStatus\n     * @memberof GetARModelListReq\n     * @instance\n     */\n    GetARModelListReq.prototype.modelStatus = 0;\n\n    /**\n     * GetARModelListReq startTime.\n     * @member {number} startTime\n     * @memberof GetARModelListReq\n     * @instance\n     */\n    GetARModelListReq.prototype.startTime = 0;\n\n    /**\n     * GetARModelListReq endTime.\n     * @member {number} endTime\n     * @memberof GetARModelListReq\n     * @instance\n     */\n    GetARModelListReq.prototype.endTime = 0;\n\n    /**\n     * GetARModelListReq offset.\n     * @member {number} offset\n     * @memberof GetARModelListReq\n     * @instance\n     */\n    GetARModelListReq.prototype.offset = 0;\n\n    /**\n     * GetARModelListReq limit.\n     * @member {number} limit\n     * @memberof GetARModelListReq\n     * @instance\n     */\n    GetARModelListReq.prototype.limit = 0;\n\n    /**\n     * GetARModelListReq algoType.\n     * @member {number} algoType\n     * @memberof GetARModelListReq\n     * @instance\n     */\n    GetARModelListReq.prototype.algoType = 0;\n\n    /**\n     * Creates a new GetARModelListReq instance using the specified properties.\n     * @function create\n     * @memberof GetARModelListReq\n     * @static\n     * @param {IGetARModelListReq=} [properties] Properties to set\n     * @returns {GetARModelListReq} GetARModelListReq instance\n     */\n    GetARModelListReq.create = function create(properties) {\n        return new GetARModelListReq(properties);\n    };\n\n    /**\n     * Encodes the specified GetARModelListReq message. Does not implicitly {@link GetARModelListReq.verify|verify} messages.\n     * @function encode\n     * @memberof GetARModelListReq\n     * @static\n     * @param {IGetARModelListReq} message GetARModelListReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetARModelListReq.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.bizuin != null && Object.hasOwnProperty.call(message, \"bizuin\"))\n            writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.bizuin);\n        if (message.modelStatus != null && Object.hasOwnProperty.call(message, \"modelStatus\"))\n            writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.modelStatus);\n        if (message.startTime != null && Object.hasOwnProperty.call(message, \"startTime\"))\n            writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.startTime);\n        if (message.endTime != null && Object.hasOwnProperty.call(message, \"endTime\"))\n            writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.endTime);\n        if (message.offset != null && Object.hasOwnProperty.call(message, \"offset\"))\n            writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.offset);\n        if (message.limit != null && Object.hasOwnProperty.call(message, \"limit\"))\n            writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.limit);\n        if (message.algoType != null && Object.hasOwnProperty.call(message, \"algoType\"))\n            writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.algoType);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GetARModelListReq message, length delimited. Does not implicitly {@link GetARModelListReq.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GetARModelListReq\n     * @static\n     * @param {IGetARModelListReq} message GetARModelListReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetARModelListReq.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GetARModelListReq message from the specified reader or buffer.\n     * @function decode\n     * @memberof GetARModelListReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GetARModelListReq} GetARModelListReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetARModelListReq.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GetARModelListReq();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.bizuin = reader.uint32();\n                break;\n            case 2:\n                message.modelStatus = reader.uint32();\n                break;\n            case 3:\n                message.startTime = reader.uint32();\n                break;\n            case 4:\n                message.endTime = reader.uint32();\n                break;\n            case 5:\n                message.offset = reader.uint32();\n                break;\n            case 6:\n                message.limit = reader.uint32();\n                break;\n            case 7:\n                message.algoType = reader.uint32();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GetARModelListReq message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GetARModelListReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GetARModelListReq} GetARModelListReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetARModelListReq.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GetARModelListReq message.\n     * @function verify\n     * @memberof GetARModelListReq\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GetARModelListReq.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.bizuin != null && message.hasOwnProperty(\"bizuin\"))\n            if (!$util.isInteger(message.bizuin))\n                return \"bizuin: integer expected\";\n        if (message.modelStatus != null && message.hasOwnProperty(\"modelStatus\"))\n            if (!$util.isInteger(message.modelStatus))\n                return \"modelStatus: integer expected\";\n        if (message.startTime != null && message.hasOwnProperty(\"startTime\"))\n            if (!$util.isInteger(message.startTime))\n                return \"startTime: integer expected\";\n        if (message.endTime != null && message.hasOwnProperty(\"endTime\"))\n            if (!$util.isInteger(message.endTime))\n                return \"endTime: integer expected\";\n        if (message.offset != null && message.hasOwnProperty(\"offset\"))\n            if (!$util.isInteger(message.offset))\n                return \"offset: integer expected\";\n        if (message.limit != null && message.hasOwnProperty(\"limit\"))\n            if (!$util.isInteger(message.limit))\n                return \"limit: integer expected\";\n        if (message.algoType != null && message.hasOwnProperty(\"algoType\"))\n            if (!$util.isInteger(message.algoType))\n                return \"algoType: integer expected\";\n        return null;\n    };\n\n    /**\n     * Creates a GetARModelListReq message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GetARModelListReq\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GetARModelListReq} GetARModelListReq\n     */\n    GetARModelListReq.fromObject = function fromObject(object) {\n        if (object instanceof $root.GetARModelListReq)\n            return object;\n        var message = new $root.GetARModelListReq();\n        if (object.bizuin != null)\n            message.bizuin = object.bizuin >>> 0;\n        if (object.modelStatus != null)\n            message.modelStatus = object.modelStatus >>> 0;\n        if (object.startTime != null)\n            message.startTime = object.startTime >>> 0;\n        if (object.endTime != null)\n            message.endTime = object.endTime >>> 0;\n        if (object.offset != null)\n            message.offset = object.offset >>> 0;\n        if (object.limit != null)\n            message.limit = object.limit >>> 0;\n        if (object.algoType != null)\n            message.algoType = object.algoType >>> 0;\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GetARModelListReq message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GetARModelListReq\n     * @static\n     * @param {GetARModelListReq} message GetARModelListReq\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GetARModelListReq.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.bizuin = 0;\n            object.modelStatus = 0;\n            object.startTime = 0;\n            object.endTime = 0;\n            object.offset = 0;\n            object.limit = 0;\n            object.algoType = 0;\n        }\n        if (message.bizuin != null && message.hasOwnProperty(\"bizuin\"))\n            object.bizuin = message.bizuin;\n        if (message.modelStatus != null && message.hasOwnProperty(\"modelStatus\"))\n            object.modelStatus = message.modelStatus;\n        if (message.startTime != null && message.hasOwnProperty(\"startTime\"))\n            object.startTime = message.startTime;\n        if (message.endTime != null && message.hasOwnProperty(\"endTime\"))\n            object.endTime = message.endTime;\n        if (message.offset != null && message.hasOwnProperty(\"offset\"))\n            object.offset = message.offset;\n        if (message.limit != null && message.hasOwnProperty(\"limit\"))\n            object.limit = message.limit;\n        if (message.algoType != null && message.hasOwnProperty(\"algoType\"))\n            object.algoType = message.algoType;\n        return object;\n    };\n\n    /**\n     * Converts this GetARModelListReq to JSON.\n     * @function toJSON\n     * @memberof GetARModelListReq\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GetARModelListReq.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GetARModelListReq;\n})();\n\n$root.GetARModelListResp = (function() {\n\n    /**\n     * Properties of a GetARModelListResp.\n     * @exports IGetARModelListResp\n     * @interface IGetARModelListResp\n     * @property {Array.<IARModel>|null} [modelList] GetARModelListResp modelList\n     */\n\n    /**\n     * Constructs a new GetARModelListResp.\n     * @exports GetARModelListResp\n     * @classdesc Represents a GetARModelListResp.\n     * @implements IGetARModelListResp\n     * @constructor\n     * @param {IGetARModelListResp=} [properties] Properties to set\n     */\n    function GetARModelListResp(properties) {\n        this.modelList = [];\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GetARModelListResp modelList.\n     * @member {Array.<IARModel>} modelList\n     * @memberof GetARModelListResp\n     * @instance\n     */\n    GetARModelListResp.prototype.modelList = $util.emptyArray;\n\n    /**\n     * Creates a new GetARModelListResp instance using the specified properties.\n     * @function create\n     * @memberof GetARModelListResp\n     * @static\n     * @param {IGetARModelListResp=} [properties] Properties to set\n     * @returns {GetARModelListResp} GetARModelListResp instance\n     */\n    GetARModelListResp.create = function create(properties) {\n        return new GetARModelListResp(properties);\n    };\n\n    /**\n     * Encodes the specified GetARModelListResp message. Does not implicitly {@link GetARModelListResp.verify|verify} messages.\n     * @function encode\n     * @memberof GetARModelListResp\n     * @static\n     * @param {IGetARModelListResp} message GetARModelListResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetARModelListResp.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.modelList != null && message.modelList.length)\n            for (var i = 0; i < message.modelList.length; ++i)\n                $root.ARModel.encode(message.modelList[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GetARModelListResp message, length delimited. Does not implicitly {@link GetARModelListResp.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GetARModelListResp\n     * @static\n     * @param {IGetARModelListResp} message GetARModelListResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetARModelListResp.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GetARModelListResp message from the specified reader or buffer.\n     * @function decode\n     * @memberof GetARModelListResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GetARModelListResp} GetARModelListResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetARModelListResp.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GetARModelListResp();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                if (!(message.modelList && message.modelList.length))\n                    message.modelList = [];\n                message.modelList.push($root.ARModel.decode(reader, reader.uint32()));\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GetARModelListResp message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GetARModelListResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GetARModelListResp} GetARModelListResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetARModelListResp.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GetARModelListResp message.\n     * @function verify\n     * @memberof GetARModelListResp\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GetARModelListResp.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.modelList != null && message.hasOwnProperty(\"modelList\")) {\n            if (!Array.isArray(message.modelList))\n                return \"modelList: array expected\";\n            for (var i = 0; i < message.modelList.length; ++i) {\n                var error = $root.ARModel.verify(message.modelList[i]);\n                if (error)\n                    return \"modelList.\" + error;\n            }\n        }\n        return null;\n    };\n\n    /**\n     * Creates a GetARModelListResp message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GetARModelListResp\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GetARModelListResp} GetARModelListResp\n     */\n    GetARModelListResp.fromObject = function fromObject(object) {\n        if (object instanceof $root.GetARModelListResp)\n            return object;\n        var message = new $root.GetARModelListResp();\n        if (object.modelList) {\n            if (!Array.isArray(object.modelList))\n                throw TypeError(\".GetARModelListResp.modelList: array expected\");\n            message.modelList = [];\n            for (var i = 0; i < object.modelList.length; ++i) {\n                if (typeof object.modelList[i] !== \"object\")\n                    throw TypeError(\".GetARModelListResp.modelList: object expected\");\n                message.modelList[i] = $root.ARModel.fromObject(object.modelList[i]);\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GetARModelListResp message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GetARModelListResp\n     * @static\n     * @param {GetARModelListResp} message GetARModelListResp\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GetARModelListResp.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.arrays || options.defaults)\n            object.modelList = [];\n        if (message.modelList && message.modelList.length) {\n            object.modelList = [];\n            for (var j = 0; j < message.modelList.length; ++j)\n                object.modelList[j] = $root.ARModel.toObject(message.modelList[j], options);\n        }\n        return object;\n    };\n\n    /**\n     * Converts this GetARModelListResp to JSON.\n     * @function toJSON\n     * @memberof GetARModelListResp\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GetARModelListResp.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GetARModelListResp;\n})();\n\n$root.GenerateARModelReq = (function() {\n\n    /**\n     * Properties of a GenerateARModelReq.\n     * @exports IGenerateARModelReq\n     * @interface IGenerateARModelReq\n     * @property {number|null} [bizuin] GenerateARModelReq bizuin\n     * @property {string|null} [name] GenerateARModelReq name\n     * @property {Uint8Array|null} [buffer] GenerateARModelReq buffer\n     * @property {string|null} [url] GenerateARModelReq url\n     * @property {enARAlgorithmType|null} [algoType] GenerateARModelReq algoType\n     * @property {number|null} [lod] GenerateARModelReq lod\n     * @property {boolean|null} [getmesh] GenerateARModelReq getmesh\n     * @property {boolean|null} [gettexture] GenerateARModelReq gettexture\n     */\n\n    /**\n     * Constructs a new GenerateARModelReq.\n     * @exports GenerateARModelReq\n     * @classdesc Represents a GenerateARModelReq.\n     * @implements IGenerateARModelReq\n     * @constructor\n     * @param {IGenerateARModelReq=} [properties] Properties to set\n     */\n    function GenerateARModelReq(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GenerateARModelReq bizuin.\n     * @member {number} bizuin\n     * @memberof GenerateARModelReq\n     * @instance\n     */\n    GenerateARModelReq.prototype.bizuin = 0;\n\n    /**\n     * GenerateARModelReq name.\n     * @member {string} name\n     * @memberof GenerateARModelReq\n     * @instance\n     */\n    GenerateARModelReq.prototype.name = \"\";\n\n    /**\n     * GenerateARModelReq buffer.\n     * @member {Uint8Array} buffer\n     * @memberof GenerateARModelReq\n     * @instance\n     */\n    GenerateARModelReq.prototype.buffer = $util.newBuffer([]);\n\n    /**\n     * GenerateARModelReq url.\n     * @member {string} url\n     * @memberof GenerateARModelReq\n     * @instance\n     */\n    GenerateARModelReq.prototype.url = \"\";\n\n    /**\n     * GenerateARModelReq algoType.\n     * @member {enARAlgorithmType} algoType\n     * @memberof GenerateARModelReq\n     * @instance\n     */\n    GenerateARModelReq.prototype.algoType = 1;\n\n    /**\n     * GenerateARModelReq lod.\n     * @member {number} lod\n     * @memberof GenerateARModelReq\n     * @instance\n     */\n    GenerateARModelReq.prototype.lod = 0;\n\n    /**\n     * GenerateARModelReq getmesh.\n     * @member {boolean} getmesh\n     * @memberof GenerateARModelReq\n     * @instance\n     */\n    GenerateARModelReq.prototype.getmesh = false;\n\n    /**\n     * GenerateARModelReq gettexture.\n     * @member {boolean} gettexture\n     * @memberof GenerateARModelReq\n     * @instance\n     */\n    GenerateARModelReq.prototype.gettexture = false;\n\n    /**\n     * Creates a new GenerateARModelReq instance using the specified properties.\n     * @function create\n     * @memberof GenerateARModelReq\n     * @static\n     * @param {IGenerateARModelReq=} [properties] Properties to set\n     * @returns {GenerateARModelReq} GenerateARModelReq instance\n     */\n    GenerateARModelReq.create = function create(properties) {\n        return new GenerateARModelReq(properties);\n    };\n\n    /**\n     * Encodes the specified GenerateARModelReq message. Does not implicitly {@link GenerateARModelReq.verify|verify} messages.\n     * @function encode\n     * @memberof GenerateARModelReq\n     * @static\n     * @param {IGenerateARModelReq} message GenerateARModelReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GenerateARModelReq.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.bizuin != null && Object.hasOwnProperty.call(message, \"bizuin\"))\n            writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.bizuin);\n        if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).string(message.name);\n        if (message.buffer != null && Object.hasOwnProperty.call(message, \"buffer\"))\n            writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.buffer);\n        if (message.url != null && Object.hasOwnProperty.call(message, \"url\"))\n            writer.uint32(/* id 4, wireType 2 =*/34).string(message.url);\n        if (message.algoType != null && Object.hasOwnProperty.call(message, \"algoType\"))\n            writer.uint32(/* id 5, wireType 0 =*/40).int32(message.algoType);\n        if (message.lod != null && Object.hasOwnProperty.call(message, \"lod\"))\n            writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.lod);\n        if (message.getmesh != null && Object.hasOwnProperty.call(message, \"getmesh\"))\n            writer.uint32(/* id 7, wireType 0 =*/56).bool(message.getmesh);\n        if (message.gettexture != null && Object.hasOwnProperty.call(message, \"gettexture\"))\n            writer.uint32(/* id 8, wireType 0 =*/64).bool(message.gettexture);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GenerateARModelReq message, length delimited. Does not implicitly {@link GenerateARModelReq.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GenerateARModelReq\n     * @static\n     * @param {IGenerateARModelReq} message GenerateARModelReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GenerateARModelReq.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GenerateARModelReq message from the specified reader or buffer.\n     * @function decode\n     * @memberof GenerateARModelReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GenerateARModelReq} GenerateARModelReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GenerateARModelReq.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GenerateARModelReq();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.bizuin = reader.uint32();\n                break;\n            case 2:\n                message.name = reader.string();\n                break;\n            case 3:\n                message.buffer = reader.bytes();\n                break;\n            case 4:\n                message.url = reader.string();\n                break;\n            case 5:\n                message.algoType = reader.int32();\n                break;\n            case 6:\n                message.lod = reader.uint32();\n                break;\n            case 7:\n                message.getmesh = reader.bool();\n                break;\n            case 8:\n                message.gettexture = reader.bool();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GenerateARModelReq message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GenerateARModelReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GenerateARModelReq} GenerateARModelReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GenerateARModelReq.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GenerateARModelReq message.\n     * @function verify\n     * @memberof GenerateARModelReq\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GenerateARModelReq.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.bizuin != null && message.hasOwnProperty(\"bizuin\"))\n            if (!$util.isInteger(message.bizuin))\n                return \"bizuin: integer expected\";\n        if (message.name != null && message.hasOwnProperty(\"name\"))\n            if (!$util.isString(message.name))\n                return \"name: string expected\";\n        if (message.buffer != null && message.hasOwnProperty(\"buffer\"))\n            if (!(message.buffer && typeof message.buffer.length === \"number\" || $util.isString(message.buffer)))\n                return \"buffer: buffer expected\";\n        if (message.url != null && message.hasOwnProperty(\"url\"))\n            if (!$util.isString(message.url))\n                return \"url: string expected\";\n        if (message.algoType != null && message.hasOwnProperty(\"algoType\"))\n            switch (message.algoType) {\n            default:\n                return \"algoType: enum value expected\";\n            case 1:\n            case 2:\n                break;\n            }\n        if (message.lod != null && message.hasOwnProperty(\"lod\"))\n            if (!$util.isInteger(message.lod))\n                return \"lod: integer expected\";\n        if (message.getmesh != null && message.hasOwnProperty(\"getmesh\"))\n            if (typeof message.getmesh !== \"boolean\")\n                return \"getmesh: boolean expected\";\n        if (message.gettexture != null && message.hasOwnProperty(\"gettexture\"))\n            if (typeof message.gettexture !== \"boolean\")\n                return \"gettexture: boolean expected\";\n        return null;\n    };\n\n    /**\n     * Creates a GenerateARModelReq message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GenerateARModelReq\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GenerateARModelReq} GenerateARModelReq\n     */\n    GenerateARModelReq.fromObject = function fromObject(object) {\n        if (object instanceof $root.GenerateARModelReq)\n            return object;\n        var message = new $root.GenerateARModelReq();\n        if (object.bizuin != null)\n            message.bizuin = object.bizuin >>> 0;\n        if (object.name != null)\n            message.name = String(object.name);\n        if (object.buffer != null)\n            if (typeof object.buffer === \"string\")\n                $util.base64.decode(object.buffer, message.buffer = $util.newBuffer($util.base64.length(object.buffer)), 0);\n            else if (object.buffer.length)\n                message.buffer = object.buffer;\n        if (object.url != null)\n            message.url = String(object.url);\n        switch (object.algoType) {\n        case \"Algorithm_Type_3D_Object\":\n        case 1:\n            message.algoType = 1;\n            break;\n        case \"Algorithm_Type_3D_Marker\":\n        case 2:\n            message.algoType = 2;\n            break;\n        }\n        if (object.lod != null)\n            message.lod = object.lod >>> 0;\n        if (object.getmesh != null)\n            message.getmesh = Boolean(object.getmesh);\n        if (object.gettexture != null)\n            message.gettexture = Boolean(object.gettexture);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GenerateARModelReq message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GenerateARModelReq\n     * @static\n     * @param {GenerateARModelReq} message GenerateARModelReq\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GenerateARModelReq.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.bizuin = 0;\n            object.name = \"\";\n            if (options.bytes === String)\n                object.buffer = \"\";\n            else {\n                object.buffer = [];\n                if (options.bytes !== Array)\n                    object.buffer = $util.newBuffer(object.buffer);\n            }\n            object.url = \"\";\n            object.algoType = options.enums === String ? \"Algorithm_Type_3D_Object\" : 1;\n            object.lod = 0;\n            object.getmesh = false;\n            object.gettexture = false;\n        }\n        if (message.bizuin != null && message.hasOwnProperty(\"bizuin\"))\n            object.bizuin = message.bizuin;\n        if (message.name != null && message.hasOwnProperty(\"name\"))\n            object.name = message.name;\n        if (message.buffer != null && message.hasOwnProperty(\"buffer\"))\n            object.buffer = options.bytes === String ? $util.base64.encode(message.buffer, 0, message.buffer.length) : options.bytes === Array ? Array.prototype.slice.call(message.buffer) : message.buffer;\n        if (message.url != null && message.hasOwnProperty(\"url\"))\n            object.url = message.url;\n        if (message.algoType != null && message.hasOwnProperty(\"algoType\"))\n            object.algoType = options.enums === String ? $root.enARAlgorithmType[message.algoType] : message.algoType;\n        if (message.lod != null && message.hasOwnProperty(\"lod\"))\n            object.lod = message.lod;\n        if (message.getmesh != null && message.hasOwnProperty(\"getmesh\"))\n            object.getmesh = message.getmesh;\n        if (message.gettexture != null && message.hasOwnProperty(\"gettexture\"))\n            object.gettexture = message.gettexture;\n        return object;\n    };\n\n    /**\n     * Converts this GenerateARModelReq to JSON.\n     * @function toJSON\n     * @memberof GenerateARModelReq\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GenerateARModelReq.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GenerateARModelReq;\n})();\n\n$root.GenerateARModelResp = (function() {\n\n    /**\n     * Properties of a GenerateARModelResp.\n     * @exports IGenerateARModelResp\n     * @interface IGenerateARModelResp\n     * @property {string|null} [url] GenerateARModelResp url\n     * @property {string|null} [host] GenerateARModelResp host\n     * @property {string|null} [cosid] GenerateARModelResp cosid\n     * @property {number|null} [lod] GenerateARModelResp lod\n     * @property {boolean|null} [getmesh] GenerateARModelResp getmesh\n     * @property {boolean|null} [gettexture] GenerateARModelResp gettexture\n     */\n\n    /**\n     * Constructs a new GenerateARModelResp.\n     * @exports GenerateARModelResp\n     * @classdesc Represents a GenerateARModelResp.\n     * @implements IGenerateARModelResp\n     * @constructor\n     * @param {IGenerateARModelResp=} [properties] Properties to set\n     */\n    function GenerateARModelResp(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GenerateARModelResp url.\n     * @member {string} url\n     * @memberof GenerateARModelResp\n     * @instance\n     */\n    GenerateARModelResp.prototype.url = \"\";\n\n    /**\n     * GenerateARModelResp host.\n     * @member {string} host\n     * @memberof GenerateARModelResp\n     * @instance\n     */\n    GenerateARModelResp.prototype.host = \"\";\n\n    /**\n     * GenerateARModelResp cosid.\n     * @member {string} cosid\n     * @memberof GenerateARModelResp\n     * @instance\n     */\n    GenerateARModelResp.prototype.cosid = \"\";\n\n    /**\n     * GenerateARModelResp lod.\n     * @member {number} lod\n     * @memberof GenerateARModelResp\n     * @instance\n     */\n    GenerateARModelResp.prototype.lod = 0;\n\n    /**\n     * GenerateARModelResp getmesh.\n     * @member {boolean} getmesh\n     * @memberof GenerateARModelResp\n     * @instance\n     */\n    GenerateARModelResp.prototype.getmesh = false;\n\n    /**\n     * GenerateARModelResp gettexture.\n     * @member {boolean} gettexture\n     * @memberof GenerateARModelResp\n     * @instance\n     */\n    GenerateARModelResp.prototype.gettexture = false;\n\n    /**\n     * Creates a new GenerateARModelResp instance using the specified properties.\n     * @function create\n     * @memberof GenerateARModelResp\n     * @static\n     * @param {IGenerateARModelResp=} [properties] Properties to set\n     * @returns {GenerateARModelResp} GenerateARModelResp instance\n     */\n    GenerateARModelResp.create = function create(properties) {\n        return new GenerateARModelResp(properties);\n    };\n\n    /**\n     * Encodes the specified GenerateARModelResp message. Does not implicitly {@link GenerateARModelResp.verify|verify} messages.\n     * @function encode\n     * @memberof GenerateARModelResp\n     * @static\n     * @param {IGenerateARModelResp} message GenerateARModelResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GenerateARModelResp.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.url != null && Object.hasOwnProperty.call(message, \"url\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).string(message.url);\n        if (message.host != null && Object.hasOwnProperty.call(message, \"host\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).string(message.host);\n        if (message.cosid != null && Object.hasOwnProperty.call(message, \"cosid\"))\n            writer.uint32(/* id 3, wireType 2 =*/26).string(message.cosid);\n        if (message.lod != null && Object.hasOwnProperty.call(message, \"lod\"))\n            writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.lod);\n        if (message.getmesh != null && Object.hasOwnProperty.call(message, \"getmesh\"))\n            writer.uint32(/* id 5, wireType 0 =*/40).bool(message.getmesh);\n        if (message.gettexture != null && Object.hasOwnProperty.call(message, \"gettexture\"))\n            writer.uint32(/* id 6, wireType 0 =*/48).bool(message.gettexture);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GenerateARModelResp message, length delimited. Does not implicitly {@link GenerateARModelResp.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GenerateARModelResp\n     * @static\n     * @param {IGenerateARModelResp} message GenerateARModelResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GenerateARModelResp.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GenerateARModelResp message from the specified reader or buffer.\n     * @function decode\n     * @memberof GenerateARModelResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GenerateARModelResp} GenerateARModelResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GenerateARModelResp.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GenerateARModelResp();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.url = reader.string();\n                break;\n            case 2:\n                message.host = reader.string();\n                break;\n            case 3:\n                message.cosid = reader.string();\n                break;\n            case 4:\n                message.lod = reader.uint32();\n                break;\n            case 5:\n                message.getmesh = reader.bool();\n                break;\n            case 6:\n                message.gettexture = reader.bool();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GenerateARModelResp message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GenerateARModelResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GenerateARModelResp} GenerateARModelResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GenerateARModelResp.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GenerateARModelResp message.\n     * @function verify\n     * @memberof GenerateARModelResp\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GenerateARModelResp.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.url != null && message.hasOwnProperty(\"url\"))\n            if (!$util.isString(message.url))\n                return \"url: string expected\";\n        if (message.host != null && message.hasOwnProperty(\"host\"))\n            if (!$util.isString(message.host))\n                return \"host: string expected\";\n        if (message.cosid != null && message.hasOwnProperty(\"cosid\"))\n            if (!$util.isString(message.cosid))\n                return \"cosid: string expected\";\n        if (message.lod != null && message.hasOwnProperty(\"lod\"))\n            if (!$util.isInteger(message.lod))\n                return \"lod: integer expected\";\n        if (message.getmesh != null && message.hasOwnProperty(\"getmesh\"))\n            if (typeof message.getmesh !== \"boolean\")\n                return \"getmesh: boolean expected\";\n        if (message.gettexture != null && message.hasOwnProperty(\"gettexture\"))\n            if (typeof message.gettexture !== \"boolean\")\n                return \"gettexture: boolean expected\";\n        return null;\n    };\n\n    /**\n     * Creates a GenerateARModelResp message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GenerateARModelResp\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GenerateARModelResp} GenerateARModelResp\n     */\n    GenerateARModelResp.fromObject = function fromObject(object) {\n        if (object instanceof $root.GenerateARModelResp)\n            return object;\n        var message = new $root.GenerateARModelResp();\n        if (object.url != null)\n            message.url = String(object.url);\n        if (object.host != null)\n            message.host = String(object.host);\n        if (object.cosid != null)\n            message.cosid = String(object.cosid);\n        if (object.lod != null)\n            message.lod = object.lod >>> 0;\n        if (object.getmesh != null)\n            message.getmesh = Boolean(object.getmesh);\n        if (object.gettexture != null)\n            message.gettexture = Boolean(object.gettexture);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GenerateARModelResp message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GenerateARModelResp\n     * @static\n     * @param {GenerateARModelResp} message GenerateARModelResp\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GenerateARModelResp.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.url = \"\";\n            object.host = \"\";\n            object.cosid = \"\";\n            object.lod = 0;\n            object.getmesh = false;\n            object.gettexture = false;\n        }\n        if (message.url != null && message.hasOwnProperty(\"url\"))\n            object.url = message.url;\n        if (message.host != null && message.hasOwnProperty(\"host\"))\n            object.host = message.host;\n        if (message.cosid != null && message.hasOwnProperty(\"cosid\"))\n            object.cosid = message.cosid;\n        if (message.lod != null && message.hasOwnProperty(\"lod\"))\n            object.lod = message.lod;\n        if (message.getmesh != null && message.hasOwnProperty(\"getmesh\"))\n            object.getmesh = message.getmesh;\n        if (message.gettexture != null && message.hasOwnProperty(\"gettexture\"))\n            object.gettexture = message.gettexture;\n        return object;\n    };\n\n    /**\n     * Converts this GenerateARModelResp to JSON.\n     * @function toJSON\n     * @memberof GenerateARModelResp\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GenerateARModelResp.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GenerateARModelResp;\n})();\n\n$root.ARModelData = (function() {\n\n    /**\n     * Properties of a ARModelData.\n     * @exports IARModelData\n     * @interface IARModelData\n     * @property {Uint8Array|null} [meshModel] ARModelData meshModel\n     * @property {Uint8Array|null} [textureModel] ARModelData textureModel\n     * @property {Uint8Array|null} [preview] ARModelData preview\n     * @property {Uint8Array|null} [meshBlob] ARModelData meshBlob\n     * @property {Uint8Array|null} [textureBlob] ARModelData textureBlob\n     */\n\n    /**\n     * Constructs a new ARModelData.\n     * @exports ARModelData\n     * @classdesc Represents a ARModelData.\n     * @implements IARModelData\n     * @constructor\n     * @param {IARModelData=} [properties] Properties to set\n     */\n    function ARModelData(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * ARModelData meshModel.\n     * @member {Uint8Array} meshModel\n     * @memberof ARModelData\n     * @instance\n     */\n    ARModelData.prototype.meshModel = $util.newBuffer([]);\n\n    /**\n     * ARModelData textureModel.\n     * @member {Uint8Array} textureModel\n     * @memberof ARModelData\n     * @instance\n     */\n    ARModelData.prototype.textureModel = $util.newBuffer([]);\n\n    /**\n     * ARModelData preview.\n     * @member {Uint8Array} preview\n     * @memberof ARModelData\n     * @instance\n     */\n    ARModelData.prototype.preview = $util.newBuffer([]);\n\n    /**\n     * ARModelData meshBlob.\n     * @member {Uint8Array} meshBlob\n     * @memberof ARModelData\n     * @instance\n     */\n    ARModelData.prototype.meshBlob = $util.newBuffer([]);\n\n    /**\n     * ARModelData textureBlob.\n     * @member {Uint8Array} textureBlob\n     * @memberof ARModelData\n     * @instance\n     */\n    ARModelData.prototype.textureBlob = $util.newBuffer([]);\n\n    /**\n     * Creates a new ARModelData instance using the specified properties.\n     * @function create\n     * @memberof ARModelData\n     * @static\n     * @param {IARModelData=} [properties] Properties to set\n     * @returns {ARModelData} ARModelData instance\n     */\n    ARModelData.create = function create(properties) {\n        return new ARModelData(properties);\n    };\n\n    /**\n     * Encodes the specified ARModelData message. Does not implicitly {@link ARModelData.verify|verify} messages.\n     * @function encode\n     * @memberof ARModelData\n     * @static\n     * @param {IARModelData} message ARModelData message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ARModelData.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.meshModel != null && Object.hasOwnProperty.call(message, \"meshModel\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.meshModel);\n        if (message.textureModel != null && Object.hasOwnProperty.call(message, \"textureModel\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.textureModel);\n        if (message.preview != null && Object.hasOwnProperty.call(message, \"preview\"))\n            writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.preview);\n        if (message.meshBlob != null && Object.hasOwnProperty.call(message, \"meshBlob\"))\n            writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.meshBlob);\n        if (message.textureBlob != null && Object.hasOwnProperty.call(message, \"textureBlob\"))\n            writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.textureBlob);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified ARModelData message, length delimited. Does not implicitly {@link ARModelData.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof ARModelData\n     * @static\n     * @param {IARModelData} message ARModelData message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ARModelData.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a ARModelData message from the specified reader or buffer.\n     * @function decode\n     * @memberof ARModelData\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {ARModelData} ARModelData\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ARModelData.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ARModelData();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.meshModel = reader.bytes();\n                break;\n            case 2:\n                message.textureModel = reader.bytes();\n                break;\n            case 3:\n                message.preview = reader.bytes();\n                break;\n            case 4:\n                message.meshBlob = reader.bytes();\n                break;\n            case 5:\n                message.textureBlob = reader.bytes();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a ARModelData message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof ARModelData\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {ARModelData} ARModelData\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ARModelData.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a ARModelData message.\n     * @function verify\n     * @memberof ARModelData\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    ARModelData.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.meshModel != null && message.hasOwnProperty(\"meshModel\"))\n            if (!(message.meshModel && typeof message.meshModel.length === \"number\" || $util.isString(message.meshModel)))\n                return \"meshModel: buffer expected\";\n        if (message.textureModel != null && message.hasOwnProperty(\"textureModel\"))\n            if (!(message.textureModel && typeof message.textureModel.length === \"number\" || $util.isString(message.textureModel)))\n                return \"textureModel: buffer expected\";\n        if (message.preview != null && message.hasOwnProperty(\"preview\"))\n            if (!(message.preview && typeof message.preview.length === \"number\" || $util.isString(message.preview)))\n                return \"preview: buffer expected\";\n        if (message.meshBlob != null && message.hasOwnProperty(\"meshBlob\"))\n            if (!(message.meshBlob && typeof message.meshBlob.length === \"number\" || $util.isString(message.meshBlob)))\n                return \"meshBlob: buffer expected\";\n        if (message.textureBlob != null && message.hasOwnProperty(\"textureBlob\"))\n            if (!(message.textureBlob && typeof message.textureBlob.length === \"number\" || $util.isString(message.textureBlob)))\n                return \"textureBlob: buffer expected\";\n        return null;\n    };\n\n    /**\n     * Creates a ARModelData message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof ARModelData\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {ARModelData} ARModelData\n     */\n    ARModelData.fromObject = function fromObject(object) {\n        if (object instanceof $root.ARModelData)\n            return object;\n        var message = new $root.ARModelData();\n        if (object.meshModel != null)\n            if (typeof object.meshModel === \"string\")\n                $util.base64.decode(object.meshModel, message.meshModel = $util.newBuffer($util.base64.length(object.meshModel)), 0);\n            else if (object.meshModel.length)\n                message.meshModel = object.meshModel;\n        if (object.textureModel != null)\n            if (typeof object.textureModel === \"string\")\n                $util.base64.decode(object.textureModel, message.textureModel = $util.newBuffer($util.base64.length(object.textureModel)), 0);\n            else if (object.textureModel.length)\n                message.textureModel = object.textureModel;\n        if (object.preview != null)\n            if (typeof object.preview === \"string\")\n                $util.base64.decode(object.preview, message.preview = $util.newBuffer($util.base64.length(object.preview)), 0);\n            else if (object.preview.length)\n                message.preview = object.preview;\n        if (object.meshBlob != null)\n            if (typeof object.meshBlob === \"string\")\n                $util.base64.decode(object.meshBlob, message.meshBlob = $util.newBuffer($util.base64.length(object.meshBlob)), 0);\n            else if (object.meshBlob.length)\n                message.meshBlob = object.meshBlob;\n        if (object.textureBlob != null)\n            if (typeof object.textureBlob === \"string\")\n                $util.base64.decode(object.textureBlob, message.textureBlob = $util.newBuffer($util.base64.length(object.textureBlob)), 0);\n            else if (object.textureBlob.length)\n                message.textureBlob = object.textureBlob;\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a ARModelData message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof ARModelData\n     * @static\n     * @param {ARModelData} message ARModelData\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    ARModelData.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            if (options.bytes === String)\n                object.meshModel = \"\";\n            else {\n                object.meshModel = [];\n                if (options.bytes !== Array)\n                    object.meshModel = $util.newBuffer(object.meshModel);\n            }\n            if (options.bytes === String)\n                object.textureModel = \"\";\n            else {\n                object.textureModel = [];\n                if (options.bytes !== Array)\n                    object.textureModel = $util.newBuffer(object.textureModel);\n            }\n            if (options.bytes === String)\n                object.preview = \"\";\n            else {\n                object.preview = [];\n                if (options.bytes !== Array)\n                    object.preview = $util.newBuffer(object.preview);\n            }\n            if (options.bytes === String)\n                object.meshBlob = \"\";\n            else {\n                object.meshBlob = [];\n                if (options.bytes !== Array)\n                    object.meshBlob = $util.newBuffer(object.meshBlob);\n            }\n            if (options.bytes === String)\n                object.textureBlob = \"\";\n            else {\n                object.textureBlob = [];\n                if (options.bytes !== Array)\n                    object.textureBlob = $util.newBuffer(object.textureBlob);\n            }\n        }\n        if (message.meshModel != null && message.hasOwnProperty(\"meshModel\"))\n            object.meshModel = options.bytes === String ? $util.base64.encode(message.meshModel, 0, message.meshModel.length) : options.bytes === Array ? Array.prototype.slice.call(message.meshModel) : message.meshModel;\n        if (message.textureModel != null && message.hasOwnProperty(\"textureModel\"))\n            object.textureModel = options.bytes === String ? $util.base64.encode(message.textureModel, 0, message.textureModel.length) : options.bytes === Array ? Array.prototype.slice.call(message.textureModel) : message.textureModel;\n        if (message.preview != null && message.hasOwnProperty(\"preview\"))\n            object.preview = options.bytes === String ? $util.base64.encode(message.preview, 0, message.preview.length) : options.bytes === Array ? Array.prototype.slice.call(message.preview) : message.preview;\n        if (message.meshBlob != null && message.hasOwnProperty(\"meshBlob\"))\n            object.meshBlob = options.bytes === String ? $util.base64.encode(message.meshBlob, 0, message.meshBlob.length) : options.bytes === Array ? Array.prototype.slice.call(message.meshBlob) : message.meshBlob;\n        if (message.textureBlob != null && message.hasOwnProperty(\"textureBlob\"))\n            object.textureBlob = options.bytes === String ? $util.base64.encode(message.textureBlob, 0, message.textureBlob.length) : options.bytes === Array ? Array.prototype.slice.call(message.textureBlob) : message.textureBlob;\n        return object;\n    };\n\n    /**\n     * Converts this ARModelData to JSON.\n     * @function toJSON\n     * @memberof ARModelData\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    ARModelData.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return ARModelData;\n})();\n\n$root.GetARModelReq = (function() {\n\n    /**\n     * Properties of a GetARModelReq.\n     * @exports IGetARModelReq\n     * @interface IGetARModelReq\n     * @property {number|null} [bizuin] GetARModelReq bizuin\n     * @property {string|null} [cosid] GetARModelReq cosid\n     * @property {number|null} [modelType] GetARModelReq modelType\n     * @property {number|null} [needData] GetARModelReq needData\n     * @property {number|null} [useIntranet] GetARModelReq useIntranet\n     * @property {number|null} [expireTime] GetARModelReq expireTime\n     */\n\n    /**\n     * Constructs a new GetARModelReq.\n     * @exports GetARModelReq\n     * @classdesc Represents a GetARModelReq.\n     * @implements IGetARModelReq\n     * @constructor\n     * @param {IGetARModelReq=} [properties] Properties to set\n     */\n    function GetARModelReq(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GetARModelReq bizuin.\n     * @member {number} bizuin\n     * @memberof GetARModelReq\n     * @instance\n     */\n    GetARModelReq.prototype.bizuin = 0;\n\n    /**\n     * GetARModelReq cosid.\n     * @member {string} cosid\n     * @memberof GetARModelReq\n     * @instance\n     */\n    GetARModelReq.prototype.cosid = \"\";\n\n    /**\n     * GetARModelReq modelType.\n     * @member {number} modelType\n     * @memberof GetARModelReq\n     * @instance\n     */\n    GetARModelReq.prototype.modelType = 0;\n\n    /**\n     * GetARModelReq needData.\n     * @member {number} needData\n     * @memberof GetARModelReq\n     * @instance\n     */\n    GetARModelReq.prototype.needData = 1;\n\n    /**\n     * GetARModelReq useIntranet.\n     * @member {number} useIntranet\n     * @memberof GetARModelReq\n     * @instance\n     */\n    GetARModelReq.prototype.useIntranet = 0;\n\n    /**\n     * GetARModelReq expireTime.\n     * @member {number} expireTime\n     * @memberof GetARModelReq\n     * @instance\n     */\n    GetARModelReq.prototype.expireTime = 0;\n\n    /**\n     * Creates a new GetARModelReq instance using the specified properties.\n     * @function create\n     * @memberof GetARModelReq\n     * @static\n     * @param {IGetARModelReq=} [properties] Properties to set\n     * @returns {GetARModelReq} GetARModelReq instance\n     */\n    GetARModelReq.create = function create(properties) {\n        return new GetARModelReq(properties);\n    };\n\n    /**\n     * Encodes the specified GetARModelReq message. Does not implicitly {@link GetARModelReq.verify|verify} messages.\n     * @function encode\n     * @memberof GetARModelReq\n     * @static\n     * @param {IGetARModelReq} message GetARModelReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetARModelReq.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.bizuin != null && Object.hasOwnProperty.call(message, \"bizuin\"))\n            writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.bizuin);\n        if (message.cosid != null && Object.hasOwnProperty.call(message, \"cosid\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).string(message.cosid);\n        if (message.modelType != null && Object.hasOwnProperty.call(message, \"modelType\"))\n            writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.modelType);\n        if (message.needData != null && Object.hasOwnProperty.call(message, \"needData\"))\n            writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.needData);\n        if (message.useIntranet != null && Object.hasOwnProperty.call(message, \"useIntranet\"))\n            writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.useIntranet);\n        if (message.expireTime != null && Object.hasOwnProperty.call(message, \"expireTime\"))\n            writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.expireTime);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GetARModelReq message, length delimited. Does not implicitly {@link GetARModelReq.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GetARModelReq\n     * @static\n     * @param {IGetARModelReq} message GetARModelReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetARModelReq.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GetARModelReq message from the specified reader or buffer.\n     * @function decode\n     * @memberof GetARModelReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GetARModelReq} GetARModelReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetARModelReq.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GetARModelReq();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.bizuin = reader.uint32();\n                break;\n            case 2:\n                message.cosid = reader.string();\n                break;\n            case 3:\n                message.modelType = reader.uint32();\n                break;\n            case 4:\n                message.needData = reader.uint32();\n                break;\n            case 5:\n                message.useIntranet = reader.uint32();\n                break;\n            case 6:\n                message.expireTime = reader.uint32();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GetARModelReq message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GetARModelReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GetARModelReq} GetARModelReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetARModelReq.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GetARModelReq message.\n     * @function verify\n     * @memberof GetARModelReq\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GetARModelReq.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.bizuin != null && message.hasOwnProperty(\"bizuin\"))\n            if (!$util.isInteger(message.bizuin))\n                return \"bizuin: integer expected\";\n        if (message.cosid != null && message.hasOwnProperty(\"cosid\"))\n            if (!$util.isString(message.cosid))\n                return \"cosid: string expected\";\n        if (message.modelType != null && message.hasOwnProperty(\"modelType\"))\n            if (!$util.isInteger(message.modelType))\n                return \"modelType: integer expected\";\n        if (message.needData != null && message.hasOwnProperty(\"needData\"))\n            if (!$util.isInteger(message.needData))\n                return \"needData: integer expected\";\n        if (message.useIntranet != null && message.hasOwnProperty(\"useIntranet\"))\n            if (!$util.isInteger(message.useIntranet))\n                return \"useIntranet: integer expected\";\n        if (message.expireTime != null && message.hasOwnProperty(\"expireTime\"))\n            if (!$util.isInteger(message.expireTime))\n                return \"expireTime: integer expected\";\n        return null;\n    };\n\n    /**\n     * Creates a GetARModelReq message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GetARModelReq\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GetARModelReq} GetARModelReq\n     */\n    GetARModelReq.fromObject = function fromObject(object) {\n        if (object instanceof $root.GetARModelReq)\n            return object;\n        var message = new $root.GetARModelReq();\n        if (object.bizuin != null)\n            message.bizuin = object.bizuin >>> 0;\n        if (object.cosid != null)\n            message.cosid = String(object.cosid);\n        if (object.modelType != null)\n            message.modelType = object.modelType >>> 0;\n        if (object.needData != null)\n            message.needData = object.needData >>> 0;\n        if (object.useIntranet != null)\n            message.useIntranet = object.useIntranet >>> 0;\n        if (object.expireTime != null)\n            message.expireTime = object.expireTime >>> 0;\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GetARModelReq message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GetARModelReq\n     * @static\n     * @param {GetARModelReq} message GetARModelReq\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GetARModelReq.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.bizuin = 0;\n            object.cosid = \"\";\n            object.modelType = 0;\n            object.needData = 1;\n            object.useIntranet = 0;\n            object.expireTime = 0;\n        }\n        if (message.bizuin != null && message.hasOwnProperty(\"bizuin\"))\n            object.bizuin = message.bizuin;\n        if (message.cosid != null && message.hasOwnProperty(\"cosid\"))\n            object.cosid = message.cosid;\n        if (message.modelType != null && message.hasOwnProperty(\"modelType\"))\n            object.modelType = message.modelType;\n        if (message.needData != null && message.hasOwnProperty(\"needData\"))\n            object.needData = message.needData;\n        if (message.useIntranet != null && message.hasOwnProperty(\"useIntranet\"))\n            object.useIntranet = message.useIntranet;\n        if (message.expireTime != null && message.hasOwnProperty(\"expireTime\"))\n            object.expireTime = message.expireTime;\n        return object;\n    };\n\n    /**\n     * Converts this GetARModelReq to JSON.\n     * @function toJSON\n     * @memberof GetARModelReq\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GetARModelReq.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GetARModelReq;\n})();\n\n$root.GetARModelResp = (function() {\n\n    /**\n     * Properties of a GetARModelResp.\n     * @exports IGetARModelResp\n     * @interface IGetARModelResp\n     * @property {IARModelData|null} [modelData] GetARModelResp modelData\n     * @property {string|null} [url] GetARModelResp url\n     * @property {string|null} [host] GetARModelResp host\n     * @property {string|null} [errMsg] GetARModelResp errMsg\n     * @property {number|null} [expireTime] GetARModelResp expireTime\n     * @property {number|null} [status] GetARModelResp status\n     */\n\n    /**\n     * Constructs a new GetARModelResp.\n     * @exports GetARModelResp\n     * @classdesc Represents a GetARModelResp.\n     * @implements IGetARModelResp\n     * @constructor\n     * @param {IGetARModelResp=} [properties] Properties to set\n     */\n    function GetARModelResp(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GetARModelResp modelData.\n     * @member {IARModelData|null|undefined} modelData\n     * @memberof GetARModelResp\n     * @instance\n     */\n    GetARModelResp.prototype.modelData = null;\n\n    /**\n     * GetARModelResp url.\n     * @member {string} url\n     * @memberof GetARModelResp\n     * @instance\n     */\n    GetARModelResp.prototype.url = \"\";\n\n    /**\n     * GetARModelResp host.\n     * @member {string} host\n     * @memberof GetARModelResp\n     * @instance\n     */\n    GetARModelResp.prototype.host = \"\";\n\n    /**\n     * GetARModelResp errMsg.\n     * @member {string} errMsg\n     * @memberof GetARModelResp\n     * @instance\n     */\n    GetARModelResp.prototype.errMsg = \"\";\n\n    /**\n     * GetARModelResp expireTime.\n     * @member {number} expireTime\n     * @memberof GetARModelResp\n     * @instance\n     */\n    GetARModelResp.prototype.expireTime = 0;\n\n    /**\n     * GetARModelResp status.\n     * @member {number} status\n     * @memberof GetARModelResp\n     * @instance\n     */\n    GetARModelResp.prototype.status = 0;\n\n    /**\n     * Creates a new GetARModelResp instance using the specified properties.\n     * @function create\n     * @memberof GetARModelResp\n     * @static\n     * @param {IGetARModelResp=} [properties] Properties to set\n     * @returns {GetARModelResp} GetARModelResp instance\n     */\n    GetARModelResp.create = function create(properties) {\n        return new GetARModelResp(properties);\n    };\n\n    /**\n     * Encodes the specified GetARModelResp message. Does not implicitly {@link GetARModelResp.verify|verify} messages.\n     * @function encode\n     * @memberof GetARModelResp\n     * @static\n     * @param {IGetARModelResp} message GetARModelResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetARModelResp.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.modelData != null && Object.hasOwnProperty.call(message, \"modelData\"))\n            $root.ARModelData.encode(message.modelData, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n        if (message.url != null && Object.hasOwnProperty.call(message, \"url\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).string(message.url);\n        if (message.host != null && Object.hasOwnProperty.call(message, \"host\"))\n            writer.uint32(/* id 3, wireType 2 =*/26).string(message.host);\n        if (message.errMsg != null && Object.hasOwnProperty.call(message, \"errMsg\"))\n            writer.uint32(/* id 4, wireType 2 =*/34).string(message.errMsg);\n        if (message.expireTime != null && Object.hasOwnProperty.call(message, \"expireTime\"))\n            writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.expireTime);\n        if (message.status != null && Object.hasOwnProperty.call(message, \"status\"))\n            writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.status);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GetARModelResp message, length delimited. Does not implicitly {@link GetARModelResp.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GetARModelResp\n     * @static\n     * @param {IGetARModelResp} message GetARModelResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetARModelResp.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GetARModelResp message from the specified reader or buffer.\n     * @function decode\n     * @memberof GetARModelResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GetARModelResp} GetARModelResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetARModelResp.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GetARModelResp();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.modelData = $root.ARModelData.decode(reader, reader.uint32());\n                break;\n            case 2:\n                message.url = reader.string();\n                break;\n            case 3:\n                message.host = reader.string();\n                break;\n            case 4:\n                message.errMsg = reader.string();\n                break;\n            case 5:\n                message.expireTime = reader.uint32();\n                break;\n            case 6:\n                message.status = reader.uint32();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GetARModelResp message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GetARModelResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GetARModelResp} GetARModelResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetARModelResp.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GetARModelResp message.\n     * @function verify\n     * @memberof GetARModelResp\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GetARModelResp.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.modelData != null && message.hasOwnProperty(\"modelData\")) {\n            var error = $root.ARModelData.verify(message.modelData);\n            if (error)\n                return \"modelData.\" + error;\n        }\n        if (message.url != null && message.hasOwnProperty(\"url\"))\n            if (!$util.isString(message.url))\n                return \"url: string expected\";\n        if (message.host != null && message.hasOwnProperty(\"host\"))\n            if (!$util.isString(message.host))\n                return \"host: string expected\";\n        if (message.errMsg != null && message.hasOwnProperty(\"errMsg\"))\n            if (!$util.isString(message.errMsg))\n                return \"errMsg: string expected\";\n        if (message.expireTime != null && message.hasOwnProperty(\"expireTime\"))\n            if (!$util.isInteger(message.expireTime))\n                return \"expireTime: integer expected\";\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            if (!$util.isInteger(message.status))\n                return \"status: integer expected\";\n        return null;\n    };\n\n    /**\n     * Creates a GetARModelResp message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GetARModelResp\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GetARModelResp} GetARModelResp\n     */\n    GetARModelResp.fromObject = function fromObject(object) {\n        if (object instanceof $root.GetARModelResp)\n            return object;\n        var message = new $root.GetARModelResp();\n        if (object.modelData != null) {\n            if (typeof object.modelData !== \"object\")\n                throw TypeError(\".GetARModelResp.modelData: object expected\");\n            message.modelData = $root.ARModelData.fromObject(object.modelData);\n        }\n        if (object.url != null)\n            message.url = String(object.url);\n        if (object.host != null)\n            message.host = String(object.host);\n        if (object.errMsg != null)\n            message.errMsg = String(object.errMsg);\n        if (object.expireTime != null)\n            message.expireTime = object.expireTime >>> 0;\n        if (object.status != null)\n            message.status = object.status >>> 0;\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GetARModelResp message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GetARModelResp\n     * @static\n     * @param {GetARModelResp} message GetARModelResp\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GetARModelResp.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.modelData = null;\n            object.url = \"\";\n            object.host = \"\";\n            object.errMsg = \"\";\n            object.expireTime = 0;\n            object.status = 0;\n        }\n        if (message.modelData != null && message.hasOwnProperty(\"modelData\"))\n            object.modelData = $root.ARModelData.toObject(message.modelData, options);\n        if (message.url != null && message.hasOwnProperty(\"url\"))\n            object.url = message.url;\n        if (message.host != null && message.hasOwnProperty(\"host\"))\n            object.host = message.host;\n        if (message.errMsg != null && message.hasOwnProperty(\"errMsg\"))\n            object.errMsg = message.errMsg;\n        if (message.expireTime != null && message.hasOwnProperty(\"expireTime\"))\n            object.expireTime = message.expireTime;\n        if (message.status != null && message.hasOwnProperty(\"status\"))\n            object.status = message.status;\n        return object;\n    };\n\n    /**\n     * Converts this GetARModelResp to JSON.\n     * @function toJSON\n     * @memberof GetARModelResp\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GetARModelResp.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GetARModelResp;\n})();\n\nmodule.exports = $root;\n"
  },
  {
    "path": "cloudfunctions/ARDemo/svrkit-utils.static.json",
    "content": "{\n  \"nested\": {\n    \"enARModelStatus\": {\n      \"values\": {\n        \"ARModel_Status_Default\": 0,\n        \"ARModel_Status_Init\": 1,\n        \"ARModel_Status_Sparse_Finished\": 2,\n        \"ARModel_Status_3d_Finished\": 3,\n        \"ARModel_Status_Object_Finished\": 4,\n        \"ARModel_Status_Marker_Finished\": 5,\n        \"ARModel_Status_Fail\": 100\n      }\n    },\n    \"enARAlgorithmType\": {\n      \"values\": {\n        \"Algorithm_Type_3D_Object\": 1,\n        \"Algorithm_Type_3D_Marker\": 2\n      }\n    },\n    \"enARModelType\": {\n      \"values\": {\n        \"ARModel_Type_Sparse\": 1,\n        \"ARModel_Type_3D\": 2,\n        \"ARModel_Type_Marker\": 3\n      }\n    },\n    \"ModelCos\": {\n      \"fields\": {\n        \"modelList\": {\n          \"rule\": \"repeated\",\n          \"type\": \"ModelCosId\",\n          \"id\": 1\n        }\n      },\n      \"nested\": {\n        \"ModelCosId\": {\n          \"fields\": {\n            \"modelType\": {\n              \"type\": \"enARModelType\",\n              \"id\": 1\n            },\n            \"modelCosid\": {\n              \"type\": \"string\",\n              \"id\": 2\n            },\n            \"errmsg\": {\n              \"type\": \"string\",\n              \"id\": 3\n            }\n          }\n        }\n      }\n    },\n    \"ARModel\": {\n      \"options\": {\n        \"(mmbizintpkv.KvTableTestID)\": 916\n      },\n      \"fields\": {\n        \"cosid\": {\n          \"type\": \"string\",\n          \"id\": 1\n        },\n        \"bizuin\": {\n          \"type\": \"uint32\",\n          \"id\": 2\n        },\n        \"name\": {\n          \"type\": \"string\",\n          \"id\": 3\n        },\n        \"uploadTime\": {\n          \"type\": \"uint32\",\n          \"id\": 4\n        },\n        \"modelStatus\": {\n          \"type\": \"enARModelStatus\",\n          \"id\": 5\n        },\n        \"algoType\": {\n          \"type\": \"enARAlgorithmType\",\n          \"id\": 6\n        },\n        \"modelCos\": {\n          \"type\": \"ModelCos\",\n          \"id\": 7\n        }\n      }\n    },\n    \"GetARModelListReq\": {\n      \"fields\": {\n        \"bizuin\": {\n          \"type\": \"uint32\",\n          \"id\": 1\n        },\n        \"modelStatus\": {\n          \"type\": \"uint32\",\n          \"id\": 2\n        },\n        \"startTime\": {\n          \"type\": \"uint32\",\n          \"id\": 3\n        },\n        \"endTime\": {\n          \"type\": \"uint32\",\n          \"id\": 4\n        },\n        \"offset\": {\n          \"type\": \"uint32\",\n          \"id\": 5\n        },\n        \"limit\": {\n          \"type\": \"uint32\",\n          \"id\": 6\n        },\n        \"algoType\": {\n          \"type\": \"uint32\",\n          \"id\": 7\n        }\n      }\n    },\n    \"GetARModelListResp\": {\n      \"fields\": {\n        \"modelList\": {\n          \"rule\": \"repeated\",\n          \"type\": \"ARModel\",\n          \"id\": 1\n        }\n      }\n    },\n    \"GenerateARModelReq\": {\n      \"fields\": {\n        \"bizuin\": {\n          \"type\": \"uint32\",\n          \"id\": 1\n        },\n        \"name\": {\n          \"type\": \"string\",\n          \"id\": 2\n        },\n        \"buffer\": {\n          \"type\": \"bytes\",\n          \"id\": 3\n        },\n        \"url\": {\n          \"type\": \"string\",\n          \"id\": 4\n        },\n        \"algoType\": {\n          \"type\": \"enARAlgorithmType\",\n          \"id\": 5\n        },\n        \"lod\": {\n          \"type\": \"uint32\",\n          \"id\": 6,\n          \"options\": {\n            \"default\": 0\n          }\n        },\n        \"getmesh\": {\n          \"type\": \"bool\",\n          \"id\": 7,\n          \"options\": {\n            \"default\": false\n          }\n        },\n        \"gettexture\": {\n          \"type\": \"bool\",\n          \"id\": 8,\n          \"options\": {\n            \"default\": false\n          }\n        }\n      }\n    },\n    \"GenerateARModelResp\": {\n      \"fields\": {\n        \"url\": {\n          \"type\": \"string\",\n          \"id\": 1\n        },\n        \"host\": {\n          \"type\": \"string\",\n          \"id\": 2\n        },\n        \"cosid\": {\n          \"type\": \"string\",\n          \"id\": 3\n        },\n        \"lod\": {\n          \"type\": \"uint32\",\n          \"id\": 4,\n          \"options\": {\n            \"default\": 0\n          }\n        },\n        \"getmesh\": {\n          \"type\": \"bool\",\n          \"id\": 5,\n          \"options\": {\n            \"default\": false\n          }\n        },\n        \"gettexture\": {\n          \"type\": \"bool\",\n          \"id\": 6,\n          \"options\": {\n            \"default\": false\n          }\n        }\n      }\n    },\n    \"ARModelData\": {\n      \"fields\": {\n        \"meshModel\": {\n          \"type\": \"bytes\",\n          \"id\": 1\n        },\n        \"textureModel\": {\n          \"type\": \"bytes\",\n          \"id\": 2\n        },\n        \"preview\": {\n          \"type\": \"bytes\",\n          \"id\": 3\n        },\n        \"meshBlob\": {\n          \"type\": \"bytes\",\n          \"id\": 4\n        },\n        \"textureBlob\": {\n          \"type\": \"bytes\",\n          \"id\": 5\n        }\n      }\n    },\n    \"GetARModelReq\": {\n      \"fields\": {\n        \"bizuin\": {\n          \"type\": \"uint32\",\n          \"id\": 1\n        },\n        \"cosid\": {\n          \"type\": \"string\",\n          \"id\": 2\n        },\n        \"modelType\": {\n          \"type\": \"uint32\",\n          \"id\": 3\n        },\n        \"needData\": {\n          \"type\": \"uint32\",\n          \"id\": 4,\n          \"options\": {\n            \"default\": 1\n          }\n        },\n        \"useIntranet\": {\n          \"type\": \"uint32\",\n          \"id\": 5,\n          \"options\": {\n            \"default\": 0\n          }\n        },\n        \"expireTime\": {\n          \"type\": \"uint32\",\n          \"id\": 6\n        }\n      }\n    },\n    \"GetARModelResp\": {\n      \"fields\": {\n        \"modelData\": {\n          \"type\": \"ARModelData\",\n          \"id\": 1\n        },\n        \"url\": {\n          \"type\": \"string\",\n          \"id\": 2\n        },\n        \"host\": {\n          \"type\": \"string\",\n          \"id\": 3\n        },\n        \"errMsg\": {\n          \"type\": \"string\",\n          \"id\": 4\n        },\n        \"expireTime\": {\n          \"type\": \"uint32\",\n          \"id\": 5\n        },\n        \"status\": {\n          \"type\": \"uint32\",\n          \"id\": 6\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "cloudfunctions/ARDemo/svrkit.config.js",
    "content": "// 模块导出一个数组，每个元素是一个模块配置项\nmodule.exports = [\n  {\n    // 模块对应的 proto 文件相对于该文件的路径\n    proto: './proto/mmbizwxaintparDemo.proto',\n    // 模块 service name\n    serviceName: 'Mmbizwxaintpar',\n    // 模块 magic 数字\n    magic: 11081,\n    // 模块导出的接口方法\n    functions: {\n      // 接口名字及其对应的接口调用信息\n      GenerateARModel: {\n        // 接口的 cmdid\n        cmdid: 1,\n        // 接口的 request 对应的 protobuf message 名字，需在 proto 文件中定义\n        req: 'GenerateARModelReq',\n        // 接口的 response 对应的 protobuf message 名字，需在 proto 文件中定义\n        res: 'GenerateARModelResp',\n      },\n      // 接口的名字及其对应的接口调用信息\n      GetARModelList: {\n        cmdid: 3,\n        req: 'GetARModelListReq',\n        res: 'GetARModelListResp',\n      },\n      GetARModel: {\n        cmdid: 4,\n        req: 'GetARModelReq',\n        res: 'GetARModelResp',\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "cloudfunctions/ARDemo/wx-server-sdk-wxg-service/CHANGELOG.md",
    "content": "## 0.6.0\n\n1. `A` 新增 `callWXSvrkit` 支持传入 `headuin` 和 `routeMethod`\n\n## 0.2.0\n\n1. `A` 新增 `callTencentInnerAPI` 内部接口\n\n## 0.1.0\n\n1. `A` 新增 `callWXSvrkit` 内部接口\n2. `A` 新增 `callWXInnerAPI` 内部接口\n"
  },
  {
    "path": "cloudfunctions/ARDemo/wx-server-sdk-wxg-service/LICENSE",
    "content": "\nMIT License\n\nCopyright (c) 2018 wechat-miniprogram\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "cloudfunctions/ARDemo/wx-server-sdk-wxg-service/index.js",
    "content": "module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = \"./src/api/inner/index.ts\");\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./src/api/inner/api/api.ts\":\n/*!**********************************!*\\\n  !*** ./src/api/inner/api/api.ts ***!\n  \\**********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getAPIs = void 0;\nconst callWXInnerAPI_1 = __webpack_require__(/*! ./callWXInnerAPI */ \"./src/api/inner/api/callWXInnerAPI.ts\");\nconst callWXSvrkit_1 = __webpack_require__(/*! ./callWXSvrkit */ \"./src/api/inner/api/callWXSvrkit.ts\");\nconst callSvrkit_1 = __webpack_require__(/*! ./callSvrkit */ \"./src/api/inner/api/callSvrkit.ts\");\nconst callTencentInnerAPI_1 = __webpack_require__(/*! ./callTencentInnerAPI */ \"./src/api/inner/api/callTencentInnerAPI.ts\");\nfunction getAPIs(cloud) {\n    return {\n        callWXInnerAPI: callWXInnerAPI_1.default(cloud),\n        callWXSvrkit: callWXSvrkit_1.default(cloud),\n        callSvrkit: callSvrkit_1.default(cloud),\n        callTencentInnerAPI: callTencentInnerAPI_1.default(cloud),\n    };\n}\nexports.getAPIs = getAPIs;\n\n\n/***/ }),\n\n/***/ \"./src/api/inner/api/callSvrkit.ts\":\n/*!*****************************************!*\\\n  !*** ./src/api/inner/api/callSvrkit.ts ***!\n  \\*****************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// @deprecated kainniu api\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst error_1 = __webpack_require__(/*! utils/error */ \"./src/utils/error.ts\");\nconst msg_1 = __webpack_require__(/*! utils/msg */ \"./src/utils/msg.ts\");\nconst openapi_1 = __webpack_require__(/*! ../../../protobuf/openapi */ \"./src/protobuf/openapi.js\");\nconst error_config_1 = __webpack_require__(/*! config/error.config */ \"./src/config/error.config.ts\");\nconst API_NAME = 'callSvrkit';\nfunction getCallSvrkit(cloud) {\n    return function callSvrkit(options) {\n        return new Promise(async (resolve, reject) => {\n            if (!options) {\n                return reject(error_1.returnAsFinalCloudSDKError({\n                    errMsg: 'Params for callSvrkit must be an object instead of ' + typeof options,\n                }, API_NAME));\n            }\n            try {\n                if (!options.pbInstance) {\n                    throw new Error('pbInstance must be provided');\n                }\n            }\n            catch (e) {\n                return reject(error_1.returnAsFinalCloudSDKError(e, API_NAME));\n            }\n            try {\n                const svrkitData = {\n                    apiName: options.pbInstance.data.apiName,\n                    reqData: options.pbInstance.data.reqBodyBuffer,\n                };\n                const pbMessage = openapi_1.CommApiData.encode({\n                    apiType: openapi_1.CommApiData.ApiType.SVRKIT_API,\n                    svrkitData,\n                }).finish();\n                const wxResp = await cloud.provider.api.callWXOpenAPI({\n                    api: API_NAME,\n                    data: Buffer.from(pbMessage),\n                }, {\n                    instance: cloud.instance,\n                });\n                let svrkitResponse;\n                let svrkitResponseBuffer;\n                let svrkitErrCode = 0;\n                if (wxResp) {\n                    if (wxResp.errorCode) {\n                        // wx system error, for example: no permission\n                        throw new error_1.CloudSDKError({\n                            errCode: error_config_1.ERR_CODE[error_config_1.ERR_CODE[wxResp.errorCode]] || wxResp.errorCode,\n                            errMsg: `${error_config_1.ERR_CODE[error_config_1.ERR_CODE.WX_SYSTEM_ERROR]}: error code: ${wxResp.errorCode}`\n                        });\n                    }\n                    else {\n                        svrkitErrCode = wxResp.svrkitErrorCode;\n                        if (wxResp.svrkitErrorCode !== 0) {\n                            throw {\n                                errCode: error_config_1.ERR_CODE.WX_SYSTEM_ERROR,\n                                errMsg: `internal svrkit error, code ${wxResp.svrkitErrorCode}`,\n                            };\n                        }\n                        if (!wxResp.respData) {\n                            throw {\n                                errCode: error_config_1.ERR_CODE.WX_SYSTEM_ERROR,\n                                errMsg: `internal svrkit error, empty respData`,\n                            };\n                        }\n                        svrkitResponseBuffer = wxResp.respData;\n                        const pbRespMsg = options.pbInstance.resProto.decode(wxResp.respData);\n                        if (options.convertResp && options.convertResp.bytes === false) {\n                            if (!options.pbInstance.resProto) {\n                                throw new Error('please ensure \\'pbInstance\\' is generated using @tencent/cloud-functions-tools whose version is greater or equal to 1.3.0');\n                            }\n                            svrkitResponse = options.pbInstance.resProto.toObject(pbRespMsg, {\n                                long: String\n                            });\n                        }\n                        else {\n                            svrkitResponse = pbRespMsg.toJSON();\n                        }\n                    }\n                }\n                resolve({\n                    svrkitErrCode,\n                    svrkitResponse,\n                    svrkitResponseBuffer,\n                    errMsg: msg_1.apiSuccessMsg(API_NAME),\n                    errCode: 0,\n                });\n            }\n            catch (e) {\n                const error = error_1.returnAsFinalCloudSDKError(e, API_NAME);\n                return reject(error);\n            }\n        });\n    };\n}\nexports.default = getCallSvrkit;\n\n\n/***/ }),\n\n/***/ \"./src/api/inner/api/callTencentInnerAPI.ts\":\n/*!**************************************************!*\\\n  !*** ./src/api/inner/api/callTencentInnerAPI.ts ***!\n  \\**************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst assert_1 = __webpack_require__(/*! utils/assert */ \"./src/utils/assert.ts\");\nconst error_1 = __webpack_require__(/*! utils/error */ \"./src/utils/error.ts\");\nconst msg_1 = __webpack_require__(/*! utils/msg */ \"./src/utils/msg.ts\");\nconst openapi_1 = __webpack_require__(/*! ../../../protobuf/openapi */ \"./src/protobuf/openapi.js\");\nconst error_config_1 = __webpack_require__(/*! config/error.config */ \"./src/config/error.config.ts\");\nconst utils_1 = __webpack_require__(/*! utils/utils */ \"./src/utils/utils.ts\");\nconst getHTTPMethodNumber = (method) => {\n    switch (method.toLowerCase()) {\n        case 'get': {\n            return openapi_1.HTTP_METHODS.HTTP_GET;\n        }\n        case 'post': {\n            return openapi_1.HTTP_METHODS.HTTP_POST;\n        }\n        case 'put': {\n            return openapi_1.HTTP_METHODS.HTTP_PUT;\n        }\n        case 'patch': {\n            return openapi_1.HTTP_METHODS.HTTP_PATCH;\n        }\n        case 'head': {\n            return openapi_1.HTTP_METHODS.HTTP_HEAD;\n        }\n        case 'delete': {\n            return openapi_1.HTTP_METHODS.HTTP_DELETE;\n        }\n        default: {\n            throw new Error(`unsupported HTTP method ${method}`);\n        }\n    }\n};\nconst API_NAME = 'callTencentInnerAPI';\nfunction getCallTencentInnerAPI(cloud) {\n    return function callTencentInnerAPI(options) {\n        const apiName = 'callTencentInnerAPI';\n        return new Promise(async (resolve, reject) => {\n            if (!options) {\n                return reject(error_1.returnAsFinalCloudSDKError({\n                    errMsg: 'Params for callTencentInnerAPI must be an object instead of ' + typeof options,\n                }, apiName));\n            }\n            try {\n                assert_1.assertType(options, {\n                    modid: 'number',\n                    cmdid: 'number',\n                    path: 'string',\n                    method: 'string',\n                });\n                if (options.headers) {\n                    assert_1.assertType(options, {\n                        headers: 'object',\n                    });\n                }\n            }\n            catch (e) {\n                return reject(error_1.returnAsFinalCloudSDKError(e, apiName));\n            }\n            try {\n                const innerData = {\n                    modid: options.modid,\n                    cmdid: options.cmdid,\n                    url: options.path,\n                    method: getHTTPMethodNumber(options.method),\n                    useHttps: options.https,\n                    headers: [],\n                };\n                if (options.headers) {\n                    for (const key in options.headers) {\n                        innerData.headers.push(`${key.toLowerCase()}: ${options.headers[key]}`);\n                    }\n                }\n                if (options.body) {\n                    // @ts-ignore\n                    innerData.body = Buffer.from(options.body);\n                }\n                const pbMessage = openapi_1.CommApiData.encode({\n                    apiType: openapi_1.CommApiData.ApiType.INNER_API,\n                    innerData,\n                }).finish();\n                const wxResp = await cloud.provider.api.callWXOpenAPI({\n                    api: API_NAME,\n                    data: Buffer.from(pbMessage),\n                }, {\n                    // this is the new protocol\n                    instance: cloud.instance,\n                    // @deprecated\n                    // the following 2 lines are deprecated, for compatibility only\n                    // to be deleted.\n                    defaultConfig: utils_1.getServiceConfigFromDefaultConfig(cloud.config),\n                    apiConfig: options.config,\n                    // @ts-ignore\n                    version: options.apiVersion || 'v2',\n                });\n                let body;\n                let contentType = '';\n                let statusCode;\n                let rawHeaders = [];\n                let err;\n                if (wxResp) {\n                    if (options.autoParse) {\n                        if (/application\\/json/.test(wxResp.contentType)) {\n                            // json response\n                            try {\n                                body = JSON.parse(wxResp.respData.toString());\n                            }\n                            catch (parseWXRespJSONError) {\n                                // wx server says it's a json but instead it is not a valid json\n                                throw new error_1.CloudSDKError({\n                                    errCode: error_config_1.ERR_CODE.WX_SYSTEM_ERROR,\n                                    errMsg: msg_1.apiFailMsg(API_NAME, `response body is not a valid json: ${wxResp.respData.toString()}`)\n                                });\n                            }\n                        }\n                        else if (/text\\/plain/.test(wxResp.contentType)) {\n                            // text response\n                            body = wxResp.respData.toString();\n                        }\n                    }\n                    if (!body) {\n                        // buffer body\n                        body = wxResp.respData;\n                    }\n                    if (wxResp.contentType) {\n                        contentType = wxResp.contentType.trim();\n                    }\n                    if (wxResp.httpCode) {\n                        statusCode = wxResp.httpCode;\n                    }\n                    if (wxResp.headers) {\n                        // @ts-ignore\n                        rawHeaders = wxResp.headers;\n                    }\n                }\n                else {\n                    throw {\n                        errCode: error_config_1.ERR_CODE.WX_SYSTEM_ERROR,\n                        errMsg: `internal server error, empty resp buffer`,\n                    };\n                }\n                if (err) {\n                    reject(err);\n                    return;\n                }\n                resolve({\n                    body,\n                    contentType,\n                    statusCode,\n                    rawHeaders,\n                    errMsg: msg_1.apiSuccessMsg(API_NAME),\n                    errCode: 0,\n                });\n            }\n            catch (e) {\n                const error = error_1.returnAsFinalCloudSDKError(e, apiName);\n                return reject(error);\n            }\n        });\n    };\n}\nexports.default = getCallTencentInnerAPI;\n\n\n/***/ }),\n\n/***/ \"./src/api/inner/api/callWXInnerAPI.ts\":\n/*!*********************************************!*\\\n  !*** ./src/api/inner/api/callWXInnerAPI.ts ***!\n  \\*********************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst assert_1 = __webpack_require__(/*! utils/assert */ \"./src/utils/assert.ts\");\nconst error_1 = __webpack_require__(/*! utils/error */ \"./src/utils/error.ts\");\nconst msg_1 = __webpack_require__(/*! utils/msg */ \"./src/utils/msg.ts\");\nfunction getCallWXInnerAPI(cloud) {\n    return function callWXInnerAPI(options) {\n        const apiName = 'callWXInnerAPI';\n        return new Promise(async (resolve, reject) => {\n            if (!options) {\n                return reject(error_1.returnAsFinalCloudSDKError({\n                    errMsg: 'Params for callWXInnerAPI must be an object instead of ' + typeof options,\n                }, apiName));\n            }\n            try {\n                assert_1.assertType(options, {\n                    cmdid: 'number'\n                });\n            }\n            catch (e) {\n                return reject(error_1.returnAsFinalCloudSDKError(e, apiName));\n            }\n            try {\n                const result = await cloud.getAPIs().callOpenAPI({\n                    api: '/inner/wxtransfer',\n                    data: {\n                        cmdid: options.cmdid,\n                        req_data: JSON.stringify(options.data || {}),\n                    },\n                    config: options.config,\n                });\n                let parsedResult = result.result;\n                try {\n                    if (typeof parsedResult === 'string') {\n                        parsedResult = JSON.parse(parsedResult);\n                    }\n                }\n                catch (_) {\n                    // no nothing\n                }\n                return resolve({\n                    result: parsedResult,\n                    errMsg: msg_1.apiSuccessMsg(apiName),\n                });\n            }\n            catch (e) {\n                const error = error_1.returnAsFinalCloudSDKError(e, apiName);\n                return reject(error);\n            }\n        });\n    };\n}\nexports.default = getCallWXInnerAPI;\n\n\n/***/ }),\n\n/***/ \"./src/api/inner/api/callWXSvrkit.ts\":\n/*!*******************************************!*\\\n  !*** ./src/api/inner/api/callWXSvrkit.ts ***!\n  \\*******************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst assert_1 = __webpack_require__(/*! utils/assert */ \"./src/utils/assert.ts\");\nconst error_1 = __webpack_require__(/*! utils/error */ \"./src/utils/error.ts\");\nconst msg_1 = __webpack_require__(/*! utils/msg */ \"./src/utils/msg.ts\");\nfunction getCallWXSvrkit(cloud) {\n    return function callWXSvrkit(options) {\n        const apiName = 'callWXSvrkit';\n        return new Promise(async (resolve, reject) => {\n            if (!options) {\n                return reject(error_1.returnAsFinalCloudSDKError({\n                    errMsg: 'Params for callWXSvrkit must be an object instead of ' + typeof options,\n                }, apiName));\n            }\n            const pbInstance = options.pbInstance;\n            if (pbInstance) {\n                options = Object.assign(Object.assign({}, options), pbInstance.data);\n                delete options.pbInstance;\n            }\n            try {\n                assert_1.assertType(options, {\n                    serviceName: 'string',\n                    funcName: 'string',\n                    magic: 'number',\n                    cmdid: 'number',\n                });\n            }\n            catch (e) {\n                return reject(error_1.returnAsFinalCloudSDKError(e, apiName));\n            }\n            try {\n                const result = await cloud.getAPIs().callOpenAPI({\n                    api: '/inner/svrkitclientcall',\n                    data: {\n                        req_body_buffer: options.reqBodyBuffer.toString('base64'),\n                        service_name: options.serviceName,\n                        func_name: options.funcName,\n                        magic: options.magic,\n                        cmdid: options.cmdid,\n                        headuin: options.headuin,\n                        route_method: options.routeMethod,\n                        idc_route_method: options.idcRouteMethod,\n                        exist_resp: options.existResp,\n                    },\n                    config: options.config,\n                    timeout: options.timeout,\n                    retryOptions: options.retryOptions,\n                });\n                // @ts-ignore\n                let parsedResult = result.result;\n                if (parsedResult.baseresponse && parsedResult.baseresponse.errcode !== 0) {\n                    parsedResult.ret = parsedResult.baseresponse.errcode;\n                }\n                if (parsedResult.ret === 0) {\n                    parsedResult.respBodyBuffer = Buffer.from(parsedResult.resp_body_buffer, 'base64');\n                    delete parsedResult.resp_body_buffer;\n                    if (pbInstance && options.existResp) {\n                        const pbRespMsg = pbInstance.decode(parsedResult.respBodyBuffer);\n                        if (options.convertResp && options.convertResp.bytes === false) {\n                            if (!pbInstance.resProto) {\n                                throw new Error('please ensure \\'pbInstance\\' is generated using @tencent/cloud-functions-tools whose version is greater or equal to 1.3.0');\n                            }\n                            parsedResult.respBody = pbInstance.resProto.toObject(pbRespMsg, {\n                                long: String\n                            });\n                        }\n                        else {\n                            parsedResult.respBody = pbRespMsg.toJSON();\n                        }\n                    }\n                }\n                const returnValue = {\n                    ret: parsedResult.ret,\n                    result: parsedResult.result,\n                    respBodyBuffer: parsedResult.respBodyBuffer,\n                    respBody: parsedResult.respBody,\n                    errMsg: msg_1.apiSuccessMsg(apiName),\n                };\n                resolve(returnValue);\n            }\n            catch (e) {\n                const error = error_1.returnAsFinalCloudSDKError(e, apiName);\n                return reject(error);\n            }\n        });\n    };\n}\nexports.default = getCallWXSvrkit;\n\n\n/***/ }),\n\n/***/ \"./src/api/inner/index.ts\":\n/*!********************************!*\\\n  !*** ./src/api/inner/index.ts ***!\n  \\********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createService = exports.SERVICE_NAME = void 0;\nconst api_1 = __webpack_require__(/*! ./api/api */ \"./src/api/inner/api/api.ts\");\nexports.SERVICE_NAME = 'inner';\nfunction createService(cloud) {\n    return {\n        name: exports.SERVICE_NAME,\n        getAPIs: api_1.getAPIs.bind(null, cloud),\n    };\n}\nexports.createService = createService;\nexports.default = createService;\n\n\n/***/ }),\n\n/***/ \"./src/api/utils/api/signature.ts\":\n/*!****************************************!*\\\n  !*** ./src/api/utils/api/signature.ts ***!\n  \\****************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MidasSignature = exports.signature = void 0;\nconst crypto = __webpack_require__(/*! crypto */ \"crypto\");\nconst utils_1 = __webpack_require__(/*! utils/utils */ \"./src/utils/utils.ts\");\nfunction signature(options) {\n    switch (options.type) {\n        case 'midas': {\n            return new MidasSignature(options);\n        }\n    }\n}\nexports.signature = signature;\nclass MidasSignature {\n    constructor(options) {\n        this.type = 'midas';\n        if (!options.params || !Array.isArray(options.params)) {\n            throw new Error('options.params must be a string array');\n        }\n        if (!options.secret) {\n            throw new Error('options.secret must be provided');\n        }\n        this.params = options.params;\n        this.secret = options.secret;\n    }\n    compute(cgiPath, method, secret, paramValues) {\n        // sort params by ascii\n        const paramNames = [...this.params].sort().map(name => utils_1.convertCase(name, {\n            from: 'camelcase',\n            to: 'snakecase',\n        }));\n        // get params string\n        const paramStr = paramNames.map(paramName => {\n            if (!paramValues.hasOwnProperty(paramName)) {\n                throw new Error(`Cannot compute signature: lack of param '${paramName}'`);\n            }\n            return `${paramName}=${paramValues[paramName]}`;\n        }).join('&');\n        // concatenate params string, cgi path, and midas secret\n        const signSource = paramStr + `&org_loc=${cgiPath}&method=${method}&secret=${secret}`;\n        // sign\n        const signature = crypto.createHmac('sha256', secret).update(signSource).digest('hex');\n        return signature;\n    }\n}\nexports.MidasSignature = MidasSignature;\nexports.default = signature;\n\n\n/***/ }),\n\n/***/ \"./src/config/error.config.ts\":\n/*!************************************!*\\\n  !*** ./src/config/error.config.ts ***!\n  \\************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TCB_ERR_CODE = exports.ERR_CODE = void 0;\nexports.ERR_CODE = {\n    '-1': 'unknown error',\n    UNKNOWN_ERROR: -1,\n    // 以 6 开始的是由微信服务器侧产生的错误码\n    // 以 5 开始的是由腾讯云侧产生的错误码\n    // 以 4 开始的是本地 SDK 产生的错误\n    // 接下来两位表示具体业务类型：01通用，02数据库，03文件，04云函数\n    // 最后三位表示具体的错误\n    // 小程序 SDK 云函数\n    '-404001': 'empty call result',\n    SDK_FUNCTIONS_EMPTY_CALL_RESULT: -404001,\n    '-404002': 'empty event id',\n    SDK_FUNCTIONS_EMPTY_EVENT_ID: -404002,\n    '-404003': 'empty poll url',\n    SDK_FUNCTIONS_EMPTY_POLL_URL: -404003,\n    '-404004': 'empty poll result json',\n    SDK_FUNCTIONS_EMPTY_POLL_RESULT_JSON: -404004,\n    '-404005': 'exceed max poll retry',\n    SDK_FUNCTIONS_EXCEED_MAX_POLL_RETRY: -404005,\n    '-404006': 'empty poll result base resp',\n    SDK_FUNCTIONS_EMPTY_POLL_RESULT_BASE_RESP: -404006,\n    '-404007': 'error while polling for the result, poll result base resp ret %s',\n    SDK_FUNCTIONS_POLL_RESULT_BASE_RESP_RET_ABNORMAL: -404007,\n    '-404008': 'error while polling for the result, polling server return a status code of %s',\n    SDK_FUNCTIONS_POLL_RESULT_STATUS_CODE_ERROR: -404008,\n    '-404009': 'error while polling for the result: %s',\n    SDK_FUNCTIONS_POLL_ERROR: -404009,\n    // 微信服务器\n    '-601001': 'system error',\n    WX_SYSTEM_ERROR: -601001,\n    '-601002': 'system args error',\n    WX_SYSTEM_ARGS_ERROR: -601002,\n    '-601003': 'system network error',\n    WX_SYSTEM_NETWORK_ERROR: -601003,\n    '-601004': 'api permission denied',\n    WX_API_PERMISSION_DENIED: -601004,\n    '-601005': 'invalid cloudID',\n    WX_INVALID_CLOUDID: -601005,\n    '-601006': 'cloudID expired',\n    WX_CLOUDID_EXPIRED: -601006,\n    '-601007': 'cloudID and calling user does not match',\n    WX_CLOUDID_USER_NOT_MATCH: -601007,\n    '-601008': 'server-side request timedout',\n    WX_SERVER_REQUEST_TIMEOUT: -601008,\n    '-601009': 'missing mobile phone',\n    WX_MISSING_MOBILE_PHONE: -601009,\n    '-601010': 'no write permission',\n    WX_NO_WRITE_PERMISSION: -601010,\n    '-601011': 'no privilege permission',\n    WX_NO_PRIVILEGE_PERMISSION: -601011,\n    '-601012': 'unauthorized env',\n    WX_UNAUTHORIZED_ENV: -601012,\n    '-601013': 'no multiend permission',\n    WX_NO_MULTIEND_PERMISSION: -601013,\n    '-601015': 'access denied (cloudfunction cloudbase_auth returns empty errCode)',\n    WX_CLOUDBASE_AUTH_RETURN_EMPTY_ERRCODE: -601015,\n    '-601016': 'missing env auth info',\n    WX_MISSING_ENV_AUTH_INFO: -601016,\n    '-601017': 'access denied (cloudbase_auth returns non-zero errCode)',\n    WX_CLOUDBASE_AUTH_RETURN_NON_ZERO_ERRCODE: -601017,\n    '-602018': 'unauthorized API',\n    WX_UNAUTHORIZED_API: -601018,\n    '-602001': 'database query result size exceed limit (1MB)',\n    WX_DATABASE_QUERY_SIZE_EXCEED_LIMIT: -602001,\n    '-604001': 'cloudfunction result size exceed limit (1MB)',\n    WX_CLOUDFUNCTION_RESULT_SIZE_EXCEED_LIMIT: -604001,\n    '-604100': 'API not found',\n    WX_FUNCTIONS_SERVER_OPENAPI_NOT_FOUND: -604100,\n    '-604101': 'function has no permission to call this API',\n    WX_FUNCTIONS_SERVER_OPENAPI_NO_PERMISSION: -604101,\n    '-604102': 'call open API timeout',\n    WX_FUNCTIONS_SERVER_OPENAPI_TIMEOUT: -604102,\n    '-604103': 'call open API system error',\n    WX_FUNCTIONS_SERVER_OPENAPI_SYSTEM_ERROR: -604103,\n    '-604104': 'illegal source of invocation',\n    WX_FUNCTIONS_SERVER_OPENAPI_ILLEGAL_INVOCATION_SOURCE: -604104,\n    // 腾讯云通用\n    '-501001': 'resource system error',\n    TCB_RESOURCE_SYSTEM_ERROR: -501001,\n    '-501002': 'resource server timeout',\n    TCB_RESOURCE_SERVER_TIMEOUT: -501002,\n    '-501003': 'exceed request limit',\n    TCB_EXCEED_REQUEST_LIMIT: -501003,\n    '-501004': 'exceed concurrent request limit',\n    TCB_EXCEED_CONCURRENT_REQUEST_LIMIT: -501004,\n    '-501005': 'invalid env',\n    TCB_INVALID_ENV: -501005,\n    '-501006': 'invalid common parameters',\n    TCB_INVALID_COMMON_PARAM: -501006,\n    '-501007': 'invalid parameters',\n    TCB_INVALID_PARAM: -501007,\n    '-501008': 'invalid request source',\n    TCB_INVALID_REQUEST_SOURCE: -501008,\n    '-501009': 'resource not initialized',\n    TCB_RESOURCE_NOT_INITIALIZED: -501009,\n    // 腾讯云数据库\n    '-502001': 'database request fail',\n    TCB_DB_REQUEST_FAIL: -502001,\n    '-502002': 'database invalid command',\n    TCB_DB_INVALID_COMMAND: -502002,\n    '-502003': 'database permission denied',\n    TCB_DB_PERMISSION_DENIED: -502003,\n    '-502004': 'database exceed collection limit',\n    TCB_DB_EXCEED_COLLECTION_LIMIT: -502004,\n    '-502005': 'database collection not exists',\n    TCB_DB_COLLECTION_NOT_EXISTS: -502005,\n    // 腾讯云文件管理\n    '-503001': 'storage request fail',\n    TCB_STORAGE_REQUEST_FAIL: -503001,\n    '-503002': 'storage permission denied',\n    TCB_STORAGE_PERMISSION_DENIED: -503002,\n    '-503003': 'storage file not exists',\n    TCB_STORAGE_FILE_NOT_EXISTS: -503003,\n    '-503004': 'storage invalid sign parameter',\n    TCB_STORAGE_INVALID_SIGN_PARAM: -503004,\n    // 腾讯云云函数\n    '-504001': 'functions request fail',\n    TCB_FUNCTIONS_REQUEST_FAIL: -504001,\n    '-504002': 'functions execute fail',\n    TCB_FUNCTIONS_EXEC_FAIL: -504002,\n};\nexports.TCB_ERR_CODE = {\n    // 通用\n    SUCCESS: 0,\n    SYS_ERR: -501001,\n    SERVER_TIMEOUT: -501002,\n    EXCEED_REQUEST_LIMIT: -501003,\n    EXCEED_CONCURRENT_REQUEST_LIMIT: -501004,\n    INVALIID_ENV: -501005,\n    INVALID_COMMON_PARAM: -501006,\n    INVALID_PARAM: -501007,\n    INVALID_REQUEST_SOURCE: -501008,\n    RESOURCE_NOT_INITIAL: -501009,\n    // 数据库\n    DATABASE_REQUEST_FAILED: -502001,\n    DATABASE_INVALID_OPERRATOR: -502002,\n    DATABASE_PERMISSION_DENIED: -502003,\n    DATABASE_COLLECTION_EXCEED_LIMIT: -502004,\n    DATABASE_COLLECTION_NOT_EXIST: -502005,\n    // 文件\n    STORAGE_REQUEST_FAIL: -503001,\n    STORAGE_EXCEED_AUTHORITY: -503002,\n    STORAGE_FILE_NONEXIST: -503003,\n    STORAGE_SIGN_PARAM_INVALID: -503004,\n    // 云函数\n    FUNCTIONS_REQUEST_FAIL: -504001,\n    FUNCTIONS_EXECUTE_FAIL: -504002,\n};\n\n\n/***/ }),\n\n/***/ \"./src/protobuf/openapi.js\":\n/*!*********************************!*\\\n  !*** ./src/protobuf/openapi.js ***!\n  \\*********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\n\n\nvar $protobuf = __webpack_require__(/*! protobufjs/minimal */ \"protobufjs/minimal\");\n\n// Common aliases\nvar $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\n\n// Exported root namespace\nvar $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n\n$root.KeyValuePair = (function() {\n\n    /**\n     * Properties of a KeyValuePair.\n     * @exports IKeyValuePair\n     * @interface IKeyValuePair\n     * @property {string|null} [key] KeyValuePair key\n     * @property {Uint8Array|null} [value] KeyValuePair value\n     * @property {string|null} [contenttype] KeyValuePair contenttype\n     * @property {string|null} [filename] KeyValuePair filename\n     */\n\n    /**\n     * Constructs a new KeyValuePair.\n     * @exports KeyValuePair\n     * @classdesc Represents a KeyValuePair.\n     * @implements IKeyValuePair\n     * @constructor\n     * @param {IKeyValuePair=} [properties] Properties to set\n     */\n    function KeyValuePair(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * KeyValuePair key.\n     * @member {string} key\n     * @memberof KeyValuePair\n     * @instance\n     */\n    KeyValuePair.prototype.key = \"\";\n\n    /**\n     * KeyValuePair value.\n     * @member {Uint8Array} value\n     * @memberof KeyValuePair\n     * @instance\n     */\n    KeyValuePair.prototype.value = $util.newBuffer([]);\n\n    /**\n     * KeyValuePair contenttype.\n     * @member {string} contenttype\n     * @memberof KeyValuePair\n     * @instance\n     */\n    KeyValuePair.prototype.contenttype = \"\";\n\n    /**\n     * KeyValuePair filename.\n     * @member {string} filename\n     * @memberof KeyValuePair\n     * @instance\n     */\n    KeyValuePair.prototype.filename = \"\";\n\n    /**\n     * Creates a new KeyValuePair instance using the specified properties.\n     * @function create\n     * @memberof KeyValuePair\n     * @static\n     * @param {IKeyValuePair=} [properties] Properties to set\n     * @returns {KeyValuePair} KeyValuePair instance\n     */\n    KeyValuePair.create = function create(properties) {\n        return new KeyValuePair(properties);\n    };\n\n    /**\n     * Encodes the specified KeyValuePair message. Does not implicitly {@link KeyValuePair.verify|verify} messages.\n     * @function encode\n     * @memberof KeyValuePair\n     * @static\n     * @param {IKeyValuePair} message KeyValuePair message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    KeyValuePair.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.key != null && message.hasOwnProperty(\"key\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).string(message.key);\n        if (message.value != null && message.hasOwnProperty(\"value\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.value);\n        if (message.contenttype != null && message.hasOwnProperty(\"contenttype\"))\n            writer.uint32(/* id 3, wireType 2 =*/26).string(message.contenttype);\n        if (message.filename != null && message.hasOwnProperty(\"filename\"))\n            writer.uint32(/* id 4, wireType 2 =*/34).string(message.filename);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified KeyValuePair message, length delimited. Does not implicitly {@link KeyValuePair.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof KeyValuePair\n     * @static\n     * @param {IKeyValuePair} message KeyValuePair message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    KeyValuePair.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a KeyValuePair message from the specified reader or buffer.\n     * @function decode\n     * @memberof KeyValuePair\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {KeyValuePair} KeyValuePair\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    KeyValuePair.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.KeyValuePair();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.key = reader.string();\n                break;\n            case 2:\n                message.value = reader.bytes();\n                break;\n            case 3:\n                message.contenttype = reader.string();\n                break;\n            case 4:\n                message.filename = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a KeyValuePair message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof KeyValuePair\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {KeyValuePair} KeyValuePair\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    KeyValuePair.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a KeyValuePair message.\n     * @function verify\n     * @memberof KeyValuePair\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    KeyValuePair.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.key != null && message.hasOwnProperty(\"key\"))\n            if (!$util.isString(message.key))\n                return \"key: string expected\";\n        if (message.value != null && message.hasOwnProperty(\"value\"))\n            if (!(message.value && typeof message.value.length === \"number\" || $util.isString(message.value)))\n                return \"value: buffer expected\";\n        if (message.contenttype != null && message.hasOwnProperty(\"contenttype\"))\n            if (!$util.isString(message.contenttype))\n                return \"contenttype: string expected\";\n        if (message.filename != null && message.hasOwnProperty(\"filename\"))\n            if (!$util.isString(message.filename))\n                return \"filename: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates a KeyValuePair message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof KeyValuePair\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {KeyValuePair} KeyValuePair\n     */\n    KeyValuePair.fromObject = function fromObject(object) {\n        if (object instanceof $root.KeyValuePair)\n            return object;\n        var message = new $root.KeyValuePair();\n        if (object.key != null)\n            message.key = String(object.key);\n        if (object.value != null)\n            if (typeof object.value === \"string\")\n                $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);\n            else if (object.value.length)\n                message.value = object.value;\n        if (object.contenttype != null)\n            message.contenttype = String(object.contenttype);\n        if (object.filename != null)\n            message.filename = String(object.filename);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a KeyValuePair message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof KeyValuePair\n     * @static\n     * @param {KeyValuePair} message KeyValuePair\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    KeyValuePair.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.key = \"\";\n            if (options.bytes === String)\n                object.value = \"\";\n            else {\n                object.value = [];\n                if (options.bytes !== Array)\n                    object.value = $util.newBuffer(object.value);\n            }\n            object.contenttype = \"\";\n            object.filename = \"\";\n        }\n        if (message.key != null && message.hasOwnProperty(\"key\"))\n            object.key = message.key;\n        if (message.value != null && message.hasOwnProperty(\"value\"))\n            object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;\n        if (message.contenttype != null && message.hasOwnProperty(\"contenttype\"))\n            object.contenttype = message.contenttype;\n        if (message.filename != null && message.hasOwnProperty(\"filename\"))\n            object.filename = message.filename;\n        return object;\n    };\n\n    /**\n     * Converts this KeyValuePair to JSON.\n     * @function toJSON\n     * @memberof KeyValuePair\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    KeyValuePair.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return KeyValuePair;\n})();\n\n$root.OpenApiData = (function() {\n\n    /**\n     * Properties of an OpenApiData.\n     * @exports IOpenApiData\n     * @interface IOpenApiData\n     * @property {Array.<IKeyValuePair>|null} [pairs] OpenApiData pairs\n     */\n\n    /**\n     * Constructs a new OpenApiData.\n     * @exports OpenApiData\n     * @classdesc Represents an OpenApiData.\n     * @implements IOpenApiData\n     * @constructor\n     * @param {IOpenApiData=} [properties] Properties to set\n     */\n    function OpenApiData(properties) {\n        this.pairs = [];\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * OpenApiData pairs.\n     * @member {Array.<IKeyValuePair>} pairs\n     * @memberof OpenApiData\n     * @instance\n     */\n    OpenApiData.prototype.pairs = $util.emptyArray;\n\n    /**\n     * Creates a new OpenApiData instance using the specified properties.\n     * @function create\n     * @memberof OpenApiData\n     * @static\n     * @param {IOpenApiData=} [properties] Properties to set\n     * @returns {OpenApiData} OpenApiData instance\n     */\n    OpenApiData.create = function create(properties) {\n        return new OpenApiData(properties);\n    };\n\n    /**\n     * Encodes the specified OpenApiData message. Does not implicitly {@link OpenApiData.verify|verify} messages.\n     * @function encode\n     * @memberof OpenApiData\n     * @static\n     * @param {IOpenApiData} message OpenApiData message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    OpenApiData.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.pairs != null && message.pairs.length)\n            for (var i = 0; i < message.pairs.length; ++i)\n                $root.KeyValuePair.encode(message.pairs[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n        return writer;\n    };\n\n    /**\n     * Encodes the specified OpenApiData message, length delimited. Does not implicitly {@link OpenApiData.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof OpenApiData\n     * @static\n     * @param {IOpenApiData} message OpenApiData message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    OpenApiData.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes an OpenApiData message from the specified reader or buffer.\n     * @function decode\n     * @memberof OpenApiData\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {OpenApiData} OpenApiData\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    OpenApiData.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.OpenApiData();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                if (!(message.pairs && message.pairs.length))\n                    message.pairs = [];\n                message.pairs.push($root.KeyValuePair.decode(reader, reader.uint32()));\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes an OpenApiData message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof OpenApiData\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {OpenApiData} OpenApiData\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    OpenApiData.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies an OpenApiData message.\n     * @function verify\n     * @memberof OpenApiData\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    OpenApiData.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.pairs != null && message.hasOwnProperty(\"pairs\")) {\n            if (!Array.isArray(message.pairs))\n                return \"pairs: array expected\";\n            for (var i = 0; i < message.pairs.length; ++i) {\n                var error = $root.KeyValuePair.verify(message.pairs[i]);\n                if (error)\n                    return \"pairs.\" + error;\n            }\n        }\n        return null;\n    };\n\n    /**\n     * Creates an OpenApiData message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof OpenApiData\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {OpenApiData} OpenApiData\n     */\n    OpenApiData.fromObject = function fromObject(object) {\n        if (object instanceof $root.OpenApiData)\n            return object;\n        var message = new $root.OpenApiData();\n        if (object.pairs) {\n            if (!Array.isArray(object.pairs))\n                throw TypeError(\".OpenApiData.pairs: array expected\");\n            message.pairs = [];\n            for (var i = 0; i < object.pairs.length; ++i) {\n                if (typeof object.pairs[i] !== \"object\")\n                    throw TypeError(\".OpenApiData.pairs: object expected\");\n                message.pairs[i] = $root.KeyValuePair.fromObject(object.pairs[i]);\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Creates a plain object from an OpenApiData message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof OpenApiData\n     * @static\n     * @param {OpenApiData} message OpenApiData\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    OpenApiData.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.arrays || options.defaults)\n            object.pairs = [];\n        if (message.pairs && message.pairs.length) {\n            object.pairs = [];\n            for (var j = 0; j < message.pairs.length; ++j)\n                object.pairs[j] = $root.KeyValuePair.toObject(message.pairs[j], options);\n        }\n        return object;\n    };\n\n    /**\n     * Converts this OpenApiData to JSON.\n     * @function toJSON\n     * @memberof OpenApiData\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    OpenApiData.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return OpenApiData;\n})();\n\n$root.TokenApiData = (function() {\n\n    /**\n     * Properties of a TokenApiData.\n     * @exports ITokenApiData\n     * @interface ITokenApiData\n     * @property {string|null} [resourceAppid] TokenApiData resourceAppid\n     * @property {string|null} [resourceEnv] TokenApiData resourceEnv\n     */\n\n    /**\n     * Constructs a new TokenApiData.\n     * @exports TokenApiData\n     * @classdesc Represents a TokenApiData.\n     * @implements ITokenApiData\n     * @constructor\n     * @param {ITokenApiData=} [properties] Properties to set\n     */\n    function TokenApiData(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * TokenApiData resourceAppid.\n     * @member {string} resourceAppid\n     * @memberof TokenApiData\n     * @instance\n     */\n    TokenApiData.prototype.resourceAppid = \"\";\n\n    /**\n     * TokenApiData resourceEnv.\n     * @member {string} resourceEnv\n     * @memberof TokenApiData\n     * @instance\n     */\n    TokenApiData.prototype.resourceEnv = \"\";\n\n    /**\n     * Creates a new TokenApiData instance using the specified properties.\n     * @function create\n     * @memberof TokenApiData\n     * @static\n     * @param {ITokenApiData=} [properties] Properties to set\n     * @returns {TokenApiData} TokenApiData instance\n     */\n    TokenApiData.create = function create(properties) {\n        return new TokenApiData(properties);\n    };\n\n    /**\n     * Encodes the specified TokenApiData message. Does not implicitly {@link TokenApiData.verify|verify} messages.\n     * @function encode\n     * @memberof TokenApiData\n     * @static\n     * @param {ITokenApiData} message TokenApiData message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    TokenApiData.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.resourceAppid != null && message.hasOwnProperty(\"resourceAppid\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).string(message.resourceAppid);\n        if (message.resourceEnv != null && message.hasOwnProperty(\"resourceEnv\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).string(message.resourceEnv);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified TokenApiData message, length delimited. Does not implicitly {@link TokenApiData.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof TokenApiData\n     * @static\n     * @param {ITokenApiData} message TokenApiData message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    TokenApiData.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a TokenApiData message from the specified reader or buffer.\n     * @function decode\n     * @memberof TokenApiData\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {TokenApiData} TokenApiData\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    TokenApiData.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.TokenApiData();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.resourceAppid = reader.string();\n                break;\n            case 2:\n                message.resourceEnv = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a TokenApiData message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof TokenApiData\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {TokenApiData} TokenApiData\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    TokenApiData.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a TokenApiData message.\n     * @function verify\n     * @memberof TokenApiData\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    TokenApiData.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.resourceAppid != null && message.hasOwnProperty(\"resourceAppid\"))\n            if (!$util.isString(message.resourceAppid))\n                return \"resourceAppid: string expected\";\n        if (message.resourceEnv != null && message.hasOwnProperty(\"resourceEnv\"))\n            if (!$util.isString(message.resourceEnv))\n                return \"resourceEnv: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates a TokenApiData message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof TokenApiData\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {TokenApiData} TokenApiData\n     */\n    TokenApiData.fromObject = function fromObject(object) {\n        if (object instanceof $root.TokenApiData)\n            return object;\n        var message = new $root.TokenApiData();\n        if (object.resourceAppid != null)\n            message.resourceAppid = String(object.resourceAppid);\n        if (object.resourceEnv != null)\n            message.resourceEnv = String(object.resourceEnv);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a TokenApiData message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof TokenApiData\n     * @static\n     * @param {TokenApiData} message TokenApiData\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    TokenApiData.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.resourceAppid = \"\";\n            object.resourceEnv = \"\";\n        }\n        if (message.resourceAppid != null && message.hasOwnProperty(\"resourceAppid\"))\n            object.resourceAppid = message.resourceAppid;\n        if (message.resourceEnv != null && message.hasOwnProperty(\"resourceEnv\"))\n            object.resourceEnv = message.resourceEnv;\n        return object;\n    };\n\n    /**\n     * Converts this TokenApiData to JSON.\n     * @function toJSON\n     * @memberof TokenApiData\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    TokenApiData.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return TokenApiData;\n})();\n\n$root.CommApiData = (function() {\n\n    /**\n     * Properties of a CommApiData.\n     * @exports ICommApiData\n     * @interface ICommApiData\n     * @property {CommApiData.ApiType|null} [apiType] CommApiData apiType\n     * @property {IOpenApiData|null} [openapiData] CommApiData openapiData\n     * @property {IInnerApiData|null} [innerData] CommApiData innerData\n     * @property {ISvrkitApiData|null} [svrkitData] CommApiData svrkitData\n     * @property {ITokenApiData|null} [tokenData] CommApiData tokenData\n     * @property {string|null} [appid] CommApiData appid\n     */\n\n    /**\n     * Constructs a new CommApiData.\n     * @exports CommApiData\n     * @classdesc Represents a CommApiData.\n     * @implements ICommApiData\n     * @constructor\n     * @param {ICommApiData=} [properties] Properties to set\n     */\n    function CommApiData(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * CommApiData apiType.\n     * @member {CommApiData.ApiType} apiType\n     * @memberof CommApiData\n     * @instance\n     */\n    CommApiData.prototype.apiType = 0;\n\n    /**\n     * CommApiData openapiData.\n     * @member {IOpenApiData|null|undefined} openapiData\n     * @memberof CommApiData\n     * @instance\n     */\n    CommApiData.prototype.openapiData = null;\n\n    /**\n     * CommApiData innerData.\n     * @member {IInnerApiData|null|undefined} innerData\n     * @memberof CommApiData\n     * @instance\n     */\n    CommApiData.prototype.innerData = null;\n\n    /**\n     * CommApiData svrkitData.\n     * @member {ISvrkitApiData|null|undefined} svrkitData\n     * @memberof CommApiData\n     * @instance\n     */\n    CommApiData.prototype.svrkitData = null;\n\n    /**\n     * CommApiData tokenData.\n     * @member {ITokenApiData|null|undefined} tokenData\n     * @memberof CommApiData\n     * @instance\n     */\n    CommApiData.prototype.tokenData = null;\n\n    /**\n     * CommApiData appid.\n     * @member {string} appid\n     * @memberof CommApiData\n     * @instance\n     */\n    CommApiData.prototype.appid = \"\";\n\n    /**\n     * Creates a new CommApiData instance using the specified properties.\n     * @function create\n     * @memberof CommApiData\n     * @static\n     * @param {ICommApiData=} [properties] Properties to set\n     * @returns {CommApiData} CommApiData instance\n     */\n    CommApiData.create = function create(properties) {\n        return new CommApiData(properties);\n    };\n\n    /**\n     * Encodes the specified CommApiData message. Does not implicitly {@link CommApiData.verify|verify} messages.\n     * @function encode\n     * @memberof CommApiData\n     * @static\n     * @param {ICommApiData} message CommApiData message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    CommApiData.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.apiType != null && message.hasOwnProperty(\"apiType\"))\n            writer.uint32(/* id 1, wireType 0 =*/8).int32(message.apiType);\n        if (message.openapiData != null && message.hasOwnProperty(\"openapiData\"))\n            $root.OpenApiData.encode(message.openapiData, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n        if (message.innerData != null && message.hasOwnProperty(\"innerData\"))\n            $root.InnerApiData.encode(message.innerData, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\n        if (message.svrkitData != null && message.hasOwnProperty(\"svrkitData\"))\n            $root.SvrkitApiData.encode(message.svrkitData, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\n        if (message.tokenData != null && message.hasOwnProperty(\"tokenData\"))\n            $root.TokenApiData.encode(message.tokenData, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n        if (message.appid != null && message.hasOwnProperty(\"appid\"))\n            writer.uint32(/* id 6, wireType 2 =*/50).string(message.appid);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified CommApiData message, length delimited. Does not implicitly {@link CommApiData.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof CommApiData\n     * @static\n     * @param {ICommApiData} message CommApiData message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    CommApiData.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a CommApiData message from the specified reader or buffer.\n     * @function decode\n     * @memberof CommApiData\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {CommApiData} CommApiData\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    CommApiData.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.CommApiData();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.apiType = reader.int32();\n                break;\n            case 2:\n                message.openapiData = $root.OpenApiData.decode(reader, reader.uint32());\n                break;\n            case 3:\n                message.innerData = $root.InnerApiData.decode(reader, reader.uint32());\n                break;\n            case 4:\n                message.svrkitData = $root.SvrkitApiData.decode(reader, reader.uint32());\n                break;\n            case 5:\n                message.tokenData = $root.TokenApiData.decode(reader, reader.uint32());\n                break;\n            case 6:\n                message.appid = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a CommApiData message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof CommApiData\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {CommApiData} CommApiData\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    CommApiData.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a CommApiData message.\n     * @function verify\n     * @memberof CommApiData\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    CommApiData.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.apiType != null && message.hasOwnProperty(\"apiType\"))\n            switch (message.apiType) {\n            default:\n                return \"apiType: enum value expected\";\n            case 0:\n            case 1:\n            case 2:\n            case 3:\n                break;\n            }\n        if (message.openapiData != null && message.hasOwnProperty(\"openapiData\")) {\n            var error = $root.OpenApiData.verify(message.openapiData);\n            if (error)\n                return \"openapiData.\" + error;\n        }\n        if (message.innerData != null && message.hasOwnProperty(\"innerData\")) {\n            var error = $root.InnerApiData.verify(message.innerData);\n            if (error)\n                return \"innerData.\" + error;\n        }\n        if (message.svrkitData != null && message.hasOwnProperty(\"svrkitData\")) {\n            var error = $root.SvrkitApiData.verify(message.svrkitData);\n            if (error)\n                return \"svrkitData.\" + error;\n        }\n        if (message.tokenData != null && message.hasOwnProperty(\"tokenData\")) {\n            var error = $root.TokenApiData.verify(message.tokenData);\n            if (error)\n                return \"tokenData.\" + error;\n        }\n        if (message.appid != null && message.hasOwnProperty(\"appid\"))\n            if (!$util.isString(message.appid))\n                return \"appid: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates a CommApiData message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof CommApiData\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {CommApiData} CommApiData\n     */\n    CommApiData.fromObject = function fromObject(object) {\n        if (object instanceof $root.CommApiData)\n            return object;\n        var message = new $root.CommApiData();\n        switch (object.apiType) {\n        case \"OPEN_API\":\n        case 0:\n            message.apiType = 0;\n            break;\n        case \"INNER_API\":\n        case 1:\n            message.apiType = 1;\n            break;\n        case \"SVRKIT_API\":\n        case 2:\n            message.apiType = 2;\n            break;\n        case \"TOKEN_API\":\n        case 3:\n            message.apiType = 3;\n            break;\n        }\n        if (object.openapiData != null) {\n            if (typeof object.openapiData !== \"object\")\n                throw TypeError(\".CommApiData.openapiData: object expected\");\n            message.openapiData = $root.OpenApiData.fromObject(object.openapiData);\n        }\n        if (object.innerData != null) {\n            if (typeof object.innerData !== \"object\")\n                throw TypeError(\".CommApiData.innerData: object expected\");\n            message.innerData = $root.InnerApiData.fromObject(object.innerData);\n        }\n        if (object.svrkitData != null) {\n            if (typeof object.svrkitData !== \"object\")\n                throw TypeError(\".CommApiData.svrkitData: object expected\");\n            message.svrkitData = $root.SvrkitApiData.fromObject(object.svrkitData);\n        }\n        if (object.tokenData != null) {\n            if (typeof object.tokenData !== \"object\")\n                throw TypeError(\".CommApiData.tokenData: object expected\");\n            message.tokenData = $root.TokenApiData.fromObject(object.tokenData);\n        }\n        if (object.appid != null)\n            message.appid = String(object.appid);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a CommApiData message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof CommApiData\n     * @static\n     * @param {CommApiData} message CommApiData\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    CommApiData.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.apiType = options.enums === String ? \"OPEN_API\" : 0;\n            object.openapiData = null;\n            object.innerData = null;\n            object.svrkitData = null;\n            object.tokenData = null;\n            object.appid = \"\";\n        }\n        if (message.apiType != null && message.hasOwnProperty(\"apiType\"))\n            object.apiType = options.enums === String ? $root.CommApiData.ApiType[message.apiType] : message.apiType;\n        if (message.openapiData != null && message.hasOwnProperty(\"openapiData\"))\n            object.openapiData = $root.OpenApiData.toObject(message.openapiData, options);\n        if (message.innerData != null && message.hasOwnProperty(\"innerData\"))\n            object.innerData = $root.InnerApiData.toObject(message.innerData, options);\n        if (message.svrkitData != null && message.hasOwnProperty(\"svrkitData\"))\n            object.svrkitData = $root.SvrkitApiData.toObject(message.svrkitData, options);\n        if (message.tokenData != null && message.hasOwnProperty(\"tokenData\"))\n            object.tokenData = $root.TokenApiData.toObject(message.tokenData, options);\n        if (message.appid != null && message.hasOwnProperty(\"appid\"))\n            object.appid = message.appid;\n        return object;\n    };\n\n    /**\n     * Converts this CommApiData to JSON.\n     * @function toJSON\n     * @memberof CommApiData\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    CommApiData.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    /**\n     * ApiType enum.\n     * @name CommApiData.ApiType\n     * @enum {string}\n     * @property {number} OPEN_API=0 OPEN_API value\n     * @property {number} INNER_API=1 INNER_API value\n     * @property {number} SVRKIT_API=2 SVRKIT_API value\n     * @property {number} TOKEN_API=3 TOKEN_API value\n     */\n    CommApiData.ApiType = (function() {\n        var valuesById = {}, values = Object.create(valuesById);\n        values[valuesById[0] = \"OPEN_API\"] = 0;\n        values[valuesById[1] = \"INNER_API\"] = 1;\n        values[valuesById[2] = \"SVRKIT_API\"] = 2;\n        values[valuesById[3] = \"TOKEN_API\"] = 3;\n        return values;\n    })();\n\n    return CommApiData;\n})();\n\n$root.CommOpenApiResp = (function() {\n\n    /**\n     * Properties of a CommOpenApiResp.\n     * @exports ICommOpenApiResp\n     * @interface ICommOpenApiResp\n     * @property {Uint8Array|null} [respData] CommOpenApiResp respData\n     * @property {string|null} [contentType] CommOpenApiResp contentType\n     * @property {number|null} [errorCode] CommOpenApiResp errorCode\n     * @property {number|null} [httpCode] CommOpenApiResp httpCode\n     * @property {Array.<IHttpHeader>|null} [headers] CommOpenApiResp headers\n     * @property {number|null} [svrkitErrorCode] CommOpenApiResp svrkitErrorCode\n     */\n\n    /**\n     * Constructs a new CommOpenApiResp.\n     * @exports CommOpenApiResp\n     * @classdesc Represents a CommOpenApiResp.\n     * @implements ICommOpenApiResp\n     * @constructor\n     * @param {ICommOpenApiResp=} [properties] Properties to set\n     */\n    function CommOpenApiResp(properties) {\n        this.headers = [];\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * CommOpenApiResp respData.\n     * @member {Uint8Array} respData\n     * @memberof CommOpenApiResp\n     * @instance\n     */\n    CommOpenApiResp.prototype.respData = $util.newBuffer([]);\n\n    /**\n     * CommOpenApiResp contentType.\n     * @member {string} contentType\n     * @memberof CommOpenApiResp\n     * @instance\n     */\n    CommOpenApiResp.prototype.contentType = \"\";\n\n    /**\n     * CommOpenApiResp errorCode.\n     * @member {number} errorCode\n     * @memberof CommOpenApiResp\n     * @instance\n     */\n    CommOpenApiResp.prototype.errorCode = 0;\n\n    /**\n     * CommOpenApiResp httpCode.\n     * @member {number} httpCode\n     * @memberof CommOpenApiResp\n     * @instance\n     */\n    CommOpenApiResp.prototype.httpCode = 0;\n\n    /**\n     * CommOpenApiResp headers.\n     * @member {Array.<IHttpHeader>} headers\n     * @memberof CommOpenApiResp\n     * @instance\n     */\n    CommOpenApiResp.prototype.headers = $util.emptyArray;\n\n    /**\n     * CommOpenApiResp svrkitErrorCode.\n     * @member {number} svrkitErrorCode\n     * @memberof CommOpenApiResp\n     * @instance\n     */\n    CommOpenApiResp.prototype.svrkitErrorCode = 0;\n\n    /**\n     * Creates a new CommOpenApiResp instance using the specified properties.\n     * @function create\n     * @memberof CommOpenApiResp\n     * @static\n     * @param {ICommOpenApiResp=} [properties] Properties to set\n     * @returns {CommOpenApiResp} CommOpenApiResp instance\n     */\n    CommOpenApiResp.create = function create(properties) {\n        return new CommOpenApiResp(properties);\n    };\n\n    /**\n     * Encodes the specified CommOpenApiResp message. Does not implicitly {@link CommOpenApiResp.verify|verify} messages.\n     * @function encode\n     * @memberof CommOpenApiResp\n     * @static\n     * @param {ICommOpenApiResp} message CommOpenApiResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    CommOpenApiResp.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.respData != null && message.hasOwnProperty(\"respData\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.respData);\n        if (message.contentType != null && message.hasOwnProperty(\"contentType\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).string(message.contentType);\n        if (message.errorCode != null && message.hasOwnProperty(\"errorCode\"))\n            writer.uint32(/* id 3, wireType 0 =*/24).int32(message.errorCode);\n        if (message.httpCode != null && message.hasOwnProperty(\"httpCode\"))\n            writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.httpCode);\n        if (message.headers != null && message.headers.length)\n            for (var i = 0; i < message.headers.length; ++i)\n                $root.HttpHeader.encode(message.headers[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n        if (message.svrkitErrorCode != null && message.hasOwnProperty(\"svrkitErrorCode\"))\n            writer.uint32(/* id 6, wireType 0 =*/48).int32(message.svrkitErrorCode);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified CommOpenApiResp message, length delimited. Does not implicitly {@link CommOpenApiResp.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof CommOpenApiResp\n     * @static\n     * @param {ICommOpenApiResp} message CommOpenApiResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    CommOpenApiResp.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a CommOpenApiResp message from the specified reader or buffer.\n     * @function decode\n     * @memberof CommOpenApiResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {CommOpenApiResp} CommOpenApiResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    CommOpenApiResp.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.CommOpenApiResp();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.respData = reader.bytes();\n                break;\n            case 2:\n                message.contentType = reader.string();\n                break;\n            case 3:\n                message.errorCode = reader.int32();\n                break;\n            case 4:\n                message.httpCode = reader.uint32();\n                break;\n            case 5:\n                if (!(message.headers && message.headers.length))\n                    message.headers = [];\n                message.headers.push($root.HttpHeader.decode(reader, reader.uint32()));\n                break;\n            case 6:\n                message.svrkitErrorCode = reader.int32();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a CommOpenApiResp message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof CommOpenApiResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {CommOpenApiResp} CommOpenApiResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    CommOpenApiResp.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a CommOpenApiResp message.\n     * @function verify\n     * @memberof CommOpenApiResp\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    CommOpenApiResp.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.respData != null && message.hasOwnProperty(\"respData\"))\n            if (!(message.respData && typeof message.respData.length === \"number\" || $util.isString(message.respData)))\n                return \"respData: buffer expected\";\n        if (message.contentType != null && message.hasOwnProperty(\"contentType\"))\n            if (!$util.isString(message.contentType))\n                return \"contentType: string expected\";\n        if (message.errorCode != null && message.hasOwnProperty(\"errorCode\"))\n            if (!$util.isInteger(message.errorCode))\n                return \"errorCode: integer expected\";\n        if (message.httpCode != null && message.hasOwnProperty(\"httpCode\"))\n            if (!$util.isInteger(message.httpCode))\n                return \"httpCode: integer expected\";\n        if (message.headers != null && message.hasOwnProperty(\"headers\")) {\n            if (!Array.isArray(message.headers))\n                return \"headers: array expected\";\n            for (var i = 0; i < message.headers.length; ++i) {\n                var error = $root.HttpHeader.verify(message.headers[i]);\n                if (error)\n                    return \"headers.\" + error;\n            }\n        }\n        if (message.svrkitErrorCode != null && message.hasOwnProperty(\"svrkitErrorCode\"))\n            if (!$util.isInteger(message.svrkitErrorCode))\n                return \"svrkitErrorCode: integer expected\";\n        return null;\n    };\n\n    /**\n     * Creates a CommOpenApiResp message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof CommOpenApiResp\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {CommOpenApiResp} CommOpenApiResp\n     */\n    CommOpenApiResp.fromObject = function fromObject(object) {\n        if (object instanceof $root.CommOpenApiResp)\n            return object;\n        var message = new $root.CommOpenApiResp();\n        if (object.respData != null)\n            if (typeof object.respData === \"string\")\n                $util.base64.decode(object.respData, message.respData = $util.newBuffer($util.base64.length(object.respData)), 0);\n            else if (object.respData.length)\n                message.respData = object.respData;\n        if (object.contentType != null)\n            message.contentType = String(object.contentType);\n        if (object.errorCode != null)\n            message.errorCode = object.errorCode | 0;\n        if (object.httpCode != null)\n            message.httpCode = object.httpCode >>> 0;\n        if (object.headers) {\n            if (!Array.isArray(object.headers))\n                throw TypeError(\".CommOpenApiResp.headers: array expected\");\n            message.headers = [];\n            for (var i = 0; i < object.headers.length; ++i) {\n                if (typeof object.headers[i] !== \"object\")\n                    throw TypeError(\".CommOpenApiResp.headers: object expected\");\n                message.headers[i] = $root.HttpHeader.fromObject(object.headers[i]);\n            }\n        }\n        if (object.svrkitErrorCode != null)\n            message.svrkitErrorCode = object.svrkitErrorCode | 0;\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a CommOpenApiResp message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof CommOpenApiResp\n     * @static\n     * @param {CommOpenApiResp} message CommOpenApiResp\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    CommOpenApiResp.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.arrays || options.defaults)\n            object.headers = [];\n        if (options.defaults) {\n            if (options.bytes === String)\n                object.respData = \"\";\n            else {\n                object.respData = [];\n                if (options.bytes !== Array)\n                    object.respData = $util.newBuffer(object.respData);\n            }\n            object.contentType = \"\";\n            object.errorCode = 0;\n            object.httpCode = 0;\n            object.svrkitErrorCode = 0;\n        }\n        if (message.respData != null && message.hasOwnProperty(\"respData\"))\n            object.respData = options.bytes === String ? $util.base64.encode(message.respData, 0, message.respData.length) : options.bytes === Array ? Array.prototype.slice.call(message.respData) : message.respData;\n        if (message.contentType != null && message.hasOwnProperty(\"contentType\"))\n            object.contentType = message.contentType;\n        if (message.errorCode != null && message.hasOwnProperty(\"errorCode\"))\n            object.errorCode = message.errorCode;\n        if (message.httpCode != null && message.hasOwnProperty(\"httpCode\"))\n            object.httpCode = message.httpCode;\n        if (message.headers && message.headers.length) {\n            object.headers = [];\n            for (var j = 0; j < message.headers.length; ++j)\n                object.headers[j] = $root.HttpHeader.toObject(message.headers[j], options);\n        }\n        if (message.svrkitErrorCode != null && message.hasOwnProperty(\"svrkitErrorCode\"))\n            object.svrkitErrorCode = message.svrkitErrorCode;\n        return object;\n    };\n\n    /**\n     * Converts this CommOpenApiResp to JSON.\n     * @function toJSON\n     * @memberof CommOpenApiResp\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    CommOpenApiResp.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return CommOpenApiResp;\n})();\n\n$root.InnerApiData = (function() {\n\n    /**\n     * Properties of an InnerApiData.\n     * @exports IInnerApiData\n     * @interface IInnerApiData\n     * @property {number|null} [modid] InnerApiData modid\n     * @property {number|null} [cmdid] InnerApiData cmdid\n     * @property {string|null} [url] InnerApiData url\n     * @property {boolean|null} [useHttps] InnerApiData useHttps\n     * @property {HTTP_METHODS|null} [method] InnerApiData method\n     * @property {Array.<string>|null} [headers] InnerApiData headers\n     * @property {Uint8Array|null} [body] InnerApiData body\n     */\n\n    /**\n     * Constructs a new InnerApiData.\n     * @exports InnerApiData\n     * @classdesc Represents an InnerApiData.\n     * @implements IInnerApiData\n     * @constructor\n     * @param {IInnerApiData=} [properties] Properties to set\n     */\n    function InnerApiData(properties) {\n        this.headers = [];\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * InnerApiData modid.\n     * @member {number} modid\n     * @memberof InnerApiData\n     * @instance\n     */\n    InnerApiData.prototype.modid = 0;\n\n    /**\n     * InnerApiData cmdid.\n     * @member {number} cmdid\n     * @memberof InnerApiData\n     * @instance\n     */\n    InnerApiData.prototype.cmdid = 0;\n\n    /**\n     * InnerApiData url.\n     * @member {string} url\n     * @memberof InnerApiData\n     * @instance\n     */\n    InnerApiData.prototype.url = \"\";\n\n    /**\n     * InnerApiData useHttps.\n     * @member {boolean} useHttps\n     * @memberof InnerApiData\n     * @instance\n     */\n    InnerApiData.prototype.useHttps = false;\n\n    /**\n     * InnerApiData method.\n     * @member {HTTP_METHODS} method\n     * @memberof InnerApiData\n     * @instance\n     */\n    InnerApiData.prototype.method = 1;\n\n    /**\n     * InnerApiData headers.\n     * @member {Array.<string>} headers\n     * @memberof InnerApiData\n     * @instance\n     */\n    InnerApiData.prototype.headers = $util.emptyArray;\n\n    /**\n     * InnerApiData body.\n     * @member {Uint8Array} body\n     * @memberof InnerApiData\n     * @instance\n     */\n    InnerApiData.prototype.body = $util.newBuffer([]);\n\n    /**\n     * Creates a new InnerApiData instance using the specified properties.\n     * @function create\n     * @memberof InnerApiData\n     * @static\n     * @param {IInnerApiData=} [properties] Properties to set\n     * @returns {InnerApiData} InnerApiData instance\n     */\n    InnerApiData.create = function create(properties) {\n        return new InnerApiData(properties);\n    };\n\n    /**\n     * Encodes the specified InnerApiData message. Does not implicitly {@link InnerApiData.verify|verify} messages.\n     * @function encode\n     * @memberof InnerApiData\n     * @static\n     * @param {IInnerApiData} message InnerApiData message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    InnerApiData.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.modid != null && message.hasOwnProperty(\"modid\"))\n            writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.modid);\n        if (message.cmdid != null && message.hasOwnProperty(\"cmdid\"))\n            writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.cmdid);\n        if (message.url != null && message.hasOwnProperty(\"url\"))\n            writer.uint32(/* id 3, wireType 2 =*/26).string(message.url);\n        if (message.useHttps != null && message.hasOwnProperty(\"useHttps\"))\n            writer.uint32(/* id 4, wireType 0 =*/32).bool(message.useHttps);\n        if (message.method != null && message.hasOwnProperty(\"method\"))\n            writer.uint32(/* id 5, wireType 0 =*/40).int32(message.method);\n        if (message.headers != null && message.headers.length)\n            for (var i = 0; i < message.headers.length; ++i)\n                writer.uint32(/* id 6, wireType 2 =*/50).string(message.headers[i]);\n        if (message.body != null && message.hasOwnProperty(\"body\"))\n            writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.body);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified InnerApiData message, length delimited. Does not implicitly {@link InnerApiData.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof InnerApiData\n     * @static\n     * @param {IInnerApiData} message InnerApiData message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    InnerApiData.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes an InnerApiData message from the specified reader or buffer.\n     * @function decode\n     * @memberof InnerApiData\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {InnerApiData} InnerApiData\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    InnerApiData.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.InnerApiData();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.modid = reader.uint32();\n                break;\n            case 2:\n                message.cmdid = reader.uint32();\n                break;\n            case 3:\n                message.url = reader.string();\n                break;\n            case 4:\n                message.useHttps = reader.bool();\n                break;\n            case 5:\n                message.method = reader.int32();\n                break;\n            case 6:\n                if (!(message.headers && message.headers.length))\n                    message.headers = [];\n                message.headers.push(reader.string());\n                break;\n            case 7:\n                message.body = reader.bytes();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes an InnerApiData message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof InnerApiData\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {InnerApiData} InnerApiData\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    InnerApiData.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies an InnerApiData message.\n     * @function verify\n     * @memberof InnerApiData\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    InnerApiData.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.modid != null && message.hasOwnProperty(\"modid\"))\n            if (!$util.isInteger(message.modid))\n                return \"modid: integer expected\";\n        if (message.cmdid != null && message.hasOwnProperty(\"cmdid\"))\n            if (!$util.isInteger(message.cmdid))\n                return \"cmdid: integer expected\";\n        if (message.url != null && message.hasOwnProperty(\"url\"))\n            if (!$util.isString(message.url))\n                return \"url: string expected\";\n        if (message.useHttps != null && message.hasOwnProperty(\"useHttps\"))\n            if (typeof message.useHttps !== \"boolean\")\n                return \"useHttps: boolean expected\";\n        if (message.method != null && message.hasOwnProperty(\"method\"))\n            switch (message.method) {\n            default:\n                return \"method: enum value expected\";\n            case 1:\n            case 2:\n            case 3:\n            case 4:\n            case 5:\n            case 6:\n                break;\n            }\n        if (message.headers != null && message.hasOwnProperty(\"headers\")) {\n            if (!Array.isArray(message.headers))\n                return \"headers: array expected\";\n            for (var i = 0; i < message.headers.length; ++i)\n                if (!$util.isString(message.headers[i]))\n                    return \"headers: string[] expected\";\n        }\n        if (message.body != null && message.hasOwnProperty(\"body\"))\n            if (!(message.body && typeof message.body.length === \"number\" || $util.isString(message.body)))\n                return \"body: buffer expected\";\n        return null;\n    };\n\n    /**\n     * Creates an InnerApiData message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof InnerApiData\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {InnerApiData} InnerApiData\n     */\n    InnerApiData.fromObject = function fromObject(object) {\n        if (object instanceof $root.InnerApiData)\n            return object;\n        var message = new $root.InnerApiData();\n        if (object.modid != null)\n            message.modid = object.modid >>> 0;\n        if (object.cmdid != null)\n            message.cmdid = object.cmdid >>> 0;\n        if (object.url != null)\n            message.url = String(object.url);\n        if (object.useHttps != null)\n            message.useHttps = Boolean(object.useHttps);\n        switch (object.method) {\n        case \"HTTP_GET\":\n        case 1:\n            message.method = 1;\n            break;\n        case \"HTTP_POST\":\n        case 2:\n            message.method = 2;\n            break;\n        case \"HTTP_PUT\":\n        case 3:\n            message.method = 3;\n            break;\n        case \"HTTP_DELETE\":\n        case 4:\n            message.method = 4;\n            break;\n        case \"HTTP_HEAD\":\n        case 5:\n            message.method = 5;\n            break;\n        case \"HTTP_PATCH\":\n        case 6:\n            message.method = 6;\n            break;\n        }\n        if (object.headers) {\n            if (!Array.isArray(object.headers))\n                throw TypeError(\".InnerApiData.headers: array expected\");\n            message.headers = [];\n            for (var i = 0; i < object.headers.length; ++i)\n                message.headers[i] = String(object.headers[i]);\n        }\n        if (object.body != null)\n            if (typeof object.body === \"string\")\n                $util.base64.decode(object.body, message.body = $util.newBuffer($util.base64.length(object.body)), 0);\n            else if (object.body.length)\n                message.body = object.body;\n        return message;\n    };\n\n    /**\n     * Creates a plain object from an InnerApiData message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof InnerApiData\n     * @static\n     * @param {InnerApiData} message InnerApiData\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    InnerApiData.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.arrays || options.defaults)\n            object.headers = [];\n        if (options.defaults) {\n            object.modid = 0;\n            object.cmdid = 0;\n            object.url = \"\";\n            object.useHttps = false;\n            object.method = options.enums === String ? \"HTTP_GET\" : 1;\n            if (options.bytes === String)\n                object.body = \"\";\n            else {\n                object.body = [];\n                if (options.bytes !== Array)\n                    object.body = $util.newBuffer(object.body);\n            }\n        }\n        if (message.modid != null && message.hasOwnProperty(\"modid\"))\n            object.modid = message.modid;\n        if (message.cmdid != null && message.hasOwnProperty(\"cmdid\"))\n            object.cmdid = message.cmdid;\n        if (message.url != null && message.hasOwnProperty(\"url\"))\n            object.url = message.url;\n        if (message.useHttps != null && message.hasOwnProperty(\"useHttps\"))\n            object.useHttps = message.useHttps;\n        if (message.method != null && message.hasOwnProperty(\"method\"))\n            object.method = options.enums === String ? $root.HTTP_METHODS[message.method] : message.method;\n        if (message.headers && message.headers.length) {\n            object.headers = [];\n            for (var j = 0; j < message.headers.length; ++j)\n                object.headers[j] = message.headers[j];\n        }\n        if (message.body != null && message.hasOwnProperty(\"body\"))\n            object.body = options.bytes === String ? $util.base64.encode(message.body, 0, message.body.length) : options.bytes === Array ? Array.prototype.slice.call(message.body) : message.body;\n        return object;\n    };\n\n    /**\n     * Converts this InnerApiData to JSON.\n     * @function toJSON\n     * @memberof InnerApiData\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    InnerApiData.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return InnerApiData;\n})();\n\n$root.SvrkitApiData = (function() {\n\n    /**\n     * Properties of a SvrkitApiData.\n     * @exports ISvrkitApiData\n     * @interface ISvrkitApiData\n     * @property {string|null} [apiName] SvrkitApiData apiName\n     * @property {Uint8Array|null} [reqData] SvrkitApiData reqData\n     */\n\n    /**\n     * Constructs a new SvrkitApiData.\n     * @exports SvrkitApiData\n     * @classdesc Represents a SvrkitApiData.\n     * @implements ISvrkitApiData\n     * @constructor\n     * @param {ISvrkitApiData=} [properties] Properties to set\n     */\n    function SvrkitApiData(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * SvrkitApiData apiName.\n     * @member {string} apiName\n     * @memberof SvrkitApiData\n     * @instance\n     */\n    SvrkitApiData.prototype.apiName = \"\";\n\n    /**\n     * SvrkitApiData reqData.\n     * @member {Uint8Array} reqData\n     * @memberof SvrkitApiData\n     * @instance\n     */\n    SvrkitApiData.prototype.reqData = $util.newBuffer([]);\n\n    /**\n     * Creates a new SvrkitApiData instance using the specified properties.\n     * @function create\n     * @memberof SvrkitApiData\n     * @static\n     * @param {ISvrkitApiData=} [properties] Properties to set\n     * @returns {SvrkitApiData} SvrkitApiData instance\n     */\n    SvrkitApiData.create = function create(properties) {\n        return new SvrkitApiData(properties);\n    };\n\n    /**\n     * Encodes the specified SvrkitApiData message. Does not implicitly {@link SvrkitApiData.verify|verify} messages.\n     * @function encode\n     * @memberof SvrkitApiData\n     * @static\n     * @param {ISvrkitApiData} message SvrkitApiData message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    SvrkitApiData.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.apiName != null && message.hasOwnProperty(\"apiName\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).string(message.apiName);\n        if (message.reqData != null && message.hasOwnProperty(\"reqData\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.reqData);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified SvrkitApiData message, length delimited. Does not implicitly {@link SvrkitApiData.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof SvrkitApiData\n     * @static\n     * @param {ISvrkitApiData} message SvrkitApiData message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    SvrkitApiData.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a SvrkitApiData message from the specified reader or buffer.\n     * @function decode\n     * @memberof SvrkitApiData\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {SvrkitApiData} SvrkitApiData\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    SvrkitApiData.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.SvrkitApiData();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.apiName = reader.string();\n                break;\n            case 2:\n                message.reqData = reader.bytes();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a SvrkitApiData message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof SvrkitApiData\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {SvrkitApiData} SvrkitApiData\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    SvrkitApiData.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a SvrkitApiData message.\n     * @function verify\n     * @memberof SvrkitApiData\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    SvrkitApiData.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.apiName != null && message.hasOwnProperty(\"apiName\"))\n            if (!$util.isString(message.apiName))\n                return \"apiName: string expected\";\n        if (message.reqData != null && message.hasOwnProperty(\"reqData\"))\n            if (!(message.reqData && typeof message.reqData.length === \"number\" || $util.isString(message.reqData)))\n                return \"reqData: buffer expected\";\n        return null;\n    };\n\n    /**\n     * Creates a SvrkitApiData message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof SvrkitApiData\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {SvrkitApiData} SvrkitApiData\n     */\n    SvrkitApiData.fromObject = function fromObject(object) {\n        if (object instanceof $root.SvrkitApiData)\n            return object;\n        var message = new $root.SvrkitApiData();\n        if (object.apiName != null)\n            message.apiName = String(object.apiName);\n        if (object.reqData != null)\n            if (typeof object.reqData === \"string\")\n                $util.base64.decode(object.reqData, message.reqData = $util.newBuffer($util.base64.length(object.reqData)), 0);\n            else if (object.reqData.length)\n                message.reqData = object.reqData;\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a SvrkitApiData message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof SvrkitApiData\n     * @static\n     * @param {SvrkitApiData} message SvrkitApiData\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    SvrkitApiData.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.apiName = \"\";\n            if (options.bytes === String)\n                object.reqData = \"\";\n            else {\n                object.reqData = [];\n                if (options.bytes !== Array)\n                    object.reqData = $util.newBuffer(object.reqData);\n            }\n        }\n        if (message.apiName != null && message.hasOwnProperty(\"apiName\"))\n            object.apiName = message.apiName;\n        if (message.reqData != null && message.hasOwnProperty(\"reqData\"))\n            object.reqData = options.bytes === String ? $util.base64.encode(message.reqData, 0, message.reqData.length) : options.bytes === Array ? Array.prototype.slice.call(message.reqData) : message.reqData;\n        return object;\n    };\n\n    /**\n     * Converts this SvrkitApiData to JSON.\n     * @function toJSON\n     * @memberof SvrkitApiData\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    SvrkitApiData.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return SvrkitApiData;\n})();\n\n/**\n * HTTP_METHODS enum.\n * @exports HTTP_METHODS\n * @enum {string}\n * @property {number} HTTP_GET=1 HTTP_GET value\n * @property {number} HTTP_POST=2 HTTP_POST value\n * @property {number} HTTP_PUT=3 HTTP_PUT value\n * @property {number} HTTP_DELETE=4 HTTP_DELETE value\n * @property {number} HTTP_HEAD=5 HTTP_HEAD value\n * @property {number} HTTP_PATCH=6 HTTP_PATCH value\n */\n$root.HTTP_METHODS = (function() {\n    var valuesById = {}, values = Object.create(valuesById);\n    values[valuesById[1] = \"HTTP_GET\"] = 1;\n    values[valuesById[2] = \"HTTP_POST\"] = 2;\n    values[valuesById[3] = \"HTTP_PUT\"] = 3;\n    values[valuesById[4] = \"HTTP_DELETE\"] = 4;\n    values[valuesById[5] = \"HTTP_HEAD\"] = 5;\n    values[valuesById[6] = \"HTTP_PATCH\"] = 6;\n    return values;\n})();\n\n$root.HttpHeader = (function() {\n\n    /**\n     * Properties of a HttpHeader.\n     * @exports IHttpHeader\n     * @interface IHttpHeader\n     * @property {string|null} [key] HttpHeader key\n     * @property {string|null} [value] HttpHeader value\n     */\n\n    /**\n     * Constructs a new HttpHeader.\n     * @exports HttpHeader\n     * @classdesc Represents a HttpHeader.\n     * @implements IHttpHeader\n     * @constructor\n     * @param {IHttpHeader=} [properties] Properties to set\n     */\n    function HttpHeader(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * HttpHeader key.\n     * @member {string} key\n     * @memberof HttpHeader\n     * @instance\n     */\n    HttpHeader.prototype.key = \"\";\n\n    /**\n     * HttpHeader value.\n     * @member {string} value\n     * @memberof HttpHeader\n     * @instance\n     */\n    HttpHeader.prototype.value = \"\";\n\n    /**\n     * Creates a new HttpHeader instance using the specified properties.\n     * @function create\n     * @memberof HttpHeader\n     * @static\n     * @param {IHttpHeader=} [properties] Properties to set\n     * @returns {HttpHeader} HttpHeader instance\n     */\n    HttpHeader.create = function create(properties) {\n        return new HttpHeader(properties);\n    };\n\n    /**\n     * Encodes the specified HttpHeader message. Does not implicitly {@link HttpHeader.verify|verify} messages.\n     * @function encode\n     * @memberof HttpHeader\n     * @static\n     * @param {IHttpHeader} message HttpHeader message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    HttpHeader.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.key != null && message.hasOwnProperty(\"key\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).string(message.key);\n        if (message.value != null && message.hasOwnProperty(\"value\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).string(message.value);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified HttpHeader message, length delimited. Does not implicitly {@link HttpHeader.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof HttpHeader\n     * @static\n     * @param {IHttpHeader} message HttpHeader message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    HttpHeader.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a HttpHeader message from the specified reader or buffer.\n     * @function decode\n     * @memberof HttpHeader\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {HttpHeader} HttpHeader\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    HttpHeader.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.HttpHeader();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.key = reader.string();\n                break;\n            case 2:\n                message.value = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a HttpHeader message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof HttpHeader\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {HttpHeader} HttpHeader\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    HttpHeader.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a HttpHeader message.\n     * @function verify\n     * @memberof HttpHeader\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    HttpHeader.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.key != null && message.hasOwnProperty(\"key\"))\n            if (!$util.isString(message.key))\n                return \"key: string expected\";\n        if (message.value != null && message.hasOwnProperty(\"value\"))\n            if (!$util.isString(message.value))\n                return \"value: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates a HttpHeader message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof HttpHeader\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {HttpHeader} HttpHeader\n     */\n    HttpHeader.fromObject = function fromObject(object) {\n        if (object instanceof $root.HttpHeader)\n            return object;\n        var message = new $root.HttpHeader();\n        if (object.key != null)\n            message.key = String(object.key);\n        if (object.value != null)\n            message.value = String(object.value);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a HttpHeader message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof HttpHeader\n     * @static\n     * @param {HttpHeader} message HttpHeader\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    HttpHeader.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.key = \"\";\n            object.value = \"\";\n        }\n        if (message.key != null && message.hasOwnProperty(\"key\"))\n            object.key = message.key;\n        if (message.value != null && message.hasOwnProperty(\"value\"))\n            object.value = message.value;\n        return object;\n    };\n\n    /**\n     * Converts this HttpHeader to JSON.\n     * @function toJSON\n     * @memberof HttpHeader\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    HttpHeader.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return HttpHeader;\n})();\n\n$root.ApiGetOpenDataByCloudIdReq = (function() {\n\n    /**\n     * Properties of an ApiGetOpenDataByCloudIdReq.\n     * @exports IApiGetOpenDataByCloudIdReq\n     * @interface IApiGetOpenDataByCloudIdReq\n     * @property {Array.<string>|null} [cloudidList] ApiGetOpenDataByCloudIdReq cloudidList\n     */\n\n    /**\n     * Constructs a new ApiGetOpenDataByCloudIdReq.\n     * @exports ApiGetOpenDataByCloudIdReq\n     * @classdesc Represents an ApiGetOpenDataByCloudIdReq.\n     * @implements IApiGetOpenDataByCloudIdReq\n     * @constructor\n     * @param {IApiGetOpenDataByCloudIdReq=} [properties] Properties to set\n     */\n    function ApiGetOpenDataByCloudIdReq(properties) {\n        this.cloudidList = [];\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * ApiGetOpenDataByCloudIdReq cloudidList.\n     * @member {Array.<string>} cloudidList\n     * @memberof ApiGetOpenDataByCloudIdReq\n     * @instance\n     */\n    ApiGetOpenDataByCloudIdReq.prototype.cloudidList = $util.emptyArray;\n\n    /**\n     * Creates a new ApiGetOpenDataByCloudIdReq instance using the specified properties.\n     * @function create\n     * @memberof ApiGetOpenDataByCloudIdReq\n     * @static\n     * @param {IApiGetOpenDataByCloudIdReq=} [properties] Properties to set\n     * @returns {ApiGetOpenDataByCloudIdReq} ApiGetOpenDataByCloudIdReq instance\n     */\n    ApiGetOpenDataByCloudIdReq.create = function create(properties) {\n        return new ApiGetOpenDataByCloudIdReq(properties);\n    };\n\n    /**\n     * Encodes the specified ApiGetOpenDataByCloudIdReq message. Does not implicitly {@link ApiGetOpenDataByCloudIdReq.verify|verify} messages.\n     * @function encode\n     * @memberof ApiGetOpenDataByCloudIdReq\n     * @static\n     * @param {IApiGetOpenDataByCloudIdReq} message ApiGetOpenDataByCloudIdReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiGetOpenDataByCloudIdReq.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.cloudidList != null && message.cloudidList.length)\n            for (var i = 0; i < message.cloudidList.length; ++i)\n                writer.uint32(/* id 2, wireType 2 =*/18).string(message.cloudidList[i]);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified ApiGetOpenDataByCloudIdReq message, length delimited. Does not implicitly {@link ApiGetOpenDataByCloudIdReq.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof ApiGetOpenDataByCloudIdReq\n     * @static\n     * @param {IApiGetOpenDataByCloudIdReq} message ApiGetOpenDataByCloudIdReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiGetOpenDataByCloudIdReq.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes an ApiGetOpenDataByCloudIdReq message from the specified reader or buffer.\n     * @function decode\n     * @memberof ApiGetOpenDataByCloudIdReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {ApiGetOpenDataByCloudIdReq} ApiGetOpenDataByCloudIdReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiGetOpenDataByCloudIdReq.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ApiGetOpenDataByCloudIdReq();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 2:\n                if (!(message.cloudidList && message.cloudidList.length))\n                    message.cloudidList = [];\n                message.cloudidList.push(reader.string());\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes an ApiGetOpenDataByCloudIdReq message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof ApiGetOpenDataByCloudIdReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {ApiGetOpenDataByCloudIdReq} ApiGetOpenDataByCloudIdReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiGetOpenDataByCloudIdReq.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies an ApiGetOpenDataByCloudIdReq message.\n     * @function verify\n     * @memberof ApiGetOpenDataByCloudIdReq\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    ApiGetOpenDataByCloudIdReq.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.cloudidList != null && message.hasOwnProperty(\"cloudidList\")) {\n            if (!Array.isArray(message.cloudidList))\n                return \"cloudidList: array expected\";\n            for (var i = 0; i < message.cloudidList.length; ++i)\n                if (!$util.isString(message.cloudidList[i]))\n                    return \"cloudidList: string[] expected\";\n        }\n        return null;\n    };\n\n    /**\n     * Creates an ApiGetOpenDataByCloudIdReq message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof ApiGetOpenDataByCloudIdReq\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {ApiGetOpenDataByCloudIdReq} ApiGetOpenDataByCloudIdReq\n     */\n    ApiGetOpenDataByCloudIdReq.fromObject = function fromObject(object) {\n        if (object instanceof $root.ApiGetOpenDataByCloudIdReq)\n            return object;\n        var message = new $root.ApiGetOpenDataByCloudIdReq();\n        if (object.cloudidList) {\n            if (!Array.isArray(object.cloudidList))\n                throw TypeError(\".ApiGetOpenDataByCloudIdReq.cloudidList: array expected\");\n            message.cloudidList = [];\n            for (var i = 0; i < object.cloudidList.length; ++i)\n                message.cloudidList[i] = String(object.cloudidList[i]);\n        }\n        return message;\n    };\n\n    /**\n     * Creates a plain object from an ApiGetOpenDataByCloudIdReq message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof ApiGetOpenDataByCloudIdReq\n     * @static\n     * @param {ApiGetOpenDataByCloudIdReq} message ApiGetOpenDataByCloudIdReq\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    ApiGetOpenDataByCloudIdReq.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.arrays || options.defaults)\n            object.cloudidList = [];\n        if (message.cloudidList && message.cloudidList.length) {\n            object.cloudidList = [];\n            for (var j = 0; j < message.cloudidList.length; ++j)\n                object.cloudidList[j] = message.cloudidList[j];\n        }\n        return object;\n    };\n\n    /**\n     * Converts this ApiGetOpenDataByCloudIdReq to JSON.\n     * @function toJSON\n     * @memberof ApiGetOpenDataByCloudIdReq\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    ApiGetOpenDataByCloudIdReq.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return ApiGetOpenDataByCloudIdReq;\n})();\n\n$root.ApiGetOpenDataByCloudIdResp = (function() {\n\n    /**\n     * Properties of an ApiGetOpenDataByCloudIdResp.\n     * @exports IApiGetOpenDataByCloudIdResp\n     * @interface IApiGetOpenDataByCloudIdResp\n     * @property {Array.<ApiGetOpenDataByCloudIdResp.IOpDataItem>|null} [dataList] ApiGetOpenDataByCloudIdResp dataList\n     */\n\n    /**\n     * Constructs a new ApiGetOpenDataByCloudIdResp.\n     * @exports ApiGetOpenDataByCloudIdResp\n     * @classdesc Represents an ApiGetOpenDataByCloudIdResp.\n     * @implements IApiGetOpenDataByCloudIdResp\n     * @constructor\n     * @param {IApiGetOpenDataByCloudIdResp=} [properties] Properties to set\n     */\n    function ApiGetOpenDataByCloudIdResp(properties) {\n        this.dataList = [];\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * ApiGetOpenDataByCloudIdResp dataList.\n     * @member {Array.<ApiGetOpenDataByCloudIdResp.IOpDataItem>} dataList\n     * @memberof ApiGetOpenDataByCloudIdResp\n     * @instance\n     */\n    ApiGetOpenDataByCloudIdResp.prototype.dataList = $util.emptyArray;\n\n    /**\n     * Creates a new ApiGetOpenDataByCloudIdResp instance using the specified properties.\n     * @function create\n     * @memberof ApiGetOpenDataByCloudIdResp\n     * @static\n     * @param {IApiGetOpenDataByCloudIdResp=} [properties] Properties to set\n     * @returns {ApiGetOpenDataByCloudIdResp} ApiGetOpenDataByCloudIdResp instance\n     */\n    ApiGetOpenDataByCloudIdResp.create = function create(properties) {\n        return new ApiGetOpenDataByCloudIdResp(properties);\n    };\n\n    /**\n     * Encodes the specified ApiGetOpenDataByCloudIdResp message. Does not implicitly {@link ApiGetOpenDataByCloudIdResp.verify|verify} messages.\n     * @function encode\n     * @memberof ApiGetOpenDataByCloudIdResp\n     * @static\n     * @param {IApiGetOpenDataByCloudIdResp} message ApiGetOpenDataByCloudIdResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiGetOpenDataByCloudIdResp.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.dataList != null && message.dataList.length)\n            for (var i = 0; i < message.dataList.length; ++i)\n                $root.ApiGetOpenDataByCloudIdResp.OpDataItem.encode(message.dataList[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n        return writer;\n    };\n\n    /**\n     * Encodes the specified ApiGetOpenDataByCloudIdResp message, length delimited. Does not implicitly {@link ApiGetOpenDataByCloudIdResp.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof ApiGetOpenDataByCloudIdResp\n     * @static\n     * @param {IApiGetOpenDataByCloudIdResp} message ApiGetOpenDataByCloudIdResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiGetOpenDataByCloudIdResp.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes an ApiGetOpenDataByCloudIdResp message from the specified reader or buffer.\n     * @function decode\n     * @memberof ApiGetOpenDataByCloudIdResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {ApiGetOpenDataByCloudIdResp} ApiGetOpenDataByCloudIdResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiGetOpenDataByCloudIdResp.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ApiGetOpenDataByCloudIdResp();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                if (!(message.dataList && message.dataList.length))\n                    message.dataList = [];\n                message.dataList.push($root.ApiGetOpenDataByCloudIdResp.OpDataItem.decode(reader, reader.uint32()));\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes an ApiGetOpenDataByCloudIdResp message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof ApiGetOpenDataByCloudIdResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {ApiGetOpenDataByCloudIdResp} ApiGetOpenDataByCloudIdResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiGetOpenDataByCloudIdResp.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies an ApiGetOpenDataByCloudIdResp message.\n     * @function verify\n     * @memberof ApiGetOpenDataByCloudIdResp\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    ApiGetOpenDataByCloudIdResp.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.dataList != null && message.hasOwnProperty(\"dataList\")) {\n            if (!Array.isArray(message.dataList))\n                return \"dataList: array expected\";\n            for (var i = 0; i < message.dataList.length; ++i) {\n                var error = $root.ApiGetOpenDataByCloudIdResp.OpDataItem.verify(message.dataList[i]);\n                if (error)\n                    return \"dataList.\" + error;\n            }\n        }\n        return null;\n    };\n\n    /**\n     * Creates an ApiGetOpenDataByCloudIdResp message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof ApiGetOpenDataByCloudIdResp\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {ApiGetOpenDataByCloudIdResp} ApiGetOpenDataByCloudIdResp\n     */\n    ApiGetOpenDataByCloudIdResp.fromObject = function fromObject(object) {\n        if (object instanceof $root.ApiGetOpenDataByCloudIdResp)\n            return object;\n        var message = new $root.ApiGetOpenDataByCloudIdResp();\n        if (object.dataList) {\n            if (!Array.isArray(object.dataList))\n                throw TypeError(\".ApiGetOpenDataByCloudIdResp.dataList: array expected\");\n            message.dataList = [];\n            for (var i = 0; i < object.dataList.length; ++i) {\n                if (typeof object.dataList[i] !== \"object\")\n                    throw TypeError(\".ApiGetOpenDataByCloudIdResp.dataList: object expected\");\n                message.dataList[i] = $root.ApiGetOpenDataByCloudIdResp.OpDataItem.fromObject(object.dataList[i]);\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Creates a plain object from an ApiGetOpenDataByCloudIdResp message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof ApiGetOpenDataByCloudIdResp\n     * @static\n     * @param {ApiGetOpenDataByCloudIdResp} message ApiGetOpenDataByCloudIdResp\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    ApiGetOpenDataByCloudIdResp.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.arrays || options.defaults)\n            object.dataList = [];\n        if (message.dataList && message.dataList.length) {\n            object.dataList = [];\n            for (var j = 0; j < message.dataList.length; ++j)\n                object.dataList[j] = $root.ApiGetOpenDataByCloudIdResp.OpDataItem.toObject(message.dataList[j], options);\n        }\n        return object;\n    };\n\n    /**\n     * Converts this ApiGetOpenDataByCloudIdResp to JSON.\n     * @function toJSON\n     * @memberof ApiGetOpenDataByCloudIdResp\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    ApiGetOpenDataByCloudIdResp.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    ApiGetOpenDataByCloudIdResp.OpDataItem = (function() {\n\n        /**\n         * Properties of an OpDataItem.\n         * @memberof ApiGetOpenDataByCloudIdResp\n         * @interface IOpDataItem\n         * @property {string|null} [cloudId] OpDataItem cloudId\n         * @property {string|null} [json] OpDataItem json\n         */\n\n        /**\n         * Constructs a new OpDataItem.\n         * @memberof ApiGetOpenDataByCloudIdResp\n         * @classdesc Represents an OpDataItem.\n         * @implements IOpDataItem\n         * @constructor\n         * @param {ApiGetOpenDataByCloudIdResp.IOpDataItem=} [properties] Properties to set\n         */\n        function OpDataItem(properties) {\n            if (properties)\n                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                    if (properties[keys[i]] != null)\n                        this[keys[i]] = properties[keys[i]];\n        }\n\n        /**\n         * OpDataItem cloudId.\n         * @member {string} cloudId\n         * @memberof ApiGetOpenDataByCloudIdResp.OpDataItem\n         * @instance\n         */\n        OpDataItem.prototype.cloudId = \"\";\n\n        /**\n         * OpDataItem json.\n         * @member {string} json\n         * @memberof ApiGetOpenDataByCloudIdResp.OpDataItem\n         * @instance\n         */\n        OpDataItem.prototype.json = \"\";\n\n        /**\n         * Creates a new OpDataItem instance using the specified properties.\n         * @function create\n         * @memberof ApiGetOpenDataByCloudIdResp.OpDataItem\n         * @static\n         * @param {ApiGetOpenDataByCloudIdResp.IOpDataItem=} [properties] Properties to set\n         * @returns {ApiGetOpenDataByCloudIdResp.OpDataItem} OpDataItem instance\n         */\n        OpDataItem.create = function create(properties) {\n            return new OpDataItem(properties);\n        };\n\n        /**\n         * Encodes the specified OpDataItem message. Does not implicitly {@link ApiGetOpenDataByCloudIdResp.OpDataItem.verify|verify} messages.\n         * @function encode\n         * @memberof ApiGetOpenDataByCloudIdResp.OpDataItem\n         * @static\n         * @param {ApiGetOpenDataByCloudIdResp.IOpDataItem} message OpDataItem message or plain object to encode\n         * @param {$protobuf.Writer} [writer] Writer to encode to\n         * @returns {$protobuf.Writer} Writer\n         */\n        OpDataItem.encode = function encode(message, writer) {\n            if (!writer)\n                writer = $Writer.create();\n            if (message.cloudId != null && message.hasOwnProperty(\"cloudId\"))\n                writer.uint32(/* id 1, wireType 2 =*/10).string(message.cloudId);\n            if (message.json != null && message.hasOwnProperty(\"json\"))\n                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);\n            return writer;\n        };\n\n        /**\n         * Encodes the specified OpDataItem message, length delimited. Does not implicitly {@link ApiGetOpenDataByCloudIdResp.OpDataItem.verify|verify} messages.\n         * @function encodeDelimited\n         * @memberof ApiGetOpenDataByCloudIdResp.OpDataItem\n         * @static\n         * @param {ApiGetOpenDataByCloudIdResp.IOpDataItem} message OpDataItem message or plain object to encode\n         * @param {$protobuf.Writer} [writer] Writer to encode to\n         * @returns {$protobuf.Writer} Writer\n         */\n        OpDataItem.encodeDelimited = function encodeDelimited(message, writer) {\n            return this.encode(message, writer).ldelim();\n        };\n\n        /**\n         * Decodes an OpDataItem message from the specified reader or buffer.\n         * @function decode\n         * @memberof ApiGetOpenDataByCloudIdResp.OpDataItem\n         * @static\n         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n         * @param {number} [length] Message length if known beforehand\n         * @returns {ApiGetOpenDataByCloudIdResp.OpDataItem} OpDataItem\n         * @throws {Error} If the payload is not a reader or valid buffer\n         * @throws {$protobuf.util.ProtocolError} If required fields are missing\n         */\n        OpDataItem.decode = function decode(reader, length) {\n            if (!(reader instanceof $Reader))\n                reader = $Reader.create(reader);\n            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ApiGetOpenDataByCloudIdResp.OpDataItem();\n            while (reader.pos < end) {\n                var tag = reader.uint32();\n                switch (tag >>> 3) {\n                case 1:\n                    message.cloudId = reader.string();\n                    break;\n                case 2:\n                    message.json = reader.string();\n                    break;\n                default:\n                    reader.skipType(tag & 7);\n                    break;\n                }\n            }\n            return message;\n        };\n\n        /**\n         * Decodes an OpDataItem message from the specified reader or buffer, length delimited.\n         * @function decodeDelimited\n         * @memberof ApiGetOpenDataByCloudIdResp.OpDataItem\n         * @static\n         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n         * @returns {ApiGetOpenDataByCloudIdResp.OpDataItem} OpDataItem\n         * @throws {Error} If the payload is not a reader or valid buffer\n         * @throws {$protobuf.util.ProtocolError} If required fields are missing\n         */\n        OpDataItem.decodeDelimited = function decodeDelimited(reader) {\n            if (!(reader instanceof $Reader))\n                reader = new $Reader(reader);\n            return this.decode(reader, reader.uint32());\n        };\n\n        /**\n         * Verifies an OpDataItem message.\n         * @function verify\n         * @memberof ApiGetOpenDataByCloudIdResp.OpDataItem\n         * @static\n         * @param {Object.<string,*>} message Plain object to verify\n         * @returns {string|null} `null` if valid, otherwise the reason why it is not\n         */\n        OpDataItem.verify = function verify(message) {\n            if (typeof message !== \"object\" || message === null)\n                return \"object expected\";\n            if (message.cloudId != null && message.hasOwnProperty(\"cloudId\"))\n                if (!$util.isString(message.cloudId))\n                    return \"cloudId: string expected\";\n            if (message.json != null && message.hasOwnProperty(\"json\"))\n                if (!$util.isString(message.json))\n                    return \"json: string expected\";\n            return null;\n        };\n\n        /**\n         * Creates an OpDataItem message from a plain object. Also converts values to their respective internal types.\n         * @function fromObject\n         * @memberof ApiGetOpenDataByCloudIdResp.OpDataItem\n         * @static\n         * @param {Object.<string,*>} object Plain object\n         * @returns {ApiGetOpenDataByCloudIdResp.OpDataItem} OpDataItem\n         */\n        OpDataItem.fromObject = function fromObject(object) {\n            if (object instanceof $root.ApiGetOpenDataByCloudIdResp.OpDataItem)\n                return object;\n            var message = new $root.ApiGetOpenDataByCloudIdResp.OpDataItem();\n            if (object.cloudId != null)\n                message.cloudId = String(object.cloudId);\n            if (object.json != null)\n                message.json = String(object.json);\n            return message;\n        };\n\n        /**\n         * Creates a plain object from an OpDataItem message. Also converts values to other types if specified.\n         * @function toObject\n         * @memberof ApiGetOpenDataByCloudIdResp.OpDataItem\n         * @static\n         * @param {ApiGetOpenDataByCloudIdResp.OpDataItem} message OpDataItem\n         * @param {$protobuf.IConversionOptions} [options] Conversion options\n         * @returns {Object.<string,*>} Plain object\n         */\n        OpDataItem.toObject = function toObject(message, options) {\n            if (!options)\n                options = {};\n            var object = {};\n            if (options.defaults) {\n                object.cloudId = \"\";\n                object.json = \"\";\n            }\n            if (message.cloudId != null && message.hasOwnProperty(\"cloudId\"))\n                object.cloudId = message.cloudId;\n            if (message.json != null && message.hasOwnProperty(\"json\"))\n                object.json = message.json;\n            return object;\n        };\n\n        /**\n         * Converts this OpDataItem to JSON.\n         * @function toJSON\n         * @memberof ApiGetOpenDataByCloudIdResp.OpDataItem\n         * @instance\n         * @returns {Object.<string,*>} JSON object\n         */\n        OpDataItem.prototype.toJSON = function toJSON() {\n            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n        };\n\n        return OpDataItem;\n    })();\n\n    return ApiGetOpenDataByCloudIdResp;\n})();\n\n$root.ApiVoipSignReq = (function() {\n\n    /**\n     * Properties of an ApiVoipSignReq.\n     * @exports IApiVoipSignReq\n     * @interface IApiVoipSignReq\n     * @property {string|null} [groupId] ApiVoipSignReq groupId\n     * @property {number|null} [timestamp] ApiVoipSignReq timestamp\n     * @property {string|null} [nonce] ApiVoipSignReq nonce\n     */\n\n    /**\n     * Constructs a new ApiVoipSignReq.\n     * @exports ApiVoipSignReq\n     * @classdesc Represents an ApiVoipSignReq.\n     * @implements IApiVoipSignReq\n     * @constructor\n     * @param {IApiVoipSignReq=} [properties] Properties to set\n     */\n    function ApiVoipSignReq(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * ApiVoipSignReq groupId.\n     * @member {string} groupId\n     * @memberof ApiVoipSignReq\n     * @instance\n     */\n    ApiVoipSignReq.prototype.groupId = \"\";\n\n    /**\n     * ApiVoipSignReq timestamp.\n     * @member {number} timestamp\n     * @memberof ApiVoipSignReq\n     * @instance\n     */\n    ApiVoipSignReq.prototype.timestamp = 0;\n\n    /**\n     * ApiVoipSignReq nonce.\n     * @member {string} nonce\n     * @memberof ApiVoipSignReq\n     * @instance\n     */\n    ApiVoipSignReq.prototype.nonce = \"\";\n\n    /**\n     * Creates a new ApiVoipSignReq instance using the specified properties.\n     * @function create\n     * @memberof ApiVoipSignReq\n     * @static\n     * @param {IApiVoipSignReq=} [properties] Properties to set\n     * @returns {ApiVoipSignReq} ApiVoipSignReq instance\n     */\n    ApiVoipSignReq.create = function create(properties) {\n        return new ApiVoipSignReq(properties);\n    };\n\n    /**\n     * Encodes the specified ApiVoipSignReq message. Does not implicitly {@link ApiVoipSignReq.verify|verify} messages.\n     * @function encode\n     * @memberof ApiVoipSignReq\n     * @static\n     * @param {IApiVoipSignReq} message ApiVoipSignReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiVoipSignReq.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.groupId != null && message.hasOwnProperty(\"groupId\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).string(message.groupId);\n        if (message.timestamp != null && message.hasOwnProperty(\"timestamp\"))\n            writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.timestamp);\n        if (message.nonce != null && message.hasOwnProperty(\"nonce\"))\n            writer.uint32(/* id 4, wireType 2 =*/34).string(message.nonce);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified ApiVoipSignReq message, length delimited. Does not implicitly {@link ApiVoipSignReq.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof ApiVoipSignReq\n     * @static\n     * @param {IApiVoipSignReq} message ApiVoipSignReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiVoipSignReq.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes an ApiVoipSignReq message from the specified reader or buffer.\n     * @function decode\n     * @memberof ApiVoipSignReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {ApiVoipSignReq} ApiVoipSignReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiVoipSignReq.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ApiVoipSignReq();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 2:\n                message.groupId = reader.string();\n                break;\n            case 3:\n                message.timestamp = reader.uint32();\n                break;\n            case 4:\n                message.nonce = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes an ApiVoipSignReq message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof ApiVoipSignReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {ApiVoipSignReq} ApiVoipSignReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiVoipSignReq.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies an ApiVoipSignReq message.\n     * @function verify\n     * @memberof ApiVoipSignReq\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    ApiVoipSignReq.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.groupId != null && message.hasOwnProperty(\"groupId\"))\n            if (!$util.isString(message.groupId))\n                return \"groupId: string expected\";\n        if (message.timestamp != null && message.hasOwnProperty(\"timestamp\"))\n            if (!$util.isInteger(message.timestamp))\n                return \"timestamp: integer expected\";\n        if (message.nonce != null && message.hasOwnProperty(\"nonce\"))\n            if (!$util.isString(message.nonce))\n                return \"nonce: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates an ApiVoipSignReq message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof ApiVoipSignReq\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {ApiVoipSignReq} ApiVoipSignReq\n     */\n    ApiVoipSignReq.fromObject = function fromObject(object) {\n        if (object instanceof $root.ApiVoipSignReq)\n            return object;\n        var message = new $root.ApiVoipSignReq();\n        if (object.groupId != null)\n            message.groupId = String(object.groupId);\n        if (object.timestamp != null)\n            message.timestamp = object.timestamp >>> 0;\n        if (object.nonce != null)\n            message.nonce = String(object.nonce);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from an ApiVoipSignReq message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof ApiVoipSignReq\n     * @static\n     * @param {ApiVoipSignReq} message ApiVoipSignReq\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    ApiVoipSignReq.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.groupId = \"\";\n            object.timestamp = 0;\n            object.nonce = \"\";\n        }\n        if (message.groupId != null && message.hasOwnProperty(\"groupId\"))\n            object.groupId = message.groupId;\n        if (message.timestamp != null && message.hasOwnProperty(\"timestamp\"))\n            object.timestamp = message.timestamp;\n        if (message.nonce != null && message.hasOwnProperty(\"nonce\"))\n            object.nonce = message.nonce;\n        return object;\n    };\n\n    /**\n     * Converts this ApiVoipSignReq to JSON.\n     * @function toJSON\n     * @memberof ApiVoipSignReq\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    ApiVoipSignReq.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return ApiVoipSignReq;\n})();\n\n$root.ApiVoipSignResp = (function() {\n\n    /**\n     * Properties of an ApiVoipSignResp.\n     * @exports IApiVoipSignResp\n     * @interface IApiVoipSignResp\n     * @property {string|null} [signature] ApiVoipSignResp signature\n     */\n\n    /**\n     * Constructs a new ApiVoipSignResp.\n     * @exports ApiVoipSignResp\n     * @classdesc Represents an ApiVoipSignResp.\n     * @implements IApiVoipSignResp\n     * @constructor\n     * @param {IApiVoipSignResp=} [properties] Properties to set\n     */\n    function ApiVoipSignResp(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * ApiVoipSignResp signature.\n     * @member {string} signature\n     * @memberof ApiVoipSignResp\n     * @instance\n     */\n    ApiVoipSignResp.prototype.signature = \"\";\n\n    /**\n     * Creates a new ApiVoipSignResp instance using the specified properties.\n     * @function create\n     * @memberof ApiVoipSignResp\n     * @static\n     * @param {IApiVoipSignResp=} [properties] Properties to set\n     * @returns {ApiVoipSignResp} ApiVoipSignResp instance\n     */\n    ApiVoipSignResp.create = function create(properties) {\n        return new ApiVoipSignResp(properties);\n    };\n\n    /**\n     * Encodes the specified ApiVoipSignResp message. Does not implicitly {@link ApiVoipSignResp.verify|verify} messages.\n     * @function encode\n     * @memberof ApiVoipSignResp\n     * @static\n     * @param {IApiVoipSignResp} message ApiVoipSignResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiVoipSignResp.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.signature != null && message.hasOwnProperty(\"signature\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).string(message.signature);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified ApiVoipSignResp message, length delimited. Does not implicitly {@link ApiVoipSignResp.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof ApiVoipSignResp\n     * @static\n     * @param {IApiVoipSignResp} message ApiVoipSignResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiVoipSignResp.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes an ApiVoipSignResp message from the specified reader or buffer.\n     * @function decode\n     * @memberof ApiVoipSignResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {ApiVoipSignResp} ApiVoipSignResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiVoipSignResp.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ApiVoipSignResp();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.signature = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes an ApiVoipSignResp message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof ApiVoipSignResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {ApiVoipSignResp} ApiVoipSignResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiVoipSignResp.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies an ApiVoipSignResp message.\n     * @function verify\n     * @memberof ApiVoipSignResp\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    ApiVoipSignResp.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.signature != null && message.hasOwnProperty(\"signature\"))\n            if (!$util.isString(message.signature))\n                return \"signature: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates an ApiVoipSignResp message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof ApiVoipSignResp\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {ApiVoipSignResp} ApiVoipSignResp\n     */\n    ApiVoipSignResp.fromObject = function fromObject(object) {\n        if (object instanceof $root.ApiVoipSignResp)\n            return object;\n        var message = new $root.ApiVoipSignResp();\n        if (object.signature != null)\n            message.signature = String(object.signature);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from an ApiVoipSignResp message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof ApiVoipSignResp\n     * @static\n     * @param {ApiVoipSignResp} message ApiVoipSignResp\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    ApiVoipSignResp.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults)\n            object.signature = \"\";\n        if (message.signature != null && message.hasOwnProperty(\"signature\"))\n            object.signature = message.signature;\n        return object;\n    };\n\n    /**\n     * Converts this ApiVoipSignResp to JSON.\n     * @function toJSON\n     * @memberof ApiVoipSignResp\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    ApiVoipSignResp.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return ApiVoipSignResp;\n})();\n\n$root.GetCloudCallSignReq = (function() {\n\n    /**\n     * Properties of a GetCloudCallSignReq.\n     * @exports IGetCloudCallSignReq\n     * @interface IGetCloudCallSignReq\n     * @property {Array.<string>|null} [parameterList] GetCloudCallSignReq parameterList\n     */\n\n    /**\n     * Constructs a new GetCloudCallSignReq.\n     * @exports GetCloudCallSignReq\n     * @classdesc Represents a GetCloudCallSignReq.\n     * @implements IGetCloudCallSignReq\n     * @constructor\n     * @param {IGetCloudCallSignReq=} [properties] Properties to set\n     */\n    function GetCloudCallSignReq(properties) {\n        this.parameterList = [];\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GetCloudCallSignReq parameterList.\n     * @member {Array.<string>} parameterList\n     * @memberof GetCloudCallSignReq\n     * @instance\n     */\n    GetCloudCallSignReq.prototype.parameterList = $util.emptyArray;\n\n    /**\n     * Creates a new GetCloudCallSignReq instance using the specified properties.\n     * @function create\n     * @memberof GetCloudCallSignReq\n     * @static\n     * @param {IGetCloudCallSignReq=} [properties] Properties to set\n     * @returns {GetCloudCallSignReq} GetCloudCallSignReq instance\n     */\n    GetCloudCallSignReq.create = function create(properties) {\n        return new GetCloudCallSignReq(properties);\n    };\n\n    /**\n     * Encodes the specified GetCloudCallSignReq message. Does not implicitly {@link GetCloudCallSignReq.verify|verify} messages.\n     * @function encode\n     * @memberof GetCloudCallSignReq\n     * @static\n     * @param {IGetCloudCallSignReq} message GetCloudCallSignReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetCloudCallSignReq.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.parameterList != null && message.parameterList.length)\n            for (var i = 0; i < message.parameterList.length; ++i)\n                writer.uint32(/* id 2, wireType 2 =*/18).string(message.parameterList[i]);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GetCloudCallSignReq message, length delimited. Does not implicitly {@link GetCloudCallSignReq.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GetCloudCallSignReq\n     * @static\n     * @param {IGetCloudCallSignReq} message GetCloudCallSignReq message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetCloudCallSignReq.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GetCloudCallSignReq message from the specified reader or buffer.\n     * @function decode\n     * @memberof GetCloudCallSignReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GetCloudCallSignReq} GetCloudCallSignReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetCloudCallSignReq.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GetCloudCallSignReq();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 2:\n                if (!(message.parameterList && message.parameterList.length))\n                    message.parameterList = [];\n                message.parameterList.push(reader.string());\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GetCloudCallSignReq message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GetCloudCallSignReq\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GetCloudCallSignReq} GetCloudCallSignReq\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetCloudCallSignReq.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GetCloudCallSignReq message.\n     * @function verify\n     * @memberof GetCloudCallSignReq\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GetCloudCallSignReq.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.parameterList != null && message.hasOwnProperty(\"parameterList\")) {\n            if (!Array.isArray(message.parameterList))\n                return \"parameterList: array expected\";\n            for (var i = 0; i < message.parameterList.length; ++i)\n                if (!$util.isString(message.parameterList[i]))\n                    return \"parameterList: string[] expected\";\n        }\n        return null;\n    };\n\n    /**\n     * Creates a GetCloudCallSignReq message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GetCloudCallSignReq\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GetCloudCallSignReq} GetCloudCallSignReq\n     */\n    GetCloudCallSignReq.fromObject = function fromObject(object) {\n        if (object instanceof $root.GetCloudCallSignReq)\n            return object;\n        var message = new $root.GetCloudCallSignReq();\n        if (object.parameterList) {\n            if (!Array.isArray(object.parameterList))\n                throw TypeError(\".GetCloudCallSignReq.parameterList: array expected\");\n            message.parameterList = [];\n            for (var i = 0; i < object.parameterList.length; ++i)\n                message.parameterList[i] = String(object.parameterList[i]);\n        }\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GetCloudCallSignReq message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GetCloudCallSignReq\n     * @static\n     * @param {GetCloudCallSignReq} message GetCloudCallSignReq\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GetCloudCallSignReq.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.arrays || options.defaults)\n            object.parameterList = [];\n        if (message.parameterList && message.parameterList.length) {\n            object.parameterList = [];\n            for (var j = 0; j < message.parameterList.length; ++j)\n                object.parameterList[j] = message.parameterList[j];\n        }\n        return object;\n    };\n\n    /**\n     * Converts this GetCloudCallSignReq to JSON.\n     * @function toJSON\n     * @memberof GetCloudCallSignReq\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GetCloudCallSignReq.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GetCloudCallSignReq;\n})();\n\n$root.GetCloudCallSignResp = (function() {\n\n    /**\n     * Properties of a GetCloudCallSignResp.\n     * @exports IGetCloudCallSignResp\n     * @interface IGetCloudCallSignResp\n     * @property {string|null} [signature] GetCloudCallSignResp signature\n     */\n\n    /**\n     * Constructs a new GetCloudCallSignResp.\n     * @exports GetCloudCallSignResp\n     * @classdesc Represents a GetCloudCallSignResp.\n     * @implements IGetCloudCallSignResp\n     * @constructor\n     * @param {IGetCloudCallSignResp=} [properties] Properties to set\n     */\n    function GetCloudCallSignResp(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * GetCloudCallSignResp signature.\n     * @member {string} signature\n     * @memberof GetCloudCallSignResp\n     * @instance\n     */\n    GetCloudCallSignResp.prototype.signature = \"\";\n\n    /**\n     * Creates a new GetCloudCallSignResp instance using the specified properties.\n     * @function create\n     * @memberof GetCloudCallSignResp\n     * @static\n     * @param {IGetCloudCallSignResp=} [properties] Properties to set\n     * @returns {GetCloudCallSignResp} GetCloudCallSignResp instance\n     */\n    GetCloudCallSignResp.create = function create(properties) {\n        return new GetCloudCallSignResp(properties);\n    };\n\n    /**\n     * Encodes the specified GetCloudCallSignResp message. Does not implicitly {@link GetCloudCallSignResp.verify|verify} messages.\n     * @function encode\n     * @memberof GetCloudCallSignResp\n     * @static\n     * @param {IGetCloudCallSignResp} message GetCloudCallSignResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetCloudCallSignResp.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.signature != null && message.hasOwnProperty(\"signature\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).string(message.signature);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified GetCloudCallSignResp message, length delimited. Does not implicitly {@link GetCloudCallSignResp.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof GetCloudCallSignResp\n     * @static\n     * @param {IGetCloudCallSignResp} message GetCloudCallSignResp message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    GetCloudCallSignResp.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes a GetCloudCallSignResp message from the specified reader or buffer.\n     * @function decode\n     * @memberof GetCloudCallSignResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {GetCloudCallSignResp} GetCloudCallSignResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetCloudCallSignResp.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.GetCloudCallSignResp();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.signature = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes a GetCloudCallSignResp message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof GetCloudCallSignResp\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {GetCloudCallSignResp} GetCloudCallSignResp\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    GetCloudCallSignResp.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies a GetCloudCallSignResp message.\n     * @function verify\n     * @memberof GetCloudCallSignResp\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    GetCloudCallSignResp.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.signature != null && message.hasOwnProperty(\"signature\"))\n            if (!$util.isString(message.signature))\n                return \"signature: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates a GetCloudCallSignResp message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof GetCloudCallSignResp\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {GetCloudCallSignResp} GetCloudCallSignResp\n     */\n    GetCloudCallSignResp.fromObject = function fromObject(object) {\n        if (object instanceof $root.GetCloudCallSignResp)\n            return object;\n        var message = new $root.GetCloudCallSignResp();\n        if (object.signature != null)\n            message.signature = String(object.signature);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from a GetCloudCallSignResp message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof GetCloudCallSignResp\n     * @static\n     * @param {GetCloudCallSignResp} message GetCloudCallSignResp\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    GetCloudCallSignResp.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults)\n            object.signature = \"\";\n        if (message.signature != null && message.hasOwnProperty(\"signature\"))\n            object.signature = message.signature;\n        return object;\n    };\n\n    /**\n     * Converts this GetCloudCallSignResp to JSON.\n     * @function toJSON\n     * @memberof GetCloudCallSignResp\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    GetCloudCallSignResp.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return GetCloudCallSignResp;\n})();\n\n$root.AuthorizationInfo = (function() {\n\n    /**\n     * Properties of an AuthorizationInfo.\n     * @exports IAuthorizationInfo\n     * @interface IAuthorizationInfo\n     * @property {AuthorizationInfo.ITcbCredentials|null} [tcbCredentials] AuthorizationInfo tcbCredentials\n     * @property {Uint8Array|null} [wxParam] AuthorizationInfo wxParam\n     */\n\n    /**\n     * Constructs a new AuthorizationInfo.\n     * @exports AuthorizationInfo\n     * @classdesc Represents an AuthorizationInfo.\n     * @implements IAuthorizationInfo\n     * @constructor\n     * @param {IAuthorizationInfo=} [properties] Properties to set\n     */\n    function AuthorizationInfo(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * AuthorizationInfo tcbCredentials.\n     * @member {AuthorizationInfo.ITcbCredentials|null|undefined} tcbCredentials\n     * @memberof AuthorizationInfo\n     * @instance\n     */\n    AuthorizationInfo.prototype.tcbCredentials = null;\n\n    /**\n     * AuthorizationInfo wxParam.\n     * @member {Uint8Array} wxParam\n     * @memberof AuthorizationInfo\n     * @instance\n     */\n    AuthorizationInfo.prototype.wxParam = $util.newBuffer([]);\n\n    /**\n     * Creates a new AuthorizationInfo instance using the specified properties.\n     * @function create\n     * @memberof AuthorizationInfo\n     * @static\n     * @param {IAuthorizationInfo=} [properties] Properties to set\n     * @returns {AuthorizationInfo} AuthorizationInfo instance\n     */\n    AuthorizationInfo.create = function create(properties) {\n        return new AuthorizationInfo(properties);\n    };\n\n    /**\n     * Encodes the specified AuthorizationInfo message. Does not implicitly {@link AuthorizationInfo.verify|verify} messages.\n     * @function encode\n     * @memberof AuthorizationInfo\n     * @static\n     * @param {IAuthorizationInfo} message AuthorizationInfo message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    AuthorizationInfo.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.tcbCredentials != null && message.hasOwnProperty(\"tcbCredentials\"))\n            $root.AuthorizationInfo.TcbCredentials.encode(message.tcbCredentials, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n        if (message.wxParam != null && message.hasOwnProperty(\"wxParam\"))\n            writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.wxParam);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified AuthorizationInfo message, length delimited. Does not implicitly {@link AuthorizationInfo.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof AuthorizationInfo\n     * @static\n     * @param {IAuthorizationInfo} message AuthorizationInfo message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    AuthorizationInfo.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes an AuthorizationInfo message from the specified reader or buffer.\n     * @function decode\n     * @memberof AuthorizationInfo\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {AuthorizationInfo} AuthorizationInfo\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    AuthorizationInfo.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.AuthorizationInfo();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.tcbCredentials = $root.AuthorizationInfo.TcbCredentials.decode(reader, reader.uint32());\n                break;\n            case 2:\n                message.wxParam = reader.bytes();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes an AuthorizationInfo message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof AuthorizationInfo\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {AuthorizationInfo} AuthorizationInfo\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    AuthorizationInfo.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies an AuthorizationInfo message.\n     * @function verify\n     * @memberof AuthorizationInfo\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    AuthorizationInfo.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.tcbCredentials != null && message.hasOwnProperty(\"tcbCredentials\")) {\n            var error = $root.AuthorizationInfo.TcbCredentials.verify(message.tcbCredentials);\n            if (error)\n                return \"tcbCredentials.\" + error;\n        }\n        if (message.wxParam != null && message.hasOwnProperty(\"wxParam\"))\n            if (!(message.wxParam && typeof message.wxParam.length === \"number\" || $util.isString(message.wxParam)))\n                return \"wxParam: buffer expected\";\n        return null;\n    };\n\n    /**\n     * Creates an AuthorizationInfo message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof AuthorizationInfo\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {AuthorizationInfo} AuthorizationInfo\n     */\n    AuthorizationInfo.fromObject = function fromObject(object) {\n        if (object instanceof $root.AuthorizationInfo)\n            return object;\n        var message = new $root.AuthorizationInfo();\n        if (object.tcbCredentials != null) {\n            if (typeof object.tcbCredentials !== \"object\")\n                throw TypeError(\".AuthorizationInfo.tcbCredentials: object expected\");\n            message.tcbCredentials = $root.AuthorizationInfo.TcbCredentials.fromObject(object.tcbCredentials);\n        }\n        if (object.wxParam != null)\n            if (typeof object.wxParam === \"string\")\n                $util.base64.decode(object.wxParam, message.wxParam = $util.newBuffer($util.base64.length(object.wxParam)), 0);\n            else if (object.wxParam.length)\n                message.wxParam = object.wxParam;\n        return message;\n    };\n\n    /**\n     * Creates a plain object from an AuthorizationInfo message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof AuthorizationInfo\n     * @static\n     * @param {AuthorizationInfo} message AuthorizationInfo\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    AuthorizationInfo.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults) {\n            object.tcbCredentials = null;\n            if (options.bytes === String)\n                object.wxParam = \"\";\n            else {\n                object.wxParam = [];\n                if (options.bytes !== Array)\n                    object.wxParam = $util.newBuffer(object.wxParam);\n            }\n        }\n        if (message.tcbCredentials != null && message.hasOwnProperty(\"tcbCredentials\"))\n            object.tcbCredentials = $root.AuthorizationInfo.TcbCredentials.toObject(message.tcbCredentials, options);\n        if (message.wxParam != null && message.hasOwnProperty(\"wxParam\"))\n            object.wxParam = options.bytes === String ? $util.base64.encode(message.wxParam, 0, message.wxParam.length) : options.bytes === Array ? Array.prototype.slice.call(message.wxParam) : message.wxParam;\n        return object;\n    };\n\n    /**\n     * Converts this AuthorizationInfo to JSON.\n     * @function toJSON\n     * @memberof AuthorizationInfo\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    AuthorizationInfo.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    AuthorizationInfo.TcbCredentials = (function() {\n\n        /**\n         * Properties of a TcbCredentials.\n         * @memberof AuthorizationInfo\n         * @interface ITcbCredentials\n         * @property {string|null} [secretId] TcbCredentials secretId\n         * @property {string|null} [secretKey] TcbCredentials secretKey\n         * @property {string|null} [token] TcbCredentials token\n         */\n\n        /**\n         * Constructs a new TcbCredentials.\n         * @memberof AuthorizationInfo\n         * @classdesc Represents a TcbCredentials.\n         * @implements ITcbCredentials\n         * @constructor\n         * @param {AuthorizationInfo.ITcbCredentials=} [properties] Properties to set\n         */\n        function TcbCredentials(properties) {\n            if (properties)\n                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                    if (properties[keys[i]] != null)\n                        this[keys[i]] = properties[keys[i]];\n        }\n\n        /**\n         * TcbCredentials secretId.\n         * @member {string} secretId\n         * @memberof AuthorizationInfo.TcbCredentials\n         * @instance\n         */\n        TcbCredentials.prototype.secretId = \"\";\n\n        /**\n         * TcbCredentials secretKey.\n         * @member {string} secretKey\n         * @memberof AuthorizationInfo.TcbCredentials\n         * @instance\n         */\n        TcbCredentials.prototype.secretKey = \"\";\n\n        /**\n         * TcbCredentials token.\n         * @member {string} token\n         * @memberof AuthorizationInfo.TcbCredentials\n         * @instance\n         */\n        TcbCredentials.prototype.token = \"\";\n\n        /**\n         * Creates a new TcbCredentials instance using the specified properties.\n         * @function create\n         * @memberof AuthorizationInfo.TcbCredentials\n         * @static\n         * @param {AuthorizationInfo.ITcbCredentials=} [properties] Properties to set\n         * @returns {AuthorizationInfo.TcbCredentials} TcbCredentials instance\n         */\n        TcbCredentials.create = function create(properties) {\n            return new TcbCredentials(properties);\n        };\n\n        /**\n         * Encodes the specified TcbCredentials message. Does not implicitly {@link AuthorizationInfo.TcbCredentials.verify|verify} messages.\n         * @function encode\n         * @memberof AuthorizationInfo.TcbCredentials\n         * @static\n         * @param {AuthorizationInfo.ITcbCredentials} message TcbCredentials message or plain object to encode\n         * @param {$protobuf.Writer} [writer] Writer to encode to\n         * @returns {$protobuf.Writer} Writer\n         */\n        TcbCredentials.encode = function encode(message, writer) {\n            if (!writer)\n                writer = $Writer.create();\n            if (message.secretId != null && message.hasOwnProperty(\"secretId\"))\n                writer.uint32(/* id 1, wireType 2 =*/10).string(message.secretId);\n            if (message.secretKey != null && message.hasOwnProperty(\"secretKey\"))\n                writer.uint32(/* id 2, wireType 2 =*/18).string(message.secretKey);\n            if (message.token != null && message.hasOwnProperty(\"token\"))\n                writer.uint32(/* id 3, wireType 2 =*/26).string(message.token);\n            return writer;\n        };\n\n        /**\n         * Encodes the specified TcbCredentials message, length delimited. Does not implicitly {@link AuthorizationInfo.TcbCredentials.verify|verify} messages.\n         * @function encodeDelimited\n         * @memberof AuthorizationInfo.TcbCredentials\n         * @static\n         * @param {AuthorizationInfo.ITcbCredentials} message TcbCredentials message or plain object to encode\n         * @param {$protobuf.Writer} [writer] Writer to encode to\n         * @returns {$protobuf.Writer} Writer\n         */\n        TcbCredentials.encodeDelimited = function encodeDelimited(message, writer) {\n            return this.encode(message, writer).ldelim();\n        };\n\n        /**\n         * Decodes a TcbCredentials message from the specified reader or buffer.\n         * @function decode\n         * @memberof AuthorizationInfo.TcbCredentials\n         * @static\n         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n         * @param {number} [length] Message length if known beforehand\n         * @returns {AuthorizationInfo.TcbCredentials} TcbCredentials\n         * @throws {Error} If the payload is not a reader or valid buffer\n         * @throws {$protobuf.util.ProtocolError} If required fields are missing\n         */\n        TcbCredentials.decode = function decode(reader, length) {\n            if (!(reader instanceof $Reader))\n                reader = $Reader.create(reader);\n            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.AuthorizationInfo.TcbCredentials();\n            while (reader.pos < end) {\n                var tag = reader.uint32();\n                switch (tag >>> 3) {\n                case 1:\n                    message.secretId = reader.string();\n                    break;\n                case 2:\n                    message.secretKey = reader.string();\n                    break;\n                case 3:\n                    message.token = reader.string();\n                    break;\n                default:\n                    reader.skipType(tag & 7);\n                    break;\n                }\n            }\n            return message;\n        };\n\n        /**\n         * Decodes a TcbCredentials message from the specified reader or buffer, length delimited.\n         * @function decodeDelimited\n         * @memberof AuthorizationInfo.TcbCredentials\n         * @static\n         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n         * @returns {AuthorizationInfo.TcbCredentials} TcbCredentials\n         * @throws {Error} If the payload is not a reader or valid buffer\n         * @throws {$protobuf.util.ProtocolError} If required fields are missing\n         */\n        TcbCredentials.decodeDelimited = function decodeDelimited(reader) {\n            if (!(reader instanceof $Reader))\n                reader = new $Reader(reader);\n            return this.decode(reader, reader.uint32());\n        };\n\n        /**\n         * Verifies a TcbCredentials message.\n         * @function verify\n         * @memberof AuthorizationInfo.TcbCredentials\n         * @static\n         * @param {Object.<string,*>} message Plain object to verify\n         * @returns {string|null} `null` if valid, otherwise the reason why it is not\n         */\n        TcbCredentials.verify = function verify(message) {\n            if (typeof message !== \"object\" || message === null)\n                return \"object expected\";\n            if (message.secretId != null && message.hasOwnProperty(\"secretId\"))\n                if (!$util.isString(message.secretId))\n                    return \"secretId: string expected\";\n            if (message.secretKey != null && message.hasOwnProperty(\"secretKey\"))\n                if (!$util.isString(message.secretKey))\n                    return \"secretKey: string expected\";\n            if (message.token != null && message.hasOwnProperty(\"token\"))\n                if (!$util.isString(message.token))\n                    return \"token: string expected\";\n            return null;\n        };\n\n        /**\n         * Creates a TcbCredentials message from a plain object. Also converts values to their respective internal types.\n         * @function fromObject\n         * @memberof AuthorizationInfo.TcbCredentials\n         * @static\n         * @param {Object.<string,*>} object Plain object\n         * @returns {AuthorizationInfo.TcbCredentials} TcbCredentials\n         */\n        TcbCredentials.fromObject = function fromObject(object) {\n            if (object instanceof $root.AuthorizationInfo.TcbCredentials)\n                return object;\n            var message = new $root.AuthorizationInfo.TcbCredentials();\n            if (object.secretId != null)\n                message.secretId = String(object.secretId);\n            if (object.secretKey != null)\n                message.secretKey = String(object.secretKey);\n            if (object.token != null)\n                message.token = String(object.token);\n            return message;\n        };\n\n        /**\n         * Creates a plain object from a TcbCredentials message. Also converts values to other types if specified.\n         * @function toObject\n         * @memberof AuthorizationInfo.TcbCredentials\n         * @static\n         * @param {AuthorizationInfo.TcbCredentials} message TcbCredentials\n         * @param {$protobuf.IConversionOptions} [options] Conversion options\n         * @returns {Object.<string,*>} Plain object\n         */\n        TcbCredentials.toObject = function toObject(message, options) {\n            if (!options)\n                options = {};\n            var object = {};\n            if (options.defaults) {\n                object.secretId = \"\";\n                object.secretKey = \"\";\n                object.token = \"\";\n            }\n            if (message.secretId != null && message.hasOwnProperty(\"secretId\"))\n                object.secretId = message.secretId;\n            if (message.secretKey != null && message.hasOwnProperty(\"secretKey\"))\n                object.secretKey = message.secretKey;\n            if (message.token != null && message.hasOwnProperty(\"token\"))\n                object.token = message.token;\n            return object;\n        };\n\n        /**\n         * Converts this TcbCredentials to JSON.\n         * @function toJSON\n         * @memberof AuthorizationInfo.TcbCredentials\n         * @instance\n         * @returns {Object.<string,*>} JSON object\n         */\n        TcbCredentials.prototype.toJSON = function toJSON() {\n            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n        };\n\n        return TcbCredentials;\n    })();\n\n    AuthorizationInfo.WxParam = (function() {\n\n        /**\n         * Properties of a WxParam.\n         * @memberof AuthorizationInfo\n         * @interface IWxParam\n         * @property {Uint8Array|null} [qbaseTicket] WxParam qbaseTicket\n         * @property {string|null} [authUin] WxParam authUin\n         * @property {string|null} [extJson] WxParam extJson\n         */\n\n        /**\n         * Constructs a new WxParam.\n         * @memberof AuthorizationInfo\n         * @classdesc Represents a WxParam.\n         * @implements IWxParam\n         * @constructor\n         * @param {AuthorizationInfo.IWxParam=} [properties] Properties to set\n         */\n        function WxParam(properties) {\n            if (properties)\n                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                    if (properties[keys[i]] != null)\n                        this[keys[i]] = properties[keys[i]];\n        }\n\n        /**\n         * WxParam qbaseTicket.\n         * @member {Uint8Array} qbaseTicket\n         * @memberof AuthorizationInfo.WxParam\n         * @instance\n         */\n        WxParam.prototype.qbaseTicket = $util.newBuffer([]);\n\n        /**\n         * WxParam authUin.\n         * @member {string} authUin\n         * @memberof AuthorizationInfo.WxParam\n         * @instance\n         */\n        WxParam.prototype.authUin = \"\";\n\n        /**\n         * WxParam extJson.\n         * @member {string} extJson\n         * @memberof AuthorizationInfo.WxParam\n         * @instance\n         */\n        WxParam.prototype.extJson = \"\";\n\n        /**\n         * Creates a new WxParam instance using the specified properties.\n         * @function create\n         * @memberof AuthorizationInfo.WxParam\n         * @static\n         * @param {AuthorizationInfo.IWxParam=} [properties] Properties to set\n         * @returns {AuthorizationInfo.WxParam} WxParam instance\n         */\n        WxParam.create = function create(properties) {\n            return new WxParam(properties);\n        };\n\n        /**\n         * Encodes the specified WxParam message. Does not implicitly {@link AuthorizationInfo.WxParam.verify|verify} messages.\n         * @function encode\n         * @memberof AuthorizationInfo.WxParam\n         * @static\n         * @param {AuthorizationInfo.IWxParam} message WxParam message or plain object to encode\n         * @param {$protobuf.Writer} [writer] Writer to encode to\n         * @returns {$protobuf.Writer} Writer\n         */\n        WxParam.encode = function encode(message, writer) {\n            if (!writer)\n                writer = $Writer.create();\n            if (message.qbaseTicket != null && message.hasOwnProperty(\"qbaseTicket\"))\n                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.qbaseTicket);\n            if (message.authUin != null && message.hasOwnProperty(\"authUin\"))\n                writer.uint32(/* id 2, wireType 2 =*/18).string(message.authUin);\n            if (message.extJson != null && message.hasOwnProperty(\"extJson\"))\n                writer.uint32(/* id 3, wireType 2 =*/26).string(message.extJson);\n            return writer;\n        };\n\n        /**\n         * Encodes the specified WxParam message, length delimited. Does not implicitly {@link AuthorizationInfo.WxParam.verify|verify} messages.\n         * @function encodeDelimited\n         * @memberof AuthorizationInfo.WxParam\n         * @static\n         * @param {AuthorizationInfo.IWxParam} message WxParam message or plain object to encode\n         * @param {$protobuf.Writer} [writer] Writer to encode to\n         * @returns {$protobuf.Writer} Writer\n         */\n        WxParam.encodeDelimited = function encodeDelimited(message, writer) {\n            return this.encode(message, writer).ldelim();\n        };\n\n        /**\n         * Decodes a WxParam message from the specified reader or buffer.\n         * @function decode\n         * @memberof AuthorizationInfo.WxParam\n         * @static\n         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n         * @param {number} [length] Message length if known beforehand\n         * @returns {AuthorizationInfo.WxParam} WxParam\n         * @throws {Error} If the payload is not a reader or valid buffer\n         * @throws {$protobuf.util.ProtocolError} If required fields are missing\n         */\n        WxParam.decode = function decode(reader, length) {\n            if (!(reader instanceof $Reader))\n                reader = $Reader.create(reader);\n            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.AuthorizationInfo.WxParam();\n            while (reader.pos < end) {\n                var tag = reader.uint32();\n                switch (tag >>> 3) {\n                case 1:\n                    message.qbaseTicket = reader.bytes();\n                    break;\n                case 2:\n                    message.authUin = reader.string();\n                    break;\n                case 3:\n                    message.extJson = reader.string();\n                    break;\n                default:\n                    reader.skipType(tag & 7);\n                    break;\n                }\n            }\n            return message;\n        };\n\n        /**\n         * Decodes a WxParam message from the specified reader or buffer, length delimited.\n         * @function decodeDelimited\n         * @memberof AuthorizationInfo.WxParam\n         * @static\n         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n         * @returns {AuthorizationInfo.WxParam} WxParam\n         * @throws {Error} If the payload is not a reader or valid buffer\n         * @throws {$protobuf.util.ProtocolError} If required fields are missing\n         */\n        WxParam.decodeDelimited = function decodeDelimited(reader) {\n            if (!(reader instanceof $Reader))\n                reader = new $Reader(reader);\n            return this.decode(reader, reader.uint32());\n        };\n\n        /**\n         * Verifies a WxParam message.\n         * @function verify\n         * @memberof AuthorizationInfo.WxParam\n         * @static\n         * @param {Object.<string,*>} message Plain object to verify\n         * @returns {string|null} `null` if valid, otherwise the reason why it is not\n         */\n        WxParam.verify = function verify(message) {\n            if (typeof message !== \"object\" || message === null)\n                return \"object expected\";\n            if (message.qbaseTicket != null && message.hasOwnProperty(\"qbaseTicket\"))\n                if (!(message.qbaseTicket && typeof message.qbaseTicket.length === \"number\" || $util.isString(message.qbaseTicket)))\n                    return \"qbaseTicket: buffer expected\";\n            if (message.authUin != null && message.hasOwnProperty(\"authUin\"))\n                if (!$util.isString(message.authUin))\n                    return \"authUin: string expected\";\n            if (message.extJson != null && message.hasOwnProperty(\"extJson\"))\n                if (!$util.isString(message.extJson))\n                    return \"extJson: string expected\";\n            return null;\n        };\n\n        /**\n         * Creates a WxParam message from a plain object. Also converts values to their respective internal types.\n         * @function fromObject\n         * @memberof AuthorizationInfo.WxParam\n         * @static\n         * @param {Object.<string,*>} object Plain object\n         * @returns {AuthorizationInfo.WxParam} WxParam\n         */\n        WxParam.fromObject = function fromObject(object) {\n            if (object instanceof $root.AuthorizationInfo.WxParam)\n                return object;\n            var message = new $root.AuthorizationInfo.WxParam();\n            if (object.qbaseTicket != null)\n                if (typeof object.qbaseTicket === \"string\")\n                    $util.base64.decode(object.qbaseTicket, message.qbaseTicket = $util.newBuffer($util.base64.length(object.qbaseTicket)), 0);\n                else if (object.qbaseTicket.length)\n                    message.qbaseTicket = object.qbaseTicket;\n            if (object.authUin != null)\n                message.authUin = String(object.authUin);\n            if (object.extJson != null)\n                message.extJson = String(object.extJson);\n            return message;\n        };\n\n        /**\n         * Creates a plain object from a WxParam message. Also converts values to other types if specified.\n         * @function toObject\n         * @memberof AuthorizationInfo.WxParam\n         * @static\n         * @param {AuthorizationInfo.WxParam} message WxParam\n         * @param {$protobuf.IConversionOptions} [options] Conversion options\n         * @returns {Object.<string,*>} Plain object\n         */\n        WxParam.toObject = function toObject(message, options) {\n            if (!options)\n                options = {};\n            var object = {};\n            if (options.defaults) {\n                if (options.bytes === String)\n                    object.qbaseTicket = \"\";\n                else {\n                    object.qbaseTicket = [];\n                    if (options.bytes !== Array)\n                        object.qbaseTicket = $util.newBuffer(object.qbaseTicket);\n                }\n                object.authUin = \"\";\n                object.extJson = \"\";\n            }\n            if (message.qbaseTicket != null && message.hasOwnProperty(\"qbaseTicket\"))\n                object.qbaseTicket = options.bytes === String ? $util.base64.encode(message.qbaseTicket, 0, message.qbaseTicket.length) : options.bytes === Array ? Array.prototype.slice.call(message.qbaseTicket) : message.qbaseTicket;\n            if (message.authUin != null && message.hasOwnProperty(\"authUin\"))\n                object.authUin = message.authUin;\n            if (message.extJson != null && message.hasOwnProperty(\"extJson\"))\n                object.extJson = message.extJson;\n            return object;\n        };\n\n        /**\n         * Converts this WxParam to JSON.\n         * @function toJSON\n         * @memberof AuthorizationInfo.WxParam\n         * @instance\n         * @returns {Object.<string,*>} JSON object\n         */\n        WxParam.prototype.toJSON = function toJSON() {\n            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n        };\n\n        return WxParam;\n    })();\n\n    return AuthorizationInfo;\n})();\n\n$root.ApiOptions = (function() {\n\n    /**\n     * Properties of an ApiOptions.\n     * @exports IApiOptions\n     * @interface IApiOptions\n     * @property {string|null} [appid] ApiOptions appid\n     */\n\n    /**\n     * Constructs a new ApiOptions.\n     * @exports ApiOptions\n     * @classdesc Represents an ApiOptions.\n     * @implements IApiOptions\n     * @constructor\n     * @param {IApiOptions=} [properties] Properties to set\n     */\n    function ApiOptions(properties) {\n        if (properties)\n            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n                if (properties[keys[i]] != null)\n                    this[keys[i]] = properties[keys[i]];\n    }\n\n    /**\n     * ApiOptions appid.\n     * @member {string} appid\n     * @memberof ApiOptions\n     * @instance\n     */\n    ApiOptions.prototype.appid = \"\";\n\n    /**\n     * Creates a new ApiOptions instance using the specified properties.\n     * @function create\n     * @memberof ApiOptions\n     * @static\n     * @param {IApiOptions=} [properties] Properties to set\n     * @returns {ApiOptions} ApiOptions instance\n     */\n    ApiOptions.create = function create(properties) {\n        return new ApiOptions(properties);\n    };\n\n    /**\n     * Encodes the specified ApiOptions message. Does not implicitly {@link ApiOptions.verify|verify} messages.\n     * @function encode\n     * @memberof ApiOptions\n     * @static\n     * @param {IApiOptions} message ApiOptions message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiOptions.encode = function encode(message, writer) {\n        if (!writer)\n            writer = $Writer.create();\n        if (message.appid != null && message.hasOwnProperty(\"appid\"))\n            writer.uint32(/* id 1, wireType 2 =*/10).string(message.appid);\n        return writer;\n    };\n\n    /**\n     * Encodes the specified ApiOptions message, length delimited. Does not implicitly {@link ApiOptions.verify|verify} messages.\n     * @function encodeDelimited\n     * @memberof ApiOptions\n     * @static\n     * @param {IApiOptions} message ApiOptions message or plain object to encode\n     * @param {$protobuf.Writer} [writer] Writer to encode to\n     * @returns {$protobuf.Writer} Writer\n     */\n    ApiOptions.encodeDelimited = function encodeDelimited(message, writer) {\n        return this.encode(message, writer).ldelim();\n    };\n\n    /**\n     * Decodes an ApiOptions message from the specified reader or buffer.\n     * @function decode\n     * @memberof ApiOptions\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @param {number} [length] Message length if known beforehand\n     * @returns {ApiOptions} ApiOptions\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiOptions.decode = function decode(reader, length) {\n        if (!(reader instanceof $Reader))\n            reader = $Reader.create(reader);\n        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ApiOptions();\n        while (reader.pos < end) {\n            var tag = reader.uint32();\n            switch (tag >>> 3) {\n            case 1:\n                message.appid = reader.string();\n                break;\n            default:\n                reader.skipType(tag & 7);\n                break;\n            }\n        }\n        return message;\n    };\n\n    /**\n     * Decodes an ApiOptions message from the specified reader or buffer, length delimited.\n     * @function decodeDelimited\n     * @memberof ApiOptions\n     * @static\n     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n     * @returns {ApiOptions} ApiOptions\n     * @throws {Error} If the payload is not a reader or valid buffer\n     * @throws {$protobuf.util.ProtocolError} If required fields are missing\n     */\n    ApiOptions.decodeDelimited = function decodeDelimited(reader) {\n        if (!(reader instanceof $Reader))\n            reader = new $Reader(reader);\n        return this.decode(reader, reader.uint32());\n    };\n\n    /**\n     * Verifies an ApiOptions message.\n     * @function verify\n     * @memberof ApiOptions\n     * @static\n     * @param {Object.<string,*>} message Plain object to verify\n     * @returns {string|null} `null` if valid, otherwise the reason why it is not\n     */\n    ApiOptions.verify = function verify(message) {\n        if (typeof message !== \"object\" || message === null)\n            return \"object expected\";\n        if (message.appid != null && message.hasOwnProperty(\"appid\"))\n            if (!$util.isString(message.appid))\n                return \"appid: string expected\";\n        return null;\n    };\n\n    /**\n     * Creates an ApiOptions message from a plain object. Also converts values to their respective internal types.\n     * @function fromObject\n     * @memberof ApiOptions\n     * @static\n     * @param {Object.<string,*>} object Plain object\n     * @returns {ApiOptions} ApiOptions\n     */\n    ApiOptions.fromObject = function fromObject(object) {\n        if (object instanceof $root.ApiOptions)\n            return object;\n        var message = new $root.ApiOptions();\n        if (object.appid != null)\n            message.appid = String(object.appid);\n        return message;\n    };\n\n    /**\n     * Creates a plain object from an ApiOptions message. Also converts values to other types if specified.\n     * @function toObject\n     * @memberof ApiOptions\n     * @static\n     * @param {ApiOptions} message ApiOptions\n     * @param {$protobuf.IConversionOptions} [options] Conversion options\n     * @returns {Object.<string,*>} Plain object\n     */\n    ApiOptions.toObject = function toObject(message, options) {\n        if (!options)\n            options = {};\n        var object = {};\n        if (options.defaults)\n            object.appid = \"\";\n        if (message.appid != null && message.hasOwnProperty(\"appid\"))\n            object.appid = message.appid;\n        return object;\n    };\n\n    /**\n     * Converts this ApiOptions to JSON.\n     * @function toJSON\n     * @memberof ApiOptions\n     * @instance\n     * @returns {Object.<string,*>} JSON object\n     */\n    ApiOptions.prototype.toJSON = function toJSON() {\n        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n    };\n\n    return ApiOptions;\n})();\n\nmodule.exports = $root;\n\n\n/***/ }),\n\n/***/ \"./src/utils/assert.ts\":\n/*!*****************************!*\\\n  !*** ./src/utils/assert.ts ***!\n  \\*****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.assertObjectNotEmpty = exports.assertRequiredParam = exports.assertObjectOptionalType = exports.assertType = exports.validObjectOptionalType = exports.validType = exports.sameType = void 0;\nconst type_1 = __webpack_require__(/*! ./type */ \"./src/utils/type.ts\");\nconst error_1 = __webpack_require__(/*! ./error */ \"./src/utils/error.ts\");\nconst error_config_1 = __webpack_require__(/*! config/error.config */ \"./src/config/error.config.ts\");\nfunction sameType(input, ref, name) {\n    function sameTypeImpl(input, ref, name) {\n        const inputType = type_1.getType(input);\n        const refType = type_1.getType(ref);\n        if (inputType !== refType) {\n            return `${name} should be ${refType} instead of ${inputType}; `;\n        }\n        let errors = '';\n        switch (inputType) {\n            case 'object': {\n                for (const key in ref) {\n                    errors += sameTypeImpl(input[key], ref[key], `${name}.${key}`);\n                }\n                break;\n            }\n            case 'array': {\n                for (let i = 0; i < ref.length; i++) {\n                    errors += sameTypeImpl(input[i], ref[i], `${name}[${i}]`);\n                }\n                break;\n            }\n            default: {\n                break;\n            }\n        }\n        return errors;\n    }\n    const error = sameTypeImpl(input, ref, name);\n    return {\n        passed: !error,\n        reason: error,\n    };\n}\nexports.sameType = sameType;\nfunction validType(input, ref, name = 'parameter') {\n    function validTypeImpl(input, ref, name) {\n        const inputType = type_1.getType(input);\n        const refType = type_1.getType(ref);\n        if (refType === 'string') {\n            if (inputType !== ref) {\n                return `${name} should be ${ref} instead of ${inputType};`;\n            }\n            return '';\n        }\n        else {\n            if (inputType !== refType) {\n                return `${name} should be ${refType} instead of ${inputType}; `;\n            }\n            let errors = '';\n            switch (inputType) {\n                case 'object': {\n                    for (const key in ref) {\n                        errors += validTypeImpl(input[key], ref[key], `${name}.${key}`);\n                    }\n                    break;\n                }\n                case 'array': {\n                    for (let i = 0; i < ref.length; i++) {\n                        errors += validTypeImpl(input[i], ref[i], `${name}[${i}]`);\n                    }\n                    break;\n                }\n                default: {\n                    break;\n                }\n            }\n            return errors;\n        }\n    }\n    const error = validTypeImpl(input, ref, name);\n    return {\n        passed: !error,\n        reason: error,\n    };\n}\nexports.validType = validType;\nfunction validObjectOptionalType(input, ref, name = 'parameter') {\n    function validImpl(input, ref, name) {\n        const inputType = type_1.getType(input);\n        const refType = type_1.getType(ref);\n        if (refType !== 'object')\n            return '';\n        if (inputType === 'object') {\n            for (const key in input) {\n                const val = input[key];\n                if (val === undefined || key === null) {\n                    continue;\n                }\n                const assertResult = validType(val, ref[key], `${name}.${key}`);\n                return assertResult.passed ? '' : assertResult.reason;\n            }\n        }\n        else {\n            return `${name} should be object instead of ${inputType}`;\n        }\n        return '';\n    }\n    const error = validImpl(input, ref, name);\n    return {\n        passed: !error,\n        reason: error,\n    };\n}\nexports.validObjectOptionalType = validObjectOptionalType;\nfunction assertType(param, ref, name = 'parameter', ErrorClass = error_1.CloudSDKError) {\n    // check param validity\n    let paramCheckResult = validType(param, ref, name);\n    if (!paramCheckResult.passed) {\n        throw new ErrorClass({\n            errMsg: paramCheckResult.reason,\n        });\n    }\n}\nexports.assertType = assertType;\nfunction assertObjectOptionalType(param, ref, name = 'parameter', ErrorClass = error_1.CloudSDKError) {\n    // check param validity\n    let paramCheckResult = validObjectOptionalType(param, ref, name);\n    if (!paramCheckResult.passed) {\n        throw new ErrorClass({\n            errMsg: paramCheckResult.reason,\n        });\n    }\n}\nexports.assertObjectOptionalType = assertObjectOptionalType;\nfunction assertRequiredParam(param, name, funcName, ErrorClass = error_1.CloudSDKError) {\n    if (param === undefined || param === null) {\n        throw new ErrorClass({\n            errMsg: `parameter ${name} of function ${funcName} must be provided`,\n        });\n    }\n}\nexports.assertRequiredParam = assertRequiredParam;\nfunction assertObjectNotEmpty({ target, name, ErrorClass = error_1.CloudSDKError }) {\n    if (Object.keys(target).length === 0) {\n        throw new ErrorClass({\n            errCode: error_config_1.ERR_CODE.SDK_API_PARAMETER_ERROR,\n            errMsg: `${name} must not be empty`\n        });\n    }\n}\nexports.assertObjectNotEmpty = assertObjectNotEmpty;\n/*\nexport function constructTypeRef(typeDef: any): any {\n\n  const type = getType(typeDef)\n\n  switch(type) {\n    case 'string': {\n      return ''\n    }\n    case 'number': {\n\n    }\n  }\n\n}\n*/ \n\n\n/***/ }),\n\n/***/ \"./src/utils/error.ts\":\n/*!****************************!*\\\n  !*** ./src/utils/error.ts ***!\n  \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toSDKError = exports.returnAsFinalCloudSDKError = exports.returnAsCloudSDKError = exports.isSDKError = exports.createError = exports.CloudSDKError = void 0;\nconst type_1 = __webpack_require__(/*! ./type */ \"./src/utils/type.ts\");\nconst error_config_1 = __webpack_require__(/*! config/error.config */ \"./src/config/error.config.ts\");\n/**\n * @deprecated\n */\nclass CloudSDKError extends Error {\n    constructor(options) {\n        super(options.errMsg);\n        this.errCode = -1;\n        Object.defineProperties(this, {\n            message: {\n                get() {\n                    return `errCode: ${this.errCode} ${error_config_1.ERR_CODE[this.errCode] || ''} | errMsg: ` + this.errMsg;\n                },\n                set(msg) {\n                    this.errMsg = msg;\n                }\n            }\n        });\n        this.errCode = options.errCode || -1;\n        this.errMsg = options.errMsg;\n    }\n    get message() {\n        return `errCode: ${this.errCode} | errMsg: ` + this.errMsg;\n    }\n    set message(msg) {\n        this.errMsg = msg;\n    }\n}\nexports.CloudSDKError = CloudSDKError;\n/**\n * @deprecated\n */\nfunction createError({ errCode = 1, errMsg = '', errClass = CloudSDKError, } = {}) {\n    return new errClass({\n        errCode,\n        errMsg,\n    });\n}\nexports.createError = createError;\nfunction isSDKError(error) {\n    return error && (error instanceof Error) && type_1.isString(error.errMsg);\n}\nexports.isSDKError = isSDKError;\n/**\n * @deprecated\n */\nfunction returnAsCloudSDKError(err, appendMsg = '') {\n    if (err) {\n        if (isSDKError(err)) {\n            if (appendMsg) {\n                err.errMsg += '; ' + appendMsg;\n            }\n            return err;\n        }\n        const errCode = err ? err.errCode : undefined;\n        const errMsg = (err && err.errMsg || err.toString() || 'unknown error') + '; ' + appendMsg;\n        return new CloudSDKError({\n            errCode,\n            errMsg,\n        });\n    }\n    return new CloudSDKError({\n        errMsg: appendMsg\n    });\n}\nexports.returnAsCloudSDKError = returnAsCloudSDKError;\n/**\n * @deprecated\n */\nfunction returnAsFinalCloudSDKError(err, apiName) {\n    return toSDKError(err, apiName);\n    // if (err && isSDKError(err)) {\n    //   return err\n    // }\n    // const e = returnAsCloudSDKError(err, `at ${apiName} api; `)\n    // e.errMsg = apiFailMsg(apiName, e.errMsg)\n    // return e\n}\nexports.returnAsFinalCloudSDKError = returnAsFinalCloudSDKError;\nfunction toSDKError(e, apiName) {\n    if (e) {\n        if (isSDKError(e)) {\n            return e;\n        }\n        const prefix = `${apiName}:fail `;\n        let err;\n        if (e instanceof Error) {\n            e.message = `${prefix}${e.message}`;\n            e.stack = e.stack.slice(0, 7) + prefix + e.stack.slice(7);\n            err = e;\n            err.errCode = -1;\n        }\n        else if (typeof e === 'string') {\n            err = new Error(`${prefix}${e}`);\n            err.errCode = -1;\n        }\n        else {\n            // errCode + errMsg\n            const errMsg = e.errMsg || '';\n            err = new Error(`${apiName}:fail ${e.errCode} ${error_config_1.ERR_CODE[e.errCode] || ''}. ${errMsg}`);\n            err.errCode = e.errCode || -1;\n        }\n        err.errMsg = err.message + '';\n        return err;\n    }\n    const err = new Error(`${apiName}:fail`);\n    err.errCode = -1;\n    err.errMsg = err.message + '';\n    return err;\n}\nexports.toSDKError = toSDKError;\n\n\n/***/ }),\n\n/***/ \"./src/utils/msg.ts\":\n/*!**************************!*\\\n  !*** ./src/utils/msg.ts ***!\n  \\**************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.apiFailMsg = exports.apiCancelMsg = exports.apiSuccessMsg = void 0;\nfunction apiSuccessMsg(apiName) {\n    return `${apiName}:ok`;\n}\nexports.apiSuccessMsg = apiSuccessMsg;\nfunction apiCancelMsg(apiName, msg) {\n    return `${apiName}:cancel ${msg}`;\n}\nexports.apiCancelMsg = apiCancelMsg;\nfunction apiFailMsg(apiName, msg) {\n    return `${apiName}:fail ${msg}`;\n}\nexports.apiFailMsg = apiFailMsg;\n\n\n/***/ }),\n\n/***/ \"./src/utils/symbol.ts\":\n/*!*****************************!*\\\n  !*** ./src/utils/symbol.ts ***!\n  \\*****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InternalSymbol = void 0;\nconst _symbols = [];\nconst __internalMark__ = {};\nclass HiddenSymbol {\n    constructor(target) {\n        Object.defineProperties(this, {\n            target: {\n                enumerable: false,\n                writable: false,\n                configurable: false,\n                value: target,\n            },\n        });\n    }\n}\nclass InternalSymbol extends HiddenSymbol {\n    constructor(target, __mark__) {\n        if (__mark__ !== __internalMark__) {\n            throw new TypeError('InternalSymbol cannot be constructed with new operator');\n        }\n        super(target);\n    }\n    static for(target) {\n        for (let i = 0, len = _symbols.length; i < len; i++) {\n            if (_symbols[i].target === target) {\n                return _symbols[i].instance;\n            }\n        }\n        const symbol = new InternalSymbol(target, __internalMark__);\n        _symbols.push({\n            target,\n            instance: symbol,\n        });\n        return symbol;\n    }\n}\nexports.InternalSymbol = InternalSymbol;\nexports.default = InternalSymbol;\n\n\n/***/ }),\n\n/***/ \"./src/utils/type.ts\":\n/*!***************************!*\\\n  !*** ./src/utils/type.ts ***!\n  \\***************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isPlainObject = exports.isInternalObject = exports.isBuffer = exports.isDate = exports.isArray = exports.isFunction = exports.isPromise = exports.isNumber = exports.isString = exports.isObject = exports.getType = void 0;\nconst symbol_1 = __webpack_require__(/*! ./symbol */ \"./src/utils/symbol.ts\");\nexports.getType = (x) => Object.prototype.toString.call(x).slice(8, -1).toLowerCase();\nexports.isObject = (x) => exports.getType(x) === 'object';\nexports.isString = (x) => exports.getType(x) === 'string';\nexports.isNumber = (x) => exports.getType(x) === 'number';\nexports.isPromise = (x) => exports.getType(x) === 'promise';\nexports.isFunction = (x) => typeof x === 'function';\nexports.isArray = (x) => Array.isArray(x);\nexports.isDate = (x) => exports.getType(x) === 'date';\nexports.isBuffer = (x) => Buffer.isBuffer(x);\nexports.isInternalObject = (x) => x && (x._internalType instanceof symbol_1.InternalSymbol);\nexports.isPlainObject = (obj) => {\n    if (typeof obj !== 'object' || obj === null)\n        return false;\n    let proto = obj;\n    while (Object.getPrototypeOf(proto) !== null) {\n        proto = Object.getPrototypeOf(proto);\n    }\n    return Object.getPrototypeOf(obj) === proto;\n};\n\n\n/***/ }),\n\n/***/ \"./src/utils/utils.ts\":\n/*!****************************!*\\\n  !*** ./src/utils/utils.ts ***!\n  \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getMergedAPIConfig = exports.getServiceConfigFromDefaultConfig = exports.getEnvFromAPIConfig = exports.getEnvFromCloudConfig = exports.isSCFEnvReady = exports.convertCase = void 0;\nconst type_1 = __webpack_require__(/*! ./type */ \"./src/utils/type.ts\");\nconst signature_1 = __webpack_require__(/*! api/utils/api/signature */ \"./src/api/utils/api/signature.ts\");\nconst ignoreInConvert = (input) => input instanceof signature_1.MidasSignature;\nexports.convertCase = (input, options) => {\n    const { from, to, recursive } = options;\n    if (type_1.isString(input)) {\n        if (from === 'camelcase' && to === 'snakecase') {\n            return input.replace(/[A-Z]/g, (match, ind) => `${ind ? '_' : ''}${match.toLowerCase()}`);\n        }\n        else if (from === 'snakecase' && to === 'camelcase') {\n            return input.replace(/_[a-z]/g, (match, ind) => `${match[1].toUpperCase()}`);\n        }\n    }\n    else if (type_1.isObject(input)) {\n        return ignoreInConvert(input) ? input : convertObject(input);\n    }\n    else if (type_1.isArray(input)) {\n        const array = [];\n        for (const item of input) {\n            if (type_1.isObject(item)) {\n                array.push(convertObject(item));\n            }\n            else if (type_1.isArray(item)) {\n                if (options.recursive) {\n                    array.push(exports.convertCase(item, options));\n                }\n                else {\n                    array.push(item);\n                }\n            }\n            else {\n                array.push(item);\n            }\n        }\n        return array;\n    }\n    else\n        return input;\n    function convertObject(input) {\n        const data = Object.assign({}, input);\n        for (const key in data) {\n            const val = recursive && (type_1.isObject(data[key]) || type_1.isArray(data[key])) ? exports.convertCase(data[key], options) : data[key];\n            const convertedKey = exports.convertCase(key, options);\n            data[convertedKey] = val;\n            if (convertedKey !== key) {\n                delete data[key];\n            }\n        }\n        return data;\n    }\n};\nexports.isSCFEnvReady = () => Boolean(process.env.TCB_ENV);\nexports.getEnvFromCloudConfig = (config, serviceName = 'default') => {\n    const env = config.env[serviceName] || config.env.default;\n    return env;\n};\nexports.getEnvFromAPIConfig = (apiConfig, cloudConfig, serviceName = 'default') => {\n    if (apiConfig && apiConfig.env) {\n        return apiConfig.env;\n    }\n    return exports.getEnvFromCloudConfig(cloudConfig, serviceName);\n};\nexports.getServiceConfigFromDefaultConfig = (defaultConfig, serviceName = 'default') => {\n    return Object.assign(Object.assign({}, defaultConfig), { env: exports.getEnvFromCloudConfig(defaultConfig, serviceName) });\n};\nexports.getMergedAPIConfig = (defaultConfig, newConfig, serviceName = 'default') => {\n    const merged = Object.assign(Object.assign({}, defaultConfig), newConfig);\n    if (newConfig && newConfig.env) {\n        merged.env = newConfig.env;\n    }\n    else {\n        merged.env = exports.getEnvFromCloudConfig(defaultConfig, serviceName);\n    }\n    return merged;\n};\n\n\n/***/ }),\n\n/***/ \"crypto\":\n/*!*************************!*\\\n  !*** external \"crypto\" ***!\n  \\*************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"crypto\");\n\n/***/ }),\n\n/***/ \"protobufjs/minimal\":\n/*!*************************************!*\\\n  !*** external \"protobufjs/minimal\" ***!\n  \\*************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"protobufjs/minimal\");\n\n/***/ })\n\n/******/ });"
  },
  {
    "path": "cloudfunctions/ARDemo/wx-server-sdk-wxg-service/package.json",
    "content": "{\n  \"name\": \"@tencent/wx-server-sdk-wxg-service\",\n  \"version\": \"0.7.0\",\n  \"description\": \"wxg service plugin for mini program cloud server sdk\",\n  \"main\": \"index.js\",\n  \"author\": \"wechat mini program team\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"tslib\": \"^1.9.3\"\n  }\n}\n"
  },
  {
    "path": "cloudfunctions/getServerDataDemo/index.js",
    "content": "// 云函数入口文件\nconst cloud = require('wx-server-sdk')\n\n// 云函数入口函数\nexports.main = async () => {\n  cloud.init({\n    env: process.env.TCB_ENV,\n  })\n  const db = cloud.database()\n  return db.collection('perm4').where({\n    _openid: 'server'\n  }).limit(1).get()\n}\n"
  },
  {
    "path": "cloudfunctions/getServerDataDemo/package.json",
    "content": "{\n  \"name\": \"getServerDataDemo\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"latest\"\n  }\n}"
  },
  {
    "path": "cloudfunctions/getTempFileURL/index.js",
    "content": "// 云函数入口文件\nconst cloud = require('wx-server-sdk')\n\n// 云函数入口函数\nexports.main = async (event) => {\n  cloud.init({\n    env: process.env.TCB_ENV,\n  })\n  const fileList = event.fileIdList\n  const result = await cloud.getTempFileURL({\n    fileList,\n  })\n  return result.fileList\n}\n"
  },
  {
    "path": "cloudfunctions/getTempFileURL/package.json",
    "content": "{\n  \"name\": \"getTempFileURL\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"latest\"\n  }\n}"
  },
  {
    "path": "cloudfunctions/login/index.js",
    "content": "exports.main = (event) => ({\n  openid: event.userInfo.openId,\n})\n"
  },
  {
    "path": "cloudfunctions/login/package.json",
    "content": "{\n  \"name\": \"login\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"latest\"\n  }\n}"
  },
  {
    "path": "gulpfile.js",
    "content": "const fs = require('fs')\n\nconst gulp = require('gulp')\nconst postcss = require('gulp-postcss')\nconst cssvars = require('postcss-css-variables')\nconst rename = require('gulp-rename')\nconst replace = require('gulp-replace')\nconst gulpIf = require('gulp-if')\nconst gulpIgnore = require('gulp-ignore')\n\ngulp.task('transform-css-vars', () => {\n  const plugins = [\n    cssvars({\n      preserve: false,\n      variables: {\n        '--weui-BTN-DISABLED-FONT-COLOR': 'rgba(0, 0, 0, .2)',\n        '--weui-BTN-DEFAULT-BG': '#f2f2f2',\n        '--weui-BTN-DEFAULT-COLOR': '#06ae56',\n        '--weui-BTN-DEFAULT-ACTIVE-BG': '#e6e6e6',\n        '--weui-DIALOG-LINE-COLOR': 'rgba(0, 0, 0, .1)',\n        '--weui-BG-0': '#ededed',\n        '--weui-BG-1': '#f7f7f7',\n        '--weui-BG-2': '#fff',\n        '--weui-BG-3': '#f7f7f7',\n        '--weui-BG-4': '#4c4c4c',\n        '--weui-BG-5': '#fff',\n        '--weui-FG-0': 'rgba(0, 0, 0, .9)',\n        '--weui-FG-HALF': 'rgba(0, 0, 0, .9)',\n        '--weui-FG-1': 'rgba(0, 0, 0, .5)',\n        '--weui-FG-2': 'rgba(0, 0, 0, .3)',\n        '--weui-FG-3': 'rgba(0, 0, 0, .1)',\n        '--weui-RED': '#fa5151',\n        '--weui-ORANGE': '#fa9d3b',\n        '--weui-YELLOW': '#ffc300',\n        '--weui-GREEN': '#91d300',\n        '--weui-LIGHTGREEN': '#95ec69',\n        '--weui-BRAND': '#07c160',\n        '--weui-BLUE': '#10aeff',\n        '--weui-INDIGO': '#1485ee',\n        '--weui-PURPLE': '#6467f0',\n        '--weui-WHITE': '#fff',\n        '--weui-LINK': '#576b95',\n        '--weui-TEXTGREEN': '#06ae56',\n        '--weui-FG': '#000',\n        '--weui-BG': '#fff',\n        '--weui-TAG-TEXT-ORANGE': '#fa9d3b',\n        '--weui-TAG-BACKGROUND-ORANGE': 'rgba(250, 157, 59, .1)',\n        '--weui-TAG-TEXT-GREEN': '#06ae56',\n        '--weui-TAG-BACKGROUND-GREEN': 'rgba(6, 174, 86, .1)',\n        '--weui-TAG-TEXT-BLUE': '#10aeff',\n        '--weui-TAG-BACKGROUND-BLUE': 'rgba(16, 174, 255, .1)',\n        '--weui-TAG-TEXT-BLACK': 'rgba(0, 0, 0, .5)',\n        '--weui-TAG-BACKGROUND-BLACK': 'rgba(0, 0, 0, .05)',\n        '--weui-BG-COLOR-ACTIVE': '#ececec',\n        '--height': '44px',\n        '--right': '95px',\n      },\n      preserveInjectedVariables: false,\n    })\n  ]\n  return gulp.src([\n    './miniprogram/app.wxss',\n    './miniprogram/common/common.wxss',\n    './miniprogram/page/common/common.wxss',\n    './miniprogram/page/common/index.wxss',\n    './miniprogram/page/component/index.wxss',\n    './miniprogram/page/cloud/index.wxss',\n    './miniprogram/page/API/index.wxss',\n    './miniprogram/page/extend/index.wxss',\n    './miniprogram/packageComponent/pages/canvas/canvas-2d/canvas-2d.wxss',\n  ])\n    .pipe(gulpIgnore.exclude(\n      file => {\n        try {\n          fs.accessSync(file.path.replace(/\\.wxss$/, '-skyline.wxss'))\n        } catch (e) {\n          return false\n        }\n        return true\n      }\n    ))\n    .pipe(postcss(plugins))\n    .pipe(replace(/\\:root ?{}\\n/g, ''))\n    .pipe(gulpIf(file => file.path.includes('miniprogram/page/common'), rename({ suffix: '-skyline' })))\n    .pipe(gulpIf(file => file.path.includes('miniprogram/common'), rename({ suffix: '-skyline' })))\n    .pipe(gulp.dest(file => file.base))\n})\n"
  },
  {
    "path": "miniprogram/_commons/0.js",
    "content": "var globalThis = this, self = this;\nmodule.exports = \n/******/ (function(modules) { // webpackBootstrap\n/******/ \tfunction webpackLoadCallback(loadModules) {\n/******/ \t\tvar i = 0, j, k = 0;\n/******/ \t\tvar deferredModules = [], result;\n/******/ \t\tvar module, chunkIds, chunkId, moreModules, executeModules, moduleId;\n/******/ \t\tvar deferredModule, fulfilled, depId;\n/******/\n/******/ \t\tfor (; i < loadModules.length; ++i) {\n/******/ \t\t\tmodule = loadModules[i];\n/******/ \t\t\tchunkIds = module.ids;\n/******/ \t\t\tmoreModules = module.modules;\n/******/ \t\t\texecuteModules = module.entries || [];\n/******/\n/******/ \t\t\tfor(j = 0; j < chunkIds.length; j++) {\n/******/ \t\t\t\tchunkId = chunkIds[j];\n/******/ \t\t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t\t}\n/******/ \t\t\tfor(moduleId in moreModules) {\n/******/ \t\t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n/******/ \t\t\t\t\tmodules[moduleId] = moreModules[moduleId];\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/\n/******/ \t\t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n/******/ \t\t}\n/******/\n/******/ \t\tfor(; k < deferredModules.length; k++) {\n/******/ \t\t\tdeferredModule = deferredModules[k];\n/******/ \t\t\tfulfilled = true;\n/******/ \t\t\tfor(j = 1; j < deferredModule.length; j++) {\n/******/ \t\t\t\tdepId = deferredModule[j];\n/******/ \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n/******/ \t\t\t}\n/******/ \t\t\tif(fulfilled) {\n/******/ \t\t\t\tdeferredModules.splice(k--, 1);\n/******/ \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n/******/ \t\t\t}\n/******/ \t\t}\n/******/\n/******/ \t\treturn result;\n/******/ \t};\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// object to store loaded chunks\n/******/ \t// \"0\" means \"already loaded\"\n/******/ \tvar installedChunks = {\n/******/ \t\t0: 0\n/******/ \t};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// uncaught error handler for webpack runtime\n/******/ \t__webpack_require__.oe = function(err) {\n/******/ \t\tprocess.nextTick(function() {\n/******/ \t\t\tthrow err; // catch this error by using import().catch()\n/******/ \t\t});\n/******/ \t};\n/******/\n/******/\n/******/ \t// return load module function\n/******/ \treturn webpackLoadCallback;\n/******/ })\n/************************************************************************/\n/******/ ([]);\n// # sourceMappingURL=0.js.map"
  },
  {
    "path": "miniprogram/app-bar/index.js",
    "content": "// components/app-bar/index.js\nComponent({\n  properties: {\n\n  },\n\n  data: {\n    showAppbar: false\n  }\n})\n"
  },
  {
    "path": "miniprogram/app-bar/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"app-bar-course\": \"../components/app-bar-course\"\n  }\n}"
  },
  {
    "path": "miniprogram/app-bar/index.wxml",
    "content": "<view wx:if=\"{{showAppbar}}\">\n\t<app-bar-course></app-bar-course>\n</view>"
  },
  {
    "path": "miniprogram/app-bar/index.wxss",
    "content": ".expand-container {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 0 24px;\n  padding-bottom: env(safe-area-inset-bottom);\n  pointer-events: auto;\n  overflow: hidden;\n  background-color: #e9f8f7;\n  color: #7e8081;\n}\n\n.hide {\n  display: none;\n}\n\n.nav-bar {\n  overflow: hidden;\n  box-sizing: border-box;\n}\n\n.icon--back {\n  width: 30px;\n  height: 30px;\n}\n\n.title {\n  margin-left: 10px;\n  min-width: 160px;\n  flex: 1;\n}\n.title .name {\n  margin-top: 4px;\n  font-size: 12px;\n}\n\n.title-wrap {\n  flex: 1;\n  min-width: 240px;\n}\n\n.footer {\n  padding: 0 24px;\n}\n\n.footer .icon {\n  width: 40px;\n  height: 40px;\n}\n\n.expand-cover {\n  width: 100%;\n  height: 100%;\n}\n\n.music-title {\n  margin-top: 48px;\n  font-size: 20px;\n  font-weight: bold;\n  color: #07c160;\n}\n.music-title .name {\n  margin-top: 12px;\n  font-size: 14px;\n  font-weight: 200;\n  color: #b1b2b3;\n}\n\n.cover-area {\n  margin: 8px 0;\n  width: 100%;\n  aspect-ratio: 1 / 1;\n  overflow: hidden;\n}\n\n.cover {\n  /* aspect-ratio: 1 / 1; */\n  flex-shrink: 0;\n}\n\n.icon {\n  width: 18px;\n  height: 18px;\n}\n\n.row {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.row-between {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.column {\n  display: flex;\n  flex-direction: column;\n}\n\n.column-main-center {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n}\n\n.column-cross-center {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.center {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.circle {\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  border-radius: 50%;\n}"
  },
  {
    "path": "miniprogram/app-darkmode.json",
    "content": "{\n  \"window\": {\n    \"navigationBarTextStyle\": \"white\",\n    \"navigationBarBackgroundColor\": \"#191919\",\n    \"backgroundColor\": \"#191919\"\n  },\n  \"tabBar\": {\n    \"color\": \"#FCFCFC\",\n    \"selectedColor\": \"#51A937\",\n    \"borderStyle\": \"white\",\n    \"backgroundColor\": \"#191919\",\n    \"list\": [\n      {\n        \"pagePath\": \"page/component/index\",\n        \"iconPath\": \"image/icon_component_HL.png\",\n        \"selectedIconPath\": \"image/icon_component_dark.png\",\n        \"text\": \"组件\"\n      },\n      {\n        \"pagePath\": \"page/extend/index\",\n        \"iconPath\": \"image/icon_component_HL.png\",\n        \"selectedIconPath\": \"image/icon_component_dark.png\",\n        \"text\": \"扩展能力\"\n      },\n      {\n        \"pagePath\": \"page/API/index\",\n        \"iconPath\": \"image/icon_API_HL.png\",\n        \"selectedIconPath\": \"image/icon_API_dark.png\",\n        \"text\": \"接口\"\n      },\n      {\n        \"pagePath\": \"page/cloud/index\",\n        \"iconPath\": \"image/icon_cloud_HL.png\",\n        \"selectedIconPath\": \"image/icon_cloud_dark.png\",\n        \"text\": \"云开发\"\n      }\n    ]\n  }\n}"
  },
  {
    "path": "miniprogram/app.js",
    "content": "const config = require('./config')\n\nconst themeListeners = []\nglobal.isDemo = true\nApp({\n\n  onLaunch(opts, data) {\n    const that = this\n    const canIUseSetBackgroundFetchToken = wx.canIUse('setBackgroundFetchToken')\n    if (canIUseSetBackgroundFetchToken) {\n      wx.setBackgroundFetchToken({\n        token: 'getBackgroundFetchToken',\n      })\n    }\n    if (wx.getBackgroundFetchData) {\n      wx.getBackgroundFetchData({\n        fetchType: 'pre',\n        success(res) {\n          that.globalData.backgroundFetchData = res\n          console.log('读取预拉取数据成功', res)\n        },\n        fail() {\n          console.log('读取预拉取数据失败')\n          wx.showToast({\n            title: '无缓存数据',\n            icon: 'none'\n          })\n        },\n        complete() {\n          console.log('结束读取')\n        }\n      })\n    }\n    console.log('App Launch', opts)\n    if (data && data.path) {\n      wx.navigateTo({\n        url: data.path,\n      })\n    }\n    if (!wx.cloud) {\n      console.error('请使用 2.2.3 或以上的基础库以使用云能力')\n    } else {\n      wx.cloud.init({\n        env: config.envId,\n        traceUser: true,\n      })\n    }\n    const getSystemInfo = [\n      'getSystemSetting',\n      'getAppAuthorizeSetting',\n      'getDeviceInfo',\n      'getAppBaseInfo',\n      'getWindowInfo'\n    ]\n\n    getSystemInfo.forEach(apiName => {\n      if (wx[apiName]) {\n        Object.assign(this.globalData, wx[apiName]())\n      }\n    })\n    // eslint-disable-next-line promise/always-return\n    require.async('./packageSkyline/common/custom-route/index.js').then(utils => {\n      console.log('--------begin installRouteBuilder')\n      utils.installRouteBuilder() // 'common'\n    }).catch(({ mod, errMsg }) => {\n      console.error(`installRouteBuilder path: ${mod}, ${errMsg}`)\n    })\n  },\n\n  onShow(opts) {\n    console.log('App Show', opts)\n    console.log('USER_DATA_PATH', wx.env.USER_DATA_PATH)\n    // console.log(wx.getSystemInfoSync())\n  },\n  onHide() {\n    console.log('App Hide')\n  },\n  onThemeChange({ theme }) {\n    this.globalData.theme = theme\n    themeListeners.forEach((listener) => {\n      listener(theme)\n    })\n  },\n  watchThemeChange(listener) {\n    if (themeListeners.indexOf(listener) < 0) {\n      themeListeners.push(listener)\n    }\n  },\n  unWatchThemeChange(listener) {\n    const index = themeListeners.indexOf(listener)\n    if (index > -1) {\n      themeListeners.splice(index, 1)\n    }\n  },\n  globalData: {\n    theme: wx.getAppBaseInfo().theme,\n    hasLogin: false,\n    openid: null,\n    iconTabbar: '/page/extend/images/icon_tabbar.png',\n    systemInfo: {}\n  },\n  // lazy loading openid\n  getUserOpenId(callback) {\n    const self = this\n\n    if (self.globalData.openid) {\n      callback(null, self.globalData.openid)\n    } else {\n      wx.login({\n        success() {\n          wx.cloud.callFunction({\n            name: 'login',\n            data: {\n              action: 'openid'\n            },\n            success: res => {\n              console.log('拉取openid成功', res)\n              self.globalData.openid = res.result.openid\n              callback(null, self.globalData.openid)\n            },\n            fail: err => {\n              console.log('拉取用户openid失败，将无法正常使用开放接口等服务', err)\n              callback(err)\n            }\n          })\n        },\n        fail(err) {\n          console.log('wx.login 接口调用失败，将无法正常使用开放接口等服务', err)\n          callback(err)\n        }\n      })\n    }\n  },\n  // 通过云函数获取用户 openid，支持回调或 Promise\n  getUserOpenIdViaCloud() {\n    return wx.cloud.callFunction({\n      name: 'wxContext',\n      data: {}\n    }).then(res => {\n      this.globalData.openid = res.result.openid\n      return res.result.openid\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/app.json",
    "content": "{\n  \"pages\": [\n    \"page/component/index\",\n    \"page/API/index\",\n    \"page/cloud/index\",\n    \"page/extend/index\",\n    \"page/animation/index\",\n    \"page/ad/index\",\n    \"page/ad/smart-ad/smart-ad\",\n    \"page/ad/smart-ad/example1/example1\",\n    \"page/ad/smart-ad/example2/example2\",\n    \"page/ad/smart-ad/example3/example3\",\n    \"page/ad/optimize-ad/optimize-ad\",\n    \"page/ad/optimize-ad/home-small-card/home-small-card\",\n    \"page/ad/optimize-ad/home-large-card/home-large-card\",\n    \"page/ad/optimize-ad/other-small-card/other-small-card\",\n    \"page/ad/optimize-ad/other-large-card/other-large-card\"\n  ],\n  \"usingComponents\": {\n    \"mp-navigation-bar\": \"/component/navigation-bar/navigation-bar\"\n  },\n  \"chatTools\": [\n    {\n      \"root\": \"packageChatTool\",\n      \"entryPagePath\": \"pages/activity_create/index\",\n      \"desc\": \"群签到工具\",\n      \"scopes\": [\n        \"scope.userLocation\"\n      ]\n    }\n  ],\n  \"subpackages\": [\n    {\n      \"root\": \"packageChatTool\",\n      \"pages\": [\n        \"pages/activity_detail/index\",\n        \"pages/activity_create/index\"\n      ],\n      \"entry\": \"entry.js\",\n      \"independent\": true,\n      \"renderer\": \"skyline\"\n    },\n    {\n      \"root\": \"packageComponent\",\n      \"pages\": [\n        \"pages/view/view/view\",\n        \"pages/view/scroll-view/scroll-view\",\n        \"pages/view/swiper/swiper\",\n        \"pages/view/root-portal/root-portal\",\n        \"pages/view/grid-view/grid-view\",\n        \"pages/view/grid-view/demo-1/demo-1\",\n        \"pages/view/grid-view/demo-2/demo-2\",\n        \"pages/view/sticky/sticky-header/sticky-header\",\n        \"pages/view/sticky/sticky-section/sticky-section\",\n        \"pages/view/movable-view/movable-view\",\n        \"pages/view/cover-view/cover-view\",\n        \"pages/view/match-media/match-media\",\n        \"pages/view/page-container/page-container\",\n        \"pages/view/sticky/sticky\",\n        \"pages/content/text/text\",\n        \"pages/content/icon/icon\",\n        \"pages/content/progress/progress\",\n        \"pages/content/rich-text/rich-text\",\n        \"pages/content/selection/selection\",\n        \"pages/form/button/button\",\n        \"pages/form/checkbox/checkbox\",\n        \"pages/form/form/form\",\n        \"pages/form/input/input\",\n        \"pages/form/label/label\",\n        \"pages/form/picker/picker\",\n        \"pages/form/picker-view/picker-view\",\n        \"pages/form/radio/radio\",\n        \"pages/form/slider/slider\",\n        \"pages/form/switch/switch\",\n        \"pages/form/textarea/textarea\",\n        \"pages/form/editor/editor\",\n        \"pages/nav/navigator/navigator\",\n        \"pages/nav/navigator/navigate\",\n        \"pages/nav/navigator/redirect\",\n        \"pages/media/image/image\",\n        \"pages/media/video/video\",\n        \"pages/media/camera/camera\",\n        \"pages/media/camera-scan-code/camera-scan-code\",\n        \"pages/media/live-pusher/live-pusher\",\n        \"pages/media/live-player/live-player\",\n        \"pages/media/channel-video/channel-video\",\n        \"pages/media/channel-live/channel-live\",\n        \"pages/map/map/map\",\n        \"pages/canvas/canvas-2d/canvas-2d\",\n        \"pages/canvas/webgl/webgl\",\n        \"pages/open/ad/ad\",\n        \"pages/open/open-data/open-data\",\n        \"pages/open/web-view/web-view\",\n        \"pages/obstacle-free/aria-component/aria-component\",\n        \"pages/doc-web-view/doc-web-view\"\n      ]\n    },\n    {\n      \"root\": \"packageAPI\",\n      \"pages\": [\n        \"pages/api/login/login\",\n        \"pages/api/get-user-info/get-user-info\",\n        \"pages/api/request-payment/request-payment\",\n        \"pages/api/jump/jump\",\n        \"pages/api/official-account/official-account\",\n        \"pages/api/share/share\",\n        \"pages/api/share-button/share-button\",\n        \"pages/api/custom-message/custom-message\",\n        \"pages/api/subscribe-message/subscribe-message\",\n        \"pages/api/choose-address/choose-address\",\n        \"pages/api/choose-invoice-title/choose-invoice-title\",\n        \"pages/api/soter-authentication/soter-authentication\",\n        \"pages/api/setting/setting\",\n        \"pages/ar/visionkit-basic/visionkit-basic\",\n        \"pages/ar/visionkit-basic-v2/visionkit-basic-v2\",\n        \"pages/ar/plane-ar/plane-ar\",\n        \"pages/ar/plane-ar-v2/plane-ar-v2\",\n        \"pages/ar/plane-ar-v2-options/plane-ar-v2-options\",\n        \"pages/ar/plane-ar-v2-marker/plane-ar-v2-marker\",\n        \"pages/ar/plane-ar-v2-depth/plane-ar-v2-depth\",\n        \"pages/ar/plane-ar-3dof/plane-ar-3dof\",\n        \"pages/ar/2dmarker-ar/2dmarker-ar\",\n        \"pages/ar/3dmarker-ar/3dmarker-ar\",\n        \"pages/ar/osd-ar/osd-ar\",\n        \"pages/ar/face-detect/face-detect\",\n        \"pages/ar/face-detect-3d/face-detect-3d\",\n        \"pages/ar/face-detect-3d-glasses/face-detect-3d-glasses\",\n        \"pages/ar/body-detect/body-detect\",\n        \"pages/ar/body-detect-3d/body-detect-3d\",\n        \"pages/ar/hand-detect/hand-detect\",\n        \"pages/ar/hand-detect-3d/hand-detect-3d\",\n        \"pages/ar/depth-detect/depth-detect\",\n        \"pages/ar/cameraBuffer-detect/cameraBuffer-detect\",\n        \"pages/ar/cameraBuffer-jpg/cameraBuffer-jpg\",\n        \"pages/ar/ocr-detect/ocr-detect\",\n        \"pages/ar/shoe-detect/shoe-detect\",\n        \"pages/ar/photo-shoe-detect/photo-shoe-detect\",\n        \"pages/ar/photo-ocr-detect/photo-ocr-detect\",\n        \"pages/ar/photo-idcard-detect/photo-idcard-detect\",\n        \"pages/ar/photo-hand-detect/photo-hand-detect\",\n        \"pages/ar/photo-body-detect/photo-body-detect\",\n        \"pages/ar/photo-face-detect/photo-face-detect\",\n        \"pages/ar/photo-depth-detect/photo-depth-detect\",\n        \"pages/ar/gaussian-splatting/gaussian-splatting\",\n        \"pages/ar/gaussian-splatting/gaussian-splatting-ar\",\n        \"pages/page/set-navigation-bar-title/set-navigation-bar-title\",\n        \"pages/page/navigation-bar-loading/navigation-bar-loading\",\n        \"pages/page/navigator/navigator\",\n        \"pages/page/pull-down-refresh/pull-down-refresh\",\n        \"pages/page/animation/animation\",\n        \"pages/page/action-sheet/action-sheet\",\n        \"pages/page/modal/modal\",\n        \"pages/page/toast/toast\",\n        \"pages/page/canvas/canvas\",\n        \"pages/page/get-wxml-node-info/get-wxml-node-info\",\n        \"pages/page/page-scroll/page-scroll\",\n        \"pages/page/intersection-observer/intersection-observer\",\n        \"pages/device/clipboard-data/clipboard-data\",\n        \"pages/device/bluetooth/bluetooth\",\n        \"pages/device/bluetooth/slave/slave\",\n        \"pages/device/screen-brightness/screen-brightness\",\n        \"pages/device/vibrate/vibrate\",\n        \"pages/device/add-contact/add-contact\",\n        \"pages/device/wifi/wifi\",\n        \"pages/device/get-network-type/get-network-type\",\n        \"pages/device/on-network-status-change/on-network-status-change\",\n        \"pages/device/get-system-info/get-system-info\",\n        \"pages/device/on-compass-change/on-compass-change\",\n        \"pages/device/make-phone-call/make-phone-call\",\n        \"pages/device/scan-code/scan-code\",\n        \"pages/device/on-accelerometer-change/on-accelerometer-change\",\n        \"pages/device/capture-screen/capture-screen\",\n        \"pages/device/ibeacon/ibeacon\",\n        \"pages/device/get-battery-info/get-battery-info\",\n        \"pages/media/image/image\",\n        \"pages/media/voice/voice\",\n        \"pages/media/file/file\",\n        \"pages/media/load-font-face/load-font-face\",\n        \"pages/media/background-audio/background-audio\",\n        \"pages/media/video/video\",\n        \"pages/media/audio/audio\",\n        \"pages/media/media-container/media-container\",\n        \"pages/location/get-location/get-location\",\n        \"pages/location/open-location/open-location\",\n        \"pages/location/choose-location/choose-location\",\n        \"pages/network/request/request\",\n        \"pages/network/web-socket/web-socket\",\n        \"pages/network/upload-file/upload-file\",\n        \"pages/network/download-file/download-file\",\n        \"pages/network/mdns/mdns\",\n        \"pages/network/udp-socket/udp-socket\",\n        \"pages/storage/storage/storage\",\n        \"pages/storage/get-background-fetch-data/get-background-fetch-data\",\n        \"pages/storage/get-background-prefetch-data/get-background-prefetch-data\",\n        \"pages/performance/get-performance/get-performance\",\n        \"pages/worker/worker/worker\",\n        \"pages/framework/two-way-bindings/two-way-bindings\",\n        \"pages/framework/wxs/wxs\",\n        \"pages/framework/resizable/resizable\",\n        \"pages/framework/wxs/movable\",\n        \"pages/framework/wxs/sidebar\",\n        \"pages/framework/wxs/stick-top\",\n        \"pages/framework/wxs/nearby\",\n        \"pages/ai/mobilenet/index\",\n        \"pages/ai/style-trans/index\",\n        \"pages/ai/mobilenet_int8/index\",\n        \"pages/chattool/activity_assist/activity_assist\",\n        \"pages/chattool/material_open/material_open\",\n        \"pages/chattool/material_view/material_view\"\n      ]\n    },\n    {\n      \"root\": \"packageCloud\",\n      \"pages\": [\n        \"pages/user/user-authentication/user-authentication\",\n        \"pages/database/crud/crud\",\n        \"pages/database/db-permission/db-permission\",\n        \"pages/database/server-date/server-date\",\n        \"pages/storage/upload-file/upload-file\",\n        \"pages/storage/download-file/download-file\",\n        \"pages/storage/get-temp-file-url/get-temp-file-url\",\n        \"pages/storage/delete-file/delete-file\",\n        \"pages/storage/cloud-file-component/cloud-file-component\",\n        \"pages/scf/get-wx-context/get-wx-context\",\n        \"pages/scf/scf-database/scf-database\",\n        \"pages/scf/scf-storage/scf-storage\",\n        \"pages/scf/scf-openapi/scf-openapi\"\n      ]\n    },\n    {\n      \"root\": \"packageExtend\",\n      \"pages\": [\n        \"pages/form/cell/cell\",\n        \"pages/form/slideview/slideview\",\n        \"pages/form/form/form\",\n        \"pages/form/uploader/uploader\",\n        \"pages/base/article/article\",\n        \"pages/base/icons/icons\",\n        \"pages/base/badge/badge\",\n        \"pages/base/flex/flex\",\n        \"pages/base/footer/footer\",\n        \"pages/base/gallery/gallery\",\n        \"pages/base/grid/grid\",\n        \"pages/base/loadmore/loadmore\",\n        \"pages/base/loading/loading\",\n        \"pages/base/panel/panel\",\n        \"pages/base/preview/preview\",\n        \"pages/operate/dialog/dialog\",\n        \"pages/operate/msg/msg\",\n        \"pages/operate/msg/msg_success\",\n        \"pages/operate/msg/msg_text\",\n        \"pages/operate/msg/msg_text_primary\",\n        \"pages/operate/msg/msg_fail\",\n        \"pages/operate/half-screen-dialog/half-screen-dialog\",\n        \"pages/operate/actionsheet/actionsheet\",\n        \"pages/operate/toptips/toptips\",\n        \"pages/navigation/navigation/navigation\",\n        \"pages/navigation/tabbar/tabbar\",\n        \"pages/search/searchbar/searchbar\",\n        \"pages/extend/emoji/emoji\",\n        \"pages/extend/video-swiper/video-swiper\",\n        \"pages/extend/index-list/index-list\",\n        \"pages/extend/recycle-view/recycle-view\",\n        \"pages/extend/sticky/sticky\",\n        \"pages/extend/tabs/tabs\",\n        \"pages/extend/vtabs/vtabs\",\n        \"pages/extend/barrage/barrage\",\n        \"pages/extend/select-text/select-text\",\n        \"pages/extend/wxml-to-canvas/wxml-to-canvas\",\n        \"pages/adapt/telescopic/telescopic\",\n        \"pages/adapt/linebreak/linebreak\",\n        \"pages/adapt/sidenavigation/sidenavigation\",\n        \"pages/adapt/pagination/pagination\",\n        \"pages/adapt/freelayout/freelayout\",\n        \"pages/adapt/layeredpresentation/layeredpresentation\",\n        \"pages/adapt/horizontalexpansion/horizontalexpansion\"\n      ]\n    },\n    {\n      \"root\": \"packageSkyline\",\n      \"renderer\": \"skyline\",\n      \"componentFramework\": \"glass-easel\",\n      \"pages\": [\n        \"pages/worklet/animation/index\",\n        \"pages/worklet/gesture/index\",\n        \"pages/share-element/list/index\",\n        \"pages/share-element/card/index\",\n        \"pages/worklet/bottom-sheet/index\",\n        \"pages/half-page/scale-page/index\",\n        \"pages/half-page/half-page/index\"\n      ]\n    },\n    {\n      \"root\": \"packageSkylineExamples\",\n      \"renderer\": \"skyline\",\n      \"componentFramework\": \"glass-easel\",\n      \"pages\": [\n        \"examples/address-book/pages/index/index\",\n        \"examples/tab-indicator/pages/index/index\",\n        \"examples/album/pages/album/index\",\n        \"examples/album/pages/preview/index\",\n        \"examples/half-screen/pages/index/index\",\n        \"examples/segmented-half-screen/pages/index/index\",\n        \"examples/card_transition/pages/list/list\",\n        \"examples/card_transition/pages/detail/detail\",\n        \"examples/product-list/pages/index/index\",\n        \"examples/expanded-scroll-view/pages/index/index\",\n        \"examples/refresher-two-level/index/index\",\n        \"examples/refresher-two-level/goods/index\",\n        \"examples/app-bar/pages/index/index\",\n        \"examples/app-bar/pages/detail/index\"\n      ]\n    },\n    {\n      \"root\": \"packageSkylineRouter\",\n      \"componentFramework\": \"glass-easel\",\n      \"renderer\": \"skyline\",\n      \"pages\": [\n        \"pages/preset-router/index/index\",\n        \"pages/preset-router/list/index\",\n        \"pages/open-container/index/index\",\n        \"pages/open-container/detail/index\",\n        \"pages/open-container/other/index\",\n        \"pages/page-return-gesture/index/index\"\n      ]\n    },\n    {\n      \"root\": \"packageXRFrame\",\n      \"pages\": [\n        \"pages/index/index\",\n        \"pages/basic/scene-basic/index\",\n        \"pages/basic/scene-basic-alpha/index\",\n        \"pages/basic/scene-basic-light/index\",\n        \"pages/basic/scene-basic-animation/index\",\n        \"pages/basic/scene-basic-touch/index\",\n        \"pages/basic/scene-basic-visible-layer/index\",\n        \"pages/basic/scene-basic-shadow/index\",\n        \"pages/basic/scene-basic-video/index\",\n        \"pages/basic/scene-basic-render-texture/index\",\n        \"pages/basic/scene-basic-postprocessing/index\",\n        \"pages/basic/scene-basic-envData/index\",\n        \"pages/basic/scene-basic-share/index\",\n        \"pages/gltf/scene-gltf-damageHelmet/index\",\n        \"pages/gltf/scene-gltf-unlit/index\",\n        \"pages/gltf/scene-gltf-animation/index\",\n        \"pages/gltf/scene-gltf-morph/index\",\n        \"pages/gltf/scene-gltf-light-loading/index\",\n        \"pages/gltf/scene-gltf-specularGlossiness/index\",\n        \"pages/gltf/scene-gltf-sheen/index\",\n        \"pages/gltf/scene-gltf-transmission/index\",\n        \"pages/gltf/scene-gltf-textureTransform/index\",\n        \"pages/gltf/scene-gltf-lightsPunctual/index\",\n        \"pages/gltf/scene-gltf-compressTextures/index\",\n        \"pages/ar/scene-ar-basic/index\",\n        \"pages/ar/scene-ar-2dmarker/index\",\n        \"pages/ar/scene-ar-osdmarker/index\",\n        \"pages/ar/scene-ar-face/index\",\n        \"pages/ar/scene-ar-hand/index\",\n        \"pages/ar/scene-ar-body/index\",\n        \"pages/ar/scene-ar-shoe/index\",\n        \"pages/ar/scene-ar-face-3d/index\",\n        \"pages/ar/scene-ar-hand-3d/index\",\n        \"pages/ar/scene-ar-body-3d/index\",\n        \"pages/ar/scene-ar-threeDof/index\",\n        \"pages/ar/scene-ar-camera/index\",\n        \"pages/ar/scene-ar-vio-marker/index\",\n        \"pages/ar/scene-ar-vio-depth/index\",\n        \"pages/custom/scene-custom-logic/index\",\n        \"pages/custom/scene-custom-render/index\",\n        \"pages/scan/scene-scan-render/index\",\n        \"pages/scan/scene-scan-team/index\",\n        \"pages/ar-classic/scene-classic-wxball/index\",\n        \"pages/ar-classic/scene-classic-video/index\",\n        \"pages/ar-classic/scene-classic-perspect/index\",\n        \"pages/ar-classic/scene-classic-portal/index\",\n        \"pages/ar-classic/scene-classic-osd/index\",\n        \"pages/ar-classic/scene-classic-face/index\",\n        \"pages/template/xr-template-message/index\",\n        \"pages/template/xr-template-control/index\",\n        \"pages/template/xr-template-loading/index\",\n        \"pages/template/xr-template-toon/index\",\n        \"pages/template/xr-template-pbr/index\",\n        \"pages/template/xr-template-planeShadow/index\",\n        \"pages/template/xr-template-geometry/index\",\n        \"pages/template/xr-template-gltfEdit/index\",\n        \"pages/template/xr-template-gltfAnimation/index\",\n        \"pages/template/xr-template-gltfOcclusion/index\",\n        \"pages/template/xr-template-gltfUVAnimation/index\",\n        \"pages/template/xr-template-blendDouble/index\",\n        \"pages/template/xr-template-frameEffect/index\",\n        \"pages/template/xr-template-tracker/index\",\n        \"pages/template/xr-template-markerCenter/index\",\n        \"pages/template/xr-template-markerLock/index\",\n        \"pages/template/xr-template-arLine/index\",\n        \"pages/template/xr-template-select/index\",\n        \"pages/template/xr-template-share/index\",\n        \"pages/template/xr-template-textEdit/index\",\n        \"pages/template/xr-template-removeBlack/index\",\n        \"pages/template/xr-template-featherVideo/index\",\n        \"pages/template/xr-template-arPreview/index\",\n        \"pages/template/xr-template-arGlasses/index\",\n        \"pages/template/xr-template-lookat/index\",\n        \"pages/template/xr-template-arui/index\",\n        \"pages/template/xr-template-volumeVideo/index\",\n        \"pages/template/xr-template-dissolve/index\",\n        \"pages/scene-last-record/index\",\n        \"pages/scene-beside-edge/index\",\n        \"pages/physics/scene-physics-shoot/index\",\n        \"pages/physics/scene-physics-throw/index\",\n        \"pages/particle/scene-particle-firework/index\",\n        \"pages/particle/scene-particle-portal/index\",\n        \"pages/particle/scene-particle-orb/index\",\n        \"pages/particle/scene-particle-shapeEmitter/index\",\n        \"pages/particle/scene-particle-custom/index\",\n        \"pages/particle/scene-particle-meshEmitter/index\",\n        \"pages/customParticle/scene-customParticle-firework/index\",\n        \"pages/customParticle/scene-customParticle-orb/index\",\n        \"pages/customParticle/scene-customParticle-portal/index\",\n        \"pages/customParticle/scene-customParticle-shapeEmitter/index\",\n        \"pages/customParticle/scene-customParticle-meshEmitter/index\"\n      ]\n    }\n  ],\n  \"preloadRule\": {\n    \"page/component/index\": {\n      \"network\": \"all\",\n      \"packages\": [\n        \"packageComponent\"\n      ]\n    },\n    \"page/animation/index\": {\n      \"network\": \"all\",\n      \"packages\": [\n        \"packageSkylineRouter\"\n      ]\n    },\n    \"page/API/index\": {\n      \"network\": \"all\",\n      \"packages\": [\n        \"packageAPI\"\n      ]\n    },\n    \"packageAPI/pages/chattool/activity_assist/activity_assist\": {\n      \"network\": \"all\",\n      \"packages\": [\n        \"packageChatTool\"\n      ]\n    },\n    \"page/cloud/index\": {\n      \"network\": \"all\",\n      \"packages\": [\n        \"packageCloud\"\n      ]\n    },\n    \"page/extend/index\": {\n      \"network\": \"all\",\n      \"packages\": [\n        \"packageExtend\"\n      ]\n    }\n  },\n  \"window\": {\n    \"navigationBarTextStyle\": \"@navigationBarTextStyle\",\n    \"navigationBarTitleText\": \"演示\",\n    \"navigationBarBackgroundColor\": \"@navigationBarBackgroundColor\",\n    \"backgroundColor\": \"@backgroundColor\"\n  },\n  \"tabBar\": {\n    \"color\": \"@tabBarColor\",\n    \"selectedColor\": \"@tabBarSelectedColor\",\n    \"borderStyle\": \"@tabBarBorderStyle\",\n    \"backgroundColor\": \"@tabBarBackgroundColor\",\n    \"list\": [\n      {\n        \"pagePath\": \"page/component/index\",\n        \"iconPath\": \"@iconPathComponent\",\n        \"selectedIconPath\": \"@selectedIconPathComponent\",\n        \"text\": \"组件\"\n      },\n      {\n        \"pagePath\": \"page/animation/index\",\n        \"iconPath\": \"@iconPathComponent\",\n        \"selectedIconPath\": \"@selectedIconPathComponent\",\n        \"text\": \"交互动画\"\n      },\n      {\n        \"pagePath\": \"page/API/index\",\n        \"iconPath\": \"@iconPathAPI\",\n        \"selectedIconPath\": \"@selectedIconPathAPI\",\n        \"text\": \"接口\"\n      },\n      {\n        \"pagePath\": \"page/cloud/index\",\n        \"iconPath\": \"@iconPathCloud\",\n        \"selectedIconPath\": \"@selectedIconPathCloud\",\n        \"text\": \"云开发\"\n      },\n      {\n        \"pagePath\": \"page/ad/index\",\n        \"iconPath\": \"@iconPathAd\",\n        \"selectedIconPath\": \"@selectedIconPathAd\",\n        \"text\": \"广告\"\n      }\n    ]\n  },\n  \"networkTimeout\": {\n    \"request\": 10000,\n    \"connectSocket\": 10000,\n    \"uploadFile\": 10000,\n    \"downloadFile\": 10000\n  },\n  \"workers\": \"workers\",\n  \"debug\": false,\n  \"style\": \"v2\",\n  \"permission\": {\n    \"scope.userLocation\": {\n      \"desc\": \"你的位置信息将用于小程序位置接口的效果展示\"\n    }\n  },\n  \"cloud\": true,\n  \"sitemapLocation\": \"sitemap.json\",\n  \"themeLocation\": \"demo.theme.json\",\n  \"darkmode\": true,\n  \"resizable\": true,\n  \"useExtendedLib\": {\n    \"weui\": \"latest\"\n  },\n  \"frameset\": true,\n  \"requiredBackgroundModes\": [\n    \"audio\",\n    \"location\"\n  ],\n  \"requiredPrivateInfos\": [\n    \"getLocation\",\n    \"chooseLocation\",\n    \"chooseAddress\"\n  ],\n  \"embeddedAppIdList\": [\n    \"wxfdcee92a299bcaf1\"\n  ],\n  \"lazyCodeLoading\": \"requiredComponents\",\n  \"__lazyCodeLoadingChunk\": true,\n  \"rendererOptions\": {\n    \"skyline\": {\n      \"defaultDisplayBlock\": true,\n      \"defaultContentBox\": true,\n      \"tagNameStyleIsolation\": \"legacy\",\n      \"disableABTest\": true,\n      \"sdkVersionBegin\": \"3.0.0\",\n      \"sdkVersionEnd\": \"15.255.255\"\n    }\n  },\n  \"componentFramework\": \"glass-easel\",\n  \"appBar\": {},\n  \"supportedMaterials\": [\n    {\n      \"materialType\": \"image/*\",\n      \"name\": \"用${nickname}打开\",\n      \"desc\": \"聊天内容长按打开\",\n      \"path\": \"packageAPI/pages/chattool/material_open/material_open\"\n    }\n  ],\n  \"multiSelectSupportedMaterials\": [\n    {\n      \"materialType\": [\n        \"image/*\"\n      ],\n      \"desc\": \"聊天内容长按多选打开\",\n      \"path\": \"packageAPI/pages/chattool/material_open/material_open\",\n      \"scopes\": []\n    }\n  ]\n}"
  },
  {
    "path": "miniprogram/app.wxss",
    "content": "/* reset */\n@import './common/common-skyline.wxss';\n\npage {\n  background-color: #f7f7f7;\n  height: 100%;\n  font-size: 16px;\n  line-height: 1.6;\n  color: rgba(0, 0, 0, .9);\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  align-items: center;\n}\npage > view, page > scroll-view {\n  width: 100vw;\n  max-width: 600px;\n}\ncheckbox, radio {\n  margin-right: 5px;\n}\n\ncanvas {\n  position: fixed;\n  top:0;\n}\n\n.info {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100px;\n  height: 20px;\n  line-height: 20px;\n  background-color: rgb(5, 16, 112);\n  color: #fff;\n  padding-left: 10px;\n  font-size: 12px;\n  z-index: 1000;\n}\n\n.memory {\n  top: 20px;\n}\n\n.cpu {\n  top: 40px;\n}\n\nbutton {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  font-size: 16px;\n  line-height: 1.2;\n}\n\nform {\n  width: 100%;\n}\ninput {\n  width: 100%;\n}\n\n/* lib */\n.strong {\n  font-weight: bold;\n}\n.tc {\n  text-align: center;\n}\n\n/* page */\n.container {\n  display: flex;\n  flex-direction: column;\n  min-height: 100%;\n  justify-content: space-between;\n  font-size: 16px;\n  font-family: -apple-system-font,Helvetica Neue,Helvetica,sans-serif;\n}\n.page-head{\n  /* padding: 30px 25px 40px; */\n  padding: 30px 25px 40px;\n  text-align: center;\n}\n.page-head-title {\n  display: inline-block;\n  /* padding: 0 20px 10px 20px;\n  font-size: 16px; */\n  padding: 0 20px 10px 20px;\n  font-size: 16px;\n}\n.page-head-line{\n  margin: 0 auto;\n  width: 75px;\n  height: 1px;\n  background-color: rgba(0, 0, 0, .5);\n}\n.page-head-desc{\n  padding-top: 10px;\n  color: rgba(0, 0, 0, .5);\n  font-size: 16px;\n}\n\n.page-body {\n  width: 100%;\n  flex-grow: 1;\n}\n.page-body-wrapper {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  width: 100%;\n}\n.page-body-wording {\n  text-align: center;\n  padding: 100px 50px;\n}\n.page-body-info {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  background-color: #fff;\n  width: 100%;\n  padding: 25px 0 75px 0;\n}\n.page-body-title {\n  margin-bottom: 50px;\n  font-size: 16px;\n}\n.page-body-text {\n  font-size: 15px;\n  line-height: 26px;\n  color: rgba(0, 0, 0, .3);\n}\n.page-body-text-small {\n  font-size: 12px;\n  color: rgba(0, 0, 0, .9);\n  margin-bottom: 50px;\n}\n\n.page-foot{\n  margin: 50px 0 0 0;\n  margin-bottom: constant(safe-area-inset-bottom);\n  margin-bottom: env(safe-area-inset-bottom);\n  padding-bottom: 15px;\n  text-align: center;\n  color: #1aad19;\n  font-size: 0;\n}\n.icon-foot{\n  /* width: 151px;\n  height: 12px; */\n  width: 76px;\n  height: 12px;\n  margin: 0 auto;\n}\n\n.page-section{\n  width: 100%;\n  margin-bottom: 30px;\n}\n.page-section_center{\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n.page-section:last-child{\n  margin-bottom: 0;\n}\n.page-section-gap{\n  box-sizing: border-box;\n  padding: 0 15px;\n}\n.page-section-spacing{\n  box-sizing: border-box;\n  padding: 0 40px;\n}\n.page-section-title{\n  font-size: 14px;\n  color: rgba(0, 0, 0, .5);\n  margin-bottom: 5px;\n  padding-left: 15px;\n  /* padding-right: 15px; */\n}\n.page-section-gap .page-section-title{\n  padding-left: 0;\n  padding-right: 0;\n}\n.page-section-ctn{\n\n}\n\n/* widget */\n.btn-area{\n  margin-top: 30px;\n  box-sizing: border-box;\n  width: 100%;\n  padding: 0 15px;\n}\n\n.image-plus {\n  width: 75px;\n  height: 75px;\n  border: 1px solid rgba(0, 0, 0, .5);\n  position: relative;\n}\n.image-plus-nb{\n  border: 0;\n}\n.image-plus-text{\n  color: rgba(0, 0, 0, .3);\n  font-size: 14px;\n}\n.image-plus-horizontal {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  background-color: rgba(0, 0, 0, .5);\n  width: 2px;\n  height: 40px;\n  transform: translate(-50%, -50%);\n}\n.image-plus-vertical {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  background-color: rgba(0, 0, 0, .5);\n  width: 40px;\n  height: 2px;\n  transform: translate(-50%, -50%);\n}\n\n.demo-text-1{\n  position: relative;\n  align-items: center;\n  justify-content: center;\n  background-color: #1AAD19;\n  color: #FFFFFF;\n  font-size: 18px;\n}\n/* skyline不支持:before */\n/* .demo-text-1:before{\n  content: 'A';\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n} */\n.demo-text-2{\n  position: relative;\n  align-items: center;\n  justify-content: center;\n  background-color: #2782D7;\n  color: #FFFFFF;\n  font-size: 18px;\n}\n/* skyline不支持:before */\n/* .demo-text-2:before{\n  content: 'B';\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n} */\n.demo-text-3{\n  position: relative;\n  align-items: center;\n  justify-content: center;\n  background-color: #F1F1F1;\n  color: #353535;\n  font-size: 18px;\n}\n/* skyline不支持:before */\n/* .demo-text-3:before{\n  content: 'C';\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n} */\n/* pick from weui */\n.weui-cells__title {\n  margin-top: 16px;\n  margin-bottom: 3px;\n  padding-left: 16px;\n  padding-right: 16px;\n  color: rgba(0,0,0,0.5);\n  font-size: 14px;\n  line-height: 1.4;\n}\n\n/* skyline 未生效，用 .weui-cells_after-title 代替 */\n.weui-cells__title + .weui-cells {\n  margin-top: 0;\n}\n.weui-cells {\n  margin-top: 8px;\n  line-height: 1.41176471;\n  font-size: 17px;\n  overflow: hidden;\n  position: relative;\n  border-top: .5px solid rgba(0,0,0,0.1);\n  border-bottom: .5px solid rgba(0,0,0,0.1);\n}\n.weui-cells_after-title {\n  margin-top: 0;\n}\n.weui-cell {\n  padding: 16px;\n  flex-direction: row;\n  align-items: center;\n}\n.weui-cell_before {\n  left: 16px;\n  border-top: .5px solid rgba(0, 0, 0, .1);\n}\n.weui-cell::before {\n  display: none;\n}\n\n[data-weui-theme=dark] .weui-cell_before {\n  border-top-color: hsla(0, 0%, 100%, .1);\n}\n\n.center {\n  align-items: center;\n  justify-content: center; \n}\n\ngrid-tile {\n  align-items: center;\n  justify-content: center; \n  overflow: hidden;\n}\n"
  },
  {
    "path": "miniprogram/assets/animation/basic-animation.json",
    "content": "{\n  \"keyframe\": {\n    \"cube\": {\n      \"0\": {\n        \"position\": [-3, 0, 2]\n      },\n      \"50\": {\n        \"rotation\": [0, 0, 0],\n        \"scale\": [1, 1, 1]\n      },\n      \"100\": {\n        \"position\": [3, 0, 2],\n        \"rotation\": [0, 3.14, 0],\n        \"scale\": [1.4, 1.4, 1.4]\n      }\n    },\n    \"sphere\": {\n      \"0\": {\n        \"position\": [-3, 0, 0],\n        \"scale\": [0.8, 0.8, 0.8]\n      },\n      \"50\": {\n        \"position\": [0, 0.2, 0],\n        \"scale\": [1, 1, 1]\n      },\n      \"100\": {\n        \"position\": [3, 0, 0],\n        \"scale\": [0.8, 0.8, 0.8]\n      }\n    },\n    \"cylinder\": {\n      \"0\": {\n        \"position\": [-3, 0, -2],\n        \"rotation\": [0, 0, 0]\n      },\n      \"50\": {\n        \"rotation\": [0, 0, -3.14]\n      },\n      \"100\": {\n        \"position\": [3, 0, -2],\n        \"rotation\": [0, 0, 3.14]\n      }\n    },\n    \"plane\": {\n      \"0\": {\n        \"material.u_baseColorFactor\": [0.48, 0.78, 0.64, 1]\n      },\n      \"50\": {\n        \"material.u_baseColorFactor\": [0.368, 0.937, 0.176, 1]\n      },\n      \"100\": {\n        \"material.u_baseColorFactor\": [0.176, 0.368, 0.937, 1]\n      }\n    },\n    \"spotLight\": {\n      \"0\": {\n        \"position\": [-4, 1, -4]\n      },\n      \"25\": {\n        \"position\": [-4.3, 0.5, -2]\n      },\n      \"75\": {\n        \"position\": [-3, 1.5, 2]\n      },\n      \"100\": {\n        \"position\": [-4, 1, 4]\n      }\n    }\n  },\n  \"animation\": {\n    \"default\": {\n      \"keyframe\": \"cube\",\n      \"duration\": 1,\n      \"ease\": \"ease-in-out\",\n      \"loop\": 400000,\n      \"delay\": 1,\n      \"direction\": \"both\"\n    },\n    \"sphere\": {\n      \"keyframe\": \"sphere\",\n      \"duration\": 1,\n      \"ease\": \"ease-out\",\n      \"loop\": 400000,\n      \"delay\": 1,\n      \"direction\": \"both\"\n    },\n    \"cylinder\": {\n      \"keyframe\": \"cylinder\",\n      \"duration\": 1,\n      \"ease\": \"ease-in\",\n      \"loop\": 400000,\n      \"delay\": 1,\n      \"direction\": \"both\"\n    },\n    \"plane\": {\n      \"keyframe\": \"plane\",\n      \"duration\": 4,\n      \"ease\": \"linear\",\n      \"loop\": 400000,\n      \"delay\": 1,\n      \"direction\": \"both\"\n    },\n    \"spotLight\": {\n      \"keyframe\": \"spotLight\",\n      \"duration\": 2,\n      \"ease\": \"ease-in-out\",\n      \"loop\": 400000,\n      \"delay\": 1,\n      \"direction\": \"both\"\n    }\n  }\n}\n"
  },
  {
    "path": "miniprogram/assets/animation/gltf-animation.json",
    "content": "{\n  \"keyframe\": {\n    \"directionalLight\": {\n      \"0\": {\n        \"rotation\": [40, 170, 0]\n      },\n      \"50\": {\n        \"rotation\": [30, 140, 0]\n      },\n      \"100\": {\n        \"rotation\": [40, 170, 0]\n      }\n    },\n    \"pointLight\": {\n      \"0\": {\n        \"position\": [10, 0, 0]\n      },\n      \"100\": {\n        \"position\": [-10, 0, 0]\n      }\n    },\n    \"spotLight\": {\n      \"0\": {\n        \"rotation\": [0,90,0]\n      },\n      \"100\": {\n        \"rotation\": [0, 270, 4]\n      }\n    }\n  },\n  \"animation\": {\n    \"default\": {\n      \"keyframe\": \"directionalLight\",\n      \"duration\": 60,\n      \"ease\": \"linear\",\n      \"loop\": 400000,\n      \"delay\": 1,\n      \"direction\": \"both\"\n    },\n    \"pointLight\": {\n      \"keyframe\": \"pointLight\",\n      \"duration\": 6,\n      \"ease\": \"linear\",\n      \"loop\": 400000,\n      \"delay\": 1,\n      \"direction\": \"both\"\n    },\n    \"spotLight\": {\n      \"keyframe\": \"spotLight\",\n      \"duration\": 200,\n      \"ease\": \"linear\",\n      \"loop\": 400000,\n      \"delay\": 1,\n      \"direction\": \"both\"\n    }\n  }\n}\n"
  },
  {
    "path": "miniprogram/assets/animation/last-record-anchor-animation.json",
    "content": "{\n  \"keyframe\": {\n    \"parent\": {\n      \"0\": {\n        \"rotation\": [0, 0, 0]\n      },\n      \"100\": {\n        \"rotation\": [0, 6.28, 0]\n      }\n    },\n    \"child\": {\n      \"0\": {\n        \"position.y\": 0.8\n      },\n      \"50\": {\n        \"position.y\": 1\n      },\n      \"100\": {\n        \"position.y\": 0.8\n      }\n    },\n    \"door\": {\n      \"0\": {\n        \"scale\": [0, 1, 1]\n      },\n      \"100\": {\n        \"scale\": [1, 1, 1]\n      }\n    }\n  },\n  \"animation\": {\n    \"parent\": {\n      \"keyframe\": \"parent\",\n      \"duration\": 8,\n      \"ease\": \"linear\",\n      \"loop\": -1\n    },\n    \"child\": {\n      \"keyframe\": \"child\",\n      \"duration\": 4,\n      \"ease\": \"linear\",\n      \"direction\": \"both\",\n      \"loop\": -1\n    },\n    \"door\": {\n      \"keyframe\": \"door\",\n      \"duration\": 0.6,\n      \"ease\": \"linear\"\n    }\n  }\n}\n"
  },
  {
    "path": "miniprogram/assets/animation/miku-kawaii-animation.json",
    "content": "{\n  \"keyframe\": {\n    \"parent\": {\n      \"0\": {\n        \"rotation\": [0, 0, 0]\n      },\n      \"100\": {\n        \"rotation\": [0, 6.28, 0]\n      }\n    },\n    \"child\": {\n      \"0\": {\n        \"position.y\": -0.5\n      },\n      \"100\": {\n        \"position.y\": 1.5\n      }\n    }\n  },\n  \"animation\": {\n    \"parent\": {\n      \"keyframe\": \"parent\",\n      \"duration\": 8,\n      \"ease\": \"linear\",\n      \"loop\": -1\n    },\n    \"child\": {\n      \"keyframe\": \"child\",\n      \"duration\": 4,\n      \"ease\": \"ease-in-out\",\n      \"direction\": \"both\",\n      \"loop\": -1\n    }\n  }\n}\n"
  },
  {
    "path": "miniprogram/common/common-skyline.wxss",
    "content": "/*!\n * WeUI v2.3.0 (https://github.com/weui/weui-wxss)\n * Copyright 2020 Tencent, Inc.\n * Licensed under the MIT license\n */\n/* @import '../components/weui-wxss/dist/style/weui.wxss'; */\n\npage {\n  height: 100%;\n  display: flex;\n  justify-content: center;\n}\n\n.page {\n  height: fit-content;\n  min-height: 100%;\n  background-color: #f7f7f7;\n  color: rgba(0, 0, 0, .9);\n  font-size: 16px;\n  font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif;\n  /* max-width: 600px; */\n}\n\nimage {\n  /* max-width: 100%;\n  max-height: 100% */\n}\n\n.link {\n  display: inline;\n  color: #576b95\n}\n\n.fadeIn {\n  -webkit-animation: a .3s forwards;\n  animation: a .3s forwards\n}\n\n.fadeOut {\n  -webkit-animation: b .3s forwards;\n  animation: b .3s forwards\n}\n\n@-webkit-keyframes a {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n@keyframes a {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n@-webkit-keyframes b {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n@keyframes b {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n.weui-msg__extra-area {\n  position: static\n}\n\n.page__hd {\n  padding: 40px\n}\n\n.page__bd {\n  padding-bottom: 40px\n}\n\n.page__bd_spacing {\n  padding-left: 15px;\n  padding-right: 15px\n}\n\n.page__ft {\n  padding-top: 40px;\n  padding-bottom: 10px;\n  padding-bottom: calc(10px + constant(safe-area-inset-bottom));\n  padding-bottom: calc(10px + env(safe-area-inset-bottom));\n  text-align: center\n}\n\n[data-weui-theme=dark] .page__ft image {\n  -webkit-filter: invert(100) hue-rotate(180deg);\n  filter: invert(100) hue-rotate(180deg)\n}\n\n.page__title {\n  text-align: left;\n  font-size: 20px;\n  font-weight: 400\n}\n\n.page__desc {\n  margin-top: 5px;\n  color: rgba(0, 0, 0, .5);\n  text-align: left;\n  font-size: 14px\n}\n\n.weui-cell_example:before {\n  left: 52px\n}\n\n@media (prefers-color-scheme: dark) {\n  page {\n    background-color: #1F1F1F;\n    color: hsla(0, 0%, 100%, .8);\n  }\n}\n\n[data-weui-theme=dark] .page-head-line{\n  background-color: hsla(0, 0%, 100%, .5);\n}\n[data-weui-theme=dark] .page-head-desc {\n  background-color: hsla(0, 0%, 100%, .5);\n}\n[data-weui-theme=dark] .page-body-info {\n  background-color: #232323;\n}\n[data-weui-theme=dark] .page-body-text {\n  color: hsla(0, 0%, 100%, .3);\n}\n[data-weui-theme=dark] .page-body-text-small {\n  color: hsla(0, 0%, 100%, .8);\n}\n[data-weui-theme=dark] .page-section-title {\n  color: hsla(0, 0%, 100%, .5);\n}\n[data-weui-theme=dark] .image-plus {\n  border-color: hsla(0, 0%, 100%, .5);\n}\n[data-weui-theme=dark] .image-plus-text {\n  color: hsla(0, 0%, 100%, .3);\n}\n[data-weui-theme=dark].page {\n  background-color: #1f1f1f;\n  color: hsla(0, 0%, 100%, .8);\n}\n[data-weui-theme=dark] .link {\n  color: #7d90a9;\n}\n[data-weui-theme=dark] .page__desc {\n  color: hsla(0, 0%, 100%, .5);\n}\n\n"
  },
  {
    "path": "miniprogram/common/common.wxss",
    "content": "/*!\n * WeUI v2.3.0 (https://github.com/weui/weui-wxss)\n * Copyright 2020 Tencent, Inc.\n * Licensed under the MIT license\n */\n/* @import '../components/weui-wxss/dist/style/weui.wxss'; */\n\npage {\n  height: 100%;\n  display: flex;\n  justify-content: center;\n}\n\n.page {\n  height: fit-content;\n  min-height: 100%;\n  background-color: var(--weui-BG-1);\n  color: var(--weui-FG-0);\n  font-size: 16px;\n  font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif;\n  max-width: 600px;\n}\n\nimage {\n  max-width: 100%;\n  max-height: 100%\n}\n\n.link {\n  display: inline;\n  color: var(--weui-LINK)\n}\n\n.fadeIn {\n  -webkit-animation: a .3s forwards;\n  animation: a .3s forwards\n}\n\n.fadeOut {\n  -webkit-animation: b .3s forwards;\n  animation: b .3s forwards\n}\n\n@-webkit-keyframes a {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n@keyframes a {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n@-webkit-keyframes b {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n@keyframes b {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n.weui-msg__extra-area {\n  position: static\n}\n\n.page__hd {\n  padding: 40px\n}\n\n.page__bd {\n  padding-bottom: 40px\n}\n\n.page__bd_spacing {\n  padding-left: 15px;\n  padding-right: 15px\n}\n\n.page__ft {\n  padding-top: 40px;\n  padding-bottom: 10px;\n  padding-bottom: calc(10px + constant(safe-area-inset-bottom));\n  padding-bottom: calc(10px + env(safe-area-inset-bottom));\n  text-align: center\n}\n\n[data-weui-theme=dark] .page__ft image {\n  -webkit-filter: invert(100) hue-rotate(180deg);\n  filter: invert(100) hue-rotate(180deg)\n}\n\n.page__title {\n  text-align: left;\n  font-size: 20px;\n  font-weight: 400\n}\n\n.page__desc {\n  margin-top: 5px;\n  color: var(--weui-FG-1);\n  text-align: left;\n  font-size: 14px\n}\n\n.weui-cell_example:before {\n  left: 52px\n}\n\n@media (prefers-color-scheme: dark) {\n  page {\n    background-color: #1F1F1F;\n  }\n}"
  },
  {
    "path": "miniprogram/common/foot.wxml",
    "content": "<template name=\"foot\">\n  <navigator class=\"page-foot\" openType=\"switchTab\" url=\"/page/component/index\" hover-class=\"none\">\n    <image class=\"icon-foot\" src=\"/image/icon_foot.png\"></image>\n  </navigator>\n</template>"
  },
  {
    "path": "miniprogram/common/head.wxml",
    "content": "<template name=\"head\">\n  <view class=\"page-head\">\n    <view class=\"page-head-title\">\n    <text>{{title}}</text></view>\n    <view class=\"page-head-line\"></view>\n    <view wx:if=\"{{desc}}\" class=\"page-head-desc\">{{desc}}</view>\n  </view>\n</template>\n"
  },
  {
    "path": "miniprogram/common/index.wxss",
    "content": ".index-hd {\n  padding: 40px;\n  text-align: center;\n}\n.index-bd {\n  padding: 0 15px 20px;\n}\n.index-ft {\n  padding-bottom: 10px;\n  text-align: center;\n}\n.index-logo {\n  width: 43px;\n  height: 43px;\n}\n.index-desc {\n  margin-top: 10px;\n  color: #888888;\n  font-size: 14px;\n}\n\n\n.navigator-box {\n  opacity: 0;\n  position: relative;\n  background-color: #FFFFFF;\n  line-height: 1.41176471;\n  font-size: 32px;\n\n  transform: translateY(-50%);\n  transition: .3s;\n}\n.navigator-box-show {\n  opacity: 1;\n  transform: translateY(0);\n}\n.navigator {\n  padding: 10px 15px;\n  position: relative;\n  display: flex;\n  align-items: center;\n}\n.navigator:before {\n  content: \" \";\n  position: absolute;\n  left: 15px;\n  top: 0;\n  right: 15px;\n  height: 1px;\n  border-top: 1px solid #D8D8D8;\n  color: #D8D8D8;\n}\n.navigator:first-child:before {\n  display: none;\n}\n.navigator-text {\n  flex: 1;\n}\n.navigator-arrow {\n  padding-right: 13px;\n  position: relative;\n}\n.navigator-arrow:after {\n  content: \" \";\n  display: inline-block;\n  height: 9px;\n  width: 9px;\n  border-width: 1px 1px 0 0;\n  border-color: #888888;\n  border-style: solid;\n  transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0);\n  position: absolute;\n  top: 50%;\n  margin-top: -4px;\n  right: 14px;\n}\n\n\n.kind-list-item {\n  margin: 10px 0;\n  background-color: #FFFFFF;\n  border-radius: 2px;\n  overflow: hidden;\n}\n.kind-list-item:first-child {\n  margin-top: 0;\n}\n.kind-list-text{\n  flex: 1;\n}\n.kind-list-img {\n  width: 30px;\n  height: 30px;\n}\n.kind-list-item-hd {\n  padding: 15px;\n  display: flex;\n  align-items: center;\n\n  transition: opacity .3s;\n}\n.kind-list-item-hd-show {\n  opacity: .2;\n}\n.kind-list-item-bd {\n  height: 0;\n  overflow: hidden;\n}\n.kind-list-item-bd-show {\n  height: auto;\n}"
  },
  {
    "path": "miniprogram/common/lib/weui.wxss",
    "content": "/*!\n * WeUI v2.3.0 (https://github.com/weui/weui-wxss)\n * Copyright 2020 Tencent, Inc.\n * Licensed under the MIT license\n */\n[data-weui-theme=light],\npage, :root {\n  --weui-BTN-DISABLED-FONT-COLOR: rgba(0, 0, 0, .2)\n}\n\n@media(prefers-color-scheme: dark) {\n  page, :root {\n    --weui-BTN-DISABLED-FONT-COLOR: hsla(0, 0%, 100%, .2)\n  }\n}\n\n[data-weui-theme=light],\npage, :root {\n  --weui-BTN-DEFAULT-BG: #f2f2f2\n}\n\n@media(prefers-color-scheme: dark) {\n  page, :root {\n    --weui-BTN-DEFAULT-BG: hsla(0, 0%, 100%, .08)\n  }\n}\n\n[data-weui-theme=light],\npage, :root {\n  --weui-BTN-DEFAULT-COLOR: #06ae56\n}\n\n@media(prefers-color-scheme: dark) {\n  page, :root {\n    --weui-BTN-DEFAULT-COLOR: hsla(0, 0%, 100%, .8)\n  }\n}\n\n[data-weui-theme=light],\npage, :root {\n  --weui-BTN-DEFAULT-ACTIVE-BG: #e6e6e6\n}\n\n@media(prefers-color-scheme: dark) {\n  page, :root {\n    --weui-BTN-DEFAULT-ACTIVE-BG: hsla(0, 0%, 100%, .126)\n  }\n}\n\n[data-weui-theme=light],\npage, :root {\n  --weui-DIALOG-LINE-COLOR: rgba(0, 0, 0, .1)\n}\n\n@media(prefers-color-scheme: dark) {\n  page, :root {\n    --weui-DIALOG-LINE-COLOR: hsla(0, 0%, 100%, .1)\n  }\n}\n\npage {\n  line-height: 1.6;\n  font-family: -apple-system-font, Helvetica Neue, sans-serif\n}\n\nicon {\n  vertical-align: middle\n}\n\n[data-weui-theme=light],\npage, :root {\n  --weui-BG-0: #ededed;\n  --weui-BG-1: #f7f7f7;\n  --weui-BG-2: #fff;\n  --weui-BG-3: #f7f7f7;\n  --weui-BG-4: #4c4c4c;\n  --weui-BG-5: #fff;\n  --weui-FG-0: rgba(0, 0, 0, .9);\n  --weui-FG-HALF: rgba(0, 0, 0, .9);\n  --weui-FG-1: rgba(0, 0, 0, .5);\n  --weui-FG-2: rgba(0, 0, 0, .3);\n  --weui-FG-3: rgba(0, 0, 0, .1);\n  --weui-RED: #fa5151;\n  --weui-ORANGE: #fa9d3b;\n  --weui-YELLOW: #ffc300;\n  --weui-GREEN: #91d300;\n  --weui-LIGHTGREEN: #95ec69;\n  --weui-BRAND: #07c160;\n  --weui-BLUE: #10aeff;\n  --weui-INDIGO: #1485ee;\n  --weui-PURPLE: #6467f0;\n  --weui-WHITE: #fff;\n  --weui-LINK: #576b95;\n  --weui-TEXTGREEN: #06ae56;\n  --weui-FG: #000;\n  --weui-BG: #fff;\n  --weui-TAG-TEXT-ORANGE: #fa9d3b;\n  --weui-TAG-BACKGROUND-ORANGE: rgba(250, 157, 59, .1);\n  --weui-TAG-TEXT-GREEN: #06ae56;\n  --weui-TAG-BACKGROUND-GREEN: rgba(6, 174, 86, .1);\n  --weui-TAG-TEXT-BLUE: #10aeff;\n  --weui-TAG-BACKGROUND-BLUE: rgba(16, 174, 255, .1);\n  --weui-TAG-TEXT-BLACK: rgba(0, 0, 0, .5);\n  --weui-TAG-BACKGROUND-BLACK: rgba(0, 0, 0, .05)\n}\n\n@media(prefers-color-scheme: dark) {\n  page, :root {\n    --weui-BG-0: #191919;\n    --weui-BG-1: #1f1f1f;\n    --weui-BG-2: #232323;\n    --weui-BG-3: #2f2f2f;\n    --weui-BG-4: #606060;\n    --weui-BG-5: #2c2c2c;\n    --weui-FG-0: hsla(0, 0%, 100%, .8);\n    --weui-FG-HALF: hsla(0, 0%, 100%, .6);\n    --weui-FG-1: hsla(0, 0%, 100%, .5);\n    --weui-FG-2: hsla(0, 0%, 100%, .3);\n    --weui-FG-3: hsla(0, 0%, 100%, .05);\n    --weui-RED: #fa5151;\n    --weui-ORANGE: #c87d2f;\n    --weui-YELLOW: #cc9c00;\n    --weui-GREEN: #74a800;\n    --weui-LIGHTGREEN: #28b561;\n    --weui-BRAND: #07c160;\n    --weui-BLUE: #10aeff;\n    --weui-INDIGO: #1196ff;\n    --weui-PURPLE: #8183ff;\n    --weui-WHITE: hsla(0, 0%, 100%, .8);\n    --weui-LINK: #7d90a9;\n    --weui-TEXTGREEN: #259c5c;\n    --weui-FG: #fff;\n    --weui-BG: #000;\n    --weui-TAG-TEXT-ORANGE: rgba(250, 157, 59, .6);\n    --weui-TAG-BACKGROUND-ORANGE: rgba(250, 157, 59, .1);\n    --weui-TAG-TEXT-GREEN: rgba(6, 174, 86, .6);\n    --weui-TAG-BACKGROUND-GREEN: rgba(6, 174, 86, .1);\n    --weui-TAG-TEXT-BLUE: rgba(16, 174, 255, .6);\n    --weui-TAG-BACKGROUND-BLUE: rgba(16, 174, 255, .1);\n    --weui-TAG-TEXT-BLACK: hsla(0, 0%, 100%, .5);\n    --weui-TAG-BACKGROUND-BLACK: hsla(0, 0%, 100%, .05)\n  }\n}\n\n[data-weui-theme=light],\npage, :root {\n  --weui-BG-COLOR-ACTIVE: #ececec\n}\n\n@media(prefers-color-scheme: dark) {\n  page, :root {\n    --weui-BG-COLOR-ACTIVE: #373737\n  }\n}\n\n[class*=\" weui-icon-\"],\n[class^=weui-icon-] {\n  display: inline-block;\n  vertical-align: middle;\n  width: 24px;\n  height: 24px;\n  -webkit-mask-position: 50% 50%;\n  mask-position: 50% 50%;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  background-color: currentColor\n}\n\n.weui-icon-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-download {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M11.25%2012.04l-1.72-1.72-1.06%201.06%202.828%202.83a1%201%200%20001.414-.001l2.828-2.828-1.06-1.061-1.73%201.73V7h-1.5v5.04zm0-5.04V2h1.5v5h6.251c.55%200%20.999.446.999.996v13.008a.998.998%200%2001-.996.996H4.996A.998.998%200%20014%2021.004V7.996A1%201%200%20014.999%207h6.251z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M11.25%2012.04l-1.72-1.72-1.06%201.06%202.828%202.83a1%201%200%20001.414-.001l2.828-2.828-1.06-1.061-1.73%201.73V7h-1.5v5.04zm0-5.04V2h1.5v5h6.251c.55%200%20.999.446.999.996v13.008a.998.998%200%2001-.996.996H4.996A.998.998%200%20014%2021.004V7.996A1%201%200%20014.999%207h6.251z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-info {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.75-12v7h1.5v-7h-1.5zM12%209a1%201%200%20100-2%201%201%200%20000%202z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.75-12v7h1.5v-7h-1.5zM12%209a1%201%200%20100-2%201%201%200%20000%202z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-safe-success {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.6C315.5%2046.7%20180.4%2093.1%2057.6%20132c0%20129.3.2%20231.7.2%20339.7%200%20304.2%20248.3%20471.6%20443.1%20523.7C695.7%20943.3%20944%20775.9%20944%20471.7c0-108%20.2-210.4.2-339.7C821.4%2093.1%20686.3%2046.7%20500.9%204.6zm248.3%20349.1l-299.7%20295c-2.1%202-5.3%202-7.4-.1L304.4%20506.1c-2-2.1-2.3-5.7-.6-8l18.3-24.9c1.7-2.3%205-2.8%207.2-1l112.2%2086c2.3%201.8%206%201.7%208.1-.1l274.7-228.9c2.2-1.8%205.7-1.7%207.7.3l17%2016.8c2.2%202.1%202.2%205.3.2%207.4z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23070202%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.6C315.5%2046.7%20180.4%2093.1%2057.6%20132c0%20129.3.2%20231.7.2%20339.7%200%20304.2%20248.3%20471.6%20443.1%20523.7C695.7%20943.3%20944%20775.9%20944%20471.7c0-108%20.2-210.4.2-339.7C821.4%2093.1%20686.3%2046.7%20500.9%204.6zm248.3%20349.1l-299.7%20295c-2.1%202-5.3%202-7.4-.1L304.4%20506.1c-2-2.1-2.3-5.7-.6-8l18.3-24.9c1.7-2.3%205-2.8%207.2-1l112.2%2086c2.3%201.8%206%201.7%208.1-.1l274.7-228.9c2.2-1.8%205.7-1.7%207.7.3l17%2016.8c2.2%202.1%202.2%205.3.2%207.4z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23070202%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-safe-warn {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.5c-185.4%2042-320.4%2088.4-443.2%20127.3%200%20129.3.2%20231.7.2%20339.6%200%20304.1%20248.2%20471.4%20443%20523.6%20194.7-52.2%20443-219.5%20443-523.6%200-107.9.2-210.3.2-339.6C821.3%2092.9%20686.2%2046.5%20500.9%204.5zm-26.1%20271.1h52.1c5.8%200%2010.3%204.7%2010.1%2010.4l-11.6%20313.8c-.1%202.8-2.5%205.2-5.4%205.2h-38.2c-2.9%200-5.3-2.3-5.4-5.2L464.8%20286c-.2-5.8%204.3-10.4%2010-10.4zm26.1%20448.3c-20.2%200-36.5-16.3-36.5-36.5s16.3-36.5%2036.5-36.5%2036.5%2016.3%2036.5%2036.5-16.4%2036.5-36.5%2036.5z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23020202%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.5c-185.4%2042-320.4%2088.4-443.2%20127.3%200%20129.3.2%20231.7.2%20339.6%200%20304.1%20248.2%20471.4%20443%20523.6%20194.7-52.2%20443-219.5%20443-523.6%200-107.9.2-210.3.2-339.6C821.3%2092.9%20686.2%2046.5%20500.9%204.5zm-26.1%20271.1h52.1c5.8%200%2010.3%204.7%2010.1%2010.4l-11.6%20313.8c-.1%202.8-2.5%205.2-5.4%205.2h-38.2c-2.9%200-5.3-2.3-5.4-5.2L464.8%20286c-.2-5.8%204.3-10.4%2010-10.4zm26.1%20448.3c-20.2%200-36.5-16.3-36.5-36.5s16.3-36.5%2036.5-36.5%2036.5%2016.3%2036.5%2036.5-16.4%2036.5-36.5%2036.5z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23020202%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm-1.172-6.242l5.809-5.808.848.849-5.95%205.95a1%201%200%2001-1.414%200L7%2012.426l.849-.849%202.98%202.98z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm-1.172-6.242l5.809-5.808.848.849-5.95%205.95a1%201%200%2001-1.414%200L7%2012.426l.849-.849%202.98%202.98z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success-no-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-waiting {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.75%2011.38V6h-1.5v6l4.243%204.243%201.06-1.06-3.803-3.804zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.75%2011.38V6h-1.5v6l4.243%204.243%201.06-1.06-3.803-3.804zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-waiting-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.6%2011.503l3.891%203.891-.848.849L11.4%2012V6h1.2v5.503zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.6%2011.503l3.891%203.891-.848.849L11.4%2012V6h1.2v5.503zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-warn {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.763-15.864l.11%207.596h1.305l.11-7.596h-1.525zm.759%2010.967c.512%200%20.902-.383.902-.882%200-.5-.39-.882-.902-.882a.878.878%200%2000-.896.882c0%20.499.396.882.896.882z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.763-15.864l.11%207.596h1.305l.11-7.596h-1.525zm.759%2010.967c.512%200%20.902-.383.902-.882%200-.5-.39-.882-.902-.882a.878.878%200%2000-.896.882c0%20.499.396.882.896.882z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-info-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zM11.4%2010h1.2v7h-1.2v-7zm.6-1a1%201%200%20110-2%201%201%200%20010%202z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zM11.4%2010h1.2v7h-1.2v-7zm.6-1a1%201%200%20110-2%201%201%200%20010%202z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-cancel {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%20fill-rule%3D%22nonzero%22%2F%3E%3Cpath%20d%3D%22M12.849%2012l3.11%203.111-.848.849L12%2012.849l-3.111%203.11-.849-.848L11.151%2012l-3.11-3.111.848-.849L12%2011.151l3.111-3.11.849.848L12.849%2012z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%20fill-rule%3D%22nonzero%22%2F%3E%3Cpath%20d%3D%22M12.849%2012l3.11%203.111-.848.849L12%2012.849l-3.111%203.11-.849-.848L11.151%2012l-3.11-3.111.848-.849L12%2011.151l3.111-3.11.849.848L12.849%2012z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-search {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M16.31%2015.561l4.114%204.115-.848.848-4.123-4.123a7%207%200%2011.857-.84zM16.8%2011a5.8%205.8%200%2010-11.6%200%205.8%205.8%200%200011.6%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M16.31%2015.561l4.114%204.115-.848.848-4.123-4.123a7%207%200%2011.857-.84zM16.8%2011a5.8%205.8%200%2010-11.6%200%205.8%205.8%200%200011.6%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-clear {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M13.06%2012l3.006-3.005-1.06-1.06L12%2010.938%208.995%207.934l-1.06%201.06L10.938%2012l-3.005%203.005%201.06%201.06L12%2013.062l3.005%203.005%201.06-1.06L13.062%2012zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M13.06%2012l3.006-3.005-1.06-1.06L12%2010.938%208.995%207.934l-1.06%201.06L10.938%2012l-3.005%203.005%201.06%201.06L12%2013.062l3.005%203.005%201.06-1.06L13.062%2012zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-back {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm1.999-6.563L10.68%2012%2014%208.562%2012.953%207.5%209.29%2011.277a1.045%201.045%200%20000%201.446l3.663%203.777L14%2015.437z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm1.999-6.563L10.68%2012%2014%208.562%2012.953%207.5%209.29%2011.277a1.045%201.045%200%20000%201.446l3.663%203.777L14%2015.437z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-delete {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M6.774%206.4l.812%2013.648a.8.8%200%2000.798.752h7.232a.8.8%200%2000.798-.752L17.226%206.4H6.774zm11.655%200l-.817%2013.719A2%202%200%200115.616%2022H8.384a2%202%200%2001-1.996-1.881L5.571%206.4H3.5v-.7a.5.5%200%2001.5-.5h16a.5.5%200%2001.5.5v.7h-2.071zM14%203a.5.5%200%2001.5.5v.7h-5v-.7A.5.5%200%200110%203h4zM9.5%209h1.2l.5%209H10l-.5-9zm3.8%200h1.2l-.5%209h-1.2l.5-9z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M6.774%206.4l.812%2013.648a.8.8%200%2000.798.752h7.232a.8.8%200%2000.798-.752L17.226%206.4H6.774zm11.655%200l-.817%2013.719A2%202%200%200115.616%2022H8.384a2%202%200%2001-1.996-1.881L5.571%206.4H3.5v-.7a.5.5%200%2001.5-.5h16a.5.5%200%2001.5.5v.7h-2.071zM14%203a.5.5%200%2001.5.5v.7h-5v-.7A.5.5%200%200110%203h4zM9.5%209h1.2l.5%209H10l-.5-9zm3.8%200h1.2l-.5%209h-1.2l.5-9z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success-no-circle-thin {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.864%2016.617l-5.303-5.303-1.061%201.06%205.657%205.657a1%201%200%20001.414%200L21.238%206.364l-1.06-1.06L8.864%2016.616z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.864%2016.617l-5.303-5.303-1.061%201.06%205.657%205.657a1%201%200%20001.414%200L21.238%206.364l-1.06-1.06L8.864%2016.616z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-arrow {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-arrow-bold {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20height%3D%2224%22%20width%3D%2212%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10.157%2012.711L4.5%2018.368l-1.414-1.414%204.95-4.95-4.95-4.95L4.5%205.64l5.657%205.657a1%201%200%20010%201.414z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20height%3D%2224%22%20width%3D%2212%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10.157%2012.711L4.5%2018.368l-1.414-1.414%204.95-4.95-4.95-4.95L4.5%205.64l5.657%205.657a1%201%200%20010%201.414z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-back-arrow {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M3.343%2012l7.071%207.071L9%2020.485l-7.778-7.778a1%201%200%20010-1.414L9%203.515l1.414%201.414L3.344%2012z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M3.343%2012l7.071%207.071L9%2020.485l-7.778-7.778a1%201%200%20010-1.414L9%203.515l1.414%201.414L3.344%2012z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-back-arrow-thin {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-close {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2010.586l5.657-5.657%201.414%201.414L13.414%2012l5.657%205.657-1.414%201.414L12%2013.414l-5.657%205.657-1.414-1.414L10.586%2012%204.929%206.343%206.343%204.93%2012%2010.586z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2010.586l5.657-5.657%201.414%201.414L13.414%2012l5.657%205.657-1.414%201.414L12%2013.414l-5.657%205.657-1.414-1.414L10.586%2012%204.929%206.343%206.343%204.93%2012%2010.586z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-close-thin {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-back-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm1.999-5.363L12.953%2016.5%209.29%2012.723a1.045%201.045%200%20010-1.446L12.953%207.5%2014%208.563%2010.68%2012%2014%2015.438z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm1.999-5.363L12.953%2016.5%209.29%2012.723a1.045%201.045%200%20010-1.446L12.953%207.5%2014%208.563%2010.68%2012%2014%2015.438z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success {\n  color: var(--weui-BRAND)\n}\n\n.weui-icon-waiting {\n  color: var(--weui-BLUE)\n}\n\n.weui-icon-warn {\n  color: var(--weui-RED)\n}\n\n.weui-icon-info {\n  color: var(--weui-BLUE)\n}\n\n.weui-icon-success-circle,\n.weui-icon-success-no-circle,\n.weui-icon-success-no-circle-thin {\n  color: var(--weui-BRAND)\n}\n\n.weui-icon-waiting-circle {\n  color: var(--weui-BLUE)\n}\n\n.weui-icon-circle {\n  color: var(--weui-FG-2)\n}\n\n.weui-icon-download {\n  color: var(--weui-BRAND)\n}\n\n.weui-icon-info-circle {\n  color: var(--weui-FG-2)\n}\n\n.weui-icon-safe-success {\n  color: var(--weui-BRAND)\n}\n\n.weui-icon-safe-warn {\n  color: var(--weui-YELLOW)\n}\n\n.weui-icon-cancel {\n  color: var(--weui-RED)\n}\n\n.weui-icon-search {\n  color: var(--weui-FG-1)\n}\n\n.weui-icon-clear {\n  color: var(--weui-FG-2)\n}\n\n.weui-icon-clear:active {\n  color: var(--weui-FG-1)\n}\n\n.weui-icon-delete.weui-icon_gallery-delete {\n  color: var(--weui-WHITE)\n}\n\n.weui-icon-arrow,\n.weui-icon-arrow-bold,\n.weui-icon-back-arrow,\n.weui-icon-back-arrow-thin {\n  width: 12px\n}\n\n.weui-icon-arrow,\n.weui-icon-arrow-bold {\n  color: var(--weui-FG-2)\n}\n\n.weui-icon-back,\n.weui-icon-back-arrow,\n.weui-icon-back-arrow-thin,\n.weui-icon-back-circle {\n  color: var(--weui-FG-0)\n}\n\n.weui-icon_msg {\n  width: 64px;\n  height: 64px\n}\n\n.weui-icon_msg.weui-icon-warn {\n  color: var(--weui-RED)\n}\n\n.weui-icon_msg-primary {\n  width: 64px;\n  height: 64px\n}\n\n.weui-icon_msg-primary.weui-icon-warn {\n  color: var(--weui-YELLOW)\n}\n\n.weui-link {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-link,\n.weui-link:visited {\n  color: var(--weui-LINK)\n}\n\n.weui-btn {\n  position: relative;\n  display: block;\n  width: 184px;\n  margin-left: auto;\n  margin-right: auto;\n  padding: 8px 24px;\n  box-sizing: border-box;\n  font-weight: 700;\n  font-size: 17px;\n  text-align: center;\n  text-decoration: none;\n  color: #fff;\n  line-height: 1.41176471;\n  border-radius: 4px;\n  overflow: hidden;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-btn_block {\n  width: auto\n}\n\n.weui-btn_inline {\n  display: inline-block\n}\n\n.weui-btn_default {\n  background-color: var(--weui-BTN-DEFAULT-BG)\n}\n\n.weui-btn_default,\n.weui-btn_default:not(.weui-btn_disabled):visited {\n  color: var(--weui-BTN-DEFAULT-COLOR)\n}\n\n.weui-btn_default:not(.weui-btn_disabled):active {\n  background-color: var(--weui-BTN-DEFAULT-ACTIVE-BG)\n}\n\n.weui-btn_primary {\n  background-color: var(--weui-BRAND)\n}\n\n.weui-btn_primary:not(.weui-btn_disabled):visited {\n  color: #fff\n}\n\n.weui-btn_primary:not(.weui-btn_disabled):active {\n  background-color: var(--weui-TAG-TEXT-GREEN)\n}\n\n.weui-btn_warn {\n  background-color: var(--weui-BTN-DEFAULT-BG)\n}\n\n.weui-btn_warn,\n.weui-btn_warn:not(.weui-btn_disabled):visited {\n  color: var(--weui-RED)\n}\n\n.weui-btn_warn:not(.weui-btn_disabled):active {\n  background-color: var(--weui-BTN-DEFAULT-ACTIVE-BG)\n}\n\n.weui-btn_disabled {\n  color: var(--weui-BTN-DISABLED-FONT-COLOR);\n  background-color: var(--weui-BTN-DEFAULT-BG)\n}\n\n.weui-btn_loading .weui-loading {\n  margin: -.2em .34em 0 0\n}\n\n.weui-btn_loading.weui-btn_primary {\n  background-color: var(--weui-TAG-TEXT-GREEN);\n  color: var(--weui-WHITE)\n}\n\n.weui-btn_loading.weui-btn_default,\n.weui-btn_loading.weui-btn_warn {\n  background-color: var(--weui-BTN-DEFAULT-ACTIVE-BG)\n}\n\n.weui-btn_cell {\n  position: relative;\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n  box-sizing: border-box;\n  font-size: 17px;\n  text-align: center;\n  text-decoration: none;\n  color: #fff;\n  line-height: 1.41176471;\n  padding: 16px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  overflow: hidden;\n  background-color: var(--weui-BG-5)\n}\n\n.weui-btn_cell+.weui-btn_cell {\n  margin-top: 16px\n}\n\n.weui-btn_cell:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-btn_cell__icon {\n  display: inline-block;\n  vertical-align: middle;\n  width: 24px;\n  height: 24px;\n  margin: -.2em .34em 0 0\n}\n\n.weui-btn_cell-default {\n  color: var(--weui-FG-0)\n}\n\n.weui-btn_cell-primary {\n  color: var(--weui-LINK)\n}\n\n.weui-btn_cell-warn {\n  color: var(--weui-RED)\n}\n\nbutton.weui-btn,\ninput.weui-btn {\n  border-width: 0;\n  outline: 0;\n  -webkit-appearance: none\n}\n\nbutton.weui-btn:focus,\ninput.weui-btn:focus {\n  outline: 0\n}\n\nbutton.weui-btn_inline,\nbutton.weui-btn_mini,\ninput.weui-btn_inline,\ninput.weui-btn_mini {\n  width: auto\n}\n\n.weui-btn_mini {\n  display: inline-block;\n  width: auto;\n  padding: 0 .75em;\n  line-height: 2;\n  font-size: 16px\n}\n\n.weui-btn:not(.weui-btn_mini)+.weui-btn:not(.weui-btn_mini) {\n  margin-top: 16px\n}\n\n.weui-btn.weui-btn_inline+.weui-btn.weui-btn_inline {\n  margin-top: auto;\n  margin-left: 16px\n}\n\n.weui-btn-area {\n  margin: 48px 16px 8px\n}\n\n.weui-btn-area_inline {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex\n}\n\n.weui-btn-area_inline .weui-btn {\n  margin-top: auto;\n  margin-right: 16px;\n  width: 100%;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-btn-area_inline .weui-btn:last-child {\n  margin-right: 0\n}\n\n.weui-btn_reset {\n  background: transparent;\n  border: 0;\n  padding: 0;\n  outline: 0\n}\n\n.weui-btn_icon {\n  font-size: 0\n}\n\n.weui-btn_icon:active [class*=weui-icon-] {\n  color: var(--weui-FG-1)\n}\n\n.weui-cells {\n  margin-top: 8px;\n  background-color: var(--weui-BG-2);\n  line-height: 1.41176471;\n  font-size: 17px;\n  overflow: hidden;\n  position: relative\n}\n\n.weui-cells:before {\n  top: 0;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-cells:after,\n.weui-cells:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 1px;\n  color: var(--weui-FG-3);\n  z-index: 2\n}\n\n.weui-cells:after {\n  bottom: 0;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-cells__title {\n  margin-top: 16px;\n  margin-bottom: 3px;\n  padding-left: 16px;\n  padding-right: 16px;\n  color: var(--weui-FG-1);\n  font-size: 14px;\n  line-height: 1.4\n}\n\n.weui-cells__title+.weui-cells {\n  margin-top: 0\n}\n\n.weui-cells__tips {\n  margin-top: 8px;\n  color: var(--weui-FG-1);\n  padding-left: 16px;\n  padding-right: 16px;\n  font-size: 14px;\n  line-height: 1.4\n}\n\n.weui-cells__tips a,\n.weui-cells__tips navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-cells__tips navigator {\n  display: inline\n}\n\n.weui-cell {\n  padding: 16px;\n  position: relative;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-cell:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  left: 16px;\n  z-index: 2\n}\n\n.weui-cell:first-child:before {\n  display: none\n}\n\n.weui-cell_active:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-cell_primary {\n  -webkit-box-align: start;\n  -webkit-align-items: flex-start;\n  align-items: flex-start\n}\n\n.weui-cell__bd {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-cell__ft {\n  text-align: right;\n  color: var(--weui-FG-1)\n}\n\n.weui-cell_swiped {\n  display: block;\n  padding: 0\n}\n\n.weui-cell_swiped>.weui-cell__bd {\n  position: relative;\n  z-index: 1;\n  background-color: var(--weui-BG-2)\n}\n\n.weui-cell_swiped>.weui-cell__ft {\n  position: absolute;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  color: #fff\n}\n\n.weui-swiped-btn {\n  display: block;\n  padding: 16px 1em;\n  line-height: 1.41176471;\n  color: inherit\n}\n\n.weui-swiped-btn_default {\n  background-color: var(--weui-BG-0)\n}\n\n.weui-swiped-btn_warn {\n  background-color: var(--weui-RED)\n}\n\n.weui-cell_access {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  color: inherit\n}\n\n.weui-cell_access:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-cell_access .weui-cell__ft {\n  padding-right: 22px;\n  position: relative\n}\n\n.weui-cell_access .weui-cell__ft:after {\n  content: \" \";\n  width: 12px;\n  height: 24px;\n  -webkit-mask-position: 0 0;\n  mask-position: 0 0;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  background-color: currentColor;\n  color: var(--weui-FG-2);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  position: absolute;\n  top: 50%;\n  right: 0;\n  margin-top: -12px\n}\n\n.weui-cell_link {\n  color: var(--weui-LINK);\n  font-size: 17px\n}\n\n.weui-cell_link:first-child:before {\n  display: block\n}\n\n.weui-check__label {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-check__label:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-check {\n  position: absolute;\n  left: -9999px\n}\n\n.weui-cells_radio .weui-cell__ft {\n  padding-left: 16px;\n  font-size: 0\n}\n\n.weui-cells_radio .weui-check+.weui-icon-checked {\n  min-width: 16px;\n  color: transparent\n}\n\n.weui-cells_radio .weui-check:checked+.weui-icon-checked,\n.weui-cells_radio .weui-check[aria-checked=true]+.weui-icon-checked {\n  color: var(--weui-BRAND);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-cells_checkbox .weui-check__label:before {\n  left: 55px\n}\n\n.weui-cells_checkbox .weui-cell__hd {\n  padding-right: 16px;\n  font-size: 0\n}\n\n.weui-cells_checkbox .weui-icon-checked {\n  color: var(--weui-FG-2);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-cells_checkbox .weui-check:checked+.weui-icon-checked,\n.weui-cells_checkbox .weui-check[aria-checked=true]+.weui-icon-checked {\n  color: var(--weui-BRAND);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-label {\n  display: block;\n  width: 105px;\n  word-wrap: break-word;\n  word-break: break-all\n}\n\n.weui-input {\n  width: 100%;\n  border: 0;\n  outline: 0;\n  -webkit-appearance: none;\n  background-color: transparent;\n  font-size: inherit;\n  color: inherit;\n  height: 1.41176471em;\n  line-height: 1.41176471\n}\n\n.weui-input::-webkit-inner-spin-button,\n.weui-input::-webkit-outer-spin-button {\n  -webkit-appearance: none;\n  margin: 0\n}\n\n.weui-input:focus:not(:placeholder-shown)+.weui-btn_input-clear {\n  display: inline\n}\n\n.weui-input::-webkit-input-placeholder,\n.weui-input__placeholder {\n  color: var(--weui-FG-2)\n}\n\n.weui-input::placeholder,\n.weui-input__placeholder {\n  color: var(--weui-FG-2)\n}\n\n.weui-textarea {\n  display: block;\n  border: 0;\n  resize: none;\n  background: transparent;\n  width: 100%;\n  color: inherit;\n  font-size: 1em;\n  line-height: inherit;\n  outline: 0\n}\n\n.weui-textarea-counter {\n  color: var(--weui-FG-2);\n  text-align: right;\n  font-size: 14px\n}\n\n.weui-cell_warn .weui-textarea-counter {\n  color: var(--weui-RED)\n}\n\n.weui-cells_form .weui-cell_disabled:active,\n.weui-cells_form .weui-cell_readonly:active,\n.weui-cells_form .weui-cell_switch:active,\n.weui-cells_form .weui-cell_vcode:active {\n  background-color: transparent\n}\n\n.weui-cells_form .weui-cell__ft {\n  font-size: 0\n}\n\n.weui-cells_form .weui-icon-warn {\n  display: none\n}\n\n.weui-cells_form input,\n.weui-cells_form label[for],\n.weui-cells_form textarea {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-cell_warn {\n  color: var(--weui-RED)\n}\n\n.weui-cell_warn .weui-icon-warn {\n  display: inline-block\n}\n\n.weui-cell_disabled .weui-input:disabled,\n.weui-cell_disabled .weui-textarea:disabled,\n.weui-cell_readonly .weui-input:disabled,\n.weui-cell_readonly .weui-textarea:disabled {\n  opacity: 1;\n  -webkit-text-fill-color: var(--weui-FG-1)\n}\n\n.weui-cell_disabled .weui-input[disabled],\n.weui-cell_disabled .weui-input[readonly],\n.weui-cell_disabled .weui-textarea[disabled],\n.weui-cell_disabled .weui-textarea[readonly],\n.weui-cell_readonly .weui-input[disabled],\n.weui-cell_readonly .weui-input[readonly],\n.weui-cell_readonly .weui-textarea[disabled],\n.weui-cell_readonly .weui-textarea[readonly] {\n  color: var(--weui-FG-1)\n}\n\n.weui-btn_input-clear {\n  display: none;\n  padding-left: 8px\n}\n\n.weui-btn_input-clear [class*=weui-icon-] {\n  width: 18px\n}\n\n.weui-form-preview {\n  position: relative;\n  background-color: var(--weui-BG-2)\n}\n\n.weui-form-preview:before {\n  top: 0;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-form-preview:after,\n.weui-form-preview:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 1px;\n  color: var(--weui-FG-3)\n}\n\n.weui-form-preview:after {\n  bottom: 0;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-form-preview__hd {\n  position: relative;\n  padding: 16px;\n  text-align: right;\n  line-height: 2.5em\n}\n\n.weui-form-preview__hd:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  left: 16px\n}\n\n.weui-form-preview__hd .weui-form-preview__value {\n  font-style: normal;\n  font-size: 1.6em\n}\n\n.weui-form-preview__bd {\n  padding: 16px;\n  font-size: .9em;\n  text-align: right;\n  color: var(--weui-FG-1);\n  line-height: 2\n}\n\n.weui-form-preview__ft {\n  position: relative;\n  line-height: 50px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex\n}\n\n.weui-form-preview__ft:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-DIALOG-LINE-COLOR);\n  color: var(--weui-DIALOG-LINE-COLOR);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-form-preview__item {\n  overflow: hidden\n}\n\n.weui-form-preview__label {\n  float: left;\n  margin-right: 1em;\n  min-width: 4em;\n  color: var(--weui-FG-1);\n  text-align: justify;\n  text-align-last: justify\n}\n\n.weui-form-preview__value {\n  display: block;\n  overflow: hidden;\n  word-break: normal;\n  word-wrap: break-word;\n  color: var(--weui-FG-0)\n}\n\n.weui-form-preview__btn {\n  position: relative;\n  display: block;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  color: var(--weui-LINK);\n  text-align: center;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\nbutton.weui-form-preview__btn {\n  background-color: transparent;\n  border: 0;\n  outline: 0;\n  line-height: inherit;\n  font-size: inherit\n}\n\n.weui-form-preview__btn:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-form-preview__btn:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-DIALOG-LINE-COLOR);\n  color: var(--weui-DIALOG-LINE-COLOR);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-form-preview__btn:first-child:after {\n  display: none\n}\n\n.weui-form-preview__btn_default {\n  color: var(--weui-FG-HALF)\n}\n\n.weui-form-preview__btn_primary {\n  color: var(--weui-LINK)\n}\n\n.weui-cell_select {\n  padding: 0\n}\n\n.weui-cell_select .weui-select {\n  padding-right: 30px\n}\n\n.weui-cell_select .weui-cell__bd:after {\n  content: \" \";\n  width: 12px;\n  height: 24px;\n  -webkit-mask-position: 0 0;\n  mask-position: 0 0;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  background-color: currentColor;\n  color: var(--weui-FG-2);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  position: absolute;\n  top: 50%;\n  right: 16px;\n  margin-top: -12px\n}\n\n.weui-select {\n  -webkit-appearance: none;\n  border: 0;\n  outline: 0;\n  background-color: transparent;\n  width: 100%;\n  font-size: inherit;\n  height: 56px;\n  line-height: 56px;\n  position: relative;\n  z-index: 1;\n  padding-left: 16px;\n  color: var(--weui-FG-0)\n}\n\n.weui-cell_select-before {\n  padding-right: 16px\n}\n\n.weui-cell_select-before .weui-select {\n  width: 105px;\n  box-sizing: border-box\n}\n\n.weui-cell_select-before .weui-cell__hd {\n  position: relative\n}\n\n.weui-cell_select-before .weui-cell__hd:after {\n  content: \" \";\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-right: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 100% 0;\n  transform-origin: 100% 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-cell_select-before .weui-cell__hd:before {\n  content: \" \";\n  width: 12px;\n  height: 24px;\n  -webkit-mask-position: 0 0;\n  mask-position: 0 0;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  background-color: currentColor;\n  color: var(--weui-FG-2);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  position: absolute;\n  top: 50%;\n  right: 16px;\n  margin-top: -12px\n}\n\n.weui-cell_select-before .weui-cell__bd {\n  padding-left: 16px\n}\n\n.weui-cell_select-before .weui-cell__bd:after {\n  display: none\n}\n\n.weui-cell_select-before.weui-cell_access .weui-cell__hd {\n  line-height: 56px;\n  padding-left: 32px\n}\n\n.weui-cell_select-after {\n  padding-left: 16px\n}\n\n.weui-cell_select-after .weui-select {\n  padding-left: 0\n}\n\n.weui-cell_select-after.weui-cell_access .weui-cell__bd {\n  line-height: 56px\n}\n\n.weui-cell_vcode {\n  padding-top: 0;\n  padding-right: 0;\n  padding-bottom: 0\n}\n\n.weui-vcode-btn,\n.weui-vcode-img {\n  margin-left: 5px;\n  height: 56px;\n  vertical-align: middle\n}\n\n.weui-vcode-btn {\n  display: inline-block;\n  padding: 0 .6em 0 .7em;\n  line-height: 56px;\n  font-size: 17px;\n  color: var(--weui-LINK);\n  position: relative\n}\n\n.weui-vcode-btn:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\nbutton.weui-vcode-btn {\n  background-color: transparent;\n  border: 0;\n  outline: 0\n}\n\n.weui-vcode-btn:active {\n  color: #767676\n}\n\n.weui-gallery {\n  display: none;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: #000;\n  z-index: 1000\n}\n\n.weui-gallery__img,\n.weui-gallery__opr {\n  position: absolute;\n  left: 0;\n  left: constant(safe-area-inset-left);\n  left: env(safe-area-inset-left);\n  right: 0;\n  right: constant(safe-area-inset-right);\n  right: env(safe-area-inset-right)\n}\n\n.weui-gallery__img {\n  top: 0;\n  top: constant(safe-area-inset-top);\n  top: env(safe-area-inset-top);\n  bottom: 60px;\n  bottom: calc(60px + constant(safe-area-inset-bottom));\n  bottom: calc(60px + env(safe-area-inset-bottom));\n  background: 50% no-repeat;\n  background-size: contain\n}\n\n.weui-gallery__opr {\n  position: absolute;\n  bottom: 0;\n  padding-bottom: 0;\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom);\n  background-color: #0d0d0d;\n  color: var(--weui-WHITE);\n  line-height: 60px;\n  text-align: center\n}\n\n.weui-gallery__del {\n  display: block\n}\n\n.weui-cell_switch {\n  padding-top: 12px;\n  padding-bottom: 12px\n}\n\n.weui-switch {\n  -webkit-appearance: none;\n  appearance: none\n}\n\n.weui-switch,\n.weui-switch-cp__box {\n  position: relative;\n  width: 52px;\n  height: 32px;\n  border: 2px solid var(--weui-FG-3);\n  outline: 0;\n  border-radius: 16px;\n  box-sizing: border-box;\n  -webkit-transition: background-color .1s, border .1s;\n  transition: background-color .1s, border .1s\n}\n\n.weui-switch-cp__box:before,\n.weui-switch:before {\n  content: \" \";\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  border-radius: 15px;\n  background-color: var(--weui-BG-3);\n  -webkit-transition: -webkit-transform .35s cubic-bezier(.45, 1, .4, 1);\n  transition: -webkit-transform .35s cubic-bezier(.45, 1, .4, 1);\n  transition: transform .35s cubic-bezier(.45, 1, .4, 1);\n  transition: transform .35s cubic-bezier(.45, 1, .4, 1), -webkit-transform .35s cubic-bezier(.45, 1, .4, 1)\n}\n\n.weui-switch-cp__box:after,\n.weui-switch:after {\n  content: \" \";\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 28px;\n  height: 28px;\n  border-radius: 15px;\n  background-color: #fff;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, .4);\n  -webkit-transition: -webkit-transform .35s cubic-bezier(.4, .4, .25, 1.35);\n  transition: -webkit-transform .35s cubic-bezier(.4, .4, .25, 1.35);\n  transition: transform .35s cubic-bezier(.4, .4, .25, 1.35);\n  transition: transform .35s cubic-bezier(.4, .4, .25, 1.35), -webkit-transform .35s cubic-bezier(.4, .4, .25, 1.35)\n}\n\n.weui-switch-cp__input:checked+.weui-switch-cp__box,\n.weui-switch-cp__input[aria-checked=true]+.weui-switch-cp__box,\n.weui-switch:checked {\n  border-color: var(--weui-BRAND);\n  background-color: var(--weui-BRAND)\n}\n\n.weui-switch-cp__input:checked+.weui-switch-cp__box:before,\n.weui-switch-cp__input[aria-checked=true]+.weui-switch-cp__box:before,\n.weui-switch:checked:before {\n  -webkit-transform: scale(0);\n  transform: scale(0)\n}\n\n.weui-switch-cp__input:checked+.weui-switch-cp__box:after,\n.weui-switch-cp__input[aria-checked=true]+.weui-switch-cp__box:after,\n.weui-switch:checked:after {\n  -webkit-transform: translateX(20px);\n  transform: translateX(20px)\n}\n\n.weui-switch-cp__input {\n  position: absolute;\n  left: -9999px\n}\n\n.weui-switch-cp__box {\n  display: block\n}\n\n.weui-uploader {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-uploader__hd {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  padding-bottom: 16px;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-uploader__title {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-uploader__info {\n  color: var(--weui-FG-2)\n}\n\n.weui-uploader__bd {\n  margin-bottom: -8px;\n  margin-right: -8px;\n  overflow: hidden\n}\n\n.weui-uploader__files {\n  list-style: none\n}\n\n.weui-uploader__file {\n  float: left;\n  margin-right: 8px;\n  margin-bottom: 8px;\n  width: 96px;\n  height: 96px;\n  background: no-repeat 50%;\n  background-size: cover\n}\n\n.weui-uploader__file_status {\n  position: relative\n}\n\n.weui-uploader__file_status:before {\n  content: \" \";\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: rgba(0, 0, 0, .5)\n}\n\n.weui-uploader__file_status .weui-uploader__file-content {\n  display: block\n}\n\n.weui-uploader__file-content {\n  display: none;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  color: var(--weui-WHITE)\n}\n\n.weui-uploader__file-content .weui-icon-warn {\n  display: inline-block\n}\n\n.weui-uploader__input-box {\n  float: left;\n  position: relative;\n  margin-right: 8px;\n  margin-bottom: 8px;\n  width: 96px;\n  height: 96px;\n  box-sizing: border-box;\n  background-color: #ededed\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-uploader__input-box {\n    background-color: #2e2e2e\n  }\n}\n\n.weui-uploader__input-box:after,\n.weui-uploader__input-box:before {\n  content: \" \";\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  background-color: #a3a3a3\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-uploader__input-box:after,\n  .weui-uploader__input-box:before {\n    background-color: #6d6d6d\n  }\n}\n\n.weui-uploader__input-box:before {\n  width: 2px;\n  height: 32px\n}\n\n.weui-uploader__input-box:after {\n  width: 32px;\n  height: 2px\n}\n\n.weui-uploader__input-box:active:after,\n.weui-uploader__input-box:active:before {\n  opacity: .7\n}\n\n.weui-uploader__input {\n  position: absolute;\n  z-index: 1;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-msg {\n  padding-top: 48px;\n  padding: calc(48px + constant(safe-area-inset-top)) constant(safe-area-inset-right) constant(safe-area-inset-bottom) constant(safe-area-inset-left);\n  padding: calc(48px + env(safe-area-inset-top)) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);\n  text-align: center;\n  line-height: 1.4;\n  min-height: 100%;\n  box-sizing: border-box;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  background-color: var(--weui-BG-2)\n}\n\n.weui-msg a:not(.weui-btn) {\n  color: var(--weui-LINK);\n  display: inline-block;\n  vertical-align: baseline\n}\n\n.weui-msg__icon-area {\n  margin-bottom: 32px\n}\n\n.weui-msg__text-area {\n  margin-bottom: 32px;\n  padding: 0 32px;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  line-height: 1.6\n}\n\n.weui-msg__text-area:first-child {\n  padding-top: 96px\n}\n\n.weui-msg__title {\n  font-weight: 700;\n  font-size: 22px\n}\n\n.weui-msg__desc,\n.weui-msg__title {\n  margin-bottom: 16px;\n  color: var(--weui-FG-0);\n  word-wrap: break-word;\n  word-break: break-all\n}\n\n.weui-msg__desc {\n  font-size: 17px\n}\n\n.weui-msg__desc-primary {\n  font-size: 14px;\n  color: var(--weui-FG-1);\n  word-wrap: break-word;\n  word-break: break-all;\n  margin-bottom: 16px\n}\n\n.weui-msg__opr-area {\n  margin-bottom: 16px\n}\n\n.weui-msg__opr-area .weui-btn-area {\n  margin: 0\n}\n\n.weui-msg__opr-area .weui-btn+.weui-btn {\n  margin-bottom: 16px\n}\n\n.weui-msg__opr-area:last-child {\n  margin-bottom: 96px\n}\n\n.weui-msg__opr-area+.weui-msg__extra-area {\n  margin-top: 48px\n}\n\n.weui-msg__tips-area {\n  margin-bottom: 16px;\n  padding: 0 40px\n}\n\n.weui-msg__opr-area+.weui-msg__tips-area {\n  margin-bottom: 48px\n}\n\n.weui-msg__tips-area:last-child {\n  margin-bottom: 64px\n}\n\n.weui-msg__extra-area,\n.weui-msg__tips {\n  font-size: 12px;\n  color: var(--weui-FG-1)\n}\n\n.weui-msg__extra-area {\n  margin-bottom: 24px\n}\n\n.weui-msg__extra-area a,\n.weui-msg__extra-area navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-msg__extra-area navigator {\n  display: inline\n}\n\n.weui-cells__group_form:first-child .weui-cells__title {\n  margin-top: 0\n}\n\n.weui-cells__group_form .weui-cells__title {\n  margin-top: 24px;\n  margin-bottom: 8px;\n  padding: 0 32px\n}\n\n.weui-cells__group_form .weui-cell:before,\n.weui-cells__group_form .weui-cells:before {\n  left: 32px;\n  right: 32px\n}\n\n.weui-cells__group_form .weui-cells_checkbox .weui-check__label:before {\n  left: 72px\n}\n\n.weui-cells__group_form .weui-cells:after {\n  left: 32px;\n  right: 32px\n}\n\n.weui-cells__group_form .weui-cell {\n  padding: 16px 32px\n}\n\n.weui-cells__group_form .weui-cell:not(.weui-cell_link) {\n  color: var(--weui-FG-0)\n}\n\n.weui-cells__group_form .weui-cell__hd {\n  padding-right: 16px\n}\n\n.weui-cells__group_form .weui-cell__ft {\n  padding-left: 16px\n}\n\n.weui-cells__group_form .weui-cell_warn input {\n  color: var(--weui-RED)\n}\n\n.weui-cells__group_form .weui-label {\n  max-width: 5em;\n  margin-right: 8px\n}\n\n.weui-cells__group_form .weui-cells__tips {\n  margin-top: 8px;\n  padding: 0 32px;\n  color: rgba(0, 0, 0, .3)\n}\n\n.weui-cells__group_form .weui-cells__tips a {\n  font-weight: 700\n}\n\n.weui-cells__group_form .weui-cell_vcode {\n  padding: 12px 32px\n}\n\n.weui-cells__group_form .weui-vcode-btn {\n  font-size: 16px;\n  padding: 0 12px;\n  margin-left: 0;\n  height: auto;\n  width: auto;\n  line-height: 2em;\n  color: var(--weui-BTN-DEFAULT-COLOR);\n  background-color: var(--weui-BTN-DEFAULT-BG)\n}\n\n.weui-cells__group_form .weui-vcode-btn:before {\n  display: none\n}\n\n.weui-cells__group_form .weui-cell_select {\n  padding: 0\n}\n\n.weui-cells__group_form .weui-cell_select .weui-select {\n  padding: 0 32px\n}\n\n.weui-cells__group_form .weui-cell_select .weui-cell__bd:after {\n  right: 32px\n}\n\n.weui-cells__group_form .weui-cell_select-before .weui-label {\n  margin-right: 24px\n}\n\n.weui-cells__group_form .weui-cell_select-before .weui-select {\n  padding-right: 24px;\n  box-sizing: initial\n}\n\n.weui-cells__group_form .weui-cell_select-after {\n  padding-left: 32px\n}\n\n.weui-cells__group_form .weui-cell_select-after .weui-select {\n  padding-left: 0\n}\n\n.weui-cells__group_form .weui-cell_switch {\n  padding: 12px 32px\n}\n\n.weui-form {\n  padding: 56px 0 0;\n  padding: calc(56px + constant(safe-area-inset-top)) constant(safe-area-inset-right) constant(safe-area-inset-bottom) constant(safe-area-inset-left);\n  padding: calc(56px + env(safe-area-inset-top)) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  line-height: 1.4;\n  min-height: 100%;\n  box-sizing: border-box;\n  background-color: var(--weui-BG-2)\n}\n\n.weui-form .weui-footer,\n.weui-form .weui-footer__link {\n  font-size: 14px\n}\n\n.weui-form .weui-agree {\n  padding: 0\n}\n\n.weui-form__text-area {\n  padding: 0 32px;\n  color: var(--weui-FG-0);\n  text-align: center\n}\n\n.weui-form__control-area {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  margin: 48px 0\n}\n\n.weui-form__tips-area {\n  overflow: hidden\n}\n\n.weui-form__extra-area,\n.weui-form__tips-area {\n  margin-bottom: 24px;\n  text-align: center\n}\n\n.weui-form__opr-area {\n  margin-bottom: 64px\n}\n\n.weui-form__opr-area:last-child {\n  margin-bottom: 96px\n}\n\n.weui-form__title {\n  font-size: 22px;\n  font-weight: 700;\n  line-height: 1.36\n}\n\n.weui-form__desc {\n  font-size: 17px;\n  margin-top: 16px\n}\n\n.weui-form__tips {\n  color: var(--weui-FG-1);\n  font-size: 14px\n}\n\n.weui-form__tips a,\n.weui-form__tips navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-form__tips navigator {\n  display: inline\n}\n\n.weui-article {\n  padding: 24px 16px;\n  padding: 24px calc(16px + constant(safe-area-inset-right)) calc(24px + constant(safe-area-inset-bottom)) calc(16px + constant(safe-area-inset-left));\n  padding: 24px calc(16px + env(safe-area-inset-right)) calc(24px + env(safe-area-inset-bottom)) calc(16px + env(safe-area-inset-left));\n  font-size: 17px;\n  color: var(--weui-FG-0)\n}\n\n.weui-article__section {\n  margin-bottom: 1.5em\n}\n\n.weui-article__h1 {\n  font-size: 22px;\n  font-weight: 700;\n  margin-bottom: .9em;\n  line-height: 1.4\n}\n\n.weui-article__h2 {\n  font-size: 17px\n}\n\n.weui-article__h2,\n.weui-article__h3 {\n  font-weight: 700;\n  margin-bottom: .34em;\n  line-height: 1.4\n}\n\n.weui-article__h3 {\n  font-size: 15px\n}\n\n.weui-article__p {\n  margin: 0 0 .8em\n}\n\n.weui-tabbar {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  position: relative;\n  z-index: 500;\n  background-color: var(--weui-BG-1)\n}\n\n.weui-tabbar:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-tabbar__item {\n  display: block;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  padding: 8px 0;\n  padding-bottom: calc(8px + constant(safe-area-inset-bottom));\n  padding-bottom: calc(8px + env(safe-area-inset-bottom));\n  font-size: 0;\n  color: var(--weui-FG-1);\n  text-align: center;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-tabbar__item:first-child {\n  padding-left: constant(safe-area-inset-left);\n  padding-left: env(safe-area-inset-left)\n}\n\n.weui-tabbar__item:last-child {\n  padding-right: constant(safe-area-inset-right);\n  padding-right: env(safe-area-inset-right)\n}\n\n.weui-tabbar__item.weui-bar__item_on .weui-tabbar__icon,\n.weui-tabbar__item.weui-bar__item_on .weui-tabbar__icon>i,\n.weui-tabbar__item.weui-bar__item_on .weui-tabbar__label {\n  color: var(--weui-BRAND)\n}\n\n.weui-tabbar__icon {\n  display: inline-block;\n  width: 28px;\n  height: 28px;\n  margin-bottom: 2px\n}\n\n.weui-tabbar__icon>i,\ni.weui-tabbar__icon {\n  font-size: 24px;\n  color: var(--weui-FG-1)\n}\n\n.weui-tabbar__icon img {\n  width: 100%;\n  height: 100%\n}\n\n.weui-tabbar__label {\n  color: var(--weui-FG-0);\n  font-size: 10px;\n  line-height: 1.4\n}\n\n.weui-navbar {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  position: relative;\n  z-index: 500;\n  background-color: var(--weui-BG-2);\n  padding-top: constant(safe-area-inset-top);\n  padding-top: env(safe-area-inset-top)\n}\n\n.weui-navbar:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-navbar+.weui-tab__panel {\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom)\n}\n\n.weui-navbar__item {\n  position: relative;\n  display: block;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  padding: 16px 0;\n  padding-top: calc(16px + constant(safe-area-inset-top));\n  padding-top: calc(16px + env(safe-area-inset-top));\n  text-align: center;\n  font-size: 17px;\n  line-height: 1.41176471;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-navbar__item.weui-bar__item_on,\n.weui-navbar__item:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-navbar__item:after {\n  content: \" \";\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-right: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 100% 0;\n  transform-origin: 100% 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-navbar__item:first-child {\n  padding-left: constant(safe-area-inset-left);\n  padding-left: env(safe-area-inset-left)\n}\n\n.weui-navbar__item:last-child {\n  padding-right: constant(safe-area-inset-right);\n  padding-right: env(safe-area-inset-right)\n}\n\n.weui-navbar__item:last-child:after {\n  display: none\n}\n\n.weui-tab {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  height: 100%;\n  box-sizing: border-box;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column\n}\n\n.weui-tab__panel {\n  box-sizing: border-box;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch\n}\n\n.weui-tab__content {\n  display: none\n}\n\n.weui-progress {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-progress__bar {\n  background-color: var(--weui-BG-0);\n  height: 3px;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-progress__inner-bar {\n  width: 0;\n  height: 100%;\n  background-color: var(--weui-BRAND)\n}\n\n.weui-progress__opr {\n  display: block;\n  margin-left: 15px;\n  font-size: 0\n}\n\n.weui-panel {\n  background-color: var(--weui-BG-2);\n  margin-top: 10px;\n  position: relative;\n  overflow: hidden\n}\n\n.weui-panel:first-child {\n  margin-top: 0\n}\n\n.weui-panel:before {\n  top: 0;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-panel:after,\n.weui-panel:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 1px;\n  color: var(--weui-FG-3)\n}\n\n.weui-panel:after {\n  bottom: 0;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-panel__hd {\n  padding: 16px 16px 13px;\n  color: var(--weui-FG-0);\n  font-size: 15px;\n  font-weight: 700;\n  position: relative\n}\n\n.weui-panel__hd:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  left: 15px\n}\n\n.weui-media-box {\n  padding: 16px;\n  position: relative\n}\n\n.weui-media-box:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  left: 16px\n}\n\n.weui-media-box:first-child:before {\n  display: none\n}\n\na.weui-media-box {\n  color: #000;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\na.weui-media-box:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-media-box__title {\n  font-weight: 400;\n  font-size: 17px;\n  color: var(--weui-FG-0);\n  width: auto;\n  white-space: nowrap;\n  word-wrap: normal;\n  word-wrap: break-word;\n  word-break: break-all\n}\n\n.weui-media-box__desc,\n.weui-media-box__title {\n  line-height: 1.4;\n  overflow: hidden;\n  text-overflow: ellipsis\n}\n\n.weui-media-box__desc {\n  color: var(--weui-FG-2);\n  font-size: 14px;\n  padding-top: 4px;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2\n}\n\n.weui-media-box__info {\n  margin-top: 16px;\n  padding-bottom: 4px;\n  font-size: 13px;\n  color: var(--weui-FG-2);\n  line-height: 1em;\n  list-style: none;\n  overflow: hidden\n}\n\n.weui-media-box__info__meta {\n  float: left;\n  padding-right: 1em\n}\n\n.weui-media-box__info__meta_extra {\n  padding-left: 1em;\n  border-left: 1px solid var(--weui-FG-2)\n}\n\n.weui-media-box_appmsg {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-media-box_appmsg .weui-media-box__hd {\n  margin-right: 16px;\n  width: 60px;\n  height: 60px;\n  line-height: 60px;\n  text-align: center\n}\n\n.weui-media-box_appmsg .weui-media-box__thumb {\n  width: 100%;\n  max-height: 100%;\n  vertical-align: top\n}\n\n.weui-media-box_appmsg .weui-media-box__bd {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  min-width: 0\n}\n\n.weui-media-box_small-appmsg {\n  padding: 0\n}\n\n.weui-media-box_small-appmsg .weui-cells {\n  margin-top: 0\n}\n\n.weui-media-box_small-appmsg .weui-cells:before {\n  display: none\n}\n\n.weui-grids {\n  position: relative;\n  overflow: hidden\n}\n\n.weui-grids:before {\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-grids:after,\n.weui-grids:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  color: var(--weui-FG-3)\n}\n\n.weui-grids:after {\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-grid {\n  position: relative;\n  float: left;\n  padding: 20px 10px;\n  width: 33.33333333%;\n  box-sizing: border-box\n}\n\n.weui-grid:before {\n  top: 0;\n  width: 1px;\n  border-right: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 100% 0;\n  transform-origin: 100% 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-grid:after,\n.weui-grid:before {\n  content: \" \";\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  color: var(--weui-FG-3)\n}\n\n.weui-grid:after {\n  left: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-grid:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-grid__icon {\n  width: 28px;\n  height: 28px;\n  margin: 0 auto\n}\n\n.weui-grid__icon img {\n  display: block;\n  width: 100%;\n  height: 100%\n}\n\n.weui-grid__icon+.weui-grid__label {\n  margin-top: 4px\n}\n\n.weui-grid__label {\n  display: block;\n  color: var(--weui-FG-0);\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden\n}\n\n.weui-footer,\n.weui-grid__label {\n  text-align: center;\n  font-size: 14px\n}\n\n.weui-footer {\n  color: var(--weui-FG-2);\n  line-height: 1.4\n}\n\n.weui-footer a,\n.weui-footer navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-footer navigator {\n  display: inline\n}\n\n.weui-footer_fixed-bottom {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  padding-top: 16px;\n  padding-bottom: 16px;\n  padding-bottom: calc(16px + constant(safe-area-inset-bottom));\n  padding-bottom: calc(16px + env(safe-area-inset-bottom));\n  left: constant(safe-area-inset-left);\n  left: env(safe-area-inset-left);\n  right: constant(safe-area-inset-right);\n  right: env(safe-area-inset-right)\n}\n\n.weui-footer__links {\n  font-size: 0\n}\n\n.weui-footer__link {\n  display: inline-block;\n  vertical-align: top;\n  margin: 0 8px;\n  position: relative;\n  font-size: 14px\n}\n\n.weui-footer__link:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5);\n  left: -8px;\n  top: .36em;\n  bottom: .36em\n}\n\n.weui-footer__link:first-child:before {\n  display: none\n}\n\n.weui-footer__text {\n  padding: 0 16px;\n  font-size: 12px\n}\n\n.weui-flex {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex\n}\n\n.weui-flex__item {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-dialog {\n  position: fixed;\n  z-index: 5000;\n  top: 50%;\n  left: 16px;\n  right: 16px;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n  background-color: var(--weui-BG-2);\n  text-align: center;\n  border-radius: 12px;\n  overflow: hidden;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: column;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  flex-direction: column;\n  max-height: 90%\n}\n\n.weui-dialog__hd {\n  padding: 32px 24px 16px\n}\n\n.weui-dialog__title {\n  font-weight: 700;\n  font-size: 17px;\n  line-height: 1.4\n}\n\n.weui-dialog__bd {\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n  padding: 0 24px;\n  margin-bottom: 32px;\n  font-size: 17px;\n  line-height: 1.4;\n  word-wrap: break-word;\n  -webkit-hyphens: auto;\n  hyphens: auto;\n  color: var(--weui-FG-1)\n}\n\n.weui-dialog__bd:first-child {\n  min-height: 40px;\n  padding: 32px 24px 0;\n  font-weight: 700;\n  color: var(--weui-FG-0);\n  -webkit-flex-direction: column;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  flex-direction: column;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center\n}\n\n.weui-dialog__bd:first-child,\n.weui-dialog__ft {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex\n}\n\n.weui-dialog__ft {\n  position: relative;\n  line-height: 56px;\n  min-height: 56px;\n  font-size: 17px\n}\n\n.weui-dialog__ft:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-DIALOG-LINE-COLOR);\n  color: var(--weui-DIALOG-LINE-COLOR);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-dialog__btn {\n  display: block;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  color: var(--weui-LINK);\n  font-weight: 700;\n  text-decoration: none;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  position: relative\n}\n\n.weui-dialog__btn:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-dialog__btn:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-DIALOG-LINE-COLOR);\n  color: var(--weui-DIALOG-LINE-COLOR);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-dialog__btn:first-child:after {\n  display: none\n}\n\n.weui-dialog__btn_default {\n  color: var(--weui-FG-HALF)\n}\n\n.weui-skin_android .weui-dialog {\n  text-align: left;\n  box-shadow: 0 6px 30px 0 rgba(0, 0, 0, .1)\n}\n\n.weui-skin_android .weui-dialog__title {\n  font-size: 22px;\n  line-height: 1.4\n}\n\n.weui-skin_android .weui-dialog__hd {\n  text-align: left\n}\n\n.weui-skin_android .weui-dialog__bd {\n  color: var(--weui-FG-1);\n  text-align: left\n}\n\n.weui-skin_android .weui-dialog__bd:first-child {\n  color: var(--weui-FG-0)\n}\n\n.weui-skin_android .weui-dialog__ft {\n  display: block;\n  text-align: right;\n  line-height: 40px;\n  min-height: 40px;\n  padding: 0 24px 16px\n}\n\n.weui-skin_android .weui-dialog__ft:after {\n  display: none\n}\n\n.weui-skin_android .weui-dialog__btn {\n  display: inline-block;\n  vertical-align: top;\n  padding: 0 .8em\n}\n\n.weui-skin_android .weui-dialog__btn:after {\n  display: none\n}\n\n.weui-skin_android .weui-dialog__btn:last-child {\n  margin-right: -.8em\n}\n\n.weui-skin_android .weui-dialog__btn_default {\n  color: var(--weui-FG-HALF)\n}\n\n@media screen and (min-width:352px) {\n  .weui-dialog {\n    width: 320px;\n    margin: 0 auto\n  }\n}\n\n.weui-half-screen-dialog {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  max-height: 75%;\n  z-index: 5000;\n  line-height: 1.4;\n  background-color: var(--weui-BG-2);\n  border-top-left-radius: 12px;\n  border-top-right-radius: 12px;\n  overflow: hidden;\n  padding: 0 24px;\n  padding: 0 calc(24px + constant(safe-area-inset-right)) constant(safe-area-inset-bottom) calc(24px + constant(safe-area-inset-left));\n  padding: 0 calc(24px + env(safe-area-inset-right)) env(safe-area-inset-bottom) calc(24px + env(safe-area-inset-left))\n}\n\n@media only screen and (max-height:558px) {\n  .weui-half-screen-dialog {\n    max-height: none\n  }\n}\n\n.weui-half-screen-dialog__hd {\n  font-size: 8px;\n  height: 8em;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-half-screen-dialog__hd .weui-icon-btn {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%)\n}\n\n.weui-half-screen-dialog__hd .weui-icon-btn:active {\n  opacity: .5\n}\n\n.weui-half-screen-dialog__hd__side {\n  position: relative;\n  left: -8px\n}\n\n.weui-half-screen-dialog__hd__main {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-half-screen-dialog__hd__side+.weui-half-screen-dialog__hd__main {\n  text-align: center;\n  padding: 0 40px\n}\n\n.weui-half-screen-dialog__hd__main+.weui-half-screen-dialog__hd__side {\n  right: -8px;\n  left: auto\n}\n\n.weui-half-screen-dialog__hd__main+.weui-half-screen-dialog__hd__side .weui-icon-btn {\n  right: 0\n}\n\n.weui-half-screen-dialog__title {\n  display: block;\n  color: var(--weui-FG-0);\n  font-weight: 700;\n  font-size: 15px\n}\n\n.weui-half-screen-dialog__subtitle {\n  display: block;\n  color: var(--weui-FG-1);\n  font-size: 10px\n}\n\n.weui-half-screen-dialog__bd {\n  word-wrap: break-word;\n  -webkit-hyphens: auto;\n  hyphens: auto;\n  overflow-y: auto;\n  padding-top: 4px;\n  padding-bottom: 40px;\n  font-size: 14px;\n  color: var(--weui-FG-0)\n}\n\n.weui-half-screen-dialog__desc {\n  font-size: 17px;\n  font-weight: 700;\n  color: var(--weui-FG-0);\n  line-height: 1.4\n}\n\n.weui-half-screen-dialog__tips {\n  padding-top: 16px;\n  font-size: 14px;\n  color: var(--weui-FG-2);\n  line-height: 1.4\n}\n\n.weui-half-screen-dialog__ft {\n  padding: 0 24px 32px;\n  text-align: center\n}\n\n.weui-half-screen-dialog__ft .weui-btn:nth-last-child(n+2),\n.weui-half-screen-dialog__ft .weui-btn:nth-last-child(n+2)+.weui-btn {\n  display: inline-block;\n  vertical-align: top;\n  margin: 0 8px;\n  width: 120px\n}\n\n.weui-icon-btn {\n  outline: 0;\n  -webkit-appearance: none;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  border-width: 0;\n  background-color: transparent;\n  color: var(--weui-FG-0);\n  font-size: 0\n}\n\n.weui-icon-more {\n  width: 24px;\n  -webkit-mask: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E  %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M5 10.25a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  mask: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E  %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M5 10.25a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  -webkit-mask-size: cover;\n  mask-size: cover\n}\n\n.weui-icon-btn_goback,\n.weui-icon-more {\n  display: inline-block;\n  vertical-align: middle;\n  height: 24px;\n  background-color: currentColor;\n  color: var(--weui-FG-0)\n}\n\n.weui-icon-btn_goback {\n  width: 12px;\n  -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E\") no-repeat 50% 50%;\n  mask: url(\"data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E\") no-repeat 50% 50%;\n  -webkit-mask-size: cover;\n  mask-size: cover\n}\n\n.weui-icon-btn_close {\n  color: var(--weui-FG-0);\n  display: inline-block;\n  vertical-align: middle;\n  width: 14px;\n  height: 24px;\n  -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E\") no-repeat 50% 50%;\n  mask: url(\"data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E\") no-repeat 50% 50%;\n  -webkit-mask-size: cover;\n  mask-size: cover;\n  background-color: currentColor\n}\n\n.weui-toast {\n  position: fixed;\n  z-index: 5000;\n  width: 120px;\n  height: 120px;\n  top: 40%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  text-align: center;\n  border-radius: 5px;\n  color: hsla(0, 0%, 100%, .9);\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  background-color: #4c4c4c\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-toast {\n    background-color: #606060\n  }\n}\n\n.weui-icon_toast {\n  display: block\n}\n\n.weui-icon_toast.weui-icon-success-no-circle {\n  color: hsla(0, 0%, 100%, .9);\n  width: 55px;\n  height: 55px\n}\n\n.weui-icon_toast.weui-loading {\n  margin: 8px 0;\n  width: 38px;\n  height: 38px;\n  vertical-align: baseline\n}\n\n.weui-toast__content {\n  font-size: 14px\n}\n\n.weui-mask {\n  background: rgba(0, 0, 0, .6)\n}\n\n.weui-mask,\n.weui-mask_transparent {\n  position: fixed;\n  z-index: 1000;\n  top: 0;\n  right: 0;\n  left: 0;\n  bottom: 0\n}\n\n.weui-actionsheet {\n  position: fixed;\n  left: 0;\n  bottom: 0;\n  -webkit-transform: translateY(100%);\n  transform: translateY(100%);\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  z-index: 5000;\n  width: 100%;\n  background-color: var(--weui-BG-1);\n  -webkit-transition: -webkit-transform .3s;\n  transition: -webkit-transform .3s;\n  transition: transform .3s;\n  transition: transform .3s, -webkit-transform .3s;\n  border-top-left-radius: 12px;\n  border-top-right-radius: 12px;\n  overflow: hidden\n}\n\n.weui-actionsheet__title {\n  position: relative;\n  height: 56px;\n  padding: 0 24px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  text-align: center;\n  font-size: 12px;\n  color: var(--weui-FG-1);\n  line-height: 1.4;\n  background: var(--weui-BG-2)\n}\n\n.weui-actionsheet__title:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-actionsheet__title .weui-actionsheet__title-text {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2\n}\n\n.weui-actionsheet__menu {\n  color: var(--weui-FG-0);\n  background-color: var(--weui-BG-2)\n}\n\n.weui-actionsheet__action {\n  margin-top: 8px;\n  background-color: var(--weui-BG-2);\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom)\n}\n\n.weui-actionsheet__cell {\n  position: relative;\n  padding: 16px;\n  text-align: center;\n  font-size: 17px;\n  line-height: 1.41176471\n}\n\n.weui-actionsheet__cell:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-actionsheet__cell:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-actionsheet__cell:first-child:before {\n  display: none\n}\n\n.weui-actionsheet__cell_warn {\n  color: var(--weui-RED)\n}\n\n.weui-skin_android .weui-actionsheet {\n  position: fixed;\n  left: 50%;\n  top: 50%;\n  bottom: auto;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  width: 274px;\n  box-sizing: border-box;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  background: transparent;\n  -webkit-transition: -webkit-transform .3s;\n  transition: -webkit-transform .3s;\n  transition: transform .3s;\n  transition: transform .3s, -webkit-transform .3s;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0\n}\n\n.weui-skin_android .weui-actionsheet__action {\n  display: none\n}\n\n.weui-skin_android .weui-actionsheet__menu {\n  border-radius: 2px;\n  box-shadow: 0 6px 30px 0 rgba(0, 0, 0, .1)\n}\n\n.weui-skin_android .weui-actionsheet__cell {\n  padding: 16px;\n  font-size: 17px;\n  line-height: 1.41176471;\n  color: var(--weui-FG-0);\n  text-align: left\n}\n\n.weui-skin_android .weui-actionsheet__cell:first-child {\n  border-top-left-radius: 2px;\n  border-top-right-radius: 2px\n}\n\n.weui-skin_android .weui-actionsheet__cell:last-child {\n  border-bottom-left-radius: 2px;\n  border-bottom-right-radius: 2px\n}\n\n.weui-actionsheet_toggle {\n  -webkit-transform: translate(0);\n  transform: translate(0)\n}\n\n.weui-loadmore {\n  width: 65%;\n  margin: 1.5em auto;\n  line-height: 1.6em;\n  font-size: 14px;\n  text-align: center\n}\n\n.weui-loadmore__tips {\n  display: inline-block;\n  vertical-align: middle;\n  color: var(--weui-FG-0)\n}\n\n.weui-loadmore_line {\n  border-top: 1px solid var(--weui-FG-3);\n  margin-top: 2.4em\n}\n\n.weui-loadmore_line .weui-loadmore__tips {\n  position: relative;\n  top: -.9em;\n  padding: 0 .55em;\n  background-color: var(--weui-BG-2);\n  color: var(--weui-FG-1)\n}\n\n.weui-loadmore_dot .weui-loadmore__tips {\n  padding: 0 .16em\n}\n\n.weui-loadmore_dot .weui-loadmore__tips:before {\n  content: \" \";\n  width: 4px;\n  height: 4px;\n  border-radius: 50%;\n  background-color: var(--weui-FG-3);\n  display: inline-block;\n  position: relative;\n  vertical-align: 0;\n  top: -.16em\n}\n\n.weui-badge {\n  display: inline-block;\n  padding: .15em .4em;\n  min-width: 8px;\n  border-radius: 18px;\n  background-color: var(--weui-RED);\n  color: #fff;\n  line-height: 1.2;\n  text-align: center;\n  font-size: 12px;\n  vertical-align: middle\n}\n\n.weui-badge_dot {\n  padding: .4em;\n  min-width: 0\n}\n\n.weui-toptips {\n  display: none;\n  position: fixed;\n  -webkit-transform: translateZ(0);\n  transform: translateZ(0);\n  top: 8px;\n  left: 8px;\n  right: 8px;\n  padding: 10px;\n  border-radius: 8px;\n  font-size: 14px;\n  text-align: center;\n  color: #fff;\n  z-index: 5000;\n  word-wrap: break-word;\n  word-break: break-all\n}\n\n.weui-toptips_warn {\n  background-color: var(--weui-RED)\n}\n\n.weui-search-bar {\n  position: relative;\n  padding: 8px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  box-sizing: border-box;\n  background-color: var(--weui-BG-0);\n  -webkit-text-size-adjust: 100%;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-search-bar.weui-search-bar_focusing .weui-search-bar__cancel-btn {\n  display: block\n}\n\n.weui-search-bar.weui-search-bar_focusing .weui-search-bar__label {\n  display: none\n}\n\n.weui-search-bar .weui-icon-search {\n  width: 16px;\n  height: 16px\n}\n\n.weui-search-bar__form {\n  position: relative;\n  -webkit-box-flex: 1;\n  -webkit-flex: auto;\n  flex: auto;\n  background-color: var(--weui-BG-2);\n  border-radius: 4px\n}\n\n.weui-search-bar__box {\n  position: relative;\n  padding-left: 28px;\n  padding-right: 32px;\n  height: 100%;\n  width: 100%;\n  box-sizing: border-box;\n  z-index: 1\n}\n\n.weui-search-bar__box .weui-search-bar__input {\n  padding: 8px 0;\n  width: 100%;\n  height: 1.14285714em;\n  border: 0;\n  font-size: 14px;\n  line-height: 1.14285714em;\n  box-sizing: content-box;\n  background: transparent;\n  caret-color: var(--weui-BRAND);\n  color: var(--weui-FG-0)\n}\n\n.weui-search-bar__box .weui-search-bar__input:focus {\n  outline: none\n}\n\n.weui-search-bar__box .weui-icon-search {\n  position: absolute;\n  top: 50%;\n  left: 8px;\n  margin-top: -8px\n}\n\n.weui-search-bar__box .weui-icon-clear {\n  position: absolute;\n  top: 50%;\n  right: 0;\n  margin-top: -16px;\n  padding: 8px;\n  width: 16px;\n  height: 16px;\n  -webkit-mask-size: 16px;\n  mask-size: 16px\n}\n\n.weui-search-bar__label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 2;\n  font-size: 0;\n  border-radius: 4px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  color: var(--weui-FG-1);\n  background: var(--weui-BG-2)\n}\n\n.weui-search-bar__label span {\n  display: inline-block;\n  font-size: 14px;\n  vertical-align: middle\n}\n\n.weui-search-bar__label .weui-icon-search {\n  margin-right: 4px\n}\n\n.weui-search-bar__cancel-btn {\n  display: none;\n  margin-left: 8px;\n  line-height: 28px;\n  color: var(--weui-LINK);\n  white-space: nowrap\n}\n\n.weui-search-bar__input:not(:valid)+.weui-icon-clear {\n  display: none\n}\n\ninput[type=search]::-webkit-search-cancel-button,\ninput[type=search]::-webkit-search-decoration,\ninput[type=search]::-webkit-search-results-button,\ninput[type=search]::-webkit-search-results-decoration {\n  display: none\n}\n\n.weui-picker {\n  position: fixed;\n  width: 100%;\n  box-sizing: border-box;\n  left: 0;\n  bottom: 0;\n  z-index: 5000;\n  background-color: var(--weui-BG-2);\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom);\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  -webkit-transform: translateY(100%);\n  transform: translateY(100%);\n  -webkit-transition: -webkit-transform .3s;\n  transition: -webkit-transform .3s;\n  transition: transform .3s;\n  transition: transform .3s, -webkit-transform .3s\n}\n\n.weui-picker__hd {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  padding: 16px;\n  padding: 16px calc(16px + constant(safe-area-inset-right)) 16px calc(16px + constant(safe-area-inset-left));\n  padding: 16px calc(16px + env(safe-area-inset-right)) 16px calc(16px + env(safe-area-inset-left));\n  position: relative;\n  text-align: center;\n  font-size: 17px;\n  line-height: 1.4\n}\n\n.weui-picker__hd:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-picker__bd {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  position: relative;\n  background-color: var(--weui-BG-2);\n  height: 240px;\n  overflow: hidden\n}\n\n.weui-picker__group {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  position: relative;\n  height: 100%\n}\n\n.weui-picker__group:first-child .weui-picker__item {\n  padding-left: constant(safe-area-inset-left);\n  padding-left: env(safe-area-inset-left)\n}\n\n.weui-picker__group:last-child .weui-picker__item {\n  padding-right: constant(safe-area-inset-right);\n  padding-right: env(safe-area-inset-right)\n}\n\n.weui-picker__mask {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  margin: 0 auto;\n  z-index: 3;\n  background-image: -webkit-linear-gradient(top, hsla(0, 0%, 100%, .95), hsla(0, 0%, 100%, .6)), -webkit-linear-gradient(bottom, hsla(0, 0%, 100%, .95), hsla(0, 0%, 100%, .6));\n  background-image: linear-gradient(180deg, hsla(0, 0%, 100%, .95), hsla(0, 0%, 100%, .6)), linear-gradient(0deg, hsla(0, 0%, 100%, .95), hsla(0, 0%, 100%, .6));\n  background-position: top, bottom;\n  background-size: 100% 92px;\n  background-repeat: no-repeat;\n  -webkit-transform: translateZ(0);\n  transform: translateZ(0)\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-picker__mask {\n    background-image: -webkit-linear-gradient(top, rgba(35, 35, 35, .95), rgba(35, 35, 35, .6)), -webkit-linear-gradient(bottom, rgba(35, 35, 35, .95), rgba(35, 35, 35, .6));\n    background-image: linear-gradient(180deg, rgba(35, 35, 35, .95), rgba(35, 35, 35, .6)), linear-gradient(0deg, rgba(35, 35, 35, .95), rgba(35, 35, 35, .6))\n  }\n}\n\n.weui-picker__indicator {\n  width: 100%;\n  height: 56px;\n  position: absolute;\n  left: 0;\n  top: 92px;\n  z-index: 3\n}\n\n.weui-picker__indicator:before {\n  top: 0;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-picker__indicator:after,\n.weui-picker__indicator:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 1px;\n  color: var(--weui-FG-3)\n}\n\n.weui-picker__indicator:after {\n  bottom: 0;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-picker__content {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%\n}\n\n.weui-picker__item {\n  height: 48px;\n  line-height: 48px;\n  text-align: center;\n  color: var(--weui-FG-0);\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden\n}\n\n.weui-picker__item_disabled {\n  color: var(--weui-FG-1)\n}\n\n@-webkit-keyframes a {\n  0% {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0)\n  }\n\n  to {\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0)\n  }\n}\n\n@keyframes a {\n  0% {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0)\n  }\n\n  to {\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0)\n  }\n}\n\n.weui-animate-slide-up {\n  -webkit-animation: a ease .3s forwards;\n  animation: a ease .3s forwards\n}\n\n@-webkit-keyframes b {\n  0% {\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0)\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0)\n  }\n}\n\n@keyframes b {\n  0% {\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0)\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0)\n  }\n}\n\n.weui-animate-slide-down {\n  -webkit-animation: b ease .3s forwards;\n  animation: b ease .3s forwards\n}\n\n@-webkit-keyframes c {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n@keyframes c {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n.weui-animate-fade-in {\n  -webkit-animation: c ease .3s forwards;\n  animation: c ease .3s forwards\n}\n\n@-webkit-keyframes d {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n@keyframes d {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n.weui-animate-fade-out {\n  -webkit-animation: d ease .3s forwards;\n  animation: d ease .3s forwards\n}\n\n.weui-agree {\n  display: block;\n  padding: 8px 15px 0;\n  font-size: 14px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-agree a,\n.weui-agree navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-agree navigator {\n  display: inline\n}\n\n.weui-agree__text {\n  color: var(--weui-FG-1);\n  margin-left: 2px\n}\n\n.weui-agree__checkbox {\n  -webkit-appearance: none;\n  appearance: none;\n  display: inline-block;\n  border: 0;\n  outline: 0;\n  vertical-align: middle;\n  background-color: currentColor;\n  -webkit-mask-position: 0 0;\n  mask-position: 0 0;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);\n  color: var(--weui-FG-2);\n  width: 1em;\n  height: 1em;\n  font-size: 17px;\n  margin-top: -.2em\n}\n\n.weui-agree__checkbox-check {\n  position: absolute;\n  left: -9999px\n}\n\n.weui-agree__checkbox-check[aria-checked=true]+.weui-agree__checkbox,\n.weui-agree__checkbox:checked {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);\n  color: var(--weui-BRAND)\n}\n\n.weui-agree_animate {\n  -webkit-animation: e .3s 1;\n  animation: e .3s 1\n}\n\n@-webkit-keyframes e {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  16% {\n    -webkit-transform: translateX(-8px);\n    transform: translateX(-8px)\n  }\n\n  28% {\n    -webkit-transform: translateX(-16px);\n    transform: translateX(-16px)\n  }\n\n  44% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  59% {\n    -webkit-transform: translateX(-16px);\n    transform: translateX(-16px)\n  }\n\n  73% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  82% {\n    -webkit-transform: translateX(16px);\n    transform: translateX(16px)\n  }\n\n  94% {\n    -webkit-transform: translateX(8px);\n    transform: translateX(8px)\n  }\n\n  to {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n}\n\n@keyframes e {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  16% {\n    -webkit-transform: translateX(-8px);\n    transform: translateX(-8px)\n  }\n\n  28% {\n    -webkit-transform: translateX(-16px);\n    transform: translateX(-16px)\n  }\n\n  44% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  59% {\n    -webkit-transform: translateX(-16px);\n    transform: translateX(-16px)\n  }\n\n  73% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  82% {\n    -webkit-transform: translateX(16px);\n    transform: translateX(16px)\n  }\n\n  94% {\n    -webkit-transform: translateX(8px);\n    transform: translateX(8px)\n  }\n\n  to {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n}\n\n.weui-loading {\n  width: 20px;\n  height: 20px;\n  display: inline-block;\n  vertical-align: middle;\n  -webkit-animation: f 1s steps(12) infinite;\n  animation: f 1s steps(12) infinite;\n  background: transparent url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E9E9E9' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23989697' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%239B999A' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23A3A1A2' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23ABA9AA' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23B2B2B2' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23BAB8B9' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23C2C0C1' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23CBCBCB' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23D2D2D2' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23DADADA' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E2E2E2' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E\") no-repeat;\n  background-size: 100%\n}\n\n.weui-btn_loading.weui-btn_primary .weui-loading,\n.weui-loading.weui-loading_transparent {\n  background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect xmlns='http://www.w3.org/2000/svg' width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.56)' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.5)' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.43)' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.38)' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.32)' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.28)' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.25)' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.2)' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.17)' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.14)' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.1)' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.03)' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E\")\n}\n\n@-webkit-keyframes f {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg)\n  }\n\n  to {\n    -webkit-transform: rotate(1turn);\n    transform: rotate(1turn)\n  }\n}\n\n@keyframes f {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg)\n  }\n\n  to {\n    -webkit-transform: rotate(1turn);\n    transform: rotate(1turn)\n  }\n}\n\n.weui-slider {\n  padding: 15px 18px;\n  -webkit-user-select: none;\n  user-select: none\n}\n\n.weui-slider__inner {\n  position: relative;\n  height: 2px;\n  background-color: var(--weui-FG-3)\n}\n\n.weui-slider__track {\n  height: 2px;\n  background-color: var(--weui-BRAND);\n  width: 0\n}\n\n.weui-slider__handler {\n  position: absolute;\n  left: 0;\n  top: 50%;\n  width: 28px;\n  height: 28px;\n  margin-left: -14px;\n  margin-top: -14px;\n  border-radius: 50%;\n  background-color: #fff;\n  box-shadow: 0 0 4px var(--weui-FG-3)\n}\n\n.weui-slider-box {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-slider-box .weui-slider {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-slider-box__value {\n  margin-left: .5em;\n  min-width: 24px;\n  color: var(--weui-FG-1);\n  text-align: center;\n  font-size: 14px\n}\n\n.wx_dot_loading,\n.wx_dot_loading:after,\n.wx_dot_loading:before {\n  display: inline-block;\n  vertical-align: middle;\n  width: 6px;\n  height: 6px;\n  border-radius: 50%;\n  background-color: rgba(0, 0, 0, .3);\n  font-size: 0;\n  -webkit-animation: h 1.6s step-start infinite;\n  animation: h 1.6s step-start infinite\n}\n\n.wx_dot_loading {\n  position: relative\n}\n\n.wx_dot_loading:before {\n  content: \"\";\n  position: absolute;\n  left: -12px;\n  background-color: rgba(0, 0, 0, .1);\n  -webkit-animation: g 1.6s step-start infinite;\n  animation: g 1.6s step-start infinite\n}\n\n.wx_dot_loading:after {\n  content: \"\";\n  position: absolute;\n  right: -12px;\n  background-color: rgba(0, 0, 0, .5);\n  -webkit-animation: i 1.6s step-start infinite;\n  animation: i 1.6s step-start infinite\n}\n\n@-webkit-keyframes g {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .1)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .3)\n  }\n}\n\n@keyframes g {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .1)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .3)\n  }\n}\n\n@-webkit-keyframes h {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .3)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .1)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .5)\n  }\n}\n\n@keyframes h {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .3)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .1)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .5)\n  }\n}\n\n@-webkit-keyframes i {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .3)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .1)\n  }\n}\n\n@keyframes i {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .3)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .1)\n  }\n}\n\n.wx_dot_loading_white {\n  background-color: hsla(0, 0%, 100%, .3);\n  -webkit-animation: k 1.6s step-start infinite;\n  animation: k 1.6s step-start infinite\n}\n\n.wx_dot_loading_white:before {\n  background-color: hsla(0, 0%, 100%, .5);\n  -webkit-animation: j 1.6s step-start infinite;\n  animation: j 1.6s step-start infinite\n}\n\n.wx_dot_loading_white:after {\n  background-color: hsla(0, 0%, 100%, .1);\n  -webkit-animation: l 1.6s step-start infinite;\n  animation: l 1.6s step-start infinite\n}\n\n@-webkit-keyframes j {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n}\n\n@keyframes j {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n}\n\n@-webkit-keyframes k {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n}\n\n@keyframes k {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n}\n\n@-webkit-keyframes l {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n}\n\n@keyframes l {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n}\n\n:host {\n  width: 100%\n}\n\n.weui-slideview {\n  position: relative;\n  overflow: hidden\n}\n\n.weui-slideview__left {\n  position: relative;\n  z-index: 10\n}\n\n.weui-slideview__right {\n  position: absolute;\n  z-index: 1;\n  left: 100%;\n  top: 0;\n  height: 100%\n}\n\n.weui-slideview__btn__wrp {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  text-align: center;\n  min-width: 69px;\n  height: 100%;\n  white-space: nowrap\n}\n\n.weui-slideview__btn {\n  color: #fff;\n  padding: 0 17px\n}\n\n.weui-slideview__btn-group_default .weui-slideview__btn {\n  background: #c7c7cc\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-slideview__btn-group_default .weui-slideview__btn {\n    background: var(--weui-BG-4)\n  }\n}\n\n.weui-slideview__btn-group_default~.weui-slideview__btn-group_default:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid #fff;\n  color: #fff;\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-slideview__btn-group_default~.weui-slideview__btn-group_default:before {\n    border-left-color: var(--weui-FG-3)\n  }\n}\n\n.weui-slideview__btn-group_default:first-child:before {\n  display: none\n}\n\n.weui-slideview__btn-group_warn .weui-slideview__btn {\n  background: #fe3b30\n}\n\n.weui-slideview__btn-group_warn~.weui-slideview__btn-group_warn:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid #fff;\n  color: #fff;\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-slideview__btn-group_warn:first-child:before {\n  display: none\n}\n\n.weui-slideview_icon .weui-slideview__btn__wrp {\n  background: transparent;\n  font-size: 0\n}\n\n.weui-slideview_icon .weui-slideview__btn__wrp:first-child {\n  padding-left: 16px\n}\n\n.weui-slideview_icon .weui-slideview__btn__wrp:last-child {\n  padding-right: 8px\n}\n\n.weui-slideview_icon .weui-slideview__btn {\n  width: 48px;\n  height: 48px;\n  line-height: 48px;\n  padding: 0;\n  display: inline-block;\n  vertical-align: middle;\n  border-radius: 50%;\n  background-color: #fff\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-slideview_icon .weui-slideview__btn {\n    background-color: var(--weui-BG-4)\n  }\n}\n\n.weui-slideview_icon .weui-slideview__btn__icon {\n  display: inline-block;\n  vertical-align: middle;\n  width: 22px;\n  height: 22px\n}\n\npage, :root {\n  --height: 44px;\n  --right: 95px\n}\n\n.weui-navigation-bar {\n  overflow: hidden;\n  color: var(--weui-FG-0)\n}\n\n.weui-navigation-bar .android {\n  --height: 48px;\n  --right: 221px\n}\n\n.weui-navigation-bar__inner {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 5001;\n  height: var(--height);\n  padding-right: var(--right);\n  width: calc(100% - var(--right))\n}\n\n.weui-navigation-bar__inner,\n.weui-navigation-bar__inner .weui-navigation-bar__left {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  flex-direction: row;\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left {\n  position: relative;\n  width: var(--right);\n  padding-left: 16px\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left .weui-navigation-bar__btn {\n  display: inline-block;\n  vertical-align: middle;\n  background-repeat: no-repeat\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left .weui-navigation-bar__btn_goback {\n  font-size: 12px;\n  width: 1em;\n  height: 2em;\n  -webkit-mask: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='24' viewBox='0 0 12 24'%3E  %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M10 19.438L8.955 20.5l-7.666-7.79a1.02 1.02 0 0 1 0-1.42L8.955 3.5 10 4.563 2.682 12 10 19.438z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  mask: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='24' viewBox='0 0 12 24'%3E  %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M10 19.438L8.955 20.5l-7.666-7.79a1.02 1.02 0 0 1 0-1.42L8.955 3.5 10 4.563 2.682 12 10 19.438z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  -webkit-mask-size: cover;\n  mask-size: cover;\n  background-color: currentColor\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left .weui-navigation-bar__btn_goback:active {\n  opacity: .5\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__center {\n  font-size: 17px;\n  text-align: center;\n  position: relative;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__loading {\n  margin-right: 4px;\n  font-size: 0\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__loading .weui-loading {\n  margin-left: 0\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__right {\n  margin-right: 16px\n}\n\n.weui-navigation-bar__placeholder {\n  height: var(--height);\n  background: var(--weui-BG-1);\n  position: relative;\n  z-index: 50\n}\n\n.weui-uploader__hd {\n  display: block\n}\n\n.weui-uploader__overview {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-uploader__tips {\n  color: var(--weui-FG-2);\n  font-size: 14px;\n  line-height: 1.4;\n  padding-top: 4px\n}\n\n.weui-uploader__img {\n  display: block;\n  width: 100%;\n  height: 100%\n}\n\n.weui-gallery {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -webkit-flex-wrap: nowrap;\n  flex-wrap: nowrap\n}\n\n.weui-gallery__info {\n  color: #fff;\n  font-size: 17px;\n  line-height: 60px;\n  min-height: 60px;\n  text-align: center\n}\n\n.weui-gallery__img__wrp {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  position: relative;\n  font-size: 0\n}\n\n.weui-gallery__img {\n  position: absolute;\n  width: 100%;\n  height: 100%\n}\n\n.weui-gallery__opr {\n  position: static\n}\n\n.weui-search-bar .weui-search-bar__box .weui-search-bar__input {\n  height: inherit;\n  line-height: inherit\n}\n\n.weui-search-bar .weui-search-bar__box .weui-icon-clear {\n  display: block\n}\n\n.weui-loadmore .weui-loading {\n  margin-right: .3em\n}\n\n.weui-btn_input-clear {\n  display: block\n}"
  },
  {
    "path": "miniprogram/common/reset.wxss",
    "content": "page, view, text, image, button, video, map, scroll-view, swiper, input, textarea, navigator {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-start;\n  align-content: flex-start;\n  align-items: stretch;\n  box-sizing: border-box;\n  background-origin: border-box;\n}\n\npage {\n  height: 100vh;\n  flex-direction: column;\n  justify-content: space-between;\n  align-items: center;\n}\n\nnavigator text,\ntext text,\ntext navigator {\n  display: inline;\n}\n\nimage {\n  align-self: flex-start;\n}\n\n.wx-scroll-view-flex :is(div):not(.wx-scroll-view-flex) {\n  width: auto!important;\n}\n\n.page-scroll-view {\n  flex: 1;\n  overflow: auto;\n}\n"
  },
  {
    "path": "miniprogram/component/navigation-bar/navigation-bar.js",
    "content": "const app = getApp().globalData\nComponent({\n  options: {\n    styleIsolation: 'apply-shared', // 表示页面 wxss 样式将影响到自定义组件，但自定义组件 wxss 中指定的样式不会影响页面\n    multipleSlots: true // 在组件定义时的选项中启用多slot支持\n  },\n  /**\n   * 组件的属性列表\n   */\n  properties: {\n    extClass: {\n      type: String,\n      value: ''\n    },\n    title: {\n      type: String,\n      value: ''\n    },\n    background: {\n      type: String,\n      value: ''\n    },\n    color: {\n      type: String,\n      value: ''\n    },\n    back: {\n      type: Boolean,\n      value: true\n    },\n    loading: {\n      type: Boolean,\n      value: false\n    },\n    animated: {\n      // 显示隐藏的时候opacity动画效果\n      type: Boolean,\n      value: true\n    },\n    show: {\n      // 显示隐藏导航，隐藏的时候navigation-bar的高度占位还在\n      type: Boolean,\n      value: true,\n      observer: '_showChange'\n    },\n    // back为true的时候，返回的页面深度\n    delta: {\n      type: Number,\n      value: 1\n    }\n  },\n  /**\n     * 组件的初始数据\n     */\n  data: {\n    displayStyle: ''\n  },\n  attached() {\n    const isSupport = !!wx.getMenuButtonBoundingClientRect\n    const rect = wx.getMenuButtonBoundingClientRect\n      ? wx.getMenuButtonBoundingClientRect()\n      : null\n    this.setData({\n      ios: !!(app.system.toLowerCase().search('ios') + 1),\n      theme: app.theme || 'light',\n      statusBarHeight: app.statusBarHeight,\n      navBarHeight: rect.bottom - rect.top + 10 + app.statusBarHeight,\n      innerWidth: isSupport ? `width:${rect.left}px` : '',\n      innerPaddingRight: isSupport\n        ? `padding-right:${app.windowWidth - rect.left}px`\n        : '',\n      leftWidth: isSupport ? `width:${app.windowWidth - rect.left}px` : '',\n    })\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  detached() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  /**\n     * 组件的方法列表\n     */\n  methods: {\n    _showChange(show) {\n      const animated = this.data.animated\n      let displayStyle = ''\n      if (animated) {\n        displayStyle = `opacity: ${show ? '1' : '0'\n        };-webkit-transition:opacity 0.5s;transition:opacity 0.5s;`\n      } else {\n        displayStyle = `display: ${show ? '' : 'none'}`\n      }\n      this.setData({\n        displayStyle\n      })\n    },\n    back() {\n      const data = this.data\n      if (data.delta) {\n        wx.navigateBack({\n          delta: data.delta\n        })\n      }\n      // 如果是直接打开的，就默认回首页\n      if (getCurrentPages().length == 1) {\n        wx.switchTab({\n          url: '/page/component/index',\n          complete: (res) => {\n            console.log(res)\n          }\n        })\n      }\n      this.triggerEvent('back', { delta: data.delta }, {})\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/component/navigation-bar/navigation-bar.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/component/navigation-bar/navigation-bar.wxml",
    "content": "<view class=\"weui-navigation-bar {{extClass}}\" data-weui-theme=\"{{theme}}\">\n  <view class=\"weui-navigation-bar__inner\" style=\"padding-top: {{statusBarHeight}}px; height: {{navBarHeight}}px; color: {{color}}; background: {{background}}; {{displayStyle}}; {{innerPaddingRight}};\">\n    <view class='weui-navigation-bar__left' style=\"{{leftWidth}}\">\n      <block wx:if=\"{{back}}\">\n        <view class=\"weui-navigation-bar__buttons\">\n          <view\n            bindtap=\"back\"\n            class=\"weui-navigation-bar__btn_goback_wrapper\"\n            hover-class=\"weui-active\"\n            aria-role=\"button\"\n            aria-label=\"返回\"\n          >\n            <view class=\"weui-navigation-bar__button weui-navigation-bar__btn_goback\"></view>\n          </view>\n        </view>\n      </block>\n      <block wx:else>\n        <slot name=\"left\"></slot>\n      </block>\n    </view>\n\n    <view class='weui-navigation-bar__center'>\n      <view wx:if=\"{{loading}}\" class=\"weui-navigation-bar__loading\" aria-role=\"alert\">\n        <view\n          class=\"weui-loading\"\n          style=\"width:{{size.width}}rpx;height:{{size.height}}rpx;\"\n          aria-role=\"img\"\n          aria-label=\"加载中\"\n        ></view>\n      </view>\n      <block wx:if=\"{{title}}\">\n        <text>{{title}}</text>\n      </block>\n      <block wx:else>\n        <slot name=\"center\"></slot>\n      </block>\n    </view>\n\n    <view class='weui-navigation-bar__right__slot'>\n      <slot name=\"right\"></slot>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/component/navigation-bar/navigation-bar.wxss",
    "content": ".weui-navigation-bar {\n  display: flex;\n  overflow: hidden;\n  color: rgba(0, 0, 0, .9);\n  width: 100vw;\n}\n\n.weui-navigation-bar__placeholder {\n  background: #f7f7f7;\n  position: relative;\n}\n\n.weui-navigation-bar__inner, .weui-navigation-bar__inner .weui-navigation-bar__left {\n  display: flex;\n  align-items: center;\n  flex-direction: row;\n}\n\n.weui-navigation-bar__inner {\n  position: relative;\n  padding-right: 95px;\n  width: 100vw;\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left {\n  position: relative;\n  width: 95px;\n  padding-left: 16px;\n}\n\n.weui-navigation-bar__btn_goback_wrapper {\n  padding: 11px 18px 11px 16px;\n  margin: -11px -18px -11px -16px;\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left .weui-navigation-bar__btn_goback {\n  font-size: 12px;\n  width: 12px;\n  height: 24px;\n  background: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='24' viewBox='0 0 12 24'%3E %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M10 19.438L8.955 20.5l-7.666-7.79a1.02 1.02 0 0 1 0-1.42L8.955 3.5 10 4.563 2.682 12 10 19.438z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  background-color: currentColor;\n  background-size: cover;\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__center {\n  font-size: 17px;\n  text-align: center;\n  position: relative;\n  flex: 1;\n  display: flex; \n  align-items: center;\n  justify-content: center;\n  font-weight: bold;\n  white-space: nowrap;\n}\n\n[data-weui-theme=dark].weui-navigation-bar {\n  color: hsla(0, 0%, 100%, .8);\n}\n[data-weui-theme=dark] .weui-navigation-bar__inner {\n  background-color: #1f1f1f;\n}\n"
  },
  {
    "path": "miniprogram/components/app-bar-course/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/components/app-bar-course/index.less",
    "content": ".expand-container {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tpadding: 0 24px;\n\tpadding-bottom: env(safe-area-inset-bottom);\n\tpointer-events: auto;\n\toverflow: hidden;\n\tbackground-color: #e9f8f7;\n\tcolor: #7e8081;\n  }\n  \n  .hide {\n\tdisplay: none;\n  }\n  \n  .nav-bar {\n\toverflow: hidden;\n\tbox-sizing: border-box;\n  }\n  \n  .icon--back {\n\twidth: 30px;\n\theight: 30px;\n  }\n  \n  .title {\n\tmargin-left: 10px;\n\tmin-width: 160px;\n\tflex: 1;\n  }\n  .title .name {\n\tmargin-top: 4px;\n\tfont-size: 12px;\n  }\n  \n  .title-wrap {\n\tflex: 1;\n\tmin-width: 240px;\n  }\n  \n  .footer {\n\tpadding: 0 24px;\n  }\n  \n  .footer .icon {\n\twidth: 40px;\n\theight: 40px;\n  }\n  \n  .expand-cover {\n\twidth: 100%;\n\theight: 100%;\n  }\n  \n  .music-title {\n\tmargin-top: 48px;\n\tfont-size: 20px;\n\tfont-weight: bold;\n\tcolor: #07c160;\n  }\n  .music-title .name {\n\tmargin-top: 12px;\n\tfont-size: 14px;\n\tfont-weight: 200;\n\tcolor: #b1b2b3;\n  }\n  \n  .cover-area {\n\tmargin: 8px 0;\n\twidth: 100%;\n\taspect-ratio: 1 / 1;\n\toverflow: hidden;\n  }\n  \n  .cover {\n\t/* aspect-ratio: 1 / 1; */\n\tflex-shrink: 0;\n  }\n  \n  .icon {\n\twidth: 18px;\n\theight: 18px;\n  }\n  \n  .row {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n  }\n  \n  .row-between {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: space-between;\n\talign-items: center;\n  }\n  \n  .column {\n\tdisplay: flex;\n\tflex-direction: column;\n  }\n  \n  .column-main-center {\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n  }\n  \n  .column-cross-center {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n  }\n  \n  .center {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n  }\n  \n  .circle {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\tborder-radius: 50%;\n  }"
  },
  {
    "path": "miniprogram/components/app-bar-course/index.ts",
    "content": "// components/app-bar/index.js\n\nconst { shared, timing, Easing } = wx.worklet\n\nexport const GestureState = {\n  POSSIBLE: 0,\n  BEGIN: 1,\n  ACTIVE: 2,\n  END: 3,\n  CANCELLED: 4,\n}\n\nexport const lerp = function (begin, end, t) {\n  'worklet'\n  return begin + (end - begin) * t\n}\n\nexport const clamp = function (cur, lowerBound, upperBound) {\n  'worklet'\n  if (cur > upperBound) return upperBound\n  if (cur < lowerBound) return lowerBound\n  return cur\n}\n\nconst systemInfo = wx.getSystemInfoSync()\nconst { statusBarHeight, screenHeight, screenWidth, safeArea } = systemInfo\nconsole.info('@@@ systemInfo', systemInfo)\nComponent({\n  properties: {\n\n  },\n\n  data: {\n    showAppbar: false,\n    maxCoverSize: 0,\n    statusBarHeight: 0,\n    musicCover: 'https://res.wx.qq.com/op_res/Nu9XXzXcXnD1j5EgWQ2ElxNcl1yMvnKypRo4MTbjOv7FC3saigGoOBTZibyESC7EXaClnPYhB6pvfb-IRmso6g'\n  },\n\n  lifetimes: {\n    attached() {\n      const progress = shared(0)\n      const initCoverSize = 60 // 初始图片大小\n      const pagePadding = 24\n      const maxCoverSize = screenWidth - 2 * pagePadding\n      const safeAreaInsetBottom = screenHeight - safeArea.bottom\n      const isIOS = systemInfo.system.indexOf('iOS') >= 0\n      this.setData({ statusBarHeight, maxCoverSize })\n      console.log('attached: ', statusBarHeight, maxCoverSize)\n\n      this.applyAnimatedStyle('.cover', () => {\n        'worklet'\n        const height = initCoverSize + (maxCoverSize - initCoverSize) * progress.value\n        console.log('height: ', maxCoverSize, initCoverSize, progress.value)\n        return {\n          width: `${height}px`,\n          height:`${height}px`,\n        }\n      })\n\n      this.applyAnimatedStyle('.expand-container', () => {\n        'worklet'\n        console.log('expand-container: ', maxCoverSize, initCoverSize, progress.value)\n        const t = progress.value\n        const maxRadius = 30\n        const radius = isIOS ? maxRadius * t : 0\n        const initBarHeight = initCoverSize + 8 * 2 + safeAreaInsetBottom\n        return {\n          top: `${(screenHeight - initBarHeight) * (1 - t)}px`,\n          borderRadius: `${radius}px ${radius}px 0px 0px`\n        }\n      })\n\n      this.applyAnimatedStyle('.title-wrap', () => {\n        'worklet'\n        console.log('title-wrap: ', maxCoverSize, initCoverSize, progress.value)\n        return {\n          opacity: 1 - progress.value\n        }\n      })\n\n      const navBarHeight = statusBarHeight + (isIOS ? 40 : 44)\n      this.applyAnimatedStyle('.nav-bar', () => {\n        'worklet'\n        console.log('nav-bar: ', maxCoverSize, initCoverSize, progress.value)\n        const t = progress.value\n        const threshold = 0.8\n        const opacity = t < threshold ? 0 : (t - threshold) / (1 - threshold)\n\n        return {\n          opacity,\n          height: `${navBarHeight * progress.value}px`\n        }\n      })\n\n      this.progress = progress\n    }\n  },\n\n  methods: {\n    close() {\n      this.progress.value = timing(0, {\n        duration: 250,\n        easing: Easing.ease\n      })\n    },\n\n    expand() {\n      this.progress.value = timing(1, {\n        duration: 250,\n        easing: Easing.ease\n      })\n    },\n\n    handleDragUpdate(delta) {\n      'worklet'\n      const curValue = this.progress.value\n      const newVal = curValue - delta\n      this.progress.value = clamp(newVal, 0.0, 1.0)\n    },\n\n    handleDragEnd(velocity) {\n      'worklet'\n      const t = this.progress.value\n      let animateForward = false\n      if (Math.abs(velocity) >= 1) {\n        animateForward = velocity <= 0\n      } else {\n        animateForward = t > 0.7\n      }\n      const animationCurve = Easing.out(Easing.ease)\n      if (animateForward) {\n        this.progress.value = timing(\n          1.0, {\n          duration: 200,\n          easing: animationCurve,\n        })\n      } else {\n        this.progress.value = timing(\n          0.0, {\n          duration: 250,\n          easing: animationCurve,\n        })\n      }\n    },\n\n    handleVerticalDrag(evt) {\n      'worklet'\n      if (evt.state === GestureState.ACTIVE) {\n        const delta = evt.deltaY / screenHeight\n        this.handleDragUpdate(delta)\n      } else if (evt.state === GestureState.END) {\n        const velocity = evt.velocityY / screenHeight\n        this.handleDragEnd(velocity)\n      } else if (evt.state === GestureState.CANCELLED) {\n        this.handleDragEnd(0.0)\n      }\n    },\n  },\n\n})"
  },
  {
    "path": "miniprogram/components/app-bar-course/index.wxml",
    "content": "<!-- components/app-bar/index.wxml -->\n<root-portal style=\"width: 100vw;height: 100vh;\">\n<vertical-drag-gesture-handler worklet:ongesture=\"handleVerticalDrag\">\n\t<view class=\"expand-container\">\n\t\t<!-- 放大模式：nav-bar -->\n\t\t<view class=\"nav-bar column\">\n\t\t\t<view style=\"height: {{statusBarHeight}}px;\" />\n\t\t\t<view style=\"flex: 1;\" class=\"column-main-center\">\n\t\t\t\t<image\n\t\t\t\t class=\"icon--back\"\n\t\t\t\t mode=\"aspectFill\"\n\t\t\t\t src=\"/assets/arrow-down.png\"\n\t\t\t\t bind:tap=\"close\"\n\t\t\t\t/>\n\t\t\t</view>\n\t\t</view>\n\n\t\t<!-- 跟着手势变化 -->\n\t\t<view class=\"cover-area\" style=\"height: {{maxCoverSize}}px;\">\n\t\t\t<view class=\"row \" bind:tap=\"expand\">\n\t\t\t\t<image class=\"cover\" mode=\"aspectFill\" src=\"{{musicCover}}\" />\n\t\t\t\t<view class=\"title-wrap row-between\">\n\t\t\t\t\t<view class=\"title column\">\n\t\t\t\t\t\t<text overflow=\"ellipsis\" max-lines=\"1\">Skyline 渲染框架入门与实践</text>\n\t\t\t\t\t\t<text class=\"name\" overflow=\"ellipsis\" max-lines=\"1\">小程序技术专员 - binnie</text>\n\t\t\t\t\t</view>\n\t\t\t\t\t<view class=\"row\">\n\t\t\t\t\t\t<image class=\"icon\" style=\"margin-right: 24px;\" src=\"/assets/play.png\" />\n\t\t\t\t\t\t<image class=\"icon\" src=\"/assets/next.png\" />\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</view>\n\n\t\t<!-- 放大模式：小字 -->\n\t\t<view class=\"row-between\">\n\t\t\t<text>微信学堂</text>\n\t\t\t<text>88 人在学</text>\n\t\t</view>\n\n\t\t<!-- 放大模式：标题 -->\n\t\t<view class=\"music-title column\" style=\"margin-top: 50px;\">\n\t\t\t<text>Skyline 渲染框架入门与实践</text>\n\t\t\t<text class=\"name\">小程序技术专员 - binnie</text>\n\t\t</view>\n\n\t\t<!-- 底部操作栏 -->\n\t\t<view class=\"footer row-between\" style=\"margin-top: 50px;\">\n\t\t\t<image class=\"icon\" src=\"/assets/next.png\" style=\"transform: rotate(180deg);\" />\n\t\t\t<image class=\"icon\" src=\"/assets/play.png\" />\n\t\t\t<image class=\"icon\" src=\"/assets/next.png\" />\n\t\t</view>\n\t</view>\n</vertical-drag-gesture-handler>\n</root-portal>\n"
  },
  {
    "path": "miniprogram/components/grid-tile/index.js",
    "content": "// components/grid-tile/index.js\nComponent({\n  /**\n   * 组件的属性列表\n   */\n  properties: {\n    height: {\n      type: Number,\n      value: 0,\n    },\n    index: {\n      type: Number,\n      value: 0,\n    },\n  },\n\n  /**\n   * 组件的初始数据\n   */\n  data: {\n\n  },\n\n  /**\n   * 组件的方法列表\n   */\n  methods: {\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/components/grid-tile/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/components/grid-tile/index.wxml",
    "content": "<view class=\"center\" style=\"width: 100%; height: {{height}}px; background-color: #6bbc7a;\">\n  <view class=\"center\" style=\"width: 60px; height: 60px; border-radius: 30px; background-color: white; color: black;\">\n    {{index}}\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/components/grid-tile/index.wxss",
    "content": "/* components/grid-tile/index.wxss */\n:host {\n  display: block;\n}\n\n.center {\n  text-align: center;\n  align-items: center;\n  justify-content: center;\n}"
  },
  {
    "path": "miniprogram/components/navigation-bar/index.js",
    "content": "const app = getApp().globalData\nComponent({\n  options: {\n    multipleSlots: true, // 在组件定义时的选项中启用多slot支持\n  },\n  /**\n   * 组件的属性列表\n   */\n  properties: {\n    title: {\n      type: String,\n      value: '',\n    },\n    background: {\n      type: String,\n      value: '',\n    },\n    color: {\n      type: String,\n      value: '',\n    },\n    back: {\n      type: Boolean,\n      value: true,\n    },\n    loading: {\n      type: Boolean,\n      value: false,\n    },\n    // back为true的时候，返回的页面深度\n    delta: {\n      type: Number,\n      value: 1,\n    },\n    sideWidth: {\n      type: Number,\n      value: 0,\n    },\n  },\n\n  attached() {\n    const isSupport = !!wx.getMenuButtonBoundingClientRect\n    const rect = wx.getMenuButtonBoundingClientRect ? wx.getMenuButtonBoundingClientRect() : null\n    const sideWidth = isSupport ? app.windowWidth - rect.left : 0\n\n    this.setData({\n      ios: !!(app.system.toLowerCase().search('ios') + 1),\n      sideWidth: this.data.sideWidth || sideWidth,\n      statusBarHeight: app.statusBarHeight,\n    })\n  },\n  /**\n   * 组件的方法列表\n   */\n  methods: {\n    back() {\n      const { data } = this\n      if (data.delta) {\n        wx.navigateBack({\n          delta: data.delta,\n        })\n      }\n      this.triggerEvent('back', { delta: data.delta }, {})\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/components/navigation-bar/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/components/navigation-bar/index.wxml",
    "content": "<view class=\"navigation-bar\">\n  <view class=\"navigation-bar__inner {{ios ? 'ios' : 'android'}}\" style=\"margin-top: {{statusBarHeight}}px; color: {{color}};background: {{background}}\">\n    <view class='navigation-bar__left' style=\"width: {{sideWidth}}px;\">\n      <block wx:if=\"{{back}}\">\n        <view class=\"navigation-bar__buttons\" bindtap=\"back\" >\n          <image class=\"navigation-bar__button navigation-bar__btn_goback\" hover-class=\"active\" src=\"../../images/back-arrow.png\"></image>\n        </view>\n      </block>\n      <block wx:else>\n        <slot name=\"left\"></slot>\n      </block>\n    </view>\n    <view class=\"navigation-bar__center {{title ? 'title' : ''}}\">\n      <view wx:if=\"{{loading}}\" class=\"navigation-bar__loading\">\n        <view class=\"loading\"></view>\n      </view>\n      <block wx:if=\"{{title}}\">{{title}}</block>\n      <block wx:else>\n        <slot name=\"center\"></slot>\n      </block>\n    </view>\n    <view class='navigation-bar__right' style=\"width: {{sideWidth}}px;\">\n      <slot name=\"right\"></slot>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/components/navigation-bar/index.wxss",
    "content": ".navigation-bar {\n  background-color: #f7f7f7;\n}\n\n.navigation-bar .android {\n  height: 48px;\n}\n\n.navigation-bar__inner {\n  height: 44px;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.navigation-bar__inner .navigation-bar__left {\n  position: relative;\n  padding-left: 16px;\n  height: 100%;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.navigation-bar__inner .navigation-bar__left .navigation-bar__buttons {\n  height: 100%;\n  flex-direction: row;\n  align-items: center;\n  min-width: 50px;\n}\n\n.navigation-bar__inner .navigation-bar__left .navigation-bar__btn {\n  display: inline-block;\n  vertical-align: middle;\n  background-repeat: no-repeat;\n  height: 100%;\n  flex-direction: row;\n  align-items: center;\n}\n\n.navigation-bar__inner .navigation-bar__left .navigation-bar__btn_goback {\n  width: 8px;\n  height: 14px;\n}\n\n.navigation-bar__inner .navigation-bar__center {\n  font-size: 17px;\n  text-align: center;\n  position: relative;\n  flex: 1;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.navigation-bar__inner .navigation-bar__center.title {\n  display: inline-block;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  white-space: nowrap;\n}\n\n.navigation-bar__inner .navigation-bar__loading {\n  margin-right: 4px;\n  display: inline-flex;\n  align-items: center;\n}\n\n.navigation-bar__inner .navigation-bar__loading .loading {\n  margin-left: 0;\n}\n\n.navigation-bar__inner .navigation-bar__right {\n  padding-right: 16px;\n}\n"
  },
  {
    "path": "miniprogram/components/page-scroll/index.js",
    "content": "const globalThis = this; const\n  self = this\nmodule.exports =\nrequire('../../_commons/0.js')([\n  {\n    ids: [6],\n    modules: {\n\n      /***/ './node_modules/@mpflow/webpack-plugin/lib/loaders/page-loader.js?appContext=src&outputPath=components%2Fpage-scroll%2Findex!./src/components/page-scroll/index.ts':\n      /*! *************************************************************************************************************************************************************************!*\\\n  !*** ./node_modules/@mpflow/webpack-plugin/lib/loaders/page-loader.js?appContext=src&outputPath=components%2Fpage-scroll%2Findex!./src/components/page-scroll/index.ts ***!\n  \\************************************************************************************************************************************************************************ */\n      /*! no static exports found */\n      /***/ (function (module, exports, __webpack_require__) {\n        module.exports = __webpack_require__(/*! ./index.ts */ './src/components/page-scroll/index.ts')\n        /***/ }),\n\n      /***/ './src/components/page-scroll/index.ts':\n      /*! *********************************************!*\\\n  !*** ./src/components/page-scroll/index.ts ***!\n  \\******************************************** */\n      /*! no static exports found */\n      /***/ (function (module, exports) {\n        Component({\n          options: {\n            virtualHost: true\n          },\n          properties: {\n            refresherEnabled: {\n              type: Boolean,\n              value: false\n            },\n            refresherThreshold: {\n              type: Number,\n              value: 45\n            },\n            refresherDefaultStyle: {\n              type: String,\n              value: 'black'\n            },\n            refresherBackground: {\n              type: String,\n              value: '#FFF'\n            },\n            refresherTriggered: {\n              type: Boolean,\n              value: false\n            },\n            lowerThreshold: {\n              type: Number,\n              value: 50\n            },\n            scrollIntoView: {\n              type: String,\n              value: ''\n            }\n          },\n          methods: {\n            onScroll: function onScroll(e) {\n              this.triggerEvent('scroll', e.detail)\n            },\n            onScrollToLower: function onScrollToLower(e) {\n              this.triggerEvent('scrollToLower', e.detail)\n            },\n            onPulling: function onPulling(e) {\n              this.triggerEvent('pulling', e.detail)\n            },\n            onRefresh: function onRefresh(e) {\n              this.triggerEvent('refresh', e.detail)\n            },\n            onRestore: function onRestore(e) {\n              this.triggerEvent('restore', e.detail)\n            },\n            onAbort: function onAbort(e) {\n              this.triggerEvent('abort', e.detail)\n            }\n          }\n        })\n        /***/ })\n\n    },\n    entries: [['./node_modules/@mpflow/webpack-plugin/lib/loaders/page-loader.js?appContext=src&outputPath=components%2Fpage-scroll%2Findex!./src/components/page-scroll/index.ts', 0]]\n  },\n])\n\n// # sourceMappingURL=index.js.map\n"
  },
  {
    "path": "miniprogram/components/page-scroll/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/components/page-scroll/index.wxml",
    "content": "<scroll-view style=\"flex: 1; overflow: auto; width: 100%;\" scroll-y scroll-anchoring enable-back-to-top enhanced scroll-into-view=\"{{ scrollIntoView }}\" refresher-enabled=\"{{ refresherEnabled }}\" refresher-threshold=\"{{ refresherThreshold }}\" refresher-default-style=\"{{ refresherDefaultStyle }}\" refresher-background=\"{{ refresherBackground }}\" refresher-triggered=\"{{ refresherTriggered }}\" bindscroll=\"onScroll\" lower-threshold=\"{{ lowerThreshold }}\" bindscrolltolower=\"onScrollToLower\" bindrefresherpulling=\"onPulling\" bindrefresherrefresh=\"onRefresh\" bindrefresherrestore=\"onRestore\" bindrefresherabort=\"onAbort\" type=\"list\">\n\t<view>\n\t\t<slot/>\n\t</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/components/page-scroll/index.wxss",
    "content": "\n\n\n/* # sourceMappingURL=index.wxss.map */"
  },
  {
    "path": "miniprogram/components/popup/index.js",
    "content": "Component({\n  properties: {\n    maskClosable: {\n      type: Boolean,\n      value: true,\n    },\n    mask: {\n      // 是否需要 遮罩层\n      type: Boolean,\n      value: true,\n    },\n    maskStyle: {\n      // 遮罩层的样式\n      type: String,\n      value: '',\n    },\n    show: {\n      // 是否开启弹窗\n      type: Boolean,\n      value: false,\n    },\n  },\n  data: {\n    enable: true,\n  },\n  methods: {\n    close() {\n      const { data } = this\n      console.log('@@@ close', data.maskClosable)\n      if (!data.maskClosable) return\n      this.setData({\n        enable: !this.data.enable\n      })\n      this.triggerEvent('close', {}, {})\n    },\n    // stopEvent() {},\n  },\n})\n"
  },
  {
    "path": "miniprogram/components/popup/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/components/popup/index.wxml",
    "content": "<root-portal wx:if=\"{{show}}\" enable=\"{{enable}}\">\n  <view class=\"popup\" bindtap=\"close\">\n    <slot></slot>\n  </view>\n</root-portal>\n"
  },
  {
    "path": "miniprogram/components/popup/index.wxss",
    "content": "root-portal {\n  display: flex;\n  width: 100%;\n  height: 100%;\n}\n\n.popup {\n  position: absolute;\n  bottom: 0;\n  top: 0;\n  z-index: 5000;\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n  align-items: center;\n  width: 100vw;\n  /* height: 200px; */\n  background: rgba(51, 51, 51, 0.65);\n  opacity: 1;\n  transform: scale3d(1, 1, 1);\n  transition: all .2s ease-in;\n  pointer-events: auto;\n}\n"
  },
  {
    "path": "miniprogram/config.js",
    "content": "/**\n * 小程序配置文件\n */\n\nconst host = '14592619.qcloud.la'\n\nconst config = {\n  // 测试的请求地址，用于测试会话\n  requestUrl: 'https://mp.weixin.qq.com',\n  host,\n\n  // 云开发环境 ID\n  envId: 'release-b86096',\n  // envId: 'test-f0b102',\n\n  // 云开发-存储 示例文件的文件 ID\n  demoImageFileId: 'cloud://release-b86096.7265-release-b86096-1258211818/demo.jpg',\n  demoVideoFileId: 'cloud://release-b86096.7265-release-b86096/demo.mp4',\n}\n\nmodule.exports = config\n"
  },
  {
    "path": "miniprogram/demo.theme.json",
    "content": "{\n  \"light\": {\n    \"navigationBarTextStyle\": \"black\",\n    \"navigationBarBackgroundColor\": \"#F7F7F7\",\n    \"backgroundColor\": \"#F7F7F7\",\n\n    \"tabBarColor\": \"#7A7E83\",\n    \"tabBarSelectedColor\": \"#3cc51f\",\n    \"tabBarBorderStyle\": \"black\",\n    \"tabBarBackgroundColor\": \"#F7F7F7\",\n\n    \"iconPathComponent\": \"image/icon_component.png\",\n    \"selectedIconPathComponent\": \"image/icon_component_HL.png\",\n    \"iconPathAPI\": \"image/icon_API.png\",\n    \"selectedIconPathAPI\": \"image/icon_API_HL.png\",\n    \"iconPathCloud\": \"image/icon_cloud.png\",\n    \"selectedIconPathCloud\": \"image/icon_cloud_HL.png\",\n    \"iconPathAd\": \"image/icon_ad.png\",\n    \"selectedIconPathAd\": \"image/icon_ad_HL.png\",\n\n    \"backgroundTextStyle\": \"dark\"\n  },\n  \"dark\": {\n    \"navigationBarTextStyle\": \"white\",\n    \"navigationBarBackgroundColor\": \"#1F1F1F\",\n    \"backgroundColor\": \"#1F1F1F\",\n\n    \"tabBarColor\": \"#FFFFFF\",\n    \"tabBarSelectedColor\": \"#51A937\",\n    \"tabBarBorderStyle\": \"white\",\n    \"tabBarBackgroundColor\": \"#1F1F1F\",\n\n    \"iconPathComponent\": \"image/icon_component_dark.png\",\n    \"selectedIconPathComponent\": \"image/icon_component_HL.png\",\n    \"iconPathAPI\": \"image/icon_API_dark.png\",\n    \"selectedIconPathAPI\": \"image/icon_API_HL.png\",\n    \"iconPathCloud\": \"image/icon_cloud_dark.png\",\n    \"selectedIconPathCloud\": \"image/icon_cloud_HL.png\",\n    \"iconPathAd\": \"image/icon_ad_dark.png\",\n    \"selectedIconPathAd\": \"image/icon_ad_HL.png\",\n\n    \"backgroundTextStyle\": \"light\"\n  }\n}"
  },
  {
    "path": "miniprogram/package.json",
    "content": "{\n  \"name\": \"miniprogram\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"app.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"miniprogram-barrage\": \"^1.1.0\",\n    \"miniprogram-recycle-view\": \"^0.1.5\",\n    \"wxml-to-canvas\": \"^1.1.1\",\n    \"threejs-miniprogram\": \"0.0.3\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Cell Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nalign | String | middle | options: top/middle/bottom | N\narrow | Boolean / Object | false | \\- | N\nbordered | Boolean | true | \\- | N\ndescription | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nhover | Boolean | - | \\- | N\nimage | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\njump-type | String | navigateTo | options: switchTab/reLaunch/redirectTo/navigateTo | N\nleft-icon | String / Object / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nnote | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nrequired | Boolean | false | \\- | N\nright-icon | String / Object / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ntitle | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nurl | String | - | \\- | N\n\n### Cell Events\n\nname | params | description\n-- | -- | --\nclick | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts)\n### Cell External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-center | \\-\nt-class-description | \\-\nt-class-hover | \\-\nt-class-image | \\-\nt-class-left | \\-\nt-class-left-icon | \\-\nt-class-note | \\-\nt-class-right | \\-\nt-class-right-icon | \\-\nt-class-title | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-cell-group-border-color | @border-color | - \n--td-cell-group-title-bg-color | @bg-color-secondarycontainer | - \n--td-cell-group-title-color | @font-gray-3 | - \n--td-cell-group-title-font-size | 28rpx | - \n--td-cell-group-title-line-height | 90rpx | - \n--td-cell-group-title-padding-left | 32rpx | - \n--td-cell-bg-color | @bg-color-container | - \n--td-cell-border-color | @component-stroke | - \n--td-cell-border-width | 1px | - \n--td-cell-border-left-space | @cell-horizontal-padding | - \n--td-cell-border-right-space | 0 | - \n--td-cell-description-color | @font-gray-2 | - \n--td-cell-description-font-size | @font-size-base | - \n--td-cell-description-line-height | 44rpx | - \n--td-cell-height | auto | - \n--td-cell-horizontal-padding | 32rpx | - \n--td-cell-hover-color | @bg-color-secondarycontainer | - \n--td-cell-image-height | 96rpx | - \n--td-cell-image-width | 96rpx | - \n--td-cell-left-icon-color | @brand-color | - \n--td-cell-left-icon-font-size | 48rpx | - \n--td-cell-line-height | 48rpx | - \n--td-cell-note-color | @font-gray-3 | - \n--td-cell-note-font-size | @font-size-m | - \n--td-cell-required-color | @error-color-6 | - \n--td-cell-required-font-size | @font-size-m | - \n--td-cell-right-icon-color | @font-gray-3 | - \n--td-cell-right-icon-font-size | 48rpx | - \n--td-cell-title-color | @font-gray-1 | - \n--td-cell-title-font-size | @font-size-m | - \n--td-cell-vertical-padding | 32rpx | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell/README.md",
    "content": "---\ntitle: Cell 单元格\ndescription: 用于各个类别行的信息展示。\nspline: data\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-100%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-cell\": \"tdesign-miniprogram/cell/cell\",\n  \"t-cell-group\": \"tdesign-miniprogram/cell-group/cell-group\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/bz7aGimL72S2\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 类型\n\n单行单元格\n\n<img src=\"https://tdesign.gtimg.com/miniprogram/readme/cell-1.png\" width=\"375px\" height=\"50%\">\n\n{{ base }}\n\n多行单元格\n\n<img src=\"https://tdesign.gtimg.com/miniprogram/readme/cell-2.png\" width=\"375px\" height=\"50%\">\n\n{{ multiple }}\n\n### 样式\n\n卡片单元格\n\n{{ theme }}\n\n## API\n\n### Cell Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nalign | String | middle | 内容的对齐方式，默认居中对齐。可选项：top/middle/bottom | N\narrow | Boolean / Object | false | 是否显示右侧箭头 | N\nbordered | Boolean | true | 是否显示下边框 | N\ndescription | String / Slot | - | 下方内容描述。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nhover | Boolean | - | 是否开启点击反馈 | N\nimage | String / Slot | - | 主图。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\njump-type | String | navigateTo | 链接跳转类型。可选项：switchTab/reLaunch/redirectTo/navigateTo | N\nleft-icon | String / Object / Slot | - | 左侧图标，出现在单元格标题的左侧。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nnote | String / Slot | - | 和标题同行的说明文字。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nrequired | Boolean | false | 是否显示表单必填星号 | N\nright-icon | String / Object / Slot | - | 最右侧图标。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ntitle | String / Slot | - | 标题。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nurl | String | - | 点击后跳转链接地址。如果值为空，则表示不需要跳转 | N\n\n### Cell Events\n\n名称 | 参数 | 描述\n-- | -- | --\nclick | - | 右侧内容。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts)\n### Cell External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-center | 中间（`title`, `description`）内容样式类\nt-class-description | 下方描述内容样式类\nt-class-hover | 悬停样式类\nt-class-image | 图片样式类\nt-class-left | 左侧内容样式类\nt-class-left-icon | 左侧图标样式类\nt-class-note | 右侧说明文字样式类\nt-class-right | 右侧内容样式类\nt-class-right-icon | 右侧图标样式类\nt-class-title | 标题样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-cell-group-border-color | @component-stroke | - \n--td-cell-group-title-bg-color | @bg-color-secondarycontainer | - \n--td-cell-group-title-color | @font-gray-3 | - \n--td-cell-group-title-font-size | 28rpx | - \n--td-cell-group-title-line-height | 90rpx | - \n--td-cell-group-title-padding-left | 32rpx | - \n--td-cell-bg-color | @bg-color-container | - \n--td-cell-border-color | @component-stroke | - \n--td-cell-border-width | 1px | - \n--td-cell-border-left-space | @cell-horizontal-padding | - \n--td-cell-border-right-space | 0 | - \n--td-cell-description-color | @font-gray-2 | - \n--td-cell-description-font-size | @font-size-base | - \n--td-cell-description-line-height | 44rpx | - \n--td-cell-height | auto | - \n--td-cell-horizontal-padding | 32rpx | - \n--td-cell-hover-color | @bg-color-secondarycontainer | - \n--td-cell-image-height | 96rpx | - \n--td-cell-image-width | 96rpx | - \n--td-cell-left-icon-color | @brand-color | - \n--td-cell-left-icon-font-size | 48rpx | - \n--td-cell-line-height | 48rpx | - \n--td-cell-note-color | @font-gray-3 | - \n--td-cell-note-font-size | @font-size-m | - \n--td-cell-required-color | @error-color-6 | - \n--td-cell-required-font-size | @font-size-m | - \n--td-cell-right-icon-color | @font-gray-3 | - \n--td-cell-right-icon-font-size | 48rpx | - \n--td-cell-title-color | @font-gray-1 | - \n--td-cell-title-font-size | @font-size-m | - \n--td-cell-vertical-padding | 32rpx | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell/cell.d.ts",
    "content": "import { SuperComponent, RelationsOptions } from '../common/src/index';\nexport default class Cell extends SuperComponent {\n    externalClasses: string[];\n    relations: RelationsOptions;\n    options: {\n        multipleSlots: boolean;\n    };\n    properties: import(\"./type\").TdCellProps;\n    data: {\n        prefix: string;\n        classPrefix: string;\n        isLastChild: boolean;\n    };\n    observers: {\n        leftIcon(v: any): void;\n        rightIcon(v: any): void;\n        arrow(v: any): void;\n    };\n    setIcon(name: any, value: any, defaultValue: any): void;\n    onClick(e: any): void;\n    jumpLink(urlKey?: string, link?: string): void;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell/cell.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport { calcIcon } from '../common/utils';\nconst { prefix } = config;\nconst name = `${prefix}-cell`;\nlet Cell = class Cell extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [\n            `${prefix}-class`,\n            `${prefix}-class-title`,\n            `${prefix}-class-description`,\n            `${prefix}-class-note`,\n            `${prefix}-class-hover`,\n            `${prefix}-class-image`,\n            `${prefix}-class-left`,\n            `${prefix}-class-left-icon`,\n            `${prefix}-class-center`,\n            `${prefix}-class-right`,\n            `${prefix}-class-right-icon`,\n        ];\n        this.relations = {\n            '../cell-group/cell-group': {\n                type: 'parent',\n            },\n        };\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n            isLastChild: false,\n        };\n        this.observers = {\n            leftIcon(v) {\n                this.setIcon('_leftIcon', v, '');\n            },\n            rightIcon(v) {\n                this.setIcon('_rightIcon', v, '');\n            },\n            arrow(v) {\n                this.setIcon('_arrow', v, 'chevron-right');\n            },\n        };\n    }\n    setIcon(name, value, defaultValue) {\n        this.setData({\n            [name]: calcIcon(value, defaultValue),\n        });\n    }\n    onClick(e) {\n        this.triggerEvent('click', e.detail);\n        this.jumpLink();\n    }\n    jumpLink(urlKey = 'url', link = 'jumpType') {\n        const url = this.data[urlKey];\n        const jumpType = this.data[link];\n        if (url) {\n            wx[jumpType]({ url });\n        }\n    }\n};\nCell = __decorate([\n    wxComponent()\n], Cell);\nexport default Cell;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell/cell.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\",\n    \"t-image\": \"../image/image\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell/cell.wxml",
    "content": "<import src=\"../common/template/icon.wxml\" />\n<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  style=\"{{_._style([style, customStyle])}}\"\n  class=\"class {{prefix}}-class {{classPrefix}} {{ !bordered || isLastChild ? classPrefix + '--borderless' : ''}} {{classPrefix}}--{{align}}\"\n  hover-class=\"{{ hover ? classPrefix + '--hover' : ''}}\"\n  hover-stay-time=\"70\"\n  bind:tap=\"onClick\"\n  aria-role=\"{{ariaRole || (arrow ? 'button' : '')}}\"\n  aria-label=\"{{ariaLabel}}\"\n>\n  <view class=\"{{classPrefix}}__left {{prefix}}-class-left\">\n    <template\n      wx:if=\"{{_leftIcon}}\"\n      is=\"icon\"\n      data=\"{{tClass: classPrefix + '__left-icon ' + prefix + '-class-left-icon', ..._leftIcon }}\"\n    />\n    <slot name=\"left-icon\" />\n    <t-image\n      wx:if=\"{{ image }}\"\n      shape=\"round\"\n      t-class=\"{{classPrefix}}__left-image {{prefix}}-class-image\"\n      src=\"{{ image }}\"\n    />\n    <slot name=\"image\" />\n  </view>\n  <view class=\"{{classPrefix}}__title {{prefix}}-class-center\">\n    <view class=\"{{classPrefix}}__title-text {{prefix}}-class-title\">\n      <block wx:if=\"{{ title }}\"> {{ title}} </block>\n      <slot name=\"title\" />\n      <block wx:if=\"{{required}}\">\n        <text decode class=\"{{classPrefix}}--required\">&nbsp;*</text>\n      </block>\n    </view>\n\n    <view class=\"{{classPrefix}}__description {{prefix}}-class-description\">\n      <view wx:if=\"{{ description }}\" class=\"{{classPrefix}}__description-text\">{{description}}</view>\n      <slot name=\"description\" />\n    </view>\n  </view>\n\n  <view class=\"{{classPrefix}}__note {{prefix}}-class-note\">\n    <text wx:if=\"{{ note }}\">{{note}}</text>\n    <slot name=\"note\" />\n  </view>\n\n  <view class=\"{{classPrefix}}__right {{prefix}}-class-right\">\n    <template\n      wx:if=\"{{_arrow}}\"\n      is=\"icon\"\n      data=\"{{tClass: classPrefix + '__right-icon ' + prefix + '-class-right-icon', ..._arrow }}\"\n    />\n    <block wx:else>\n      <template\n        wx:if=\"{{_rightIcon}}\"\n        is=\"icon\"\n        data=\"{{tClass: classPrefix + '__right-icon ' + prefix + '-class-right-icon', ..._rightIcon }}\"\n      />\n      <slot name=\"right-icon\" />\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell/cell.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-cell {\n  position: relative;\n  display: flex;\n  box-sizing: border-box;\n  width: 100%;\n  padding: var(--td-cell-vertical-padding, 32rpx) var(--td-cell-horizontal-padding, 32rpx);\n  line-height: var(--td-cell-line-height, 48rpx);\n  height: var(--td-cell-height, auto);\n  background-color: var(--td-cell-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n}\n.t-cell::after {\n  position: absolute;\n  box-sizing: border-box;\n  content: ' ';\n  pointer-events: none;\n  right: 0;\n  left: 0;\n  bottom: 0;\n  border-bottom: var(--td-cell-border-width, 1px) solid var(--td-cell-border-color, var(--td-component-stroke, var(--td-gray-color-3, #e7e7e7)));\n  transform: scaleY(0.5);\n  transform-origin: bottom;\n  left: var(--td-cell-border-left-space, var(--td-cell-horizontal-padding, 32rpx));\n  right: var(--td-cell-border-right-space, 0);\n}\n.t-cell--borderless::after {\n  display: none;\n}\n.t-cell__description {\n  font-size: var(--td-cell-description-font-size, var(--td-font-size-base, 28rpx));\n  line-height: var(--td-cell-description-line-height, 44rpx);\n  color: var(--td-cell-description-color, var(--td-text-color-secondary, var(--td-font-gray-2, rgba(0, 0, 0, 0.6))));\n}\n.t-cell__description-text {\n  margin-top: calc(var(--td-spacer, 16rpx) / 2);\n}\n.t-cell__note {\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  color: var(--td-cell-note-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n  font-size: var(--td-cell-note-font-size, var(--td-font-size-m, 32rpx));\n}\n.t-cell__title,\n.t-cell__note {\n  flex: 1 1 auto;\n}\n.t-cell__title:empty,\n.t-cell__note:empty {\n  display: none;\n}\n.t-cell__title-text {\n  display: flex;\n  font-size: var(--td-cell-title-font-size, var(--td-font-size-m, 32rpx));\n  color: var(--td-cell-title-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  font-weight: 400;\n}\n.t-cell__left,\n.t-cell__right {\n  display: flex;\n  align-items: center;\n}\n.t-cell__left:not(:empty) {\n  margin-right: var(--td-spacer, 16rpx);\n}\n.t-cell__left-icon {\n  color: var(--td-cell-left-icon-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  font-size: var(--td-cell-left-icon-font-size, 48rpx);\n}\n.t-cell__left-image {\n  height: var(--td-cell-image-height, 96rpx);\n  width: var(--td-cell-image-width, 96rpx);\n}\n.t-cell__right {\n  margin-left: calc(var(--td-spacer, 16rpx) / 2);\n}\n.t-cell__right-icon {\n  color: var(--td-cell-right-icon-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n  font-size: var(--td-cell-right-icon-font-size, 48rpx);\n}\n.t-cell--hover {\n  background-color: var(--td-cell-hover-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n}\n.t-cell--required {\n  font-size: var(--td-cell-required-font-size, var(--td-font-size-m, 32rpx));\n  color: var(--td-cell-required-color, var(--td-error-color-6, #d54941));\n}\n.t-cell--middle {\n  align-items: center;\n}\n.t-cell--top {\n  align-items: flex-start;\n}\n.t-cell--bottom {\n  align-items: flex-end;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell/props.d.ts",
    "content": "import { TdCellProps } from './type';\ndeclare const props: TdCellProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell/props.js",
    "content": "const props = {\n    align: {\n        type: String,\n        value: 'middle',\n    },\n    arrow: {\n        type: null,\n        value: false,\n    },\n    bordered: {\n        type: Boolean,\n        value: true,\n    },\n    description: {\n        type: String,\n    },\n    hover: {\n        type: Boolean,\n    },\n    image: {\n        type: String,\n    },\n    jumpType: {\n        type: String,\n        value: 'navigateTo',\n    },\n    leftIcon: {\n        type: null,\n    },\n    note: {\n        type: String,\n    },\n    required: {\n        type: Boolean,\n        value: false,\n    },\n    rightIcon: {\n        type: null,\n    },\n    title: {\n        type: String,\n    },\n    url: {\n        type: String,\n        value: '',\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell/type.d.ts",
    "content": "export interface TdCellProps {\n    align?: {\n        type: StringConstructor;\n        value?: 'top' | 'middle' | 'bottom';\n    };\n    arrow?: {\n        type: null;\n        value?: boolean | object;\n    };\n    bordered?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    description?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    hover?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    image?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    jumpType?: {\n        type: StringConstructor;\n        value?: 'switchTab' | 'reLaunch' | 'redirectTo' | 'navigateTo';\n    };\n    leftIcon?: {\n        type: null;\n        value?: string | object;\n    };\n    note?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    required?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    rightIcon?: {\n        type: null;\n        value?: string | object;\n    };\n    title?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    url?: {\n        type: StringConstructor;\n        value?: string;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell-group/cell-group.d.ts",
    "content": "import { SuperComponent, RelationsOptions } from '../common/src/index';\nexport default class CellGroup extends SuperComponent {\n    externalClasses: string[];\n    relations: RelationsOptions;\n    properties: import(\"./type\").TdCellGroupProps;\n    data: {\n        prefix: string;\n        classPrefix: string;\n    };\n    methods: {\n        updateLastChid(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell-group/cell-group.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-cell-group`;\nlet CellGroup = class CellGroup extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-title`];\n        this.relations = {\n            '../cell/cell': {\n                type: 'child',\n                linked() {\n                    this.updateLastChid();\n                },\n                unlinked() {\n                    this.updateLastChid();\n                },\n            },\n        };\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n        };\n        this.methods = {\n            updateLastChid() {\n                const items = this.$children;\n                items.forEach((child, index) => child.setData({ isLastChild: index === items.length - 1 }));\n            },\n        };\n    }\n};\nCellGroup = __decorate([\n    wxComponent()\n], CellGroup);\nexport default CellGroup;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell-group/cell-group.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell-group/cell-group.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view wx:if=\"{{ title }}\" class=\"class {{ classPrefix }}__title {{prefix}}-class-title\"> {{ title }} </view>\n<view\n  style=\"{{_._style([style, customStyle])}}\"\n  class=\"{{_.cls(classPrefix, [['bordered', bordered], theme])}} class {{prefix}}-class\"\n>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell-group/cell-group.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-cell-group {\n  position: relative;\n}\n.t-cell-group__title {\n  font-family: PingFangSC-Regular;\n  font-size: var(--td-cell-group-title-font-size, 28rpx);\n  color: var(--td-cell-group-title-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n  text-align: left;\n  line-height: var(--td-cell-group-title-line-height, 90rpx);\n  background-color: var(--td-cell-group-title-bg-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n  padding-left: var(--td-cell-group-title-padding-left, 32rpx);\n}\n.t-cell-group--bordered::before {\n  position: absolute;\n  box-sizing: border-box;\n  content: ' ';\n  pointer-events: none;\n  right: 0;\n  left: 0;\n  top: 0;\n  border-top: 1px solid var(--td-cell-group-border-color, var(--td-component-stroke, var(--td-gray-color-3, #e7e7e7)));\n  transform: scaleY(0.5);\n  transform-origin: 0 0;\n  transform-origin: top;\n  z-index: 1;\n}\n.t-cell-group--bordered::after {\n  position: absolute;\n  box-sizing: border-box;\n  content: ' ';\n  pointer-events: none;\n  right: 0;\n  left: 0;\n  bottom: 0;\n  border-bottom: 1px solid var(--td-cell-group-border-color, var(--td-component-stroke, var(--td-gray-color-3, #e7e7e7)));\n  transform: scaleY(0.5);\n  transform-origin: bottom;\n  z-index: 1;\n}\n.t-cell-group--card {\n  margin: 0 32rpx;\n  border-radius: var(--td-radius-large, 18rpx);\n  overflow: hidden;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell-group/props.d.ts",
    "content": "import { TdCellGroupProps } from './type';\ndeclare const props: TdCellGroupProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell-group/props.js",
    "content": "const props = {\n    bordered: {\n        type: Boolean,\n    },\n    externalClasses: {\n        type: Array,\n    },\n    theme: {\n        type: String,\n        value: 'default',\n    },\n    title: {\n        type: String,\n        value: '',\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell-group/type.d.ts",
    "content": "export interface TdCellGroupProps {\n    bordered?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    style?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    externalClasses?: {\n        type: ArrayConstructor;\n        value?: ['t-class'];\n    };\n    theme?: {\n        type: StringConstructor;\n        value?: 'default' | 'card';\n    };\n    title?: {\n        type: StringConstructor;\n        value?: string;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/cell-group/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/col/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Col Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\noffset | String / Number | - | \\- | N\nspan | String / Number | - | \\- | N\n\n\n### Row Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ngutter | String / Number | - | \\- | N\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/col/README.md",
    "content": "---\ntitle: Layout 布局\ndescription: 以规则的网格阵列来指导和规范页面中的版面布局以及信息分布，提高界面内布局的一致性，节约成本。\nspline: base\nisComponent: true\n---\n\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-row\": \"tdesign-miniprogram/row/row\",\n  \"t-col\": \"tdesign-miniprogram/col/col\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/WwISnbmq7RSC\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n\n### 组件类型\n\n基础\n\n{{ base }}\n\n\n增加间距\n\n{{ offset }}\n\n\n\n## API\n\n### Col Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\noffset | String / Number | - | 列的偏移量（默认单位px） | N\nspan | String / Number | - | 列的宽度（默认单位px） | N\n\n\n### Row Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ngutter | String / Number | - | 列之间的间距（默认单位px） | N\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/col/col.d.ts",
    "content": "import { SuperComponent, RelationsOptions } from '../common/src/index';\nexport default class Col extends SuperComponent {\n    externalClasses: string[];\n    properties: import(\"./type\").TdColProps;\n    data: {\n        prefix: string;\n        classPrefix: string;\n    };\n    relations: RelationsOptions;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/col/col.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-col`;\nlet Col = class Col extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`];\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n        };\n        this.relations = {\n            '../row/row': {\n                type: 'parent',\n            },\n        };\n    }\n};\nCol = __decorate([\n    wxComponent()\n], Col);\nexport default Col;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/col/col.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/col/col.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n<wxs src=\"./col.wxs\" module=\"utils\" />\n\n<view\n  class=\"class {{prefix}}-class {{ _.cls(classPrefix, [span]) }} {{ offset ? classPrefix + '--offset-' + offset : '' }}\"\n  style=\"{{ utils.getColStyles(gutter, style, customStyle) }}\"\n>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/col/col.wxs",
    "content": "var utils = require('../common/utils.wxs');\n\nfunction getColStyles(gutter, style, customStyle) {\n  var _style = '';\n  if (gutter) {\n    _style = utils._style({\n      'padding-right': utils.addUnit(gutter / 2),\n      'padding-left': utils.addUnit(gutter / 2),\n    });\n  }\n\n  return utils._style([style, customStyle]) + _style;\n}\n\nmodule.exports = {\n  getColStyles: getColStyles,\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/col/col.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-col {\n  display: block;\n  box-sizing: border-box;\n  min-height: 1px;\n}\n.t-col--1 {\n  width: 4.16666667%;\n}\n.t-col--offset-1 {\n  margin-left: 4.16666667%;\n}\n.t-col--2 {\n  width: 8.33333333%;\n}\n.t-col--offset-2 {\n  margin-left: 8.33333333%;\n}\n.t-col--3 {\n  width: 12.5%;\n}\n.t-col--offset-3 {\n  margin-left: 12.5%;\n}\n.t-col--4 {\n  width: 16.66666667%;\n}\n.t-col--offset-4 {\n  margin-left: 16.66666667%;\n}\n.t-col--5 {\n  width: 20.83333333%;\n}\n.t-col--offset-5 {\n  margin-left: 20.83333333%;\n}\n.t-col--6 {\n  width: 25%;\n}\n.t-col--offset-6 {\n  margin-left: 25%;\n}\n.t-col--7 {\n  width: 29.16666667%;\n}\n.t-col--offset-7 {\n  margin-left: 29.16666667%;\n}\n.t-col--8 {\n  width: 33.33333333%;\n}\n.t-col--offset-8 {\n  margin-left: 33.33333333%;\n}\n.t-col--9 {\n  width: 37.5%;\n}\n.t-col--offset-9 {\n  margin-left: 37.5%;\n}\n.t-col--10 {\n  width: 41.66666667%;\n}\n.t-col--offset-10 {\n  margin-left: 41.66666667%;\n}\n.t-col--11 {\n  width: 45.83333333%;\n}\n.t-col--offset-11 {\n  margin-left: 45.83333333%;\n}\n.t-col--12 {\n  width: 50%;\n}\n.t-col--offset-12 {\n  margin-left: 50%;\n}\n.t-col--13 {\n  width: 54.16666667%;\n}\n.t-col--offset-13 {\n  margin-left: 54.16666667%;\n}\n.t-col--14 {\n  width: 58.33333333%;\n}\n.t-col--offset-14 {\n  margin-left: 58.33333333%;\n}\n.t-col--15 {\n  width: 62.5%;\n}\n.t-col--offset-15 {\n  margin-left: 62.5%;\n}\n.t-col--16 {\n  width: 66.66666667%;\n}\n.t-col--offset-16 {\n  margin-left: 66.66666667%;\n}\n.t-col--17 {\n  width: 70.83333333%;\n}\n.t-col--offset-17 {\n  margin-left: 70.83333333%;\n}\n.t-col--18 {\n  width: 75%;\n}\n.t-col--offset-18 {\n  margin-left: 75%;\n}\n.t-col--19 {\n  width: 79.16666667%;\n}\n.t-col--offset-19 {\n  margin-left: 79.16666667%;\n}\n.t-col--20 {\n  width: 83.33333333%;\n}\n.t-col--offset-20 {\n  margin-left: 83.33333333%;\n}\n.t-col--21 {\n  width: 87.5%;\n}\n.t-col--offset-21 {\n  margin-left: 87.5%;\n}\n.t-col--22 {\n  width: 91.66666667%;\n}\n.t-col--offset-22 {\n  margin-left: 91.66666667%;\n}\n.t-col--23 {\n  width: 95.83333333%;\n}\n.t-col--offset-23 {\n  margin-left: 95.83333333%;\n}\n.t-col--24 {\n  width: 100%;\n}\n.t-col--offset-24 {\n  margin-left: 100%;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/col/props.d.ts",
    "content": "import { TdColProps } from './type';\ndeclare const props: TdColProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/col/props.js",
    "content": "const props = {\n    offset: {\n        type: null,\n    },\n    span: {\n        type: null,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/col/type.d.ts",
    "content": "export interface TdColProps {\n    offset?: {\n        type: null;\n        value?: string | number;\n    };\n    span?: {\n        type: null;\n        value?: string | number;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/col/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Collapse Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ndefault-expand-all | Boolean | false | \\- | N\ndisabled | Boolean | - | \\- | N\nexpand-icon | Boolean | true | \\- | N\nexpand-mutex | Boolean | false | \\- | N\ntheme | String | default | options: default/card | N\nvalue | Array | [] | Typescript：`CollapseValue` `type CollapseValue = Array<string \\| number>`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/collapse/type.ts) | N\ndefault-value | Array | undefined | uncontrolled property。Typescript：`CollapseValue` `type CollapseValue = Array<string \\| number>`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/collapse/type.ts) | N\n\n### Collapse Events\n\nname | params | description\n-- | -- | --\nchange | `(value: CollapseValue)` | \\-\n\n\n### CollapsePanel Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ncontent | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndisabled | Boolean | undefined | \\- | N\nexpand-icon | Boolean / Slot | undefined | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nheader | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nheader-left-icon | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nheader-right-content | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nplacement | String | bottom | `0.34.0`。options: bottom/top | N\nvalue | String / Number | - | \\- | N\n### CollapsePanel External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-content | \\-\nt-class-header | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-collapse-border-color | @border-level-1-color | - \n--td-collapse-content-font-size | @font-size-base | - \n--td-collapse-content-line-height | 1.5 | - \n--td-collapse-content-padding | 32rpx | - \n--td-collapse-content-text-color | @text-color-primary | - \n--td-collapse-extra-font-size | @font-size-m | - \n--td-collapse-header-height | auto | - \n--td-collapse-header-text-color | @text-color-primary | - \n--td-collapse-header-text-disabled-color | @text-color-disabled | - \n--td-collapse-horizontal-padding | 32rpx | - \n--td-collapse-icon-color | @font-gray-3 | - \n--td-collapse-panel-bg-color | @bg-color-container | - \n--td-collapse-title-font-size | @font-size-m | - \n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/README.md",
    "content": "---\ntitle: Collapse 折叠面板\ndescription: 用于对复杂区域进行分组和隐藏 常用于订单信息展示等\nspline: data\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-99%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-87%25-blue\" /></span>\n\n<div style=\"background: #ecf2fe; display: flex; align-items: center; line-height: 20px; padding: 14px 24px; border-radius: 3px; color: #555a65\">\n  <svg fill=\"none\" viewBox=\"0 0 16 16\" width=\"16px\" height=\"16px\" style=\"margin-right: 5px\">\n    <path fill=\"#0052d9\" d=\"M8 15A7 7 0 108 1a7 7 0 000 14zM7.4 4h1.2v1.2H7.4V4zm.1 2.5h1V12h-1V6.5z\" fillOpacity=\"0.9\"></path>\n  </svg>\n  该组件于 0.7.3 版本上线，请留意版本。\n</div>\n\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-collapse\": \"tdesign-miniprogram/collapse/collapse\",\n  \"t-collapse-panel\": \"tdesign-miniprogram/collapse-panel/collapse-panel\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/P67sAimx75Sy\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 类型\n\n基础折叠面板\n\n{{ base }}\n\n\n带操作说明\n\n{{ action }}\n\n手风琴模式\n\n{{ accordion }}\n\n### 样式\n\n卡片折叠面板\n\n{{ theme }}\n\n## API\n\n### Collapse Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ndefault-expand-all | Boolean | false | 默认是否展开全部 | N\ndisabled | Boolean | - | 是否禁用面板展开/收起操作 | N\nexpand-icon | Boolean | true | 展开图标 | N\nexpand-mutex | Boolean | false | 每个面板互斥展开，每次只展开一个面板 | N\ntheme | String | default | 折叠面板风格。可选项：default/card | N\nvalue | Array | [] | 展开的面板集合。TS 类型：`CollapseValue` `type CollapseValue = Array<string \\| number>`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/collapse/type.ts) | N\ndefault-value | Array | undefined | 展开的面板集合。非受控属性。TS 类型：`CollapseValue` `type CollapseValue = Array<string \\| number>`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/collapse/type.ts) | N\n\n### Collapse Events\n\n名称 | 参数 | 描述\n-- | -- | --\nchange | `(value: CollapseValue)` | 切换面板时触发，返回变化的值\n\n\n### CollapsePanel Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ncontent | String / Slot | - | 折叠面板内容。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndisabled | Boolean | undefined | 禁止当前面板展开，优先级大于 Collapse 的同名属性 | N\nexpand-icon | Boolean / Slot | undefined | 当前折叠面板展开图标，优先级大于 Collapse 的同名属性。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nheader | String / Slot | - | 面板头内容。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nheader-left-icon | String / Slot | - | 面板头左侧图标。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nheader-right-content | String / Slot | - | 面板头的右侧区域，一般用于呈现面板操作。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nplacement | String | bottom | `0.34.0`。选项卡内容的位置。可选项：bottom/top | N\nvalue | String / Number | - | 当前面板唯一标识，如果值为空则取当前面下标兜底作为唯一标识 | N\n### CollapsePanel External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-content | 内容样式类\nt-class-header | 头部样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-collapse-border-color | @border-level-1-color | - \n--td-collapse-content-font-size | @font-size-base | - \n--td-collapse-content-line-height | 1.5 | - \n--td-collapse-content-padding | 32rpx | - \n--td-collapse-content-text-color | @text-color-primary | - \n--td-collapse-extra-font-size | @font-size-m | - \n--td-collapse-header-height | auto | - \n--td-collapse-header-text-color | @text-color-primary | - \n--td-collapse-header-text-disabled-color | @text-color-disabled | - \n--td-collapse-horizontal-padding | 32rpx | - \n--td-collapse-icon-color | @font-gray-3 | - \n--td-collapse-panel-bg-color | @bg-color-container | - \n--td-collapse-title-font-size | @font-size-m | - \n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/collapse.d.ts",
    "content": "import { SuperComponent, RelationsOptions } from '../common/src/index';\nimport type { CollapseValue, TdCollapseProps } from './type';\nexport interface CollapseProps extends TdCollapseProps {\n}\nexport default class Collapse extends SuperComponent {\n    externalClasses: string[];\n    relations: RelationsOptions;\n    controlledProps: {\n        key: string;\n        event: string;\n    }[];\n    properties: TdCollapseProps;\n    data: {\n        prefix: string;\n        classPrefix: string;\n    };\n    observers: {\n        'value, expandMutex '(): void;\n    };\n    methods: {\n        updateExpanded(): void;\n        switch(panelValue: CollapseValue): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/collapse.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-collapse`;\nlet Collapse = class Collapse extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`];\n        this.relations = {\n            '../collapse-panel/collapse-panel': {\n                type: 'descendant',\n            },\n        };\n        this.controlledProps = [\n            {\n                key: 'value',\n                event: 'change',\n            },\n        ];\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n        };\n        this.observers = {\n            'value, expandMutex '() {\n                this.updateExpanded();\n            },\n        };\n        this.methods = {\n            updateExpanded() {\n                this.$children.forEach((child) => {\n                    child.updateExpanded(this.properties.value);\n                });\n            },\n            switch(panelValue) {\n                const { expandMutex, value: activeValues } = this.properties;\n                let value = [];\n                const hit = activeValues.indexOf(panelValue);\n                if (hit > -1) {\n                    value = activeValues.filter((item) => item !== panelValue);\n                }\n                else {\n                    value = expandMutex ? [panelValue] : activeValues.concat(panelValue);\n                }\n                this._trigger('change', { value });\n            },\n        };\n    }\n};\nCollapse = __decorate([\n    wxComponent()\n], Collapse);\nexport default Collapse;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/collapse.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/collapse.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  style=\"{{_._style([style, customStyle])}}\"\n  class=\"class {{prefix}}-class {{_.cls(classPrefix, [['hairline--top-bottom', border], theme])}}\"\n>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/collapse.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-collapse--card {\n  margin: 0 32rpx;\n  border-radius: var(--td-radius-large, 18rpx);\n  overflow: hidden;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/index.d.ts",
    "content": "export { default as Collapse } from './collapse';\nexport * from './type';\nexport * from './props';\nexport { CollapseProps } from './collapse';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/index.js",
    "content": "export { default as Collapse } from './collapse';\nexport * from './type';\nexport * from './props';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/props.d.ts",
    "content": "import { TdCollapseProps } from './type';\ndeclare const props: TdCollapseProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/props.js",
    "content": "const props = {\n    defaultExpandAll: {\n        type: Boolean,\n        value: false,\n    },\n    disabled: {\n        type: Boolean,\n    },\n    expandIcon: {\n        type: Boolean,\n        value: true,\n    },\n    expandMutex: {\n        type: Boolean,\n        value: false,\n    },\n    theme: {\n        type: String,\n        value: 'default',\n    },\n    value: {\n        type: Array,\n        value: null,\n    },\n    defaultValue: {\n        type: Array,\n        value: [],\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/type.d.ts",
    "content": "export interface TdCollapseProps {\n    defaultExpandAll?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    expandIcon?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    expandMutex?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    theme?: {\n        type: StringConstructor;\n        value?: 'default' | 'card';\n    };\n    value?: {\n        type: ArrayConstructor;\n        value?: CollapseValue;\n    };\n    defaultValue?: {\n        type: ArrayConstructor;\n        value?: CollapseValue;\n    };\n}\nexport declare type CollapseValue = Array<string | number>;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse-panel/collapse-panel.d.ts",
    "content": "import { SuperComponent, RelationsOptions } from '../common/src/index';\nimport type { TdCollapsePanelProps } from './type';\nexport interface CollapsePanelProps extends TdCollapsePanelProps {\n}\nexport default class CollapsePanel extends SuperComponent {\n    externalClasses: string[];\n    options: {\n        multipleSlots: boolean;\n    };\n    relations: RelationsOptions;\n    properties: TdCollapsePanelProps;\n    data: {\n        prefix: string;\n        expanded: boolean;\n        classPrefix: string;\n        classBasePrefix: string;\n        ultimateExpandIcon: boolean;\n        ultimateDisabled: boolean;\n    };\n    observers: {\n        disabled(v: any): void;\n    };\n    methods: {\n        updateExpanded(activeValues?: any[]): void;\n        updateStyle(expanded: boolean): Promise<void>;\n        onClick(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse-panel/collapse-panel.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport { getRect } from '../common/utils';\nconst { prefix } = config;\nconst name = `${prefix}-collapse-panel`;\nlet CollapsePanel = class CollapsePanel extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-content`, `${prefix}-class-header`];\n        this.options = {\n            multipleSlots: true,\n        };\n        this.relations = {\n            '../collapse/collapse': {\n                type: 'ancestor',\n                linked(target) {\n                    const { value, expandIcon, disabled } = target.properties;\n                    this.setData({\n                        ultimateExpandIcon: this.properties.expandIcon == null ? expandIcon : this.properties.expandIcon,\n                        ultimateDisabled: this.properties.disabled == null ? disabled : this.properties.disabled,\n                    });\n                    this.updateExpanded(value);\n                },\n            },\n        };\n        this.properties = props;\n        this.data = {\n            prefix,\n            expanded: false,\n            classPrefix: name,\n            classBasePrefix: prefix,\n            ultimateExpandIcon: false,\n            ultimateDisabled: false,\n        };\n        this.observers = {\n            disabled(v) {\n                this.setData({ ultimateDisabled: !!v });\n            },\n        };\n        this.methods = {\n            updateExpanded(activeValues = []) {\n                if (!this.$parent) {\n                    return;\n                }\n                const { value } = this.properties;\n                const { defaultExpandAll } = this.$parent.data;\n                const expanded = defaultExpandAll ? !this.data.expanded : activeValues.includes(value);\n                if (expanded === this.properties.expanded)\n                    return;\n                this.setData({ expanded });\n                this.updateStyle(expanded);\n            },\n            updateStyle(expanded) {\n                return getRect(this, `.${name}__content`)\n                    .then((rect) => rect.height)\n                    .then((height) => {\n                    const animation = wx.createAnimation({\n                        duration: 0,\n                        timingFunction: 'ease-in-out',\n                    });\n                    if (expanded) {\n                        animation.height(height).top(0).step({ duration: 300 }).height('auto').step();\n                    }\n                    else {\n                        animation.height(height).top(1).step({ duration: 1 }).height(0).step({ duration: 300 });\n                    }\n                    this.setData({ animation: animation.export() });\n                });\n            },\n            onClick() {\n                const { ultimateDisabled } = this.data;\n                const { value } = this.properties;\n                if (ultimateDisabled)\n                    return;\n                if (this.$parent.data.defaultExpandAll) {\n                    this.updateExpanded();\n                }\n                else {\n                    this.$parent.switch(value);\n                }\n            },\n        };\n    }\n};\nCollapsePanel = __decorate([\n    wxComponent()\n], CollapsePanel);\nexport default CollapsePanel;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse-panel/collapse-panel.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-cell\": \"../cell/cell\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse-panel/collapse-panel.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  style=\"{{_._style([style, customStyle])}}\"\n  class=\"class {{classPrefix}} {{classPrefix}}--{{placement}} {{prefix}}-class\"\n>\n  <view\n    class=\"{{classPrefix}}__title\"\n    aria-role=\"button\"\n    aria-expanded=\"{{expanded}}\"\n    aria-disabled=\"{{ultimateDisabled}}\"\n    bind:tap=\"onClick\"\n  >\n    <t-cell\n      title=\"{{header}}\"\n      note=\"{{headerRightContent}}\"\n      bordered\n      left-icon=\"{{headerLeftIcon}}\"\n      right-icon=\"{{ ultimateExpandIcon ? (expanded ? 'chevron-up' : 'chevron-down') : '' }}\"\n      t-class=\"{{_.cls(classPrefix + '__header', [placement, ['expanded', expanded]])}} {{prefix}}-class-header\"\n      t-class-title=\"class-title {{ultimateDisabled ? 'class-title--disabled' : ''}}\"\n      t-class-note=\"class-note {{ultimateDisabled ? 'class-note--disabled' : ''}}\"\n      t-class-right-icon=\"class-right-icon {{classPrefix}}__arrow--{{placement}} {{ultimateDisabled ? 'class-right-icon--disabled' : ''}}\"\n      t-class-hover=\"class-header-hover\"\n    >\n      <slot name=\"header-left-icon\" slot=\"left-icon\" />\n      <slot name=\"header\" slot=\"title\" />\n      <slot name=\"header-right-content\" slot=\"note\" />\n      <slot name=\"expand-icon\" slot=\"right-icon\" />\n    </t-cell>\n  </view>\n  <view class=\"{{classPrefix}}__wrapper\" animation=\"{{animation}}\" aria-hidden=\"{{expanded ? '' : true}}\">\n    <view\n      class=\"{{_.cls(classPrefix + '__content', [['disabled', ultimateDisabled],  ['expanded', expanded], placement])}} {{prefix}}-class-content\"\n    >\n      {{content}}\n      <slot />\n      <slot name=\"content\" />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse-panel/collapse-panel.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-collapse-panel {\n  background-color: var(--td-collapse-panel-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n}\n.t-collapse-panel--disabled {\n  pointer-events: none;\n}\n.t-collapse-panel--disabled .t-collapse-panel__content,\n.t-collapse-panel--disabled .t-collapse-panel__header {\n  opacity: 0.3;\n}\n.t-collapse-panel--top {\n  display: flex;\n  flex-direction: column-reverse;\n}\n.t-collapse-panel__header {\n  position: relative;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding-left: var(--td-collapse-horizontal-padding, 32rpx);\n  height: var(--td-collapse-header-height, auto);\n  color: var(--td-collapse-header-text-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n}\n.t-collapse-panel__header--top {\n  position: relative;\n}\n.t-collapse-panel__header--top::after {\n  content: '';\n  display: block;\n  position: absolute;\n  top: 0;\n  bottom: unset;\n  left: unset;\n  right: unset;\n  background-color: var(--td-collapse-border-color, var(--td-border-level-1-color, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-collapse-panel__header--top::after {\n  height: 1px;\n  left: 0;\n  right: 0;\n  transform: scaleY(0.5);\n}\n.t-collapse-panel__header--bottom {\n  position: relative;\n}\n.t-collapse-panel__header--bottom::after {\n  content: '';\n  display: block;\n  position: absolute;\n  top: unset;\n  bottom: 0;\n  left: unset;\n  right: unset;\n  background-color: var(--td-collapse-border-color, var(--td-border-level-1-color, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-collapse-panel__header--bottom::after {\n  height: 1px;\n  left: 0;\n  right: 0;\n  transform: scaleY(0.5);\n}\n.t-collapse-panel__header::after {\n  left: 32rpx;\n}\n.t-collapse-panel__header-right {\n  display: inline-flex;\n  align-items: center;\n  height: 100%;\n}\n.t-collapse-panel__header-icon {\n  height: 100%;\n  padding-left: 8px;\n  width: 44px;\n  padding-right: 8px;\n  color: var(--td-collapse-icon-color, var(--td-font-gray-3, rgba(0, 0, 0, 0.4)));\n}\n.t-collapse-panel__extra {\n  font-size: var(--td-collapse-extra-font-size, var(--td-font-size-m, 32rpx));\n}\n.t-collapse-panel__body {\n  position: relative;\n}\n.t-collapse-panel__body::after {\n  content: '';\n  display: block;\n  position: absolute;\n  top: unset;\n  bottom: 0;\n  left: unset;\n  right: unset;\n  background-color: var(--td-collapse-border-color, var(--td-border-level-1-color, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-collapse-panel__body::after {\n  height: 1px;\n  left: 0;\n  right: 0;\n  transform: scaleY(0.5);\n}\n.t-collapse-panel__wrapper {\n  height: 0;\n  overflow: hidden;\n}\n.t-collapse-panel__content {\n  color: var(--td-collapse-content-text-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  font-size: var(--td-collapse-content-font-size, var(--td-font-size-base, 28rpx));\n  padding: var(--td-collapse-content-padding, 32rpx);\n  line-height: var(--td-collapse-content-line-height, 1.5);\n}\n.t-collapse-panel__content--disabled {\n  color: var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26)));\n}\n.t-collapse-panel__content--expanded.t-collapse-panel__content--bottom {\n  position: relative;\n}\n.t-collapse-panel__content--expanded.t-collapse-panel__content--bottom::after {\n  content: '';\n  display: block;\n  position: absolute;\n  top: unset;\n  bottom: 0;\n  left: unset;\n  right: unset;\n  background-color: var(--td-collapse-border-color, var(--td-border-level-1-color, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-collapse-panel__content--expanded.t-collapse-panel__content--bottom::after {\n  height: 1px;\n  left: 0;\n  right: 0;\n  transform: scaleY(0.5);\n}\n.t-collapse-panel__content--expanded.t-collapse-panel__content--top {\n  position: relative;\n}\n.t-collapse-panel__content--expanded.t-collapse-panel__content--top::after {\n  content: '';\n  display: block;\n  position: absolute;\n  top: 0;\n  bottom: unset;\n  left: unset;\n  right: unset;\n  background-color: var(--td-collapse-border-color, var(--td-border-level-1-color, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-collapse-panel__content--expanded.t-collapse-panel__content--top::after {\n  height: 1px;\n  left: 0;\n  right: 0;\n  transform: scaleY(0.5);\n}\n.t-collapse-panel__arrow--top {\n  transform: rotate(180deg);\n}\n.class-title {\n  font-size: var(--td-collapse-title-font-size, var(--td-font-size-m, 32rpx));\n}\n.class-title--disabled {\n  color: var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26)));\n}\n.class-note--disabled {\n  color: var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26)));\n}\n.class-right-icon--disabled {\n  color: var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26)));\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse-panel/props.d.ts",
    "content": "import { TdCollapsePanelProps } from './type';\ndeclare const props: TdCollapsePanelProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse-panel/props.js",
    "content": "const props = {\n    content: {\n        type: String,\n    },\n    disabled: {\n        type: null,\n        value: undefined,\n    },\n    expandIcon: {\n        type: null,\n        value: undefined,\n    },\n    externalClasses: {\n        type: Array,\n    },\n    header: {\n        type: String,\n    },\n    headerLeftIcon: {\n        type: String,\n    },\n    headerRightContent: {\n        type: String,\n    },\n    placement: {\n        type: String,\n        value: 'bottom',\n    },\n    value: {\n        type: null,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse-panel/type.d.ts",
    "content": "export interface TdCollapsePanelProps {\n    content?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    expandIcon?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    externalClasses?: {\n        type: ArrayConstructor;\n        value?: ['t-class', 't-class-header', 't-class-content'];\n    };\n    header?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    headerLeftIcon?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    headerRightContent?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    placement?: {\n        type: StringConstructor;\n        value?: 'bottom' | 'top';\n    };\n    value?: {\n        type: null;\n        value?: string | number;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/collapse-panel/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/bus.d.ts",
    "content": "export default class Bus {\n    listeners: Map<string, any>;\n    emitted: Set<string>;\n    constructor();\n    on(evtName: string, listener: any): void;\n    emit(evtName: string): void;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/bus.js",
    "content": "export default class Bus {\n    constructor() {\n        this.listeners = new Map();\n        this.emitted = new Set();\n    }\n    on(evtName, listener) {\n        if (this.emitted.has(evtName)) {\n            listener();\n            return;\n        }\n        const target = this.listeners.get(evtName) || [];\n        target.push(listener);\n        this.listeners.set(evtName, target);\n    }\n    emit(evtName) {\n        const listeners = this.listeners.get(evtName);\n        if (listeners) {\n            listeners.forEach((func) => func());\n        }\n        this.emitted.add(evtName);\n    }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/common.d.ts",
    "content": "export declare type Classes = Array<string>;\nexport interface Styles {\n    [css: string]: string | number;\n}\nexport declare type ImageEvent = any;\nexport declare type PlainObject = {\n    [key: string]: any;\n};\nexport declare type OptionData = {\n    label?: string;\n    value?: string | number;\n} & PlainObject;\nexport declare type TreeOptionData<T = string | number> = {\n    children?: Array<TreeOptionData<T>> | boolean;\n    label?: string;\n    text?: string;\n    value?: T;\n    content?: string;\n} & PlainObject;\nexport declare type SizeEnum = 'small' | 'medium' | 'large';\nexport declare type ShapeEnum = 'circle' | 'round';\nexport declare type HorizontalAlignEnum = 'left' | 'center' | 'right';\nexport declare type VerticalAlignEnum = 'top' | 'middle' | 'bottom';\nexport declare type LayoutEnum = 'vertical' | 'horizontal';\nexport declare type ClassName = {\n    [className: string]: any;\n} | ClassName[] | string;\nexport declare type CSSSelector = string;\nexport interface KeysType {\n    value?: string;\n    label?: string;\n    disabled?: string;\n}\nexport interface TreeKeysType extends KeysType {\n    children?: string;\n}\nexport interface HTMLElementAttributes {\n    [attribute: string]: string;\n}\nexport interface TScroll {\n    bufferSize?: number;\n    isFixedRowHeight?: boolean;\n    rowHeight?: number;\n    threshold?: number;\n    type: 'lazy' | 'virtual';\n}\nexport declare type InfinityScroll = TScroll;\nexport interface ScrollToElementParams {\n    index?: number;\n    top?: number;\n    time?: number;\n    behavior?: 'auto' | 'smooth';\n}\nexport interface ComponentScrollToElementParams extends ScrollToElementParams {\n    key?: string | number;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/common.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/component.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\ndeclare const TComponent: typeof Component;\nexport default TComponent;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/component.js",
    "content": "const TComponent = (options) => {\n    options.options = Object.assign({ multipleSlots: true, addGlobalClass: true }, options.options);\n    return Component(options);\n};\nexport default TComponent;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/config.d.ts",
    "content": "declare const _default: {\n    prefix: string;\n};\nexport default _default;\nexport declare const prefix = \"t\";\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/config.js",
    "content": "export default {\n    prefix: \"t\",\n};\nexport const prefix = \"t\";\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/index.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/calendar/index.d.ts",
    "content": "import type { TDate, TCalendarType, TCalendarValue } from './type';\nexport default class TCalendar {\n    firstDayOfWeek: number;\n    value: TCalendarValue | TCalendarValue[];\n    type: TCalendarType;\n    minDate: Date;\n    maxDate: Date;\n    format: (day: TDate) => TDate;\n    constructor(options?: {});\n    getTrimValue(): Date | Date[];\n    getDays(): any[];\n    getMonths(): any[];\n    select({ cellType, year, month, date }: {\n        cellType: any;\n        year: any;\n        month: any;\n        date: any;\n    }): Date | TCalendarValue[];\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/calendar/index.js",
    "content": "import { getDateRect, isSameDate, getMonthDateRect, isValidDate, getDate } from '../date';\nexport default class TCalendar {\n    constructor(options = {}) {\n        this.type = 'single';\n        Object.assign(this, options);\n        if (!this.minDate)\n            this.minDate = getDate();\n        if (!this.maxDate)\n            this.maxDate = getDate(6);\n    }\n    getTrimValue() {\n        const { value, type } = this;\n        const format = (val) => {\n            if (val instanceof Date)\n                return val;\n            if (typeof val === 'number')\n                return new Date(val);\n            return new Date();\n        };\n        if (type === 'single' && isValidDate(value))\n            return format(value);\n        if (type === 'multiple' || type === 'range') {\n            if (Array.isArray(value)) {\n                const isValid = value.every((item) => isValidDate(item));\n                return isValid ? value.map((item) => format(item)) : [];\n            }\n            return [];\n        }\n    }\n    getDays() {\n        const raw = '日一二三四五六';\n        const ans = [];\n        let i = this.firstDayOfWeek % 7;\n        while (ans.length < 7) {\n            ans.push(raw[i]);\n            i = (i + 1) % 7;\n        }\n        return ans;\n    }\n    getMonths() {\n        const ans = [];\n        const selectedDate = this.getTrimValue();\n        const { minDate, maxDate, type, format } = this;\n        let { year: minYear, month: minMonth, time: minTime } = getDateRect(minDate);\n        const { year: maxYear, month: maxMonth, time: maxTime } = getDateRect(maxDate);\n        const calcType = (year, month, date) => {\n            const curDate = new Date(year, month, date, 23, 59, 59);\n            if (type === 'single' && selectedDate) {\n                if (isSameDate({ year, month, date }, selectedDate))\n                    return 'selected';\n            }\n            if (type === 'multiple' && selectedDate) {\n                const hit = selectedDate.some((item) => isSameDate({ year, month, date }, item));\n                if (hit) {\n                    return 'selected';\n                }\n            }\n            if (type === 'range' && selectedDate) {\n                if (Array.isArray(selectedDate)) {\n                    const [startDate, endDate] = selectedDate;\n                    if (startDate && isSameDate({ year, month, date }, startDate))\n                        return 'start';\n                    if (endDate && isSameDate({ year, month, date }, endDate))\n                        return 'end';\n                    if (startDate && endDate && curDate.getTime() > startDate.getTime() && curDate.getTime() < endDate.getTime())\n                        return 'centre';\n                }\n            }\n            const minCurDate = new Date(year, month, date, 0, 0, 0);\n            if (curDate.getTime() < minTime || minCurDate.getTime() > maxTime) {\n                return 'disabled';\n            }\n            return '';\n        };\n        while (minYear < maxYear || (minYear === maxYear && minMonth <= maxMonth)) {\n            const target = getMonthDateRect(new Date(minYear, minMonth, 1));\n            const months = [];\n            for (let i = 1; i <= 31; i++) {\n                if (i > target.lastDate)\n                    break;\n                const dateObj = {\n                    date: new Date(minYear, minMonth, i),\n                    day: i,\n                    type: calcType(minYear, minMonth, i),\n                };\n                months.push(format ? format(dateObj) : dateObj);\n            }\n            ans.push({\n                year: minYear,\n                month: minMonth,\n                months,\n                weekdayOfFirstDay: target.weekdayOfFirstDay,\n            });\n            const curDate = getDateRect(new Date(minYear, minMonth + 1, 1));\n            minYear = curDate.year;\n            minMonth = curDate.month;\n        }\n        return ans;\n    }\n    select({ cellType, year, month, date }) {\n        const { type } = this;\n        const selectedDate = this.getTrimValue();\n        if (cellType === 'disabled')\n            return;\n        const selected = new Date(year, month, date);\n        this.value = selected;\n        if (type === 'range' && Array.isArray(selectedDate)) {\n            if (selectedDate.length === 1 && selected > selectedDate[0]) {\n                this.value = [selectedDate[0], selected];\n            }\n            else {\n                this.value = [selected];\n            }\n        }\n        else if (type === 'multiple' && Array.isArray(selectedDate)) {\n            const newVal = [...selectedDate];\n            const index = selectedDate.findIndex((item) => isSameDate(item, selected));\n            if (index > -1) {\n                newVal.splice(index, 1);\n            }\n            else {\n                newVal.push(selected);\n            }\n            this.value = newVal;\n        }\n        return this.value;\n    }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/calendar/type.d.ts",
    "content": "export interface TDate {\n    date: Date;\n    day: number;\n    type: TDateType;\n    className?: string;\n    prefix?: string;\n    suffix?: string;\n}\nexport declare type TCalendarValue = number | Date;\nexport declare type TDateType = 'selected' | 'disabled' | 'start' | 'centre' | 'end' | '';\nexport declare type TCalendarType = 'single' | 'multiple' | 'range';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/calendar/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/color-picker/cmyk.d.ts",
    "content": "export declare const rgb2cmyk: (red: number, green: number, blue: number) => number[];\nexport declare const cmyk2rgb: (cyan: number, magenta: number, yellow: number, black: number) => {\n    r: number;\n    g: number;\n    b: number;\n};\nexport declare const cmykInputToColor: (input: string) => string;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/color-picker/cmyk.js",
    "content": "export const rgb2cmyk = (red, green, blue) => {\n    let computedC = 0;\n    let computedM = 0;\n    let computedY = 0;\n    let computedK = 0;\n    const r = parseInt(`${red}`.replace(/\\s/g, ''), 10);\n    const g = parseInt(`${green}`.replace(/\\s/g, ''), 10);\n    const b = parseInt(`${blue}`.replace(/\\s/g, ''), 10);\n    if (r === 0 && g === 0 && b === 0) {\n        computedK = 1;\n        return [0, 0, 0, 1];\n    }\n    computedC = 1 - r / 255;\n    computedM = 1 - g / 255;\n    computedY = 1 - b / 255;\n    const minCMY = Math.min(computedC, Math.min(computedM, computedY));\n    computedC = (computedC - minCMY) / (1 - minCMY);\n    computedM = (computedM - minCMY) / (1 - minCMY);\n    computedY = (computedY - minCMY) / (1 - minCMY);\n    computedK = minCMY;\n    return [computedC, computedM, computedY, computedK];\n};\nexport const cmyk2rgb = (cyan, magenta, yellow, black) => {\n    let c = cyan / 100;\n    let m = magenta / 100;\n    let y = yellow / 100;\n    const k = black / 100;\n    c = c * (1 - k) + k;\n    m = m * (1 - k) + k;\n    y = y * (1 - k) + k;\n    let r = 1 - c;\n    let g = 1 - m;\n    let b = 1 - y;\n    r = Math.round(255 * r);\n    g = Math.round(255 * g);\n    b = Math.round(255 * b);\n    return {\n        r,\n        g,\n        b,\n    };\n};\nconst REG_CMYK_STRING = /cmyk\\((\\d+%?),(\\d+%?),(\\d+%?),(\\d+%?)\\)/;\nconst toNumber = (str) => Math.max(0, Math.min(255, parseInt(str, 10)));\nexport const cmykInputToColor = (input) => {\n    if (/cmyk/i.test(input)) {\n        const str = input.replace(/\\s/g, '');\n        const match = str.match(REG_CMYK_STRING);\n        const c = toNumber(match[1]);\n        const m = toNumber(match[2]);\n        const y = toNumber(match[3]);\n        const k = toNumber(match[4]);\n        const { r, g, b } = cmyk2rgb(c, m, y, k);\n        return `rgb(${r}, ${g}, ${b})`;\n    }\n    return input;\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/color-picker/color.d.ts",
    "content": "import tinyColor from 'tinycolor2';\nimport { GradientColors, GradientColorPoint } from './gradient';\nexport interface ColorObject {\n    alpha: number;\n    css: string;\n    hex: string;\n    hex8: string;\n    hsl: string;\n    hsla: string;\n    hsv: string;\n    hsva: string;\n    rgb: string;\n    rgba: string;\n    saturation: number;\n    value: number;\n    isGradient: boolean;\n    linearGradient?: string;\n}\ninterface ColorStates {\n    s: number;\n    v: number;\n    h: number;\n    a: number;\n}\ninterface GradientStates {\n    colors: GradientColorPoint[];\n    degree: number;\n    selectedId: string;\n    css?: string;\n}\nexport declare const gradientColors2string: (object: GradientColors) => string;\nexport declare const getColorWithoutAlpha: (color: string) => string;\nexport declare const genId: () => string;\nexport declare const genGradientPoint: (left: number, color: string) => GradientColorPoint;\nexport declare class Color {\n    states: ColorStates;\n    originColor: string;\n    isGradient: boolean;\n    gradientStates: GradientStates;\n    constructor(input: string);\n    update(input: string): void;\n    get saturation(): number;\n    set saturation(value: number);\n    get value(): number;\n    set value(value: number);\n    get hue(): number;\n    set hue(value: number);\n    get alpha(): number;\n    set alpha(value: number);\n    get rgb(): string;\n    get rgba(): string;\n    get hsv(): string;\n    get hsva(): string;\n    get hsl(): string;\n    get hsla(): string;\n    get hex(): string;\n    get hex8(): string;\n    get cmyk(): string;\n    get css(): string;\n    get linearGradient(): string;\n    get gradientColors(): GradientColorPoint[];\n    set gradientColors(colors: GradientColorPoint[]);\n    get gradientSelectedId(): string;\n    set gradientSelectedId(id: string);\n    get gradientDegree(): number;\n    set gradientDegree(degree: number);\n    get gradientSelectedPoint(): GradientColorPoint;\n    getFormatsColorMap(): {\n        HEX: string;\n        CMYK: string;\n        RGB: string;\n        RGBA: string;\n        HSL: string;\n        HSLA: string;\n        HSV: string;\n        HSVA: string;\n        CSS: string;\n        HEX8: string;\n    };\n    updateCurrentGradientColor(): false | this;\n    updateStates(input: string): void;\n    getRgba(): {\n        r: number;\n        g: number;\n        b: number;\n        a: number;\n    };\n    getCmyk(): {\n        c: number;\n        m: number;\n        y: number;\n        k: number;\n    };\n    getHsva(): tinyColor.ColorFormats.HSVA;\n    getHsla(): tinyColor.ColorFormats.HSLA;\n    equals(color: string): boolean;\n    static isValid(color: string): boolean;\n    static hsva2color(h: number, s: number, v: number, a: number): string;\n    static hsla2color(h: number, s: number, l: number, a: number): string;\n    static rgba2color(r: number, g: number, b: number, a: number): string;\n    static hex2color(hex: string, a: number): string;\n    static object2color(object: any, format: string): string;\n    static isGradientColor: (input: string) => boolean;\n    static compare: (color1: string, color2: string) => boolean;\n}\nexport declare const getColorObject: (color: Color) => ColorObject;\nexport default Color;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/color-picker/color.js",
    "content": "import tinyColor from 'tinycolor2';\nimport { cmykInputToColor, rgb2cmyk } from './cmyk';\nimport { parseGradientString, isGradientColor } from './gradient';\nconst mathRound = Math.round;\nconst hsv2rgba = (states) => tinyColor(states).toRgb();\nconst hsv2hsva = (states) => tinyColor(states).toHsv();\nconst hsv2hsla = (states) => tinyColor(states).toHsl();\nexport const gradientColors2string = (object) => {\n    const { points, degree } = object;\n    const colorsStop = points\n        .sort((pA, pB) => pA.left - pB.left)\n        .map((p) => `${p.color} ${Math.round(p.left * 100) / 100}%`);\n    return `linear-gradient(${degree}deg,${colorsStop.join(',')})`;\n};\nexport const getColorWithoutAlpha = (color) => tinyColor(color).setAlpha(1).toHexString();\nexport const genId = () => (1 + Math.random() * 4294967295).toString(16);\nexport const genGradientPoint = (left, color) => ({\n    id: genId(),\n    left,\n    color,\n});\nexport class Color {\n    constructor(input) {\n        this.states = {\n            s: 100,\n            v: 100,\n            h: 100,\n            a: 1,\n        };\n        this.gradientStates = {\n            colors: [],\n            degree: 0,\n            selectedId: null,\n            css: '',\n        };\n        this.update(input);\n    }\n    update(input) {\n        var _a, _b;\n        const gradientColors = parseGradientString(input);\n        if (this.isGradient && !gradientColors) {\n            const colorHsv = tinyColor(input).toHsv();\n            this.states = colorHsv;\n            this.updateCurrentGradientColor();\n            return;\n        }\n        this.originColor = input;\n        this.isGradient = false;\n        let colorInput = input;\n        if (gradientColors) {\n            this.isGradient = true;\n            const object = gradientColors;\n            const points = object.points.map((c) => genGradientPoint(c.left, c.color));\n            this.gradientStates = {\n                colors: points,\n                degree: object.degree,\n                selectedId: ((_a = points[0]) === null || _a === void 0 ? void 0 : _a.id) || null,\n            };\n            this.gradientStates.css = this.linearGradient;\n            colorInput = (_b = this.gradientSelectedPoint) === null || _b === void 0 ? void 0 : _b.color;\n        }\n        this.updateStates(colorInput);\n    }\n    get saturation() {\n        return this.states.s;\n    }\n    set saturation(value) {\n        this.states.s = Math.max(0, Math.min(100, value));\n        this.updateCurrentGradientColor();\n    }\n    get value() {\n        return this.states.v;\n    }\n    set value(value) {\n        this.states.v = Math.max(0, Math.min(100, value));\n        this.updateCurrentGradientColor();\n    }\n    get hue() {\n        return this.states.h;\n    }\n    set hue(value) {\n        this.states.h = Math.max(0, Math.min(360, value));\n        this.updateCurrentGradientColor();\n    }\n    get alpha() {\n        return this.states.a;\n    }\n    set alpha(value) {\n        this.states.a = Math.max(0, Math.min(1, Math.round(value * 100) / 100));\n        this.updateCurrentGradientColor();\n    }\n    get rgb() {\n        const { r, g, b } = hsv2rgba(this.states);\n        return `rgb(${mathRound(r)}, ${mathRound(g)}, ${mathRound(b)})`;\n    }\n    get rgba() {\n        const { r, g, b, a } = hsv2rgba(this.states);\n        return `rgba(${mathRound(r)}, ${mathRound(g)}, ${mathRound(b)}, ${a})`;\n    }\n    get hsv() {\n        const { h, s, v } = this.getHsva();\n        return `hsv(${h}, ${s}%, ${v}%)`;\n    }\n    get hsva() {\n        const { h, s, v, a } = this.getHsva();\n        return `hsva(${h}, ${s}%, ${v}%, ${a})`;\n    }\n    get hsl() {\n        const { h, s, l } = this.getHsla();\n        return `hsl(${h}, ${s}%, ${l}%)`;\n    }\n    get hsla() {\n        const { h, s, l, a } = this.getHsla();\n        return `hsla(${h}, ${s}%, ${l}%, ${a})`;\n    }\n    get hex() {\n        return tinyColor(this.states).toHexString();\n    }\n    get hex8() {\n        return tinyColor(this.states).toHex8String();\n    }\n    get cmyk() {\n        const { c, m, y, k } = this.getCmyk();\n        return `cmyk(${c}, ${m}, ${y}, ${k})`;\n    }\n    get css() {\n        if (this.isGradient) {\n            return this.linearGradient;\n        }\n        return this.rgba;\n    }\n    get linearGradient() {\n        const { gradientColors, gradientDegree } = this;\n        return gradientColors2string({\n            points: gradientColors,\n            degree: gradientDegree,\n        });\n    }\n    get gradientColors() {\n        return this.gradientStates.colors;\n    }\n    set gradientColors(colors) {\n        this.gradientStates.colors = colors;\n        this.gradientStates.css = this.linearGradient;\n    }\n    get gradientSelectedId() {\n        return this.gradientStates.selectedId;\n    }\n    set gradientSelectedId(id) {\n        var _a;\n        if (id === this.gradientSelectedId) {\n            return;\n        }\n        this.gradientStates.selectedId = id;\n        this.updateStates((_a = this.gradientSelectedPoint) === null || _a === void 0 ? void 0 : _a.color);\n    }\n    get gradientDegree() {\n        return this.gradientStates.degree;\n    }\n    set gradientDegree(degree) {\n        this.gradientStates.degree = Math.max(0, Math.min(360, degree));\n        this.gradientStates.css = this.linearGradient;\n    }\n    get gradientSelectedPoint() {\n        const { gradientColors, gradientSelectedId } = this;\n        return gradientColors.find((color) => color.id === gradientSelectedId);\n    }\n    getFormatsColorMap() {\n        return {\n            HEX: this.hex,\n            CMYK: this.cmyk,\n            RGB: this.rgb,\n            RGBA: this.rgba,\n            HSL: this.hsl,\n            HSLA: this.hsla,\n            HSV: this.hsv,\n            HSVA: this.hsva,\n            CSS: this.css,\n            HEX8: this.hex8,\n        };\n    }\n    updateCurrentGradientColor() {\n        const { isGradient, gradientColors, gradientSelectedId } = this;\n        const { length } = gradientColors;\n        const current = this.gradientSelectedPoint;\n        if (!isGradient || length === 0 || !current) {\n            return false;\n        }\n        const index = gradientColors.findIndex((color) => color.id === gradientSelectedId);\n        const newColor = Object.assign(Object.assign({}, current), { color: this.rgba });\n        gradientColors.splice(index, 1, newColor);\n        this.gradientColors = gradientColors.slice();\n        return this;\n    }\n    updateStates(input) {\n        const color = tinyColor(cmykInputToColor(input));\n        const hsva = color.toHsv();\n        this.states = hsva;\n    }\n    getRgba() {\n        const { r, g, b, a } = hsv2rgba(this.states);\n        return {\n            r: mathRound(r),\n            g: mathRound(g),\n            b: mathRound(b),\n            a,\n        };\n    }\n    getCmyk() {\n        const { r, g, b } = this.getRgba();\n        const [c, m, y, k] = rgb2cmyk(r, g, b);\n        return {\n            c: mathRound(c * 100),\n            m: mathRound(m * 100),\n            y: mathRound(y * 100),\n            k: mathRound(k * 100),\n        };\n    }\n    getHsva() {\n        let { h, s, v, a } = hsv2hsva(this.states);\n        h = mathRound(h);\n        s = mathRound(s * 100);\n        v = mathRound(v * 100);\n        a *= 1;\n        return {\n            h,\n            s,\n            v,\n            a,\n        };\n    }\n    getHsla() {\n        let { h, s, l, a } = hsv2hsla(this.states);\n        h = mathRound(h);\n        s = mathRound(s * 100);\n        l = mathRound(l * 100);\n        a *= 1;\n        return {\n            h,\n            s,\n            l,\n            a,\n        };\n    }\n    equals(color) {\n        return tinyColor.equals(this.rgba, color);\n    }\n    static isValid(color) {\n        if (parseGradientString(color)) {\n            return true;\n        }\n        return tinyColor(color).isValid();\n    }\n    static hsva2color(h, s, v, a) {\n        return tinyColor({\n            h,\n            s,\n            v,\n            a,\n        }).toHsvString();\n    }\n    static hsla2color(h, s, l, a) {\n        return tinyColor({\n            h,\n            s,\n            l,\n            a,\n        }).toHslString();\n    }\n    static rgba2color(r, g, b, a) {\n        return tinyColor({\n            r,\n            g,\n            b,\n            a,\n        }).toHsvString();\n    }\n    static hex2color(hex, a) {\n        const color = tinyColor(hex);\n        color.setAlpha(a);\n        return color.toHexString();\n    }\n    static object2color(object, format) {\n        if (format === 'CMYK') {\n            const { c, m, y, k } = object;\n            return `cmyk(${c}, ${m}, ${y}, ${k})`;\n        }\n        const color = tinyColor(object, {\n            format,\n        });\n        return color.toRgbString();\n    }\n}\nColor.isGradientColor = (input) => !!isGradientColor(input);\nColor.compare = (color1, color2) => {\n    const isGradientColor1 = Color.isGradientColor(color1);\n    const isGradientColor2 = Color.isGradientColor(color2);\n    if (isGradientColor1 && isGradientColor2) {\n        const gradientColor1 = gradientColors2string(parseGradientString(color1));\n        const gradientColor2 = gradientColors2string(parseGradientString(color2));\n        return gradientColor1 === gradientColor2;\n    }\n    if (!isGradientColor1 && !isGradientColor2) {\n        return tinyColor.equals(color1, color2);\n    }\n    return false;\n};\nconst COLOR_OBJECT_OUTPUT_KEYS = [\n    'alpha',\n    'css',\n    'hex',\n    'hex8',\n    'hsl',\n    'hsla',\n    'hsv',\n    'hsva',\n    'rgb',\n    'rgba',\n    'saturation',\n    'value',\n    'isGradient',\n];\nexport const getColorObject = (color) => {\n    if (!color) {\n        return null;\n    }\n    const colorObject = Object.create(null);\n    COLOR_OBJECT_OUTPUT_KEYS.forEach((key) => (colorObject[key] = color[key]));\n    if (color.isGradient) {\n        colorObject.linearGradient = color.linearGradient;\n    }\n    return colorObject;\n};\nexport default Color;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/color-picker/gradient.d.ts",
    "content": "export interface GradientColorPoint {\n    id?: string;\n    color?: string;\n    left?: number;\n}\nexport interface GradientColors {\n    points: GradientColorPoint[];\n    degree: number;\n}\nexport declare const isGradientColor: (input: string) => null | RegExpExecArray;\nexport declare const parseGradientString: (input: string) => GradientColors | boolean;\nexport default parseGradientString;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/color-picker/gradient.js",
    "content": "import isString from 'lodash/isString';\nimport isNull from 'lodash/isNull';\nimport tinyColor from 'tinycolor2';\nconst combineRegExp = (regexpList, flags) => {\n    let source = '';\n    for (let i = 0; i < regexpList.length; i++) {\n        if (isString(regexpList[i])) {\n            source += regexpList[i];\n        }\n        else {\n            source += regexpList[i].source;\n        }\n    }\n    return new RegExp(source, flags);\n};\nconst generateRegExp = () => {\n    const searchFlags = 'gi';\n    const rAngle = /(?:[+-]?\\d*\\.?\\d+)(?:deg|grad|rad|turn)/;\n    const rSideCornerCapture = /to\\s+((?:(?:left|right|top|bottom)(?:\\s+(?:top|bottom|left|right))?))/;\n    const rComma = /\\s*,\\s*/;\n    const rColorHex = /#(?:[a-f0-9]{6}|[a-f0-9]{3})/;\n    const rDigits3 = /\\(\\s*(?:\\d{1,3}\\s*,\\s*){2}\\d{1,3}\\s*\\)/;\n    const rDigits4 = /\\(\\s*(?:\\d{1,3}\\s*,\\s*){2}\\d{1,3}\\s*,\\s*\\d*\\.?\\d+\\)/;\n    const rValue = /(?:[+-]?\\d*\\.?\\d+)(?:%|[a-z]+)?/;\n    const rKeyword = /[_a-z-][_a-z0-9-]*/;\n    const rColor = combineRegExp(['(?:', rColorHex, '|', '(?:rgb|hsl)', rDigits3, '|', '(?:rgba|hsla)', rDigits4, '|', rKeyword, ')'], '');\n    const rColorStop = combineRegExp([rColor, '(?:\\\\s+', rValue, '(?:\\\\s+', rValue, ')?)?'], '');\n    const rColorStopList = combineRegExp(['(?:', rColorStop, rComma, ')*', rColorStop], '');\n    const rLineCapture = combineRegExp(['(?:(', rAngle, ')|', rSideCornerCapture, ')'], '');\n    const rGradientSearch = combineRegExp(['(?:(', rLineCapture, ')', rComma, ')?(', rColorStopList, ')'], searchFlags);\n    const rColorStopSearch = combineRegExp(['\\\\s*(', rColor, ')', '(?:\\\\s+', '(', rValue, '))?', '(?:', rComma, '\\\\s*)?'], searchFlags);\n    return {\n        gradientSearch: rGradientSearch,\n        colorStopSearch: rColorStopSearch,\n    };\n};\nconst parseGradient = (regExpLib, input) => {\n    let result;\n    let matchColorStop;\n    let stopResult;\n    regExpLib.gradientSearch.lastIndex = 0;\n    const matchGradient = regExpLib.gradientSearch.exec(input);\n    if (!isNull(matchGradient)) {\n        result = {\n            original: matchGradient[0],\n            colorStopList: [],\n        };\n        if (matchGradient[1]) {\n            result.line = matchGradient[1];\n        }\n        if (matchGradient[2]) {\n            result.angle = matchGradient[2];\n        }\n        if (matchGradient[3]) {\n            result.sideCorner = matchGradient[3];\n        }\n        regExpLib.colorStopSearch.lastIndex = 0;\n        matchColorStop = regExpLib.colorStopSearch.exec(matchGradient[4]);\n        while (!isNull(matchColorStop)) {\n            stopResult = {\n                color: matchColorStop[1],\n            };\n            if (matchColorStop[2]) {\n                stopResult.position = matchColorStop[2];\n            }\n            result.colorStopList.push(stopResult);\n            matchColorStop = regExpLib.colorStopSearch.exec(matchGradient[4]);\n        }\n    }\n    return result;\n};\nconst REGEXP_LIB = generateRegExp();\nconst REG_GRADIENT = /.*gradient\\s*\\(((?:\\([^)]*\\)|[^)(]*)*)\\)/gim;\nexport const isGradientColor = (input) => {\n    REG_GRADIENT.lastIndex = 0;\n    return REG_GRADIENT.exec(input);\n};\nconst sideCornerDegreeMap = {\n    top: 0,\n    right: 90,\n    bottom: 180,\n    left: 270,\n    'top left': 225,\n    'left top': 225,\n    'top right': 135,\n    'right top': 135,\n    'bottom left': 315,\n    'left bottom': 315,\n    'bottom right': 45,\n    'right bottom': 45,\n};\nexport const parseGradientString = (input) => {\n    const match = isGradientColor(input);\n    if (!match) {\n        return false;\n    }\n    const gradientColors = {\n        points: [],\n        degree: 0,\n    };\n    const result = parseGradient(REGEXP_LIB, match[1]);\n    if (result.original.trim() !== match[1].trim()) {\n        return false;\n    }\n    const points = result.colorStopList.map(({ color, position }) => {\n        const point = Object.create(null);\n        point.color = tinyColor(color).toRgbString();\n        point.left = parseFloat(position);\n        return point;\n    });\n    gradientColors.points = points;\n    let degree = parseInt(result.angle, 10);\n    if (Number.isNaN(degree)) {\n        degree = sideCornerDegreeMap[result.sideCorner] || 90;\n    }\n    gradientColors.degree = degree;\n    return gradientColors;\n};\nexport default parseGradientString;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/color-picker/index.d.ts",
    "content": "export * from './cmyk';\nexport * from './color';\nexport * from './gradient';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/color-picker/index.js",
    "content": "export * from './cmyk';\nexport * from './color';\nexport * from './gradient';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/date.d.ts",
    "content": "export declare type CompareDate = Date | number | {\n    year: number;\n    month: number;\n    date: number;\n};\nexport declare const getDateRect: (date: Date | number) => {\n    year: number;\n    month: number;\n    date: number;\n    day: number;\n    time: number;\n};\nexport declare const isSameDate: (date1: CompareDate, date2: CompareDate) => boolean;\nexport declare const getMonthDateRect: (date: Date | number) => {\n    year: number;\n    month: number;\n    weekdayOfFirstDay: number;\n    lastDate: number;\n};\nexport declare const isValidDate: (val: any) => boolean;\nexport declare const getDate: (...args: any[]) => any;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/shared/date.js",
    "content": "export const getDateRect = (date) => {\n    const _date = new Date(date);\n    return {\n        year: _date.getFullYear(),\n        month: _date.getMonth(),\n        date: _date.getDate(),\n        day: _date.getDay(),\n        time: _date.getTime(),\n    };\n};\nexport const isSameDate = (date1, date2) => {\n    if (date1 instanceof Date || typeof date1 === 'number')\n        date1 = getDateRect(date1);\n    if (date2 instanceof Date || typeof date2 === 'number')\n        date2 = getDateRect(date2);\n    const keys = ['year', 'month', 'date'];\n    return keys.every((key) => date1[key] === date2[key]);\n};\nexport const getMonthDateRect = (date) => {\n    const { year, month } = getDateRect(date);\n    const firstDay = new Date(year, month, 1);\n    const weekdayOfFirstDay = firstDay.getDay();\n    const lastDate = new Date(+new Date(year, month + 1, 1) - 24 * 3600 * 1000).getDate();\n    return {\n        year,\n        month,\n        weekdayOfFirstDay,\n        lastDate,\n    };\n};\nexport const isValidDate = (val) => typeof val === 'number' || val instanceof Date;\nexport const getDate = (...args) => {\n    const now = new Date();\n    if (args.length === 0)\n        return now;\n    if (args.length === 1 && args[0] <= 1000) {\n        const { year, month, date } = getDateRect(now);\n        return new Date(year, month + args[0], date);\n    }\n    return Date.apply(null, args);\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/src/control.d.ts",
    "content": "declare type ControlInstance = {\n    controlled: boolean;\n    initValue: any;\n    set(newVal: any, extObj?: Object, fn?: any): void;\n    get(): any;\n    change(newVal: any, customChangeData?: any, customUpdateFn?: any): void;\n};\ndeclare type ControlOption = {\n    valueKey?: string;\n    defaultValueKey?: string;\n    changeEventName?: string;\n    strict?: boolean;\n};\ndeclare function useControl(this: any, option?: ControlOption): ControlInstance;\nexport { ControlOption, ControlInstance, useControl };\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/src/control.js",
    "content": "const defaultOption = {\n    valueKey: 'value',\n    defaultValueKey: 'defaultValue',\n    changeEventName: 'change',\n    strict: true,\n};\nfunction useControl(option = {}) {\n    const { valueKey, defaultValueKey, changeEventName, strict } = Object.assign(Object.assign({}, defaultOption), option);\n    const props = this.properties || {};\n    const value = props[valueKey];\n    const defaultValue = props[strict ? defaultValueKey : valueKey];\n    let controlled = false;\n    if (strict && typeof value !== 'undefined' && value !== null) {\n        controlled = true;\n    }\n    const set = (newVal, extObj, fn) => {\n        this.setData(Object.assign({ [`_${valueKey}`]: newVal }, extObj), fn);\n    };\n    return {\n        controlled,\n        initValue: controlled ? value : defaultValue,\n        set,\n        get: () => {\n            return this.data[`_${valueKey}`];\n        },\n        change: (newVal, customChangeData, customUpdateFn) => {\n            this.triggerEvent(changeEventName, typeof customChangeData !== 'undefined' ? customChangeData : newVal);\n            if (controlled) {\n                return;\n            }\n            if (typeof customUpdateFn === 'function') {\n                customUpdateFn();\n            }\n            else {\n                set(newVal);\n            }\n        },\n    };\n}\nexport { useControl };\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/src/flatTool.d.ts",
    "content": "export declare const getPrototypeOf: (obj: any) => any;\nexport declare const isObject: (something: any) => boolean;\nexport declare const iterateInheritedPrototype: (callback: (proto: Record<string, any>) => boolean | void, fromCtor: any, toCtor: any, includeToCtor?: boolean) => void;\nexport interface ClassInstanceToObjectOptions {\n    bindTo?: any;\n    excludes?: string[];\n    till?: any;\n    enumerable?: 0 | boolean;\n    configurable?: 0 | boolean;\n    writable?: 0 | boolean;\n}\nexport declare const toObject: (something: any, options?: ClassInstanceToObjectOptions) => {\n    [key: string]: any;\n};\nexport declare const isPlainObject: (something: any) => boolean;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/src/flatTool.js",
    "content": "export const getPrototypeOf = function (obj) {\n    return Object.getPrototypeOf ? Object.getPrototypeOf(obj) : obj.__proto__;\n};\nexport const isObject = function isObject(something) {\n    const type = typeof something;\n    return something !== null && (type === 'function' || type === 'object');\n};\nexport const iterateInheritedPrototype = function iterateInheritedPrototype(callback, fromCtor, toCtor, includeToCtor = true) {\n    let proto = fromCtor.prototype || fromCtor;\n    const toProto = toCtor.prototype || toCtor;\n    while (proto) {\n        if (!includeToCtor && proto === toProto)\n            break;\n        if (callback(proto) === false)\n            break;\n        if (proto === toProto)\n            break;\n        proto = getPrototypeOf(proto);\n    }\n};\nexport const toObject = function toObject(something, options = {}) {\n    const obj = {};\n    if (!isObject(something))\n        return obj;\n    const excludes = options.excludes || ['constructor'];\n    const { enumerable = true, configurable = 0, writable = 0 } = options;\n    const defaultDesc = {};\n    if (enumerable !== 0)\n        defaultDesc.enumerable = enumerable;\n    if (configurable !== 0)\n        defaultDesc.configurable = configurable;\n    if (writable !== 0)\n        defaultDesc.writable = writable;\n    iterateInheritedPrototype((proto) => {\n        Object.getOwnPropertyNames(proto).forEach((key) => {\n            if (excludes.indexOf(key) >= 0)\n                return;\n            if (Object.prototype.hasOwnProperty.call(obj, key))\n                return;\n            const desc = Object.getOwnPropertyDescriptor(proto, key);\n            const fnKeys = ['get', 'set', 'value'];\n            fnKeys.forEach((k) => {\n                if (typeof desc[k] === 'function') {\n                    const oldFn = desc[k];\n                    desc[k] = function (...args) {\n                        return oldFn.apply(Object.prototype.hasOwnProperty.call(options, 'bindTo') ? options.bindTo : this, args);\n                    };\n                }\n            });\n            Object.defineProperty(obj, key, Object.assign(Object.assign({}, desc), defaultDesc));\n        });\n    }, something, options.till || Object, false);\n    return obj;\n};\nexport const isPlainObject = function isPlainObject(something) {\n    return Object.prototype.toString.call(something) === '[object Object]';\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/src/index.d.ts",
    "content": "export * from './superComponent';\nexport * from './flatTool';\nexport * from './instantiationDecorator';\nexport * from './control';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/src/index.js",
    "content": "export * from './superComponent';\nexport * from './flatTool';\nexport * from './instantiationDecorator';\nexport * from './control';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/src/instantiationDecorator.d.ts",
    "content": "import { SuperComponent } from './superComponent';\nexport declare const toComponent: (options: Record<string, any>) => Record<string, any>;\nexport declare const wxComponent: () => (constructor: new () => SuperComponent) => void;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/src/instantiationDecorator.js",
    "content": "import { isPlainObject, toObject } from './flatTool';\nimport { canUseVirtualHost } from '../version';\nconst RawLifeCycles = ['Created', 'Attached', 'Ready', 'Moved', 'Detached', 'Error'];\nconst NativeLifeCycles = RawLifeCycles.map((k) => k.toLowerCase());\nconst ComponentNativeProps = [\n    'properties',\n    'data',\n    'observers',\n    'methods',\n    'behaviors',\n    ...NativeLifeCycles,\n    'relations',\n    'externalClasses',\n    'options',\n    'lifetimes',\n    'pageLifeTimes',\n    'definitionFilter',\n];\nexport const toComponent = function toComponent(options) {\n    const { relations, behaviors = [], externalClasses = [] } = options;\n    if (options.properties) {\n        Object.keys(options.properties).forEach((k) => {\n            let opt = options.properties[k];\n            if (!isPlainObject(opt)) {\n                opt = { type: opt };\n            }\n            options.properties[k] = opt;\n        });\n        const ariaProps = [\n            { key: 'ariaHidden', type: Boolean },\n            { key: 'ariaRole', type: String },\n            { key: 'ariaLabel', type: String },\n            { key: 'ariaLabelledby', type: String },\n            { key: 'ariaDescribedby', type: String },\n            { key: 'ariaBusy', type: Boolean },\n        ];\n        ariaProps.forEach(({ key, type }) => {\n            options.properties[key] = {\n                type,\n            };\n        });\n        options.properties.style = { type: String, value: '' };\n        options.properties.customStyle = { type: String, value: '' };\n    }\n    if (!options.methods)\n        options.methods = {};\n    if (!options.lifetimes)\n        options.lifetimes = {};\n    const inits = {};\n    if (relations) {\n        const getRelations = (relation, path) => Behavior({\n            created() {\n                Object.defineProperty(this, `$${relation}`, {\n                    get: () => {\n                        const nodes = this.getRelationNodes(path) || [];\n                        return relation === 'parent' ? nodes[0] : nodes;\n                    },\n                });\n            },\n        });\n        const map = {};\n        Object.keys(relations).forEach((path) => {\n            const comp = relations[path];\n            const relation = ['parent', 'ancestor'].includes(comp.type) ? 'parent' : 'children';\n            const mixin = getRelations(relation, path);\n            map[relation] = mixin;\n        });\n        behaviors.push(...Object.keys(map).map((key) => map[key]));\n    }\n    options.behaviors = [...behaviors];\n    options.externalClasses = ['class', ...externalClasses];\n    Object.getOwnPropertyNames(options).forEach((k) => {\n        const desc = Object.getOwnPropertyDescriptor(options, k);\n        if (!desc)\n            return;\n        if (NativeLifeCycles.indexOf(k) < 0 && typeof desc.value === 'function') {\n            Object.defineProperty(options.methods, k, desc);\n            delete options[k];\n        }\n        else if (ComponentNativeProps.indexOf(k) < 0) {\n            inits[k] = desc;\n        }\n        else if (NativeLifeCycles.indexOf(k) >= 0) {\n            options.lifetimes[k] = options[k];\n        }\n    });\n    if (Object.keys(inits).length) {\n        const oldCreated = options.lifetimes.created;\n        const oldAttached = options.lifetimes.attached;\n        const { controlledProps = [] } = options;\n        options.lifetimes.created = function (...args) {\n            Object.defineProperties(this, inits);\n            if (oldCreated)\n                oldCreated.apply(this, args);\n        };\n        options.lifetimes.attached = function (...args) {\n            if (oldAttached)\n                oldAttached.apply(this, args);\n            controlledProps.forEach(({ key }) => {\n                const defaultKey = `default${key.replace(/^(\\w)/, (m, m1) => m1.toUpperCase())}`;\n                const props = this.properties;\n                if (props[key] == null) {\n                    this._selfControlled = true;\n                }\n                if (props[key] == null && props[defaultKey] != null) {\n                    this.setData({\n                        [key]: props[defaultKey],\n                    });\n                }\n            });\n        };\n        options.methods._trigger = function (evtName, detail, opts) {\n            const target = controlledProps.find((item) => item.event == evtName);\n            if (target) {\n                const { key } = target;\n                if (this._selfControlled) {\n                    this.setData({\n                        [key]: detail[key],\n                    });\n                }\n            }\n            this.triggerEvent(evtName, detail, opts);\n        };\n    }\n    return options;\n};\nexport const wxComponent = function wxComponent() {\n    return function (constructor) {\n        class WxComponent extends constructor {\n        }\n        const current = new WxComponent();\n        current.options = current.options || {};\n        if (canUseVirtualHost()) {\n            current.options.virtualHost = true;\n        }\n        const obj = toComponent(toObject(current));\n        Component(obj);\n    };\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/src/superComponent.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\nexport interface ComponentsOptionsType extends WechatMiniprogram.Component.ComponentOptions {\n    styleIsolation?: 'isolated' | 'apply-shared' | 'shared' | 'page-isolated' | 'page-apply-shared' | 'page-shared';\n}\nexport interface RelationsOptions {\n    [componentName: string]: WechatMiniprogram.Component.RelationOption;\n}\nexport interface SuperComponent<D = {}, P = {}, M = {}> extends WechatMiniprogram.Component.Lifetimes, WechatMiniprogram.Component.OtherOption, WechatMiniprogram.Component.InstanceMethods<D> {\n    properties: P;\n    data: D;\n    options: ComponentsOptionsType;\n    methods: M | Record<string, (...args: any[]) => any>;\n    $global: Function;\n    [x: string]: any;\n}\nexport declare class SuperComponent<D = {}, P = {}, M = {}> {\n    readonly app: any;\n    constructor();\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/src/superComponent.js",
    "content": "export class SuperComponent {\n    constructor() {\n        this.app = getApp();\n    }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/_variables.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/base.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/icons.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/index.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/mixins/_clearfix.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/mixins/_cursor.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/mixins/_ellipsis.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/mixins/_hairline.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/mixins/_index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/theme/_components.wxss",
    "content": "@media (prefers-color-scheme: dark) {\n  page,\n  .page {\n    --td-button-primary-disabled-color: var(--td-font-white-4);\n    --td-skeleton-animation-gradient: rgba(255, 255, 255, 0.06);\n    --td-slider-dot-bg-color: var(--td-gray-color-4);\n    --td-slider-dot-disabled-bg-color: var(--td-gray-color-11);\n    --td-slider-dot-disabled-border-color: var(--td-gray-color-12);\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/theme/_dark.wxss",
    "content": "@media (prefers-color-scheme: dark) {\n  page,\n  .page {\n    --td-primary-color-1: #1b2f51;\n    --td-primary-color-2: #173463;\n    --td-primary-color-3: #143975;\n    --td-primary-color-4: #103d88;\n    --td-primary-color-5: #0d429a;\n    --td-primary-color-6: #054bbe;\n    --td-primary-color-7: #2667d4;\n    --td-primary-color-8: #4582e6;\n    --td-primary-color-9: #699ef5;\n    --td-primary-color-10: #96bbf8;\n    --td-warning-color-1: #4f2a1d;\n    --td-warning-color-2: #582f21;\n    --td-warning-color-3: #733c23;\n    --td-warning-color-4: #a75d2b;\n    --td-warning-color-5: #cf6e2d;\n    --td-warning-color-6: #dc7633;\n    --td-warning-color-7: #e8935c;\n    --td-warning-color-8: #ecbf91;\n    --td-warning-color-9: #eed7bf;\n    --td-warning-color-10: #f3e9dc;\n    --td-error-color-1: #472324;\n    --td-error-color-2: #5e2a2d;\n    --td-error-color-3: #703439;\n    --td-error-color-4: #83383e;\n    --td-error-color-5: #a03f46;\n    --td-error-color-6: #c64751;\n    --td-error-color-7: #de6670;\n    --td-error-color-8: #ec888e;\n    --td-error-color-9: #edb1b6;\n    --td-error-color-10: #eeced0;\n    --td-success-color-1: #193a2a;\n    --td-success-color-2: #1a4230;\n    --td-success-color-3: #17533d;\n    --td-success-color-4: #0d7a55;\n    --td-success-color-5: #059465;\n    --td-success-color-6: #43af8a;\n    --td-success-color-7: #46bf96;\n    --td-success-color-8: #80d2b6;\n    --td-success-color-9: #b4e1d3;\n    --td-success-color-10: #deede8;\n    --td-gray-color-1: #f3f3f3;\n    --td-gray-color-2: #eee;\n    --td-gray-color-3: #e8e8e8;\n    --td-gray-color-4: #ddd;\n    --td-gray-color-5: #c6c6c6;\n    --td-gray-color-6: #a6a6a6;\n    --td-gray-color-7: #8b8b8b;\n    --td-gray-color-8: #777;\n    --td-gray-color-9: #5e5e5e;\n    --td-gray-color-10: #4b4b4b;\n    --td-gray-color-11: #383838;\n    --td-gray-color-12: #2c2c2c;\n    --td-gray-color-13: #242424;\n    --td-gray-color-14: #181818;\n    --td-font-white-1: rgba(255, 255, 255, 0.9);\n    --td-font-white-2: rgba(255, 255, 255, 0.55);\n    --td-font-white-3: rgba(255, 255, 255, 0.35);\n    --td-font-white-4: rgba(255, 255, 255, 0.22);\n    --td-font-gray-1: rgba(0, 0, 0, 0.9);\n    --td-font-gray-2: rgba(0, 0, 0, 0.6);\n    --td-font-gray-3: rgba(0, 0, 0, 0.4);\n    --td-font-gray-4: rgba(0, 0, 0, 0.26);\n    --td-brand-color: var(--td-primary-color-8);\n    --td-warning-color: var(--td-warning-color-5);\n    --td-error-color: var(--td-error-color-6);\n    --td-success-color: var(--td-success-color-5);\n    --td-brand-color-focus: var(--td-primary-color-1);\n    --td-brand-color-active: var(--td-primary-color-9);\n    --td-brand-color-disabled: var(--td-primary-color-3);\n    --td-brand-color-light: var(--td-primary-color-1);\n    --td-brand-color-light-active: var(--td-primary-color-2);\n    --td-warning-color-focus: var(--td-warning-color-2);\n    --td-warning-color-active: var(--td-warning-color-4);\n    --td-warning-color-disabled: var(--td-warning-color-3);\n    --td-warning-color-light: var(--td-warning-color-1);\n    --td-warning-color-light-active: var(--td-warning-color-2);\n    --td-error-color-focus: var(--td-error-color-2);\n    --td-error-color-active: var(--td-error-color-5);\n    --td-error-color-disabled: var(--td-error-color-3);\n    --td-error-color-light: var(--td-error-color-1);\n    --td-error-color-light-active: var(--td-error-color-2);\n    --td-success-color-focus: var(--td-success-color-2);\n    --td-success-color-active: var(--td-success-color-4);\n    --td-success-color-disabled: var(--td-success-color-3);\n    --td-success-color-light: var(--td-success-color-1);\n    --td-success-color-light-active: var(--td-success-color-2);\n    --td-mask-active: rgba(0, 0, 0, 0.4);\n    --td-mask-disabled: rgba(0, 0, 0, 0.6);\n    --td-bg-color-page: var(--td-gray-color-14);\n    --td-bg-color-container: var(--td-gray-color-13);\n    --td-bg-color-secondarycontainer: var(--td-gray-color-12);\n    --td-bg-color-component: var(--td-gray-color-11);\n    --td-bg-color-container-active: var(--td-gray-color-12);\n    --td-bg-color-secondarycontainer-active: var(--td-gray-color-11);\n    --td-bg-color-component-active: var(--td-gray-color-10);\n    --td-bg-color-component-disabled: var(--td-gray-color-12);\n    --td-bg-color-specialcomponent: transparent;\n    --td-text-color-primary: var(--td-font-white-1);\n    --td-text-color-secondary: var(--td-font-white-2);\n    --td-text-color-placeholder: var(--td-font-white-3);\n    --td-text-color-disabled: var(--td-font-white-4);\n    --td-text-color-anti: var(--td-font-white-1);\n    --td-text-color-brand: var(--td-primary-color-8);\n    --td-text-color-link: var(--td-primary-color-8);\n    --td-border-level-1-color: var(--td-gray-color-11);\n    --td-component-stroke: var(--td-gray-color-11);\n    --td-border-level-2-color: var(--td-gray-color-9);\n    --td-component-border: var(--td-gray-color-9);\n    --td-shadow-1: 0 4px 6px rgba(0, 0, 0, 0.06), 0 1px 10px rgba(0, 0, 0, 8%), 0 2px 4px rgba(0, 0, 0, 12%);\n    --td-shadow-2: 0 8px 10px rgba(0, 0, 0, 0.12), 0 3px 14px rgba(0, 0, 0, 10%), 0 5px 5px rgba(0, 0, 0, 16%);\n    --td-shadow-3: 0 16px 24px rgba(0, 0, 0, 0.14), 0 6px 30px rgba(0, 0, 0, 12%), 0 8px 10px rgba(0, 0, 0, 20%);\n    --td-shadow-inset-top: inset 0 0.5px 0 #5e5e5e;\n    --td-shadow-inset-right: inset 0.5px 0 0 #5e5e5e;\n    --td-shadow-inset-bottom: inset 0 -0.5px 0 #5e5e5e;\n    --td-shadow-inset-left: inset -0.5px 0 0 #5e5e5e;\n    --td-table-shadow-color: rgba(0, 0, 0, 0.55);\n    --td-scrollbar-color: rgba(255, 255, 255, 0.1);\n    --td-scroll-track-color: #333;\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/theme/_font.wxss",
    "content": "page,\n.page {\n  --td-font-family: PingFang SC, Microsoft YaHei, Arial Regular;\n  --td-font-family-medium: PingFang SC, Microsoft YaHei, Arial Medium;\n  --td-font-size-link-small: 24rpx;\n  --td-font-size-link-medium: 28rpx;\n  --td-font-size-link-large: 32rpx;\n  --td-font-size-mark-extra-small: 20rpx;\n  --td-font-size-mark-small: 24rpx;\n  --td-font-size-mark-medium: 28rpx;\n  --td-font-size-mark-large: 32rpx;\n  --td-font-size-body-extra-small: 20rpx;\n  --td-font-size-body-small: 24rpx;\n  --td-font-size-body-medium: 28rpx;\n  --td-font-size-body-large: 32rpx;\n  --td-font-size-title-small: 28rpx;\n  --td-font-size-title-medium: 32rpx;\n  --td-font-size-title-large: 36rpx;\n  --td-font-size-title-extra-large: 40rpx;\n  --td-font-size-headline-small: 48rpx;\n  --td-font-size-headline-medium: 56rpx;\n  --td-font-size-headline-large: 72rpx;\n  --td-font-size-display-medium: 96rpx;\n  --td-font-size-display-large: 128rpx;\n  --td-font-size: 20rpx;\n  --td-font-size-xs: var(--td-font-size-body-extra-small);\n  --td-font-size-s: var(--td-font-size-body-small);\n  --td-font-size-base: var(--td-font-size-title-small);\n  --td-font-size-m: var(--td-font-size-title-medium);\n  --td-font-size-l: var(--td-font-size-title-large);\n  --td-font-size-xl: var(--td-font-size-title-extra-large);\n  --td-font-size-xxl: var(--td-font-size-headline-large);\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/theme/_index.wxss",
    "content": "@media (prefers-color-scheme: light) {\n  page,\n  .page {\n    --td-primary-color-1: #f2f3ff;\n    --td-primary-color-2: #d9e1ff;\n    --td-primary-color-3: #b5c7ff;\n    --td-primary-color-4: #8eabff;\n    --td-primary-color-5: #618dff;\n    --td-primary-color-6: #366ef4;\n    --td-primary-color-7: #0052d9;\n    --td-primary-color-8: #003cab;\n    --td-primary-color-9: #002a7c;\n    --td-primary-color-10: #001a57;\n    --td-warning-color-1: #fff1e9;\n    --td-warning-color-2: #ffd9c2;\n    --td-warning-color-3: #ffb98c;\n    --td-warning-color-4: #fa9550;\n    --td-warning-color-5: #e37318;\n    --td-warning-color-6: #be5a00;\n    --td-warning-color-7: #954500;\n    --td-warning-color-8: #713300;\n    --td-warning-color-9: #532300;\n    --td-warning-color-10: #3b1700;\n    --td-error-color-1: #fff0ed;\n    --td-error-color-2: #ffd8d2;\n    --td-error-color-3: #ffb9b0;\n    --td-error-color-4: #ff9285;\n    --td-error-color-5: #f6685d;\n    --td-error-color-6: #d54941;\n    --td-error-color-7: #ad352f;\n    --td-error-color-8: #881f1c;\n    --td-error-color-9: #68070a;\n    --td-error-color-10: #490002;\n    --td-success-color-1: #e3f9e9;\n    --td-success-color-2: #c6f3d7;\n    --td-success-color-3: #92dab2;\n    --td-success-color-4: #56c08d;\n    --td-success-color-5: #2ba471;\n    --td-success-color-6: #008858;\n    --td-success-color-7: #006c45;\n    --td-success-color-8: #005334;\n    --td-success-color-9: #003b23;\n    --td-success-color-10: #002515;\n    --td-gray-color-1: #f3f3f3;\n    --td-gray-color-2: #eeeeee;\n    --td-gray-color-3: #e7e7e7;\n    --td-gray-color-4: #dcdcdc;\n    --td-gray-color-5: #c5c5c5;\n    --td-gray-color-6: #a6a6a6;\n    --td-gray-color-7: #8b8b8b;\n    --td-gray-color-8: #777777;\n    --td-gray-color-9: #5e5e5e;\n    --td-gray-color-10: #4b4b4b;\n    --td-gray-color-11: #383838;\n    --td-gray-color-12: #2c2c2c;\n    --td-gray-color-13: #242424;\n    --td-gray-color-14: #181818;\n    --td-font-white-1: #ffffff;\n    --td-font-white-2: rgba(255, 255, 255, 0.55);\n    --td-font-white-3: rgba(255, 255, 255, 0.35);\n    --td-font-white-4: rgba(255, 255, 255, 0.22);\n    --td-font-gray-1: rgba(0, 0, 0, 0.9);\n    --td-font-gray-2: rgba(0, 0, 0, 0.6);\n    --td-font-gray-3: rgba(0, 0, 0, 0.4);\n    --td-font-gray-4: rgba(0, 0, 0, 0.26);\n    --td-brand-color: var(--td-primary-color-7);\n    --td-warning-color: var(--td-warning-color-5);\n    --td-error-color: var(--td-error-color-6);\n    --td-success-color: var(--td-success-color-5);\n    --td-brand-color-focus: var(--td-primary-color-1);\n    --td-brand-color-active: var(--td-primary-color-8);\n    --td-brand-color-disabled: var(--td-primary-color-3);\n    --td-brand-color-light: var(--td-primary-color-1);\n    --td-brand-color-light-active: var(--td-primary-color-2);\n    --td-warning-color-active: var(--td-warning-color-6);\n    --td-warning-color-disabled: var(--td-warning-color-3);\n    --td-warning-color-focus: var(--td-warning-color-2);\n    --td-warning-color-light: var(--td-warning-color-1);\n    --td-warning-color-light-active: var(--td-warning-color-2);\n    --td-error-color-focus: var(--td-error-color-2);\n    --td-error-color-active: var(--td-error-color-7);\n    --td-error-color-disabled: var(--td-error-color-3);\n    --td-error-color-light: var(--td-error-color-1);\n    --td-error-color-light-active: var(--td-error-color-2);\n    --td-success-color-focus: var(--td-success-color-2);\n    --td-success-color-active: var(--td-success-color-6);\n    --td-success-color-disabled: var(--td-success-color-3);\n    --td-success-color-light: var(--td-success-color-1);\n    --td-success-color-light-active: var(--td-success-color-2);\n    --td-mask-active: rgba(0, 0, 0, 0.6);\n    --td-mask-disabled: rgba(255, 255, 255, 0.6);\n    --td-bg-color-page: var(--td-gray-color-1);\n    --td-bg-color-container: var(--td-font-white-1);\n    --td-bg-color-container-active: var(--td-gray-color-3);\n    --td-bg-color-secondarycontainer: var(--td-gray-color-1);\n    --td-bg-color-secondarycontainer-active: var(--td-gray-color-4);\n    --td-bg-color-component: var(--td-gray-color-3);\n    --td-bg-color-component-active: var(--td-gray-color-6);\n    --td-bg-color-component-disabled: var(--td-gray-color-2);\n    --td-bg-color-secondarycomponent: var(--td-gray-color-4);\n    --td-bg-color-secondarycomponent-active: var(--td-gray-color-6);\n    --td-bg-color-specialcomponent: #fff;\n    --td-text-color-primary: var(--td-font-gray-1);\n    --td-text-color-secondary: var(--td-font-gray-2);\n    --td-text-color-placeholder: var(--td-font-gray-3);\n    --td-text-color-disabled: var(--td-font-gray-4);\n    --td-text-color-anti: var(--td-font-white-1);\n    --td-text-color-brand: var(--td-brand-color);\n    --td-text-color-link: var(--td-brand-color);\n    --td-border-level-1-color: var(--td-gray-color-3);\n    --td-component-stroke: var(--td-gray-color-3);\n    --td-border-level-2-color: var(--td-gray-color-4);\n    --td-component-border: var(--td-gray-color-4);\n    --td-shadow-1: 0 1px 10px rgba(0, 0, 0, 0.05), 0 4px 5px rgba(0, 0, 0, 8%), 0 2px 4px -1px rgba(0, 0, 0, 12%);\n    --td-shadow-2: 0 3px 14px 2px rgba(0, 0, 0, 0.05), 0 8px 10px 1px rgba(0, 0, 0, 6%), 0 5px 5px -3px rgba(0, 0, 0, 10%);\n    --td-shadow-3: 0 6px 30px 5px rgba(0, 0, 0, 0.05), 0 16px 24px 2px rgba(0, 0, 0, 4%),\n      0 8px 10px -5px rgba(0, 0, 0, 8%);\n    --td-shadow-4: 0 2px 8px 0 rgba(0, 0, 0, 0.06);\n    --td-shadow-inset-top: inset 0 0.5px 0 #dcdcdc;\n    --td-shadow-inset-right: inset 0.5px 0 0 #dcdcdc;\n    --td-shadow-inset-bottom: inset 0 -0.5px 0 #dcdcdc;\n    --td-shadow-inset-left: inset -0.5px 0 0 #dcdcdc;\n    --td-table-shadow-color: rgba(0, 0, 0, 0.08);\n    --td-scrollbar-color: rgba(0, 0, 0, 0.1);\n    --td-scrollbar-hover-color: rgba(0, 0, 0, 0.3);\n    --td-scroll-track-color: #fff;\n  }\n}\n@media (prefers-color-scheme: dark) {\n  page,\n  .page {\n    --td-primary-color-1: #1b2f51;\n    --td-primary-color-2: #173463;\n    --td-primary-color-3: #143975;\n    --td-primary-color-4: #103d88;\n    --td-primary-color-5: #0d429a;\n    --td-primary-color-6: #054bbe;\n    --td-primary-color-7: #2667d4;\n    --td-primary-color-8: #4582e6;\n    --td-primary-color-9: #699ef5;\n    --td-primary-color-10: #96bbf8;\n    --td-warning-color-1: #4f2a1d;\n    --td-warning-color-2: #582f21;\n    --td-warning-color-3: #733c23;\n    --td-warning-color-4: #a75d2b;\n    --td-warning-color-5: #cf6e2d;\n    --td-warning-color-6: #dc7633;\n    --td-warning-color-7: #e8935c;\n    --td-warning-color-8: #ecbf91;\n    --td-warning-color-9: #eed7bf;\n    --td-warning-color-10: #f3e9dc;\n    --td-error-color-1: #472324;\n    --td-error-color-2: #5e2a2d;\n    --td-error-color-3: #703439;\n    --td-error-color-4: #83383e;\n    --td-error-color-5: #a03f46;\n    --td-error-color-6: #c64751;\n    --td-error-color-7: #de6670;\n    --td-error-color-8: #ec888e;\n    --td-error-color-9: #edb1b6;\n    --td-error-color-10: #eeced0;\n    --td-success-color-1: #193a2a;\n    --td-success-color-2: #1a4230;\n    --td-success-color-3: #17533d;\n    --td-success-color-4: #0d7a55;\n    --td-success-color-5: #059465;\n    --td-success-color-6: #43af8a;\n    --td-success-color-7: #46bf96;\n    --td-success-color-8: #80d2b6;\n    --td-success-color-9: #b4e1d3;\n    --td-success-color-10: #deede8;\n    --td-gray-color-1: #f3f3f3;\n    --td-gray-color-2: #eee;\n    --td-gray-color-3: #e8e8e8;\n    --td-gray-color-4: #ddd;\n    --td-gray-color-5: #c6c6c6;\n    --td-gray-color-6: #a6a6a6;\n    --td-gray-color-7: #8b8b8b;\n    --td-gray-color-8: #777;\n    --td-gray-color-9: #5e5e5e;\n    --td-gray-color-10: #4b4b4b;\n    --td-gray-color-11: #383838;\n    --td-gray-color-12: #2c2c2c;\n    --td-gray-color-13: #242424;\n    --td-gray-color-14: #181818;\n    --td-font-white-1: rgba(255, 255, 255, 0.9);\n    --td-font-white-2: rgba(255, 255, 255, 0.55);\n    --td-font-white-3: rgba(255, 255, 255, 0.35);\n    --td-font-white-4: rgba(255, 255, 255, 0.22);\n    --td-font-gray-1: rgba(0, 0, 0, 0.9);\n    --td-font-gray-2: rgba(0, 0, 0, 0.6);\n    --td-font-gray-3: rgba(0, 0, 0, 0.4);\n    --td-font-gray-4: rgba(0, 0, 0, 0.26);\n    --td-brand-color: var(--td-primary-color-8);\n    --td-warning-color: var(--td-warning-color-5);\n    --td-error-color: var(--td-error-color-6);\n    --td-success-color: var(--td-success-color-5);\n    --td-brand-color-focus: var(--td-primary-color-1);\n    --td-brand-color-active: var(--td-primary-color-9);\n    --td-brand-color-disabled: var(--td-primary-color-3);\n    --td-brand-color-light: var(--td-primary-color-1);\n    --td-brand-color-light-active: var(--td-primary-color-2);\n    --td-warning-color-focus: var(--td-warning-color-2);\n    --td-warning-color-active: var(--td-warning-color-4);\n    --td-warning-color-disabled: var(--td-warning-color-3);\n    --td-warning-color-light: var(--td-warning-color-1);\n    --td-warning-color-light-active: var(--td-warning-color-2);\n    --td-error-color-focus: var(--td-error-color-2);\n    --td-error-color-active: var(--td-error-color-5);\n    --td-error-color-disabled: var(--td-error-color-3);\n    --td-error-color-light: var(--td-error-color-1);\n    --td-error-color-light-active: var(--td-error-color-2);\n    --td-success-color-focus: var(--td-success-color-2);\n    --td-success-color-active: var(--td-success-color-4);\n    --td-success-color-disabled: var(--td-success-color-3);\n    --td-success-color-light: var(--td-success-color-1);\n    --td-success-color-light-active: var(--td-success-color-2);\n    --td-mask-active: rgba(0, 0, 0, 0.4);\n    --td-mask-disabled: rgba(0, 0, 0, 0.6);\n    --td-bg-color-page: var(--td-gray-color-14);\n    --td-bg-color-container: var(--td-gray-color-13);\n    --td-bg-color-secondarycontainer: var(--td-gray-color-12);\n    --td-bg-color-component: var(--td-gray-color-11);\n    --td-bg-color-container-active: var(--td-gray-color-12);\n    --td-bg-color-secondarycontainer-active: var(--td-gray-color-11);\n    --td-bg-color-component-active: var(--td-gray-color-10);\n    --td-bg-color-component-disabled: var(--td-gray-color-12);\n    --td-bg-color-specialcomponent: transparent;\n    --td-text-color-primary: var(--td-font-white-1);\n    --td-text-color-secondary: var(--td-font-white-2);\n    --td-text-color-placeholder: var(--td-font-white-3);\n    --td-text-color-disabled: var(--td-font-white-4);\n    --td-text-color-anti: var(--td-font-white-1);\n    --td-text-color-brand: var(--td-primary-color-8);\n    --td-text-color-link: var(--td-primary-color-8);\n    --td-border-level-1-color: var(--td-gray-color-11);\n    --td-component-stroke: var(--td-gray-color-11);\n    --td-border-level-2-color: var(--td-gray-color-9);\n    --td-component-border: var(--td-gray-color-9);\n    --td-shadow-1: 0 4px 6px rgba(0, 0, 0, 0.06), 0 1px 10px rgba(0, 0, 0, 8%), 0 2px 4px rgba(0, 0, 0, 12%);\n    --td-shadow-2: 0 8px 10px rgba(0, 0, 0, 0.12), 0 3px 14px rgba(0, 0, 0, 10%), 0 5px 5px rgba(0, 0, 0, 16%);\n    --td-shadow-3: 0 16px 24px rgba(0, 0, 0, 0.14), 0 6px 30px rgba(0, 0, 0, 12%), 0 8px 10px rgba(0, 0, 0, 20%);\n    --td-shadow-inset-top: inset 0 0.5px 0 #5e5e5e;\n    --td-shadow-inset-right: inset 0.5px 0 0 #5e5e5e;\n    --td-shadow-inset-bottom: inset 0 -0.5px 0 #5e5e5e;\n    --td-shadow-inset-left: inset -0.5px 0 0 #5e5e5e;\n    --td-table-shadow-color: rgba(0, 0, 0, 0.55);\n    --td-scrollbar-color: rgba(255, 255, 255, 0.1);\n    --td-scroll-track-color: #333;\n  }\n}\npage,\n.page {\n  --td-radius-small: 6rpx;\n  --td-radius-default: 12rpx;\n  --td-radius-large: 18rpx;\n  --td-radius-extra-large: 24rpx;\n  --td-radius-round: 999px;\n  --td-radius-circle: 50%;\n}\npage,\n.page {\n  --td-font-family: PingFang SC, Microsoft YaHei, Arial Regular;\n  --td-font-family-medium: PingFang SC, Microsoft YaHei, Arial Medium;\n  --td-font-size-link-small: 24rpx;\n  --td-font-size-link-medium: 28rpx;\n  --td-font-size-link-large: 32rpx;\n  --td-font-size-mark-extra-small: 20rpx;\n  --td-font-size-mark-small: 24rpx;\n  --td-font-size-mark-medium: 28rpx;\n  --td-font-size-mark-large: 32rpx;\n  --td-font-size-body-extra-small: 20rpx;\n  --td-font-size-body-small: 24rpx;\n  --td-font-size-body-medium: 28rpx;\n  --td-font-size-body-large: 32rpx;\n  --td-font-size-title-small: 28rpx;\n  --td-font-size-title-medium: 32rpx;\n  --td-font-size-title-large: 36rpx;\n  --td-font-size-title-extra-large: 40rpx;\n  --td-font-size-headline-small: 48rpx;\n  --td-font-size-headline-medium: 56rpx;\n  --td-font-size-headline-large: 72rpx;\n  --td-font-size-display-medium: 96rpx;\n  --td-font-size-display-large: 128rpx;\n  --td-font-size: 20rpx;\n  --td-font-size-xs: var(--td-font-size-body-extra-small);\n  --td-font-size-s: var(--td-font-size-body-small);\n  --td-font-size-base: var(--td-font-size-title-small);\n  --td-font-size-m: var(--td-font-size-title-medium);\n  --td-font-size-l: var(--td-font-size-title-large);\n  --td-font-size-xl: var(--td-font-size-title-extra-large);\n  --td-font-size-xxl: var(--td-font-size-headline-large);\n}\npage,\n.page {\n  --td-spacer: 16rpx;\n  --td-spacer-1: 24rpx;\n  --td-spacer-2: 32rpx;\n  --td-spacer-3: 48rpx;\n  --td-spacer-4: 64rpx;\n  --td-spacer-5: 96rpx;\n  --td-spacer-6: 160rpx;\n}\n@media (prefers-color-scheme: dark) {\n  page,\n  .page {\n    --td-button-primary-disabled-color: var(--td-font-white-4);\n    --td-skeleton-animation-gradient: rgba(255, 255, 255, 0.06);\n    --td-slider-dot-bg-color: var(--td-gray-color-4);\n    --td-slider-dot-disabled-bg-color: var(--td-gray-color-11);\n    --td-slider-dot-disabled-border-color: var(--td-gray-color-12);\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/theme/_light.wxss",
    "content": "@media (prefers-color-scheme: light) {\n  page,\n  .page {\n    --td-primary-color-1: #f2f3ff;\n    --td-primary-color-2: #d9e1ff;\n    --td-primary-color-3: #b5c7ff;\n    --td-primary-color-4: #8eabff;\n    --td-primary-color-5: #618dff;\n    --td-primary-color-6: #366ef4;\n    --td-primary-color-7: #0052d9;\n    --td-primary-color-8: #003cab;\n    --td-primary-color-9: #002a7c;\n    --td-primary-color-10: #001a57;\n    --td-warning-color-1: #fff1e9;\n    --td-warning-color-2: #ffd9c2;\n    --td-warning-color-3: #ffb98c;\n    --td-warning-color-4: #fa9550;\n    --td-warning-color-5: #e37318;\n    --td-warning-color-6: #be5a00;\n    --td-warning-color-7: #954500;\n    --td-warning-color-8: #713300;\n    --td-warning-color-9: #532300;\n    --td-warning-color-10: #3b1700;\n    --td-error-color-1: #fff0ed;\n    --td-error-color-2: #ffd8d2;\n    --td-error-color-3: #ffb9b0;\n    --td-error-color-4: #ff9285;\n    --td-error-color-5: #f6685d;\n    --td-error-color-6: #d54941;\n    --td-error-color-7: #ad352f;\n    --td-error-color-8: #881f1c;\n    --td-error-color-9: #68070a;\n    --td-error-color-10: #490002;\n    --td-success-color-1: #e3f9e9;\n    --td-success-color-2: #c6f3d7;\n    --td-success-color-3: #92dab2;\n    --td-success-color-4: #56c08d;\n    --td-success-color-5: #2ba471;\n    --td-success-color-6: #008858;\n    --td-success-color-7: #006c45;\n    --td-success-color-8: #005334;\n    --td-success-color-9: #003b23;\n    --td-success-color-10: #002515;\n    --td-gray-color-1: #f3f3f3;\n    --td-gray-color-2: #eeeeee;\n    --td-gray-color-3: #e7e7e7;\n    --td-gray-color-4: #dcdcdc;\n    --td-gray-color-5: #c5c5c5;\n    --td-gray-color-6: #a6a6a6;\n    --td-gray-color-7: #8b8b8b;\n    --td-gray-color-8: #777777;\n    --td-gray-color-9: #5e5e5e;\n    --td-gray-color-10: #4b4b4b;\n    --td-gray-color-11: #383838;\n    --td-gray-color-12: #2c2c2c;\n    --td-gray-color-13: #242424;\n    --td-gray-color-14: #181818;\n    --td-font-white-1: #ffffff;\n    --td-font-white-2: rgba(255, 255, 255, 0.55);\n    --td-font-white-3: rgba(255, 255, 255, 0.35);\n    --td-font-white-4: rgba(255, 255, 255, 0.22);\n    --td-font-gray-1: rgba(0, 0, 0, 0.9);\n    --td-font-gray-2: rgba(0, 0, 0, 0.6);\n    --td-font-gray-3: rgba(0, 0, 0, 0.4);\n    --td-font-gray-4: rgba(0, 0, 0, 0.26);\n    --td-brand-color: var(--td-primary-color-7);\n    --td-warning-color: var(--td-warning-color-5);\n    --td-error-color: var(--td-error-color-6);\n    --td-success-color: var(--td-success-color-5);\n    --td-brand-color-focus: var(--td-primary-color-1);\n    --td-brand-color-active: var(--td-primary-color-8);\n    --td-brand-color-disabled: var(--td-primary-color-3);\n    --td-brand-color-light: var(--td-primary-color-1);\n    --td-brand-color-light-active: var(--td-primary-color-2);\n    --td-warning-color-active: var(--td-warning-color-6);\n    --td-warning-color-disabled: var(--td-warning-color-3);\n    --td-warning-color-focus: var(--td-warning-color-2);\n    --td-warning-color-light: var(--td-warning-color-1);\n    --td-warning-color-light-active: var(--td-warning-color-2);\n    --td-error-color-focus: var(--td-error-color-2);\n    --td-error-color-active: var(--td-error-color-7);\n    --td-error-color-disabled: var(--td-error-color-3);\n    --td-error-color-light: var(--td-error-color-1);\n    --td-error-color-light-active: var(--td-error-color-2);\n    --td-success-color-focus: var(--td-success-color-2);\n    --td-success-color-active: var(--td-success-color-6);\n    --td-success-color-disabled: var(--td-success-color-3);\n    --td-success-color-light: var(--td-success-color-1);\n    --td-success-color-light-active: var(--td-success-color-2);\n    --td-mask-active: rgba(0, 0, 0, 0.6);\n    --td-mask-disabled: rgba(255, 255, 255, 0.6);\n    --td-bg-color-page: var(--td-gray-color-1);\n    --td-bg-color-container: var(--td-font-white-1);\n    --td-bg-color-container-active: var(--td-gray-color-3);\n    --td-bg-color-secondarycontainer: var(--td-gray-color-1);\n    --td-bg-color-secondarycontainer-active: var(--td-gray-color-4);\n    --td-bg-color-component: var(--td-gray-color-3);\n    --td-bg-color-component-active: var(--td-gray-color-6);\n    --td-bg-color-component-disabled: var(--td-gray-color-2);\n    --td-bg-color-secondarycomponent: var(--td-gray-color-4);\n    --td-bg-color-secondarycomponent-active: var(--td-gray-color-6);\n    --td-bg-color-specialcomponent: #fff;\n    --td-text-color-primary: var(--td-font-gray-1);\n    --td-text-color-secondary: var(--td-font-gray-2);\n    --td-text-color-placeholder: var(--td-font-gray-3);\n    --td-text-color-disabled: var(--td-font-gray-4);\n    --td-text-color-anti: var(--td-font-white-1);\n    --td-text-color-brand: var(--td-brand-color);\n    --td-text-color-link: var(--td-brand-color);\n    --td-border-level-1-color: var(--td-gray-color-3);\n    --td-component-stroke: var(--td-gray-color-3);\n    --td-border-level-2-color: var(--td-gray-color-4);\n    --td-component-border: var(--td-gray-color-4);\n    --td-shadow-1: 0 1px 10px rgba(0, 0, 0, 0.05), 0 4px 5px rgba(0, 0, 0, 8%), 0 2px 4px -1px rgba(0, 0, 0, 12%);\n    --td-shadow-2: 0 3px 14px 2px rgba(0, 0, 0, 0.05), 0 8px 10px 1px rgba(0, 0, 0, 6%), 0 5px 5px -3px rgba(0, 0, 0, 10%);\n    --td-shadow-3: 0 6px 30px 5px rgba(0, 0, 0, 0.05), 0 16px 24px 2px rgba(0, 0, 0, 4%),\n      0 8px 10px -5px rgba(0, 0, 0, 8%);\n    --td-shadow-4: 0 2px 8px 0 rgba(0, 0, 0, 0.06);\n    --td-shadow-inset-top: inset 0 0.5px 0 #dcdcdc;\n    --td-shadow-inset-right: inset 0.5px 0 0 #dcdcdc;\n    --td-shadow-inset-bottom: inset 0 -0.5px 0 #dcdcdc;\n    --td-shadow-inset-left: inset -0.5px 0 0 #dcdcdc;\n    --td-table-shadow-color: rgba(0, 0, 0, 0.08);\n    --td-scrollbar-color: rgba(0, 0, 0, 0.1);\n    --td-scrollbar-hover-color: rgba(0, 0, 0, 0.3);\n    --td-scroll-track-color: #fff;\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/theme/_radius.wxss",
    "content": "page,\n.page {\n  --td-radius-small: 6rpx;\n  --td-radius-default: 12rpx;\n  --td-radius-large: 18rpx;\n  --td-radius-extra-large: 24rpx;\n  --td-radius-round: 999px;\n  --td-radius-circle: 50%;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/theme/_spacer.wxss",
    "content": "page,\n.page {\n  --td-spacer: 16rpx;\n  --td-spacer-1: 24rpx;\n  --td-spacer-2: 32rpx;\n  --td-spacer-3: 48rpx;\n  --td-spacer-4: 64rpx;\n  --td-spacer-5: 96rpx;\n  --td-spacer-6: 160rpx;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/utilities/_animation.wxss",
    "content": "@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/utilities/_float.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/style/utilities/_index.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/template/badge.wxml",
    "content": "<template name=\"badge\">\n  <t-badge\n    color=\"{{color || ''}}\"\n    content=\"{{content || ''}}\"\n    count=\"{{count || 0}}\"\n    dot=\"{{dot || false}}\"\n    max-count=\"{{maxCount || 99}}\"\n    offset=\"{{offset || []}}\"\n    shape=\"{{shape || 'circle'}}\"\n    show-zero=\"{{showZero || false}}\"\n    size=\"{{size || 'medium'}}\"\n    t-class=\"{{class}} {{tClass}}\"\n    t-class-content=\"{{tClassContent}}\"\n    t-class-count=\"{{tClassCount}}\"\n  />\n</template>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/template/button.wxml",
    "content": "<template name=\"button\">\n  <t-button\n    t-id=\"{{tId || ''}}\"\n    block=\"{{block || false}}\"\n    class=\"{{class || ''}}\"\n    t-class=\"{{externalClass}}\"\n    disabled=\"{{disabled || false}}\"\n    data-type=\"{{type}}\"\n    data-extra=\"{{extra}}\"\n    content=\"{{content || ''}}\"\n    icon=\"{{icon || ''}}\"\n    loading=\"{{loading || false}}\"\n    theme=\"{{theme || 'default'}}\"\n    ghost=\"{{ghost || false}}\"\n    shape=\"{{shape || 'rectangle'}}\"\n    size=\"{{size || 'medium'}}\"\n    variant=\"{{variant || 'base'}}\"\n    open-type=\"{{openType || ''}}\"\n    hover-class=\"{{hoverClass || ''}}\"\n    hover-stop-propagation=\"{{hoverStopPropagation || false}}\"\n    hover-start-time=\"{{hoverStartTime || 20}}\"\n    hover-stay-time=\"{{hoverStayTime || 70}}\"\n    lang=\"{{lang || 'en'}}\"\n    session-from=\"{{sessionFrom || ''}}\"\n    send-message-title=\"{{sendMessageTitle || ''}}\"\n    send-message-path=\"{{sendMessagePath || ''}}\"\n    send-message-img=\"{{sendMessageImg || ''}}\"\n    app-parameter=\"{{appParameter || ''}}\"\n    show-message-card=\"{{showMessageCard || false}}\"\n    bind:tap=\"onTplButtonTap\"\n    bind:getuserinfo=\"onTplButtonTap\"\n    bind:contact=\"onTplButtonTap\"\n    bind:getphonenumber=\"onTplButtonTap\"\n    bind:error=\"onTplButtonTap\"\n    bind:opensetting=\"onTplButtonTap\"\n    bind:launchapp=\"onTplButtonTap\"\n    bind:agreeprivacyauthorization=\"onTplButtonTap\"\n    aria-label=\"{{ariaLabel || ''}}\"\n  >\n    <slot />\n  </t-button>\n</template>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/template/icon.wxml",
    "content": "<template name=\"icon\">\n  <t-icon\n    style=\"{{style || ''}}\"\n    class=\"{{class}}\"\n    t-class=\"{{tClass}}\"\n    prefix=\"{{prefix || ''}}\"\n    name=\"{{name || ''}}\"\n    size=\"{{size || ''}}\"\n    color=\"{{color || ''}}\"\n    aria-hidden=\"{{ariaHidden || '' }}\"\n    aria-label=\"{{ariaLabel || ''}}\"\n    aria-role=\"{{ariaRole || ''}}\"\n    bind:click=\"{{bindclick || ''}}\"\n  />\n</template>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/template/image.wxml",
    "content": "<template name=\"image\">\n  <t-image\n    class=\"{{class}}\"\n    t-class=\"{{tClass}}\"\n    t-class-load=\"{{tClassLoad}}\"\n    style=\"{{style || ''}}\"\n    customStyle=\"{{customStyle || ''}}\"\n    height=\"{{height || ''}}\"\n    width=\"{{width || ''}}\"\n    error=\"{{error || 'default'}}\"\n    lazy=\"{{lazy || false}}\"\n    loading=\"{{count || 'default'}}\"\n    shape=\"{{shape || 'square'}}\"\n    src=\"{{src || ''}}\"\n    mode=\"{{mode || 'scaleToFill'}}\"\n    webp=\"{{webp || false}}\"\n    showMenuByLongpress=\"{{showMenuByLongpress || false}}\"\n    data-custom=\"{{dataset || null}}\"\n    bind:error=\"{{binderror}}\"\n    bind:load=\"{{bindload}}\"\n  />\n</template>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/utils.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\n/// <reference types=\"miniprogram-api-typings\" />\n/// <reference types=\"miniprogram-api-typings\" />\nexport declare const systemInfo: WechatMiniprogram.WindowInfo | WechatMiniprogram.SystemInfo;\nexport declare const appBaseInfo: WechatMiniprogram.AppBaseInfo | WechatMiniprogram.SystemInfo;\nexport declare const deviceInfo: WechatMiniprogram.DeviceInfo | WechatMiniprogram.SystemInfo;\ndeclare type Context = WechatMiniprogram.Page.TrivialInstance | WechatMiniprogram.Component.TrivialInstance;\nexport declare const debounce: (func: any, wait?: number) => (...rest: any[]) => void;\nexport declare const throttle: (func: any, wait?: number, options?: any) => (...args: any[]) => void;\nexport declare const classNames: (...args: any[]) => string;\nexport declare const styles: (styleObj: any) => string;\nexport declare const getAnimationFrame: (context: any, cb: Function) => any;\nexport declare const getRect: (context: any, selector: string, needAll?: boolean) => Promise<any>;\nexport declare const isNumber: (value: any) => boolean;\nexport declare const isNull: (value: any) => boolean;\nexport declare const isUndefined: (value: any) => boolean;\nexport declare const isDef: (value: any) => boolean;\nexport declare const addUnit: (value?: string | number) => string | undefined;\nexport declare const getCharacterLength: (type: string, char: string | number, max?: number) => {\n    length: number;\n    characters: string;\n};\nexport declare const chunk: (arr: any[], size: number) => any[][];\nexport declare const getInstance: (context?: Context, selector?: string) => WechatMiniprogram.Component.TrivialInstance;\nexport declare const unitConvert: (value: number | string | null | undefined) => number;\nexport declare const setIcon: (iconName: any, icon: any, defaultIcon: any) => {\n    [x: string]: any;\n};\nexport declare const isBool: (val: any) => boolean;\nexport declare const isObject: (val: any) => boolean;\nexport declare const isString: (val: any) => boolean;\nexport declare const toCamel: (str: any) => any;\nexport declare const getCurrentPage: <T>() => T & WechatMiniprogram.OptionalInterface<WechatMiniprogram.Page.ILifetime> & WechatMiniprogram.Page.InstanceProperties & WechatMiniprogram.Page.InstanceMethods<WechatMiniprogram.IAnyObject> & WechatMiniprogram.Page.Data<WechatMiniprogram.IAnyObject> & WechatMiniprogram.IAnyObject;\nexport declare const uniqueFactory: (compName: any) => () => string;\nexport declare const calcIcon: (icon: string | Record<string, any>, defaultIcon?: string) => string | Record<string, any>;\nexport declare const isOverSize: (size: any, sizeLimit: any) => boolean;\nexport declare const rpx2px: (rpx: any) => number;\nexport declare const nextTick: () => Promise<void>;\nexport {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/utils.js",
    "content": "import { prefix } from './config';\nimport { getWindowInfo, getAppBaseInfo, getDeviceInfo } from './wechat';\nexport const systemInfo = getWindowInfo();\nexport const appBaseInfo = getAppBaseInfo();\nexport const deviceInfo = getDeviceInfo();\nexport const debounce = function (func, wait = 500) {\n    let timerId;\n    return function (...rest) {\n        if (timerId) {\n            clearTimeout(timerId);\n        }\n        timerId = setTimeout(() => {\n            func.apply(this, rest);\n        }, wait);\n    };\n};\nexport const throttle = (func, wait = 100, options = null) => {\n    let previous = 0;\n    let timerid = null;\n    if (!options) {\n        options = {\n            leading: true,\n        };\n    }\n    return function (...args) {\n        const now = Date.now();\n        if (!previous && !options.leading)\n            previous = now;\n        const remaining = wait - (now - previous);\n        const context = this;\n        if (remaining <= 0) {\n            if (timerid) {\n                clearTimeout(timerid);\n                timerid = null;\n            }\n            previous = now;\n            func.apply(context, args);\n        }\n    };\n};\nexport const classNames = function (...args) {\n    const hasOwn = {}.hasOwnProperty;\n    const classes = [];\n    args.forEach((arg) => {\n        if (!arg)\n            return;\n        const argType = typeof arg;\n        if (argType === 'string' || argType === 'number') {\n            classes.push(arg);\n        }\n        else if (Array.isArray(arg) && arg.length) {\n            const inner = classNames(...arg);\n            if (inner) {\n                classes.push(inner);\n            }\n        }\n        else if (argType === 'object') {\n            for (const key in arg) {\n                if (hasOwn.call(arg, key) && arg[key]) {\n                    classes.push(key);\n                }\n            }\n        }\n    });\n    return classes.join(' ');\n};\nexport const styles = function (styleObj) {\n    return Object.keys(styleObj)\n        .map((styleKey) => `${styleKey}: ${styleObj[styleKey]}`)\n        .join('; ');\n};\nexport const getAnimationFrame = function (context, cb) {\n    return context\n        .createSelectorQuery()\n        .selectViewport()\n        .boundingClientRect()\n        .exec(() => {\n        cb();\n    });\n};\nexport const getRect = function (context, selector, needAll = false) {\n    return new Promise((resolve, reject) => {\n        context\n            .createSelectorQuery()[needAll ? 'selectAll' : 'select'](selector)\n            .boundingClientRect((rect) => {\n            if (rect) {\n                resolve(rect);\n            }\n            else {\n                reject(rect);\n            }\n        })\n            .exec();\n    });\n};\nexport const isNumber = function (value) {\n    return /^\\d+(\\.\\d+)?$/.test(value);\n};\nexport const isNull = function (value) {\n    return value === null;\n};\nexport const isUndefined = (value) => typeof value === 'undefined';\nexport const isDef = function (value) {\n    return !isUndefined(value) && !isNull(value);\n};\nexport const addUnit = function (value) {\n    if (!isDef(value)) {\n        return undefined;\n    }\n    value = String(value);\n    return isNumber(value) ? `${value}px` : value;\n};\nexport const getCharacterLength = (type, char, max) => {\n    const str = String(char !== null && char !== void 0 ? char : '');\n    if (str.length === 0) {\n        return {\n            length: 0,\n            characters: '',\n        };\n    }\n    if (type === 'maxcharacter') {\n        let len = 0;\n        for (let i = 0; i < str.length; i += 1) {\n            let currentStringLength = 0;\n            if (str.charCodeAt(i) > 127 || str.charCodeAt(i) === 94) {\n                currentStringLength = 2;\n            }\n            else {\n                currentStringLength = 1;\n            }\n            if (len + currentStringLength > max) {\n                return {\n                    length: len,\n                    characters: str.slice(0, i),\n                };\n            }\n            len += currentStringLength;\n        }\n        return {\n            length: len,\n            characters: str,\n        };\n    }\n    else if (type === 'maxlength') {\n        const length = str.length > max ? max : str.length;\n        return {\n            length,\n            characters: str.slice(0, length),\n        };\n    }\n    return {\n        length: str.length,\n        characters: str,\n    };\n};\nexport const chunk = (arr, size) => Array.from({ length: Math.ceil(arr.length / size) }, (v, i) => arr.slice(i * size, i * size + size));\nexport const getInstance = function (context, selector) {\n    if (!context) {\n        const pages = getCurrentPages();\n        const page = pages[pages.length - 1];\n        context = page.$$basePage || page;\n    }\n    const instance = context ? context.selectComponent(selector) : null;\n    if (!instance) {\n        console.warn('未找到组件,请检查selector是否正确');\n        return null;\n    }\n    return instance;\n};\nexport const unitConvert = (value) => {\n    var _a;\n    if (typeof value === 'string') {\n        if (value.includes('rpx')) {\n            return (parseInt(value, 10) * ((_a = systemInfo === null || systemInfo === void 0 ? void 0 : systemInfo.screenWidth) !== null && _a !== void 0 ? _a : 750)) / 750;\n        }\n        return parseInt(value, 10);\n    }\n    return value !== null && value !== void 0 ? value : 0;\n};\nexport const setIcon = (iconName, icon, defaultIcon) => {\n    if (icon) {\n        if (typeof icon === 'string') {\n            return {\n                [`${iconName}Name`]: icon,\n                [`${iconName}Data`]: {},\n            };\n        }\n        else if (typeof icon === 'object') {\n            return {\n                [`${iconName}Name`]: '',\n                [`${iconName}Data`]: icon,\n            };\n        }\n        else {\n            return {\n                [`${iconName}Name`]: defaultIcon,\n                [`${iconName}Data`]: {},\n            };\n        }\n    }\n    return {\n        [`${iconName}Name`]: '',\n        [`${iconName}Data`]: {},\n    };\n};\nexport const isBool = (val) => typeof val === 'boolean';\nexport const isObject = (val) => typeof val === 'object' && val != null;\nexport const isString = (val) => typeof val === 'string';\nexport const toCamel = (str) => str.replace(/-(\\w)/g, (match, m1) => m1.toUpperCase());\nexport const getCurrentPage = function () {\n    const pages = getCurrentPages();\n    return pages[pages.length - 1];\n};\nexport const uniqueFactory = (compName) => {\n    let number = 0;\n    return () => `${prefix}_${compName}_${number++}`;\n};\nexport const calcIcon = (icon, defaultIcon) => {\n    if (icon && ((isBool(icon) && defaultIcon) || isString(icon))) {\n        return { name: isBool(icon) ? defaultIcon : icon };\n    }\n    if (isObject(icon)) {\n        return icon;\n    }\n    return null;\n};\nexport const isOverSize = (size, sizeLimit) => {\n    var _a;\n    if (!sizeLimit)\n        return false;\n    const base = 1000;\n    const unitMap = {\n        B: 1,\n        KB: base,\n        MB: base * base,\n        GB: base * base * base,\n    };\n    const computedSize = typeof sizeLimit === 'number' ? sizeLimit * base : (sizeLimit === null || sizeLimit === void 0 ? void 0 : sizeLimit.size) * unitMap[(_a = sizeLimit === null || sizeLimit === void 0 ? void 0 : sizeLimit.unit) !== null && _a !== void 0 ? _a : 'KB'];\n    return size > computedSize;\n};\nexport const rpx2px = (rpx) => Math.floor((systemInfo.windowWidth * rpx) / 750);\nexport const nextTick = () => {\n    return new Promise((resolve) => {\n        wx.nextTick(() => {\n            resolve();\n        });\n    });\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/utils.wxs",
    "content": "/* utils */\n\n/**\n * addUnit */\n// 为 css 添加单位\nfunction addUnit(value) {\n  var REGEXP = getRegExp('^-?\\d+(.\\d+)?$');\n  if (value == null) {\n    return undefined;\n  }\n  return REGEXP.test('' + value) ? value + 'px' : value;\n}\n\nfunction isString(string) {\n  return string && string.constructor === 'String';\n}\n\nfunction isArray(array) {\n  return array && array.constructor === 'Array';\n}\n\nfunction isObject(obj) {\n  return obj && obj.constructor === 'Object';\n}\n\nvar isNoEmptyObj = function (obj) {\n  return isObject(obj) && JSON.stringify(obj) !== '{}';\n};\n\nfunction includes(arr, value) {\n  if (!arr || !isArray(arr)) return false;\n\n  var i = 0;\n  var len = arr.length;\n\n  for (; i < len; i++) {\n    if (arr[i] === value) return true;\n  }\n  return false;\n}\n\nfunction cls(base, arr) {\n  var res = [base];\n  var i = 0;\n  for (var size = arr.length; i < size; i++) {\n    var item = arr[i];\n\n    if (item && item.constructor === 'Array') {\n      var key = arr[i][0];\n      var value = arr[i][1];\n\n      if (value) {\n        res.push(base + '--' + key);\n      }\n    } else if (typeof item === 'string' || typeof item === 'number') {\n      if (item) {\n        res.push(base + '--' + item);\n      }\n    }\n  }\n  return res.join(' ');\n}\n\nfunction getBadgeAriaLabel(options) {\n  var maxCount = options.maxCount || 99;\n  if (options.dot) {\n    return '有新的消息';\n  }\n  if (options.count === '...') {\n    return '有很多消息';\n  }\n  if (isNaN(options.count)) {\n    return options.count;\n  }\n  var str1 = '有' + maxCount + '+条消息';\n  var str2 = '有' + options.count + '条消息';\n  return Number(options.count) > maxCount ? str1 : str2;\n}\n\nfunction endsWith(str, endStr) {\n  return str.slice(-endStr.length) === endStr ? str : str + endStr;\n}\n\nfunction keys(obj) {\n  return JSON.stringify(obj)\n    .replace(getRegExp('{|}|\"', 'g'), '')\n    .split(',')\n    .map(function (item) {\n      return item.split(':')[0];\n    });\n}\n\nfunction kebabCase(str) {\n  return str\n    .replace(getRegExp('[A-Z]', 'g'), function (ele) {\n      return '-' + ele;\n    })\n    .toLowerCase();\n}\n\nfunction _style(styles) {\n  if (isArray(styles)) {\n    return styles\n      .filter(function (item) {\n        return item != null && item !== '';\n      })\n      .map(function (item) {\n        return isArray(item) ? _style(item) : endsWith(item, ';');\n      })\n      .join(' ');\n  }\n\n  if (isObject(styles)) {\n    return keys(styles)\n      .filter(function (key) {\n        return styles[key] != null && styles[key] !== '';\n      })\n      .map(function (key) {\n        return [kebabCase(key), [styles[key]]].join(':');\n      })\n      .join(';');\n  }\n\n  return styles;\n}\n\nfunction isValidIconName(str) {\n  return getRegExp('^[A-Za-z0-9\\-]+$').test(str);\n}\n\nmodule.exports = {\n  addUnit: addUnit,\n  isString: isString,\n  isArray: isArray,\n  isObject: isObject,\n  isNoEmptyObj: isNoEmptyObj,\n  includes: includes,\n  cls: cls,\n  getBadgeAriaLabel: getBadgeAriaLabel,\n  _style: _style,\n  isValidIconName: isValidIconName,\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/version.d.ts",
    "content": "export declare function compareVersion(v1: any, v2: any): 0 | 1 | -1;\nexport declare function canIUseFormFieldButton(): boolean;\nexport declare function canUseVirtualHost(): boolean;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/version.js",
    "content": "import { getAppBaseInfo } from './wechat';\nlet systemInfo;\nfunction getSystemInfo() {\n    if (systemInfo == null) {\n        systemInfo = getAppBaseInfo();\n    }\n    return systemInfo;\n}\nexport function compareVersion(v1, v2) {\n    v1 = v1.split('.');\n    v2 = v2.split('.');\n    const len = Math.max(v1.length, v2.length);\n    while (v1.length < len) {\n        v1.push('0');\n    }\n    while (v2.length < len) {\n        v2.push('0');\n    }\n    for (let i = 0; i < len; i++) {\n        const num1 = parseInt(v1[i]);\n        const num2 = parseInt(v2[i]);\n        if (num1 > num2) {\n            return 1;\n        }\n        else if (num1 < num2) {\n            return -1;\n        }\n    }\n    return 0;\n}\nfunction judgeByVersion(version) {\n    const currentSDKVersion = getSystemInfo().SDKVersion;\n    return compareVersion(currentSDKVersion, version) >= 0;\n}\nexport function canIUseFormFieldButton() {\n    return judgeByVersion('2.10.3');\n}\nexport function canUseVirtualHost() {\n    return judgeByVersion('2.19.2');\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/wechat.d.ts",
    "content": "export declare const getObserver: (context: any, selector: string) => Promise<unknown>;\nexport declare const getWindowInfo: () => WechatMiniprogram.WindowInfo | WechatMiniprogram.SystemInfo;\nexport declare const getAppBaseInfo: () => WechatMiniprogram.SystemInfo | WechatMiniprogram.AppBaseInfo;\nexport declare const getDeviceInfo: () => WechatMiniprogram.SystemInfo | WechatMiniprogram.DeviceInfo;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/common/wechat.js",
    "content": "export const getObserver = (context, selector) => {\n    return new Promise((resolve, reject) => {\n        context\n            .createIntersectionObserver(context)\n            .relativeToViewport()\n            .observe(selector, (res) => {\n            resolve(res);\n        });\n    });\n};\nexport const getWindowInfo = () => {\n    return wx.getWindowInfo ? wx.getWindowInfo() : wx.getSystemInfoSync();\n};\nexport const getAppBaseInfo = () => {\n    return wx.getAppBaseInfo ? wx.getAppBaseInfo() : wx.getSystemInfoSync();\n};\nexport const getDeviceInfo = () => {\n    return wx.getDeviceInfo ? wx.getDeviceInfo() : wx.getSystemInfoSync();\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### CountDown Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nauto-start | Boolean | true | \\- | N\ncontent | String / Slot | 'default' | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nformat | String | HH:mm:ss | \\- | N\nmillisecond | Boolean | false | \\- | N\nsize | String | 'medium' | `0.5.1`。options: small/medium/large | N\nsplit-with-unit | Boolean | false | `0.5.1` | N\ntheme | String | 'default' | `0.5.1`。options: default/round/square | N\ntime | Number | 0 | required | Y\n\n### CountDown Events\n\nname | params | description\n-- | -- | --\nchange | `(time: TimeData)` | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/count-down/type.ts)。<br/>`interface TimeData {  days: number; hours: number; minutes: number; seconds: number; milliseconds: number }`<br/>\nfinish | \\- | \\-\n### CountDown External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-count | \\-\nt-class-split | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-countdown-bg-color | @error-color-6 | - \n--td-countdown-default-color | @font-gray-1 | - \n--td-countdown-round-border-radius | @radius-circle | - \n--td-countdown-round-color | @font-white-1 | - \n--td-countdown-square-border-radius | @radius-small | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/README.md",
    "content": "---\ntitle: CountDown 倒计时\ndescription: 用于实时展示倒计时数值。\nspline: data\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-99%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-99%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-85%25-blue\" /></span>\n\n> CountDown 组件用于实时展示倒计时数值。\n如果需要与站点演示一致的数字字体效果，推荐您到 <a href=\"https://tdesign.tencent.com/design/fonts\">数字字体章节</a>，将 TCloudNumber 字体下载并将包含的 TCloudNumberVF.ttf 做为 TCloudNumber 字体资源引入到具体项目中使用。\n\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-count-down\": \"tdesign-miniprogram/count-down/count-down\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/C37tsims79Sk\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 基础倒计时\n\n{{ base }}\n\n### 调整尺寸\n\n{{ size }}\n\n## API\n\n### CountDown Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nauto-start | Boolean | true | 是否自动开始倒计时 | N\ncontent | String / Slot | 'default' | 最终倒计时的展示内容，值为'default'时使用默认的格式，否则使用自定义样式插槽。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nformat | String | HH:mm:ss | 时间格式，DD-日，HH-时，mm-分，ss-秒，SSS-毫秒 | N\nmillisecond | Boolean | false | 是否开启毫秒级渲染 | N\nsize | String | 'medium' | `0.5.1`。倒计时尺寸。可选项：small/medium/large | N\nsplit-with-unit | Boolean | false | `0.5.1`。使用时间单位分割 | N\ntheme | String | 'default' | `0.5.1`。倒计时风格。可选项：default/round/square | N\ntime | Number | 0 | 必需。倒计时时长，单位毫秒 | Y\n\n### CountDown Events\n\n名称 | 参数 | 描述\n-- | -- | --\nchange | `(time: TimeData)` | 时间变化时触发。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/count-down/type.ts)。<br/>`interface TimeData {  days: number; hours: number; minutes: number; seconds: number; milliseconds: number }`<br/>\nfinish | \\- | 倒计时结束时触发\n### CountDown External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-count | 计数样式类\nt-class-split | 分隔线样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-countdown-bg-color | @error-color-6 | - \n--td-countdown-default-color | @font-gray-1 | - \n--td-countdown-round-border-radius | @radius-circle | - \n--td-countdown-round-color | @font-white-1 | - \n--td-countdown-square-border-radius | @radius-small | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/count-down.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nexport default class CountDown extends SuperComponent {\n    externalClasses: string[];\n    properties: import(\"./type\").TdCountDownProps;\n    observers: {\n        time(): void;\n    };\n    data: {\n        prefix: string;\n        classPrefix: string;\n        timeDataUnit: {\n            DD: string;\n            HH: string;\n            mm: string;\n            ss: string;\n            SSS: string;\n        };\n        timeData: import(\"./utils\").TimeData;\n        formattedTime: string;\n    };\n    timeoutId: null | number;\n    lifetimes: {\n        detached(): void;\n    };\n    methods: {\n        start(): void;\n        pause(): void;\n        reset(): void;\n        getTime(): number;\n        updateTime(remain: number): void;\n        doCount(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/count-down.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport { isSameSecond, parseFormat, parseTimeData, TimeDataUnit } from './utils';\nconst { prefix } = config;\nconst name = `${prefix}-count-down`;\nlet CountDown = class CountDown extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-count`, `${prefix}-class-split`];\n        this.properties = props;\n        this.observers = {\n            time() {\n                this.reset();\n            },\n        };\n        this.data = {\n            prefix,\n            classPrefix: name,\n            timeDataUnit: TimeDataUnit,\n            timeData: parseTimeData(0),\n            formattedTime: '0',\n        };\n        this.timeoutId = null;\n        this.lifetimes = {\n            detached() {\n                if (this.timeoutId) {\n                    clearTimeout(this.timeoutId);\n                    this.timeoutId = null;\n                }\n            },\n        };\n        this.methods = {\n            start() {\n                if (this.counting) {\n                    return;\n                }\n                this.counting = true;\n                this.endTime = Date.now() + this.remain;\n                this.doCount();\n            },\n            pause() {\n                this.counting = false;\n                this.timeoutId && clearTimeout(this.timeoutId);\n            },\n            reset() {\n                this.pause();\n                this.remain = this.properties.time;\n                this.updateTime(this.remain);\n                if (this.properties.autoStart) {\n                    this.start();\n                }\n            },\n            getTime() {\n                return Math.max(this.endTime - Date.now(), 0);\n            },\n            updateTime(remain) {\n                const { format } = this.properties;\n                this.remain = remain;\n                const timeData = parseTimeData(remain);\n                this.triggerEvent('change', timeData);\n                const { timeText } = parseFormat(remain, format);\n                const timeRange = format.split(':');\n                this.setData({\n                    timeRange,\n                    timeData,\n                    formattedTime: timeText.replace(/:/g, ' : '),\n                });\n                if (remain === 0) {\n                    this.pause();\n                    this.triggerEvent('finish');\n                }\n            },\n            doCount() {\n                this.timeoutId = setTimeout(() => {\n                    const time = this.getTime();\n                    if (this.properties.millisecond) {\n                        this.updateTime(time);\n                    }\n                    else if (!isSameSecond(time, this.remain) || time === 0) {\n                        this.updateTime(time);\n                    }\n                    if (time !== 0) {\n                        this.doCount();\n                    }\n                }, 33);\n            },\n        };\n    }\n};\nCountDown = __decorate([\n    wxComponent()\n], CountDown);\nexport default CountDown;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/count-down.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/count-down.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n<wxs module=\"this\"> module.exports.format = function(num) { return num < 10 ? '0' + num : num; } </wxs>\n\n<view\n  style=\"{{_._style([style, customStyle])}}\"\n  class=\"{{classPrefix}} {{classPrefix}}--{{theme}} {{classPrefix}}--{{size}} class {{prefix}}-class \"\n  aria-role=\"option\"\n>\n  <slot wx:if=\"{{content !== 'default'}}\" name=\"content\" />\n  <slot wx:if=\"{{content !== 'default'}}\" />\n  <block wx:elif=\"{{theme == 'default' && !splitWithUnit}}\">{{formattedTime}}</block>\n  <block wx:else>\n    <block wx:for=\"{{timeRange}}\" wx:key=\"index\">\n      <text class=\"{{classPrefix}}__item {{prefix}}-class-count\">{{this.format(timeData[timeRange[index]])}}</text>\n      <text\n        wx:if=\"{{ splitWithUnit || timeRange.length - 1 !== index}}\"\n        class=\"{{classPrefix}}__split {{classPrefix}}__split--{{splitWithUnit ? 'text' : 'dot'}} {{prefix}}-class-split\"\n        >{{splitWithUnit ? timeDataUnit[timeRange[index]] : ':'}}</text\n      >\n    </block>\n  </block>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/count-down.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-count-down--small.t-count-down--default {\n  font-size: var(--td-font-size-base, 28rpx);\n}\n.t-count-down--small.t-count-down--round > .t-count-down__item {\n  font-size: var(--td-font-size-s, 24rpx);\n}\n.t-count-down--small.t-count-down--square > .t-count-down__item {\n  font-size: var(--td-font-size-s, 24rpx);\n}\n.t-count-down--small.t-count-down--round > .t-count-down__item,\n.t-count-down--small.t-count-down--square > .t-count-down__item {\n  width: 40rpx;\n  height: 40rpx;\n}\n.t-count-down--small.t-count-down--round > .t-count-down__split--dot,\n.t-count-down--small.t-count-down--square > .t-count-down__split--dot {\n  margin: 0 4rpx;\n  font-size: var(--td-font-size-base, 28rpx);\n  font-weight: 700;\n}\n.t-count-down--small.t-count-down--round > .t-count-down__split--text,\n.t-count-down--small.t-count-down--square > .t-count-down__split--text {\n  margin: 0 8rpx;\n  font-size: var(--td-font-size, 20rpx);\n}\n.t-count-down--medium.t-count-down--default {\n  font-size: var(--td-font-size-m, 32rpx);\n}\n.t-count-down--medium.t-count-down--round > .t-count-down__item {\n  font-size: var(--td-font-size-base, 28rpx);\n}\n.t-count-down--medium.t-count-down--square > .t-count-down__item {\n  font-size: var(--td-font-size-base, 28rpx);\n}\n.t-count-down--medium.t-count-down--round > .t-count-down__item,\n.t-count-down--medium.t-count-down--square > .t-count-down__item {\n  width: 48rpx;\n  height: 48rpx;\n}\n.t-count-down--medium.t-count-down--round > .t-count-down__split--dot,\n.t-count-down--medium.t-count-down--square > .t-count-down__split--dot {\n  margin: 0 6rpx;\n  font-size: var(--td-font-size-m, 32rpx);\n  font-weight: 700;\n}\n.t-count-down--medium.t-count-down--round > .t-count-down__split--text,\n.t-count-down--medium.t-count-down--square > .t-count-down__split--text {\n  margin: 0 10rpx;\n  font-size: var(--td-font-size-s, 24rpx);\n}\n.t-count-down--large.t-count-down--default {\n  font-size: 36rpx;\n}\n.t-count-down--large.t-count-down--round > .t-count-down__item {\n  font-size: var(--td-font-size-m, 32rpx);\n}\n.t-count-down--large.t-count-down--square > .t-count-down__item {\n  font-size: var(--td-font-size-m, 32rpx);\n}\n.t-count-down--large.t-count-down--round > .t-count-down__item,\n.t-count-down--large.t-count-down--square > .t-count-down__item {\n  width: 56rpx;\n  height: 56rpx;\n}\n.t-count-down--large.t-count-down--round > .t-count-down__split--dot,\n.t-count-down--large.t-count-down--square > .t-count-down__split--dot {\n  margin: 0 12rpx;\n  font-size: 36rpx;\n  font-weight: 700;\n}\n.t-count-down--large.t-count-down--round > .t-count-down__split--text,\n.t-count-down--large.t-count-down--square > .t-count-down__split--text {\n  margin: 0 12rpx;\n  font-size: var(--td-font-size-base, 28rpx);\n}\n.t-count-down {\n  font-family: TCloudNumber, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Hiragino Sans GB, Microsoft YaHei UI, Microsoft YaHei, Source Han Sans CN, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;\n  display: flex;\n}\n.t-count-down .t-count-down__item,\n.t-count-down .t-count-down__split {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.t-count-down--square > .t-count-down__split--dot,\n.t-count-down--round > .t-count-down__split--dot {\n  color: var(--td-error-color-6, #d54941);\n}\n.t-count-down--square > .t-count-down__split--text,\n.t-count-down--round > .t-count-down__split--text {\n  color: var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9)));\n}\n.t-count-down--default {\n  color: var(--td-countdown-default-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n}\n.t-count-down--square {\n  color: var(--td-countdown-round-color, var(--td-text-color-anti, var(--td-font-white-1, #ffffff)));\n}\n.t-count-down--square > .t-count-down__item {\n  border-radius: var(--td-countdown-square-border-radius, var(--td-radius-small, 6rpx));\n  background: var(--td-countdown-bg-color, var(--td-error-color-6, #d54941));\n}\n.t-count-down--round {\n  color: var(--td-countdown-round-color, var(--td-text-color-anti, var(--td-font-white-1, #ffffff)));\n}\n.t-count-down--round > .t-count-down__item {\n  border-radius: var(--td-countdown-round-border-radius, var(--td-radius-circle, 50%));\n  background: var(--td-countdown-bg-color, var(--td-error-color-6, #d54941));\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/props.d.ts",
    "content": "import { TdCountDownProps } from './type';\ndeclare const props: TdCountDownProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/props.js",
    "content": "const props = {\n    autoStart: {\n        type: Boolean,\n        value: true,\n    },\n    content: {\n        type: String,\n        value: 'default',\n    },\n    format: {\n        type: String,\n        value: 'HH:mm:ss',\n    },\n    millisecond: {\n        type: Boolean,\n        value: false,\n    },\n    size: {\n        type: String,\n        value: 'medium',\n    },\n    splitWithUnit: {\n        type: Boolean,\n        value: false,\n    },\n    theme: {\n        type: String,\n        value: 'default',\n    },\n    time: {\n        type: Number,\n        value: 0,\n        required: true,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/type.d.ts",
    "content": "export interface TdCountDownProps {\n    autoStart?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    content?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    format?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    millisecond?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    size?: {\n        type: StringConstructor;\n        value?: 'small' | 'medium' | 'large';\n    };\n    splitWithUnit?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    theme?: {\n        type: StringConstructor;\n        value?: 'default' | 'round' | 'square';\n    };\n    time: {\n        type: NumberConstructor;\n        value?: number;\n        required?: boolean;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/utils.d.ts",
    "content": "export interface TimeData {\n    DD: number;\n    HH: number;\n    mm: number;\n    ss: number;\n    SSS: number;\n}\nexport declare const TimeDataUnit: {\n    DD: string;\n    HH: string;\n    mm: string;\n    ss: string;\n    SSS: string;\n};\nexport declare const parseTimeData: (time: number) => TimeData;\nexport declare const isSameSecond: (time1: number, time2: number) => boolean;\nexport declare type TTimeList = {\n    digit: string;\n    unit: string;\n    match: string;\n}[];\nexport declare const parseFormat: (time: number, format: string) => {\n    timeText: string;\n    timeList: TTimeList;\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/count-down/utils.js",
    "content": "export const TimeDataUnit = {\n    DD: '天',\n    HH: '时',\n    mm: '分',\n    ss: '秒',\n    SSS: '毫秒',\n};\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nexport const parseTimeData = function (time) {\n    const days = Math.floor(time / DAY);\n    const hours = Math.floor((time % DAY) / HOUR);\n    const minutes = Math.floor((time % HOUR) / MINUTE);\n    const seconds = Math.floor((time % MINUTE) / SECOND);\n    const milliseconds = Math.floor(time % SECOND);\n    return {\n        DD: days,\n        HH: hours,\n        mm: minutes,\n        ss: seconds,\n        SSS: milliseconds,\n    };\n};\nexport const isSameSecond = function (time1, time2) {\n    return Math.floor(time1 / 1000) === Math.floor(time2 / 1000);\n};\nexport const parseFormat = function (time, format) {\n    const obj = {\n        'D+': Math.floor(time / 86400000),\n        'H+': Math.floor((time % 86400000) / 3600000),\n        'm+': Math.floor((time % 3600000) / 60000),\n        's+': Math.floor((time % 60000) / 1000),\n        'S+': Math.floor(time % 1000),\n    };\n    const timeList = [];\n    let timeText = format;\n    Object.keys(obj).forEach((prop) => {\n        if (new RegExp(`(${prop})`).test(timeText)) {\n            timeText = timeText.replace(RegExp.$1, (match, offset, source) => {\n                const v = `${obj[prop]}`;\n                let digit = v;\n                if (match.length > 1) {\n                    digit = (match.replace(new RegExp(match[0], 'g'), '0') + v).substr(v.length);\n                }\n                const unit = source.substr(offset + match.length);\n                const last = timeList[timeList.length - 1];\n                if (last) {\n                    const index = last.unit.indexOf(match);\n                    if (index !== -1) {\n                        last.unit = last.unit.substr(0, index);\n                    }\n                }\n                timeList.push({ digit, unit, match });\n                return digit;\n            });\n        }\n    });\n    return { timeText, timeList };\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/icon/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n\n### Icon Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ncolor | String | - | \\- | N\nname | String | - | required | Y\nprefix | String | - | \\- | N\nsize | String / Number | - | \\- | N\n\n### Icon Events\n\nname | params | description\n-- | -- | --\nclick | \\- | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts)\n### Icon External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/icon/README.md",
    "content": "---\ntitle: Icon 图标\ndescription: 图标。\nspline: base\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-100%25-blue\" /></span>\n\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-icon\": \"tdesign-miniprogram/icon/icon\"\n}\n```\n\n## 常见问题\n\n<details>\n  <summary>\n    控制台告警：Failed to load font\n    <span class=\"icon\">👇</span>\n  </summary>\n  <p style=\"margin-top: 10px; color: rgba(0, 0, 0, .6)\">\n    告警属于开发者工具的 bug，可以忽略，具体可以看 <a href=\"https://developers.weixin.qq.com/miniprogram/dev/api/ui/font/wx.loadFontFace.html\" target=\"_blank\">官网文档</a>\n  </p>\n</details>\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/wMINibmJ7WSQ\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n\n### 基础组件图标\n\n{{ base }}\n\n### 自定义组件图标\n\n{{ custom }}\n\n自定义图标用法，下面以 `iconfont` 为例\n\n#### 准备图标文件\n\n文件后缀应为`.wxss`，如下方代码块所示：\n\n```css\n@font-face {\n  font-family: 'icon';  // 使用自定义的字体名称\n  ···\n}\n\n.icon {\n  font-family: 'icon' !important;  // 字体名称\n  ···\n}\n\n.icon-a-0:before {  // icon 图标。注意 FontClass 前缀与 font-family 保持一致\n  content: '\\e64d';\n}\n```\n- 添加所需图标，下载图标。图标库一般会提供 **在线链接** 或者 **下载至本地** 等使用方式。**在线链接** 方式会指向一个 `.css` 文件，可以下载或复制其内容，将其修改成后缀名为 `.wxss` 的文件\n- 将 `.wxss` 文件中的 `FontClass/Symbol前缀` 与 `Font Family` 两项内容保持一致，如: `FontClass/Symbol` 前缀为 `icon-`，则 `Font Family` 为 `icon`。\n\n> 注：若是采用 `下载至本地` 方式，需关注 `.css` 和 `.ttf` 文件。由于微信小程序不支持处理 `ttf、woff、eot` 等文件，但支持 `base64`，所以需要将 `.ttf` 文件转换为 `base64`  (可借助转换工具，如 [transfonter.org](https://transfonter.org/)，会得到一个 `stylesheet.css` 文件)，然后将 `.css` 文件中的 `@font-face {}` 内容替换为 `stylesheet.css` 中的 `base64` 内容，最后将 `.css` 文件修改后缀为 `.wxss`\n\n#### 引入自定义图标\n\n- 全局引入：在项目 `app.wxss`，使用 `@import` 引入上述的 `.wxss` 文件\n- 局部引入：在 `page` 对应的 `.wxss` 中，使用 `@import` 引入上述的 `.wxss` 文件\n\n#### 自定义图标的使用\n\n `<t-icon>` 组件中的 `prefix` 属性值与前面设置的 `Font Family` 保持一致，即 `prefix=\"icon\"`，`name` 属性值为自定义图标名称，如图标的 `className` 为 `icon-a-1h`，则 `name=\"a-1h\"`。\n\n### 图片链接\n\n{{ iconImage }}\n\n### 全部图标\n\n<td-icons-view />\n\n## API\n\n### Icon Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ncolor | String | - | 图标颜色 | N\nname | String | - | 必需。图标名称或图片链接 | Y\nprefix | String | - | 自定义图标前缀 | N\nsize | String / Number | - | 图标大小, 如 `20`, `20px`, `48rpx`, 默认单位是 `px` | N\n\n### Icon Events\n\n名称 | 参数 | 描述\n-- | -- | --\nclick | \\- | 点击图标时触发。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts)\n### Icon External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/icon/icon.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nexport default class Icon extends SuperComponent {\n    externalClasses: string[];\n    properties: import(\"./type\").TdIconProps;\n    data: {\n        componentPrefix: string;\n        classPrefix: string;\n        isImage: boolean;\n        iconStyle: any;\n    };\n    observers: {\n        'name, color, size, style'(): void;\n    };\n    methods: {\n        onTap(event: any): void;\n        setIconStyle(): Promise<void>;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/icon/icon.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport { styles, addUnit, getRect } from '../common/utils';\nconst { prefix } = config;\nconst name = `${prefix}-icon`;\nlet Icon = class Icon extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`];\n        this.properties = props;\n        this.data = {\n            componentPrefix: prefix,\n            classPrefix: name,\n            isImage: false,\n            iconStyle: undefined,\n        };\n        this.observers = {\n            'name, color, size, style'() {\n                this.setIconStyle();\n            },\n        };\n        this.methods = {\n            onTap(event) {\n                this.triggerEvent('click', event.detail);\n            },\n            setIconStyle() {\n                return __awaiter(this, void 0, void 0, function* () {\n                    const { name, color, size, classPrefix } = this.data;\n                    const isImage = name.indexOf('/') !== -1;\n                    const sizeValue = addUnit(size);\n                    const colorStyle = color ? { color: color } : {};\n                    const fontStyle = size ? { 'font-size': sizeValue } : {};\n                    const iconStyle = Object.assign(Object.assign({}, colorStyle), fontStyle);\n                    if (isImage) {\n                        const { height } = yield getRect(this, `.${classPrefix}`);\n                        const iconSize = sizeValue || addUnit(height);\n                        iconStyle.width = iconSize;\n                        iconStyle.height = iconSize;\n                    }\n                    this.setData({\n                        isImage,\n                        iconStyle: `${styles(iconStyle)}`,\n                    });\n                });\n            },\n        };\n    }\n};\nIcon = __decorate([\n    wxComponent()\n], Icon);\nexport default Icon;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/icon/icon.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/icon/icon.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  class=\"{{ prefix ? prefix : classPrefix}} class {{componentPrefix}}-class\"\n  style=\"{{_._style([iconStyle, style, customStyle])}}\"\n  bind:tap=\"onTap\"\n  aria-hidden=\"{{ariaHidden}}\"\n  aria-label=\"{{ariaLabel}}\"\n  aria-role=\"{{ariaRole}}\"\n>\n  <view wx:if=\"{{ isImage }}\" class=\"{{classPrefix}}--image\">\n    <image src=\"{{ name }}\" mode=\"aspectFit\" class=\"{{classPrefix}}__image\" />\n  </view>\n  <label\n    wx:if=\"{{ _.isValidIconName(name) && !isImage }}\"\n    class=\"{{ prefix ? prefix : classPrefix }}-{{ name}} {{ classPrefix }}-base\"\n  >\n  </label>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/icon/icon.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n@font-face {\n  font-family: t;\n  src: url('https://tdesign.gtimg.com/icon/0.2.1/fonts/t.eot'), url('https://tdesign.gtimg.com/icon/0.2.1/fonts/t.eot?#iefix') format('ded-opentype'), url('https://tdesign.gtimg.com/icon/0.2.1/fonts/t.woff') format('woff'), url('https://tdesign.gtimg.com/icon/0.2.1/fonts/t.ttf') format('truetype'), url('https://tdesign.gtimg.com/icon/0.2.1/fonts/t.svg') format('svg');\n  /* iOS 4.1- */\n  font-weight: normal;\n  font-style: normal;\n}\n.t-icon--image {\n  width: 100%;\n  height: 100%;\n}\n.t-icon__image {\n  vertical-align: top;\n  width: 100%;\n  height: 100%;\n}\n.t-icon-base {\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n  line-height: 1;\n  text-align: center;\n  display: block;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.t-icon {\n  /* stylelint-disable-next-line declaration-no-important */\n  font-family: t !important;\n  /* prevent issues with browser extensions that change fonts */\n}\n.t-icon-activity:before {\n  content: '\\E001';\n}\n.t-icon-add-and-subtract:before {\n  content: '\\E002';\n}\n.t-icon-add-circle:before {\n  content: '\\E003';\n}\n.t-icon-add-rectangle:before {\n  content: '\\E004';\n}\n.t-icon-add:before {\n  content: '\\E005';\n}\n.t-icon-address-book:before {\n  content: '\\E006';\n}\n.t-icon-adjustment:before {\n  content: '\\E007';\n}\n.t-icon-airplay-wave:before {\n  content: '\\E008';\n}\n.t-icon-alarm-add:before {\n  content: '\\E009';\n}\n.t-icon-alarm-off:before {\n  content: '\\E00A';\n}\n.t-icon-alarm:before {\n  content: '\\E00B';\n}\n.t-icon-align-top:before {\n  content: '\\E00C';\n}\n.t-icon-align-vertical:before {\n  content: '\\E00D';\n}\n.t-icon-alpha:before {\n  content: '\\E00E';\n}\n.t-icon-analytics:before {\n  content: '\\E00F';\n}\n.t-icon-anchor:before {\n  content: '\\E010';\n}\n.t-icon-angry:before {\n  content: '\\E011';\n}\n.t-icon-animation-1:before {\n  content: '\\E012';\n}\n.t-icon-animation:before {\n  content: '\\E013';\n}\n.t-icon-anticlockwise:before {\n  content: '\\E014';\n}\n.t-icon-api:before {\n  content: '\\E015';\n}\n.t-icon-app:before {\n  content: '\\E016';\n}\n.t-icon-apple:before {\n  content: '\\E017';\n}\n.t-icon-application:before {\n  content: '\\E018';\n}\n.t-icon-architecture-hui-style:before {\n  content: '\\E019';\n}\n.t-icon-archway-1:before {\n  content: '\\E01A';\n}\n.t-icon-archway:before {\n  content: '\\E01B';\n}\n.t-icon-arrow-down-circle:before {\n  content: '\\E01C';\n}\n.t-icon-arrow-down-rectangle:before {\n  content: '\\E01D';\n}\n.t-icon-arrow-down:before {\n  content: '\\E01E';\n}\n.t-icon-arrow-left-circle:before {\n  content: '\\E01F';\n}\n.t-icon-arrow-left-down-circle:before {\n  content: '\\E020';\n}\n.t-icon-arrow-left-down:before {\n  content: '\\E021';\n}\n.t-icon-arrow-left-right-1:before {\n  content: '\\E022';\n}\n.t-icon-arrow-left-right-2:before {\n  content: '\\E023';\n}\n.t-icon-arrow-left-right-3:before {\n  content: '\\E024';\n}\n.t-icon-arrow-left-right-circle:before {\n  content: '\\E025';\n}\n.t-icon-arrow-left-up-circle:before {\n  content: '\\E026';\n}\n.t-icon-arrow-left-up:before {\n  content: '\\E027';\n}\n.t-icon-arrow-left:before {\n  content: '\\E028';\n}\n.t-icon-arrow-right-circle:before {\n  content: '\\E029';\n}\n.t-icon-arrow-right-down-circle:before {\n  content: '\\E02A';\n}\n.t-icon-arrow-right-down:before {\n  content: '\\E02B';\n}\n.t-icon-arrow-right-up-circle:before {\n  content: '\\E02C';\n}\n.t-icon-arrow-right-up:before {\n  content: '\\E02D';\n}\n.t-icon-arrow-right:before {\n  content: '\\E02E';\n}\n.t-icon-arrow-triangle-down-filled:before {\n  content: '\\E02F';\n}\n.t-icon-arrow-triangle-down:before {\n  content: '\\E030';\n}\n.t-icon-arrow-triangle-up-filled:before {\n  content: '\\E031';\n}\n.t-icon-arrow-triangle-up:before {\n  content: '\\E032';\n}\n.t-icon-arrow-up-circle:before {\n  content: '\\E033';\n}\n.t-icon-arrow-up-down-1:before {\n  content: '\\E034';\n}\n.t-icon-arrow-up-down-2:before {\n  content: '\\E035';\n}\n.t-icon-arrow-up-down-3:before {\n  content: '\\E036';\n}\n.t-icon-arrow-up-down-circle:before {\n  content: '\\E037';\n}\n.t-icon-arrow-up:before {\n  content: '\\E038';\n}\n.t-icon-artboard:before {\n  content: '\\E039';\n}\n.t-icon-article:before {\n  content: '\\E03A';\n}\n.t-icon-assignment-checked:before {\n  content: '\\E03B';\n}\n.t-icon-assignment-code:before {\n  content: '\\E03C';\n}\n.t-icon-assignment-error:before {\n  content: '\\E03D';\n}\n.t-icon-assignment-user:before {\n  content: '\\E03E';\n}\n.t-icon-assignment:before {\n  content: '\\E03F';\n}\n.t-icon-attach:before {\n  content: '\\E040';\n}\n.t-icon-attic-1:before {\n  content: '\\E041';\n}\n.t-icon-attic:before {\n  content: '\\E042';\n}\n.t-icon-audio:before {\n  content: '\\E043';\n}\n.t-icon-awkward:before {\n  content: '\\E044';\n}\n.t-icon-backtop-rectangle:before {\n  content: '\\E045';\n}\n.t-icon-backtop:before {\n  content: '\\E046';\n}\n.t-icon-backup:before {\n  content: '\\E047';\n}\n.t-icon-backward:before {\n  content: '\\E048';\n}\n.t-icon-bad-laugh:before {\n  content: '\\E049';\n}\n.t-icon-bamboo-shoot:before {\n  content: '\\E04A';\n}\n.t-icon-banana:before {\n  content: '\\E04B';\n}\n.t-icon-barbecue:before {\n  content: '\\E04C';\n}\n.t-icon-barcode-1:before {\n  content: '\\E04D';\n}\n.t-icon-barcode:before {\n  content: '\\E04E';\n}\n.t-icon-base-station:before {\n  content: '\\E04F';\n}\n.t-icon-battery-add:before {\n  content: '\\E050';\n}\n.t-icon-battery-charging:before {\n  content: '\\E051';\n}\n.t-icon-battery-low:before {\n  content: '\\E052';\n}\n.t-icon-battery:before {\n  content: '\\E053';\n}\n.t-icon-bean:before {\n  content: '\\E054';\n}\n.t-icon-beer:before {\n  content: '\\E055';\n}\n.t-icon-beta:before {\n  content: '\\E056';\n}\n.t-icon-bifurcate:before {\n  content: '\\E057';\n}\n.t-icon-bill:before {\n  content: '\\E058';\n}\n.t-icon-blockchain:before {\n  content: '\\E059';\n}\n.t-icon-bluetooth:before {\n  content: '\\E05A';\n}\n.t-icon-bone:before {\n  content: '\\E05B';\n}\n.t-icon-book-open:before {\n  content: '\\E05C';\n}\n.t-icon-book:before {\n  content: '\\E05D';\n}\n.t-icon-bookmark-add:before {\n  content: '\\E05E';\n}\n.t-icon-bookmark-checked:before {\n  content: '\\E05F';\n}\n.t-icon-bookmark-double:before {\n  content: '\\E060';\n}\n.t-icon-bookmark-minus:before {\n  content: '\\E061';\n}\n.t-icon-bookmark:before {\n  content: '\\E062';\n}\n.t-icon-braces:before {\n  content: '\\E063';\n}\n.t-icon-brackets:before {\n  content: '\\E064';\n}\n.t-icon-bread:before {\n  content: '\\E065';\n}\n.t-icon-bridge-1:before {\n  content: '\\E066';\n}\n.t-icon-bridge-2:before {\n  content: '\\E067';\n}\n.t-icon-bridge-3:before {\n  content: '\\E068';\n}\n.t-icon-bridge-4:before {\n  content: '\\E069';\n}\n.t-icon-bridge-5:before {\n  content: '\\E06A';\n}\n.t-icon-bridge-6:before {\n  content: '\\E06B';\n}\n.t-icon-bridge:before {\n  content: '\\E06C';\n}\n.t-icon-brightness-1:before {\n  content: '\\E06D';\n}\n.t-icon-brightness:before {\n  content: '\\E06E';\n}\n.t-icon-broccoli:before {\n  content: '\\E06F';\n}\n.t-icon-browse-gallery:before {\n  content: '\\E070';\n}\n.t-icon-browse-off:before {\n  content: '\\E071';\n}\n.t-icon-browse:before {\n  content: '\\E072';\n}\n.t-icon-brush:before {\n  content: '\\E073';\n}\n.t-icon-bug-report:before {\n  content: '\\E074';\n}\n.t-icon-bug:before {\n  content: '\\E075';\n}\n.t-icon-building-1:before {\n  content: '\\E076';\n}\n.t-icon-building-2:before {\n  content: '\\E077';\n}\n.t-icon-building-3:before {\n  content: '\\E078';\n}\n.t-icon-building-4:before {\n  content: '\\E079';\n}\n.t-icon-building-5:before {\n  content: '\\E07A';\n}\n.t-icon-building:before {\n  content: '\\E07B';\n}\n.t-icon-bulletpoint:before {\n  content: '\\E07C';\n}\n.t-icon-button:before {\n  content: '\\E07D';\n}\n.t-icon-cabbage:before {\n  content: '\\E07E';\n}\n.t-icon-cake:before {\n  content: '\\E07F';\n}\n.t-icon-calculation-1:before {\n  content: '\\E080';\n}\n.t-icon-calculation:before {\n  content: '\\E081';\n}\n.t-icon-calculator-1:before {\n  content: '\\E082';\n}\n.t-icon-calculator:before {\n  content: '\\E083';\n}\n.t-icon-calendar-1:before {\n  content: '\\E084';\n}\n.t-icon-calendar-2:before {\n  content: '\\E085';\n}\n.t-icon-calendar-edit:before {\n  content: '\\E086';\n}\n.t-icon-calendar-event:before {\n  content: '\\E087';\n}\n.t-icon-calendar:before {\n  content: '\\E088';\n}\n.t-icon-call-1:before {\n  content: '\\E089';\n}\n.t-icon-call-cancel:before {\n  content: '\\E08A';\n}\n.t-icon-call-forwarded:before {\n  content: '\\E08B';\n}\n.t-icon-call-incoming:before {\n  content: '\\E08C';\n}\n.t-icon-call-off:before {\n  content: '\\E08D';\n}\n.t-icon-call:before {\n  content: '\\E08E';\n}\n.t-icon-calm-1:before {\n  content: '\\E08F';\n}\n.t-icon-calm:before {\n  content: '\\E090';\n}\n.t-icon-camera-1:before {\n  content: '\\E091';\n}\n.t-icon-camera-2:before {\n  content: '\\E092';\n}\n.t-icon-camera-off:before {\n  content: '\\E093';\n}\n.t-icon-camera:before {\n  content: '\\E094';\n}\n.t-icon-candy:before {\n  content: '\\E095';\n}\n.t-icon-card:before {\n  content: '\\E096';\n}\n.t-icon-cardmembership:before {\n  content: '\\E097';\n}\n.t-icon-caret-down-small:before {\n  content: '\\E098';\n}\n.t-icon-caret-down:before {\n  content: '\\E099';\n}\n.t-icon-caret-left-small:before {\n  content: '\\E09A';\n}\n.t-icon-caret-left:before {\n  content: '\\E09B';\n}\n.t-icon-caret-right-small:before {\n  content: '\\E09C';\n}\n.t-icon-caret-right:before {\n  content: '\\E09D';\n}\n.t-icon-caret-up-small:before {\n  content: '\\E09E';\n}\n.t-icon-caret-up:before {\n  content: '\\E09F';\n}\n.t-icon-cart-add:before {\n  content: '\\E0A0';\n}\n.t-icon-cart:before {\n  content: '\\E0A1';\n}\n.t-icon-cast:before {\n  content: '\\E0A2';\n}\n.t-icon-castle-1:before {\n  content: '\\E0A3';\n}\n.t-icon-castle-2:before {\n  content: '\\E0A4';\n}\n.t-icon-castle-3:before {\n  content: '\\E0A5';\n}\n.t-icon-castle-4:before {\n  content: '\\E0A6';\n}\n.t-icon-castle-5:before {\n  content: '\\E0A7';\n}\n.t-icon-castle-6:before {\n  content: '\\E0A8';\n}\n.t-icon-castle-7:before {\n  content: '\\E0A9';\n}\n.t-icon-castle:before {\n  content: '\\E0AA';\n}\n.t-icon-cat:before {\n  content: '\\E0AB';\n}\n.t-icon-catalog:before {\n  content: '\\E0AC';\n}\n.t-icon-cd:before {\n  content: '\\E0AD';\n}\n.t-icon-celsius:before {\n  content: '\\E0AE';\n}\n.t-icon-center-focus-strong:before {\n  content: '\\E0AF';\n}\n.t-icon-centimeter:before {\n  content: '\\E0B0';\n}\n.t-icon-certificate-1:before {\n  content: '\\E0B1';\n}\n.t-icon-certificate:before {\n  content: '\\E0B2';\n}\n.t-icon-chart-3d:before {\n  content: '\\E0B3';\n}\n.t-icon-chart-add:before {\n  content: '\\E0B4';\n}\n.t-icon-chart-analytics:before {\n  content: '\\E0B5';\n}\n.t-icon-chart-area-multi:before {\n  content: '\\E0B6';\n}\n.t-icon-chart-area:before {\n  content: '\\E0B7';\n}\n.t-icon-chart-bar:before {\n  content: '\\E0B8';\n}\n.t-icon-chart-bubble:before {\n  content: '\\E0B9';\n}\n.t-icon-chart-column:before {\n  content: '\\E0BA';\n}\n.t-icon-chart-combo:before {\n  content: '\\E0BB';\n}\n.t-icon-chart-line-data-1:before {\n  content: '\\E0BC';\n}\n.t-icon-chart-line-data:before {\n  content: '\\E0BD';\n}\n.t-icon-chart-line-multi:before {\n  content: '\\E0BE';\n}\n.t-icon-chart-line:before {\n  content: '\\E0BF';\n}\n.t-icon-chart-maximum:before {\n  content: '\\E0C0';\n}\n.t-icon-chart-median:before {\n  content: '\\E0C1';\n}\n.t-icon-chart-minimum:before {\n  content: '\\E0C2';\n}\n.t-icon-chart-pie:before {\n  content: '\\E0C3';\n}\n.t-icon-chart-radar:before {\n  content: '\\E0C4';\n}\n.t-icon-chart-radial:before {\n  content: '\\E0C5';\n}\n.t-icon-chart-ring-1:before {\n  content: '\\E0C6';\n}\n.t-icon-chart-ring:before {\n  content: '\\E0C7';\n}\n.t-icon-chart-scatter:before {\n  content: '\\E0C8';\n}\n.t-icon-chart-stacked:before {\n  content: '\\E0C9';\n}\n.t-icon-chart:before {\n  content: '\\E0CA';\n}\n.t-icon-chat-add:before {\n  content: '\\E0CB';\n}\n.t-icon-chat-bubble-1:before {\n  content: '\\E0CC';\n}\n.t-icon-chat-bubble-add:before {\n  content: '\\E0CD';\n}\n.t-icon-chat-bubble-error:before {\n  content: '\\E0CE';\n}\n.t-icon-chat-bubble-help:before {\n  content: '\\E0CF';\n}\n.t-icon-chat-bubble-history:before {\n  content: '\\E0D0';\n}\n.t-icon-chat-bubble-locked:before {\n  content: '\\E0D1';\n}\n.t-icon-chat-bubble-smile:before {\n  content: '\\E0D2';\n}\n.t-icon-chat-bubble:before {\n  content: '\\E0D3';\n}\n.t-icon-chat-checked:before {\n  content: '\\E0D4';\n}\n.t-icon-chat-clear:before {\n  content: '\\E0D5';\n}\n.t-icon-chat-double:before {\n  content: '\\E0D6';\n}\n.t-icon-chat-error:before {\n  content: '\\E0D7';\n}\n.t-icon-chat-heart:before {\n  content: '\\E0D8';\n}\n.t-icon-chat-message:before {\n  content: '\\E0D9';\n}\n.t-icon-chat-off:before {\n  content: '\\E0DA';\n}\n.t-icon-chat-poll:before {\n  content: '\\E0DB';\n}\n.t-icon-chat-setting:before {\n  content: '\\E0DC';\n}\n.t-icon-chat:before {\n  content: '\\E0DD';\n}\n.t-icon-check-circle-filled:before {\n  content: '\\E0DE';\n}\n.t-icon-check-circle:before {\n  content: '\\E0DF';\n}\n.t-icon-check-double:before {\n  content: '\\E0E0';\n}\n.t-icon-check-rectangle-filled:before {\n  content: '\\E0E1';\n}\n.t-icon-check-rectangle:before {\n  content: '\\E0E2';\n}\n.t-icon-check:before {\n  content: '\\E0E3';\n}\n.t-icon-cheese:before {\n  content: '\\E0E4';\n}\n.t-icon-cherry:before {\n  content: '\\E0E5';\n}\n.t-icon-chevron-down-circle:before {\n  content: '\\E0E6';\n}\n.t-icon-chevron-down-double-s:before {\n  content: '\\E0E7';\n}\n.t-icon-chevron-down-double:before {\n  content: '\\E0E8';\n}\n.t-icon-chevron-down-rectangle:before {\n  content: '\\E0E9';\n}\n.t-icon-chevron-down-s:before {\n  content: '\\E0EA';\n}\n.t-icon-chevron-down:before {\n  content: '\\E0EB';\n}\n.t-icon-chevron-left-circle:before {\n  content: '\\E0EC';\n}\n.t-icon-chevron-left-double-s:before {\n  content: '\\E0ED';\n}\n.t-icon-chevron-left-double:before {\n  content: '\\E0EE';\n}\n.t-icon-chevron-left-rectangle:before {\n  content: '\\E0EF';\n}\n.t-icon-chevron-left-s:before {\n  content: '\\E0F0';\n}\n.t-icon-chevron-left:before {\n  content: '\\E0F1';\n}\n.t-icon-chevron-right-circle:before {\n  content: '\\E0F2';\n}\n.t-icon-chevron-right-double-s:before {\n  content: '\\E0F3';\n}\n.t-icon-chevron-right-double:before {\n  content: '\\E0F4';\n}\n.t-icon-chevron-right-rectangle:before {\n  content: '\\E0F5';\n}\n.t-icon-chevron-right-s:before {\n  content: '\\E0F6';\n}\n.t-icon-chevron-right:before {\n  content: '\\E0F7';\n}\n.t-icon-chevron-up-circle:before {\n  content: '\\E0F8';\n}\n.t-icon-chevron-up-double-s:before {\n  content: '\\E0F9';\n}\n.t-icon-chevron-up-double:before {\n  content: '\\E0FA';\n}\n.t-icon-chevron-up-rectangle:before {\n  content: '\\E0FB';\n}\n.t-icon-chevron-up-s:before {\n  content: '\\E0FC';\n}\n.t-icon-chevron-up:before {\n  content: '\\E0FD';\n}\n.t-icon-chicken:before {\n  content: '\\E0FE';\n}\n.t-icon-chili:before {\n  content: '\\E0FF';\n}\n.t-icon-chimney-1:before {\n  content: '\\E100';\n}\n.t-icon-chimney-2:before {\n  content: '\\E101';\n}\n.t-icon-chimney:before {\n  content: '\\E102';\n}\n.t-icon-chinese-cabbage:before {\n  content: '\\E103';\n}\n.t-icon-church:before {\n  content: '\\E104';\n}\n.t-icon-circle:before {\n  content: '\\E105';\n}\n.t-icon-city-1:before {\n  content: '\\E106';\n}\n.t-icon-city-10:before {\n  content: '\\E107';\n}\n.t-icon-city-11:before {\n  content: '\\E108';\n}\n.t-icon-city-12:before {\n  content: '\\E109';\n}\n.t-icon-city-13:before {\n  content: '\\E10A';\n}\n.t-icon-city-14:before {\n  content: '\\E10B';\n}\n.t-icon-city-15:before {\n  content: '\\E10C';\n}\n.t-icon-city-2:before {\n  content: '\\E10D';\n}\n.t-icon-city-3:before {\n  content: '\\E10E';\n}\n.t-icon-city-4:before {\n  content: '\\E10F';\n}\n.t-icon-city-5:before {\n  content: '\\E110';\n}\n.t-icon-city-6:before {\n  content: '\\E111';\n}\n.t-icon-city-7:before {\n  content: '\\E112';\n}\n.t-icon-city-8:before {\n  content: '\\E113';\n}\n.t-icon-city-9:before {\n  content: '\\E114';\n}\n.t-icon-city-ancient-1:before {\n  content: '\\E115';\n}\n.t-icon-city-ancient-2:before {\n  content: '\\E116';\n}\n.t-icon-city-ancient:before {\n  content: '\\E117';\n}\n.t-icon-city:before {\n  content: '\\E118';\n}\n.t-icon-clear-formatting-1:before {\n  content: '\\E119';\n}\n.t-icon-clear-formatting:before {\n  content: '\\E11A';\n}\n.t-icon-clear:before {\n  content: '\\E11B';\n}\n.t-icon-close-circle-filled:before {\n  content: '\\E11C';\n}\n.t-icon-close-circle:before {\n  content: '\\E11D';\n}\n.t-icon-close-octagon:before {\n  content: '\\E11E';\n}\n.t-icon-close-rectangle:before {\n  content: '\\E11F';\n}\n.t-icon-close:before {\n  content: '\\E120';\n}\n.t-icon-cloud-download:before {\n  content: '\\E121';\n}\n.t-icon-cloud-upload:before {\n  content: '\\E122';\n}\n.t-icon-cloud:before {\n  content: '\\E123';\n}\n.t-icon-cloudy-day:before {\n  content: '\\E124';\n}\n.t-icon-cloudy-night-rain:before {\n  content: '\\E125';\n}\n.t-icon-cloudy-night:before {\n  content: '\\E126';\n}\n.t-icon-cloudy-rain:before {\n  content: '\\E127';\n}\n.t-icon-cloudy-sunny:before {\n  content: '\\E128';\n}\n.t-icon-code-1:before {\n  content: '\\E129';\n}\n.t-icon-code-off:before {\n  content: '\\E12A';\n}\n.t-icon-code:before {\n  content: '\\E12B';\n}\n.t-icon-cola:before {\n  content: '\\E12C';\n}\n.t-icon-collage:before {\n  content: '\\E12D';\n}\n.t-icon-collection:before {\n  content: '\\E12E';\n}\n.t-icon-color-invert:before {\n  content: '\\E12F';\n}\n.t-icon-combination:before {\n  content: '\\E130';\n}\n.t-icon-command:before {\n  content: '\\E131';\n}\n.t-icon-compass-1:before {\n  content: '\\E132';\n}\n.t-icon-compass:before {\n  content: '\\E133';\n}\n.t-icon-component-breadcrumb:before {\n  content: '\\E134';\n}\n.t-icon-component-checkbox:before {\n  content: '\\E135';\n}\n.t-icon-component-divider-horizontal:before {\n  content: '\\E136';\n}\n.t-icon-component-divider-vertical:before {\n  content: '\\E137';\n}\n.t-icon-component-dropdown:before {\n  content: '\\E138';\n}\n.t-icon-component-grid:before {\n  content: '\\E139';\n}\n.t-icon-component-input:before {\n  content: '\\E13A';\n}\n.t-icon-component-layout:before {\n  content: '\\E13B';\n}\n.t-icon-component-radio:before {\n  content: '\\E13C';\n}\n.t-icon-component-space:before {\n  content: '\\E13D';\n}\n.t-icon-component-steps:before {\n  content: '\\E13E';\n}\n.t-icon-component-switch:before {\n  content: '\\E13F';\n}\n.t-icon-constraint:before {\n  content: '\\E140';\n}\n.t-icon-contrast-1:before {\n  content: '\\E141';\n}\n.t-icon-contrast:before {\n  content: '\\E142';\n}\n.t-icon-control-platform:before {\n  content: '\\E143';\n}\n.t-icon-cooperate:before {\n  content: '\\E144';\n}\n.t-icon-coordinate-system:before {\n  content: '\\E145';\n}\n.t-icon-copy:before {\n  content: '\\E146';\n}\n.t-icon-copyright:before {\n  content: '\\E147';\n}\n.t-icon-corn:before {\n  content: '\\E148';\n}\n.t-icon-coupon:before {\n  content: '\\E149';\n}\n.t-icon-course:before {\n  content: '\\E14A';\n}\n.t-icon-cpu:before {\n  content: '\\E14B';\n}\n.t-icon-crack:before {\n  content: '\\E14C';\n}\n.t-icon-creditcard-add:before {\n  content: '\\E14D';\n}\n.t-icon-creditcard-off:before {\n  content: '\\E14E';\n}\n.t-icon-creditcard:before {\n  content: '\\E14F';\n}\n.t-icon-crooked-smile:before {\n  content: '\\E150';\n}\n.t-icon-cry-and-laugh:before {\n  content: '\\E151';\n}\n.t-icon-cry-loudly:before {\n  content: '\\E152';\n}\n.t-icon-css3:before {\n  content: '\\E153';\n}\n.t-icon-cucumber:before {\n  content: '\\E154';\n}\n.t-icon-currency-exchange:before {\n  content: '\\E155';\n}\n.t-icon-cursor:before {\n  content: '\\E156';\n}\n.t-icon-curtain:before {\n  content: '\\E157';\n}\n.t-icon-curve:before {\n  content: '\\E158';\n}\n.t-icon-cut-1:before {\n  content: '\\E159';\n}\n.t-icon-cut:before {\n  content: '\\E15A';\n}\n.t-icon-dam-1:before {\n  content: '\\E15B';\n}\n.t-icon-dam-2:before {\n  content: '\\E15C';\n}\n.t-icon-dam-3:before {\n  content: '\\E15D';\n}\n.t-icon-dam-4:before {\n  content: '\\E15E';\n}\n.t-icon-dam-5:before {\n  content: '\\E15F';\n}\n.t-icon-dam-6:before {\n  content: '\\E160';\n}\n.t-icon-dam-7:before {\n  content: '\\E161';\n}\n.t-icon-dam:before {\n  content: '\\E162';\n}\n.t-icon-dart-board:before {\n  content: '\\E163';\n}\n.t-icon-dashboard-1:before {\n  content: '\\E164';\n}\n.t-icon-dashboard:before {\n  content: '\\E165';\n}\n.t-icon-data-base:before {\n  content: '\\E166';\n}\n.t-icon-data-checked:before {\n  content: '\\E167';\n}\n.t-icon-data-display:before {\n  content: '\\E168';\n}\n.t-icon-data-error:before {\n  content: '\\E169';\n}\n.t-icon-data-search:before {\n  content: '\\E16A';\n}\n.t-icon-data:before {\n  content: '\\E16B';\n}\n.t-icon-delete-1:before {\n  content: '\\E16C';\n}\n.t-icon-delete-time:before {\n  content: '\\E16D';\n}\n.t-icon-delete:before {\n  content: '\\E16E';\n}\n.t-icon-delta:before {\n  content: '\\E16F';\n}\n.t-icon-depressed:before {\n  content: '\\E170';\n}\n.t-icon-desktop-1:before {\n  content: '\\E171';\n}\n.t-icon-desktop:before {\n  content: '\\E172';\n}\n.t-icon-despise:before {\n  content: '\\E173';\n}\n.t-icon-device:before {\n  content: '\\E174';\n}\n.t-icon-discount-filled:before {\n  content: '\\E175';\n}\n.t-icon-discount:before {\n  content: '\\E176';\n}\n.t-icon-dissatisfaction:before {\n  content: '\\E177';\n}\n.t-icon-divide:before {\n  content: '\\E178';\n}\n.t-icon-dividers-1:before {\n  content: '\\E179';\n}\n.t-icon-dividers:before {\n  content: '\\E17A';\n}\n.t-icon-doge:before {\n  content: '\\E17B';\n}\n.t-icon-double-storey:before {\n  content: '\\E17C';\n}\n.t-icon-download-1:before {\n  content: '\\E17D';\n}\n.t-icon-download:before {\n  content: '\\E17E';\n}\n.t-icon-downscale:before {\n  content: '\\E17F';\n}\n.t-icon-drag-drop:before {\n  content: '\\E180';\n}\n.t-icon-drag-move:before {\n  content: '\\E181';\n}\n.t-icon-drink:before {\n  content: '\\E182';\n}\n.t-icon-drumstick:before {\n  content: '\\E183';\n}\n.t-icon-dv:before {\n  content: '\\E184';\n}\n.t-icon-dvd:before {\n  content: '\\E185';\n}\n.t-icon-earphone:before {\n  content: '\\E186';\n}\n.t-icon-earth:before {\n  content: '\\E187';\n}\n.t-icon-edit-1:before {\n  content: '\\E188';\n}\n.t-icon-edit-2:before {\n  content: '\\E189';\n}\n.t-icon-edit-off:before {\n  content: '\\E18A';\n}\n.t-icon-edit:before {\n  content: '\\E18B';\n}\n.t-icon-education:before {\n  content: '\\E18C';\n}\n.t-icon-eggplant:before {\n  content: '\\E18D';\n}\n.t-icon-ellipsis:before {\n  content: '\\E18E';\n}\n.t-icon-emo-emotional:before {\n  content: '\\E18F';\n}\n.t-icon-enter:before {\n  content: '\\E190';\n}\n.t-icon-equal:before {\n  content: '\\E191';\n}\n.t-icon-error-circle-filled:before {\n  content: '\\E192';\n}\n.t-icon-error-circle:before {\n  content: '\\E193';\n}\n.t-icon-error-triangle:before {\n  content: '\\E194';\n}\n.t-icon-error:before {\n  content: '\\E195';\n}\n.t-icon-excited-1:before {\n  content: '\\E196';\n}\n.t-icon-excited:before {\n  content: '\\E197';\n}\n.t-icon-expand-horizontal:before {\n  content: '\\E198';\n}\n.t-icon-expand-vertical:before {\n  content: '\\E199';\n}\n.t-icon-explore-off:before {\n  content: '\\E19A';\n}\n.t-icon-explore:before {\n  content: '\\E19B';\n}\n.t-icon-exposure:before {\n  content: '\\E19C';\n}\n.t-icon-extension-off:before {\n  content: '\\E19D';\n}\n.t-icon-extension:before {\n  content: '\\E19E';\n}\n.t-icon-face-retouching:before {\n  content: '\\E19F';\n}\n.t-icon-fact-check:before {\n  content: '\\E1A0';\n}\n.t-icon-fahrenheit-scale:before {\n  content: '\\E1A1';\n}\n.t-icon-feel-at-ease:before {\n  content: '\\E1A2';\n}\n.t-icon-ferocious:before {\n  content: '\\E1A3';\n}\n.t-icon-ferris-wheel:before {\n  content: '\\E1A4';\n}\n.t-icon-file-1:before {\n  content: '\\E1A5';\n}\n.t-icon-file-add-1:before {\n  content: '\\E1A6';\n}\n.t-icon-file-add:before {\n  content: '\\E1A7';\n}\n.t-icon-file-attachment:before {\n  content: '\\E1A8';\n}\n.t-icon-file-blocked:before {\n  content: '\\E1A9';\n}\n.t-icon-file-code-1:before {\n  content: '\\E1AA';\n}\n.t-icon-file-code:before {\n  content: '\\E1AB';\n}\n.t-icon-file-copy:before {\n  content: '\\E1AC';\n}\n.t-icon-file-download:before {\n  content: '\\E1AD';\n}\n.t-icon-file-excel:before {\n  content: '\\E1AE';\n}\n.t-icon-file-export:before {\n  content: '\\E1AF';\n}\n.t-icon-file-icon:before {\n  content: '\\E1B0';\n}\n.t-icon-file-image:before {\n  content: '\\E1B1';\n}\n.t-icon-file-import:before {\n  content: '\\E1B2';\n}\n.t-icon-file-locked:before {\n  content: '\\E1B3';\n}\n.t-icon-file-minus:before {\n  content: '\\E1B4';\n}\n.t-icon-file-music:before {\n  content: '\\E1B5';\n}\n.t-icon-file-onenote:before {\n  content: '\\E1B6';\n}\n.t-icon-file-outlook:before {\n  content: '\\E1B7';\n}\n.t-icon-file-paste:before {\n  content: '\\E1B8';\n}\n.t-icon-file-pdf:before {\n  content: '\\E1B9';\n}\n.t-icon-file-powerpoint:before {\n  content: '\\E1BA';\n}\n.t-icon-file-restore:before {\n  content: '\\E1BB';\n}\n.t-icon-file-safety:before {\n  content: '\\E1BC';\n}\n.t-icon-file-search:before {\n  content: '\\E1BD';\n}\n.t-icon-file-setting:before {\n  content: '\\E1BE';\n}\n.t-icon-file-teams:before {\n  content: '\\E1BF';\n}\n.t-icon-file-unknown:before {\n  content: '\\E1C0';\n}\n.t-icon-file-unlocked:before {\n  content: '\\E1C1';\n}\n.t-icon-file-word:before {\n  content: '\\E1C2';\n}\n.t-icon-file-zip:before {\n  content: '\\E1C3';\n}\n.t-icon-file:before {\n  content: '\\E1C4';\n}\n.t-icon-fill-color-1:before {\n  content: '\\E1C5';\n}\n.t-icon-fill-color:before {\n  content: '\\E1C6';\n}\n.t-icon-film-1:before {\n  content: '\\E1C7';\n}\n.t-icon-film:before {\n  content: '\\E1C8';\n}\n.t-icon-filter-1:before {\n  content: '\\E1C9';\n}\n.t-icon-filter-2:before {\n  content: '\\E1CA';\n}\n.t-icon-filter-3:before {\n  content: '\\E1CB';\n}\n.t-icon-filter-clear:before {\n  content: '\\E1CC';\n}\n.t-icon-filter-off:before {\n  content: '\\E1CD';\n}\n.t-icon-filter:before {\n  content: '\\E1CE';\n}\n.t-icon-fingerprint-1:before {\n  content: '\\E1CF';\n}\n.t-icon-fingerprint-2:before {\n  content: '\\E1D0';\n}\n.t-icon-fingerprint-3:before {\n  content: '\\E1D1';\n}\n.t-icon-fingerprint:before {\n  content: '\\E1D2';\n}\n.t-icon-fish:before {\n  content: '\\E1D3';\n}\n.t-icon-flag-1:before {\n  content: '\\E1D4';\n}\n.t-icon-flag-2:before {\n  content: '\\E1D5';\n}\n.t-icon-flag-3:before {\n  content: '\\E1D6';\n}\n.t-icon-flag-4:before {\n  content: '\\E1D7';\n}\n.t-icon-flag:before {\n  content: '\\E1D8';\n}\n.t-icon-flashlight:before {\n  content: '\\E1D9';\n}\n.t-icon-flight-landing:before {\n  content: '\\E1DA';\n}\n.t-icon-flight-takeoff:before {\n  content: '\\E1DB';\n}\n.t-icon-flip-smiling-face:before {\n  content: '\\E1DC';\n}\n.t-icon-flip-to-back:before {\n  content: '\\E1DD';\n}\n.t-icon-flip-to-front:before {\n  content: '\\E1DE';\n}\n.t-icon-focus:before {\n  content: '\\E1DF';\n}\n.t-icon-fog-night:before {\n  content: '\\E1E0';\n}\n.t-icon-fog-sunny:before {\n  content: '\\E1E1';\n}\n.t-icon-fog:before {\n  content: '\\E1E2';\n}\n.t-icon-folder-1:before {\n  content: '\\E1E3';\n}\n.t-icon-folder-add-1:before {\n  content: '\\E1E4';\n}\n.t-icon-folder-add:before {\n  content: '\\E1E5';\n}\n.t-icon-folder-blocked:before {\n  content: '\\E1E6';\n}\n.t-icon-folder-details:before {\n  content: '\\E1E7';\n}\n.t-icon-folder-export:before {\n  content: '\\E1E8';\n}\n.t-icon-folder-import:before {\n  content: '\\E1E9';\n}\n.t-icon-folder-locked:before {\n  content: '\\E1EA';\n}\n.t-icon-folder-minus:before {\n  content: '\\E1EB';\n}\n.t-icon-folder-move:before {\n  content: '\\E1EC';\n}\n.t-icon-folder-off:before {\n  content: '\\E1ED';\n}\n.t-icon-folder-open-1:before {\n  content: '\\E1EE';\n}\n.t-icon-folder-open:before {\n  content: '\\E1EF';\n}\n.t-icon-folder-search:before {\n  content: '\\E1F0';\n}\n.t-icon-folder-setting:before {\n  content: '\\E1F1';\n}\n.t-icon-folder-shared:before {\n  content: '\\E1F2';\n}\n.t-icon-folder-unlocked:before {\n  content: '\\E1F3';\n}\n.t-icon-folder-zip:before {\n  content: '\\E1F4';\n}\n.t-icon-folder:before {\n  content: '\\E1F5';\n}\n.t-icon-forest:before {\n  content: '\\E1F6';\n}\n.t-icon-fork:before {\n  content: '\\E1F7';\n}\n.t-icon-form:before {\n  content: '\\E1F8';\n}\n.t-icon-format-horizontal-align-bottom:before {\n  content: '\\E1F9';\n}\n.t-icon-format-horizontal-align-center:before {\n  content: '\\E1FA';\n}\n.t-icon-format-horizontal-align-top:before {\n  content: '\\E1FB';\n}\n.t-icon-format-vertical-align-center:before {\n  content: '\\E1FC';\n}\n.t-icon-format-vertical-align-left:before {\n  content: '\\E1FD';\n}\n.t-icon-format-vertical-align-right:before {\n  content: '\\E1FE';\n}\n.t-icon-forward:before {\n  content: '\\E1FF';\n}\n.t-icon-frame-1:before {\n  content: '\\E200';\n}\n.t-icon-frame:before {\n  content: '\\E201';\n}\n.t-icon-fries:before {\n  content: '\\E202';\n}\n.t-icon-fullscreen-1:before {\n  content: '\\E203';\n}\n.t-icon-fullscreen-2:before {\n  content: '\\E204';\n}\n.t-icon-fullscreen-exit-1:before {\n  content: '\\E205';\n}\n.t-icon-fullscreen-exit:before {\n  content: '\\E206';\n}\n.t-icon-fullscreen:before {\n  content: '\\E207';\n}\n.t-icon-function-curve:before {\n  content: '\\E208';\n}\n.t-icon-functions-1:before {\n  content: '\\E209';\n}\n.t-icon-functions:before {\n  content: '\\E20A';\n}\n.t-icon-gamepad-1:before {\n  content: '\\E20B';\n}\n.t-icon-gamepad:before {\n  content: '\\E20C';\n}\n.t-icon-gamma:before {\n  content: '\\E20D';\n}\n.t-icon-garlic:before {\n  content: '\\E20E';\n}\n.t-icon-gender-female:before {\n  content: '\\E20F';\n}\n.t-icon-gender-male:before {\n  content: '\\E210';\n}\n.t-icon-gesture-applause:before {\n  content: '\\E211';\n}\n.t-icon-gesture-click:before {\n  content: '\\E212';\n}\n.t-icon-gesture-down:before {\n  content: '\\E213';\n}\n.t-icon-gesture-expansion:before {\n  content: '\\E214';\n}\n.t-icon-gesture-left-slip:before {\n  content: '\\E215';\n}\n.t-icon-gesture-left:before {\n  content: '\\E216';\n}\n.t-icon-gesture-pray-1:before {\n  content: '\\E217';\n}\n.t-icon-gesture-pray:before {\n  content: '\\E218';\n}\n.t-icon-gesture-press:before {\n  content: '\\E219';\n}\n.t-icon-gesture-ranslation-1:before {\n  content: '\\E21A';\n}\n.t-icon-gesture-ranslation:before {\n  content: '\\E21B';\n}\n.t-icon-gesture-right-slip:before {\n  content: '\\E21C';\n}\n.t-icon-gesture-right:before {\n  content: '\\E21D';\n}\n.t-icon-gesture-slide-up:before {\n  content: '\\E21E';\n}\n.t-icon-gesture-up-1:before {\n  content: '\\E21F';\n}\n.t-icon-gesture-up-2:before {\n  content: '\\E220';\n}\n.t-icon-gesture-up-and-down:before {\n  content: '\\E221';\n}\n.t-icon-gesture-up:before {\n  content: '\\E222';\n}\n.t-icon-gesture-wipe-down:before {\n  content: '\\E223';\n}\n.t-icon-gift:before {\n  content: '\\E224';\n}\n.t-icon-giggle:before {\n  content: '\\E225';\n}\n.t-icon-git-branch:before {\n  content: '\\E226';\n}\n.t-icon-git-commit:before {\n  content: '\\E227';\n}\n.t-icon-git-merge:before {\n  content: '\\E228';\n}\n.t-icon-git-pull-request:before {\n  content: '\\E229';\n}\n.t-icon-git-repository-commits:before {\n  content: '\\E22A';\n}\n.t-icon-git-repository-private:before {\n  content: '\\E22B';\n}\n.t-icon-git-repository:before {\n  content: '\\E22C';\n}\n.t-icon-gps:before {\n  content: '\\E22D';\n}\n.t-icon-grape:before {\n  content: '\\E22E';\n}\n.t-icon-greater-than-or-equal:before {\n  content: '\\E22F';\n}\n.t-icon-greater-than:before {\n  content: '\\E230';\n}\n.t-icon-green-onion:before {\n  content: '\\E231';\n}\n.t-icon-grid-add:before {\n  content: '\\E232';\n}\n.t-icon-grid-view:before {\n  content: '\\E233';\n}\n.t-icon-guitar:before {\n  content: '\\E234';\n}\n.t-icon-hamburger:before {\n  content: '\\E235';\n}\n.t-icon-happy:before {\n  content: '\\E236';\n}\n.t-icon-hard-disk-storage:before {\n  content: '\\E237';\n}\n.t-icon-hard-drive:before {\n  content: '\\E238';\n}\n.t-icon-hashtag:before {\n  content: '\\E239';\n}\n.t-icon-hd:before {\n  content: '\\E23A';\n}\n.t-icon-heart-filled:before {\n  content: '\\E23B';\n}\n.t-icon-heart:before {\n  content: '\\E23C';\n}\n.t-icon-help-circle-filled:before {\n  content: '\\E23D';\n}\n.t-icon-help-circle:before {\n  content: '\\E23E';\n}\n.t-icon-help-rectangle:before {\n  content: '\\E23F';\n}\n.t-icon-help:before {\n  content: '\\E240';\n}\n.t-icon-highlight-1:before {\n  content: '\\E241';\n}\n.t-icon-highlight:before {\n  content: '\\E242';\n}\n.t-icon-history-setting:before {\n  content: '\\E243';\n}\n.t-icon-history:before {\n  content: '\\E244';\n}\n.t-icon-home:before {\n  content: '\\E245';\n}\n.t-icon-hospital-1:before {\n  content: '\\E246';\n}\n.t-icon-hospital:before {\n  content: '\\E247';\n}\n.t-icon-hotspot-wave:before {\n  content: '\\E248';\n}\n.t-icon-hourglass:before {\n  content: '\\E249';\n}\n.t-icon-houses-1:before {\n  content: '\\E24A';\n}\n.t-icon-houses-2:before {\n  content: '\\E24B';\n}\n.t-icon-houses:before {\n  content: '\\E24C';\n}\n.t-icon-html5:before {\n  content: '\\E24D';\n}\n.t-icon-https:before {\n  content: '\\E24E';\n}\n.t-icon-ice-cream:before {\n  content: '\\E24F';\n}\n.t-icon-icon:before {\n  content: '\\E250';\n}\n.t-icon-image-1:before {\n  content: '\\E251';\n}\n.t-icon-image-add:before {\n  content: '\\E252';\n}\n.t-icon-image-edit:before {\n  content: '\\E253';\n}\n.t-icon-image-error:before {\n  content: '\\E254';\n}\n.t-icon-image-off:before {\n  content: '\\E255';\n}\n.t-icon-image-search:before {\n  content: '\\E256';\n}\n.t-icon-image:before {\n  content: '\\E257';\n}\n.t-icon-indent-left:before {\n  content: '\\E258';\n}\n.t-icon-indent-right:before {\n  content: '\\E259';\n}\n.t-icon-indicator:before {\n  content: '\\E25A';\n}\n.t-icon-info-circle-filled:before {\n  content: '\\E25B';\n}\n.t-icon-info-circle:before {\n  content: '\\E25C';\n}\n.t-icon-ink:before {\n  content: '\\E25D';\n}\n.t-icon-install-desktop:before {\n  content: '\\E25E';\n}\n.t-icon-install-mobile:before {\n  content: '\\E25F';\n}\n.t-icon-install:before {\n  content: '\\E260';\n}\n.t-icon-institution-checked:before {\n  content: '\\E261';\n}\n.t-icon-institution:before {\n  content: '\\E262';\n}\n.t-icon-internet:before {\n  content: '\\E263';\n}\n.t-icon-ipod:before {\n  content: '\\E264';\n}\n.t-icon-joyful:before {\n  content: '\\E265';\n}\n.t-icon-jump-off:before {\n  content: '\\E266';\n}\n.t-icon-jump:before {\n  content: '\\E267';\n}\n.t-icon-keyboard:before {\n  content: '\\E268';\n}\n.t-icon-laptop:before {\n  content: '\\E269';\n}\n.t-icon-layers:before {\n  content: '\\E26A';\n}\n.t-icon-layout:before {\n  content: '\\E26B';\n}\n.t-icon-leaderboard:before {\n  content: '\\E26C';\n}\n.t-icon-lemon-slice:before {\n  content: '\\E26D';\n}\n.t-icon-lemon:before {\n  content: '\\E26E';\n}\n.t-icon-less-than-or-equal:before {\n  content: '\\E26F';\n}\n.t-icon-less-than:before {\n  content: '\\E270';\n}\n.t-icon-letters-a:before {\n  content: '\\E271';\n}\n.t-icon-letters-b:before {\n  content: '\\E272';\n}\n.t-icon-letters-c:before {\n  content: '\\E273';\n}\n.t-icon-letters-d:before {\n  content: '\\E274';\n}\n.t-icon-letters-e:before {\n  content: '\\E275';\n}\n.t-icon-letters-f:before {\n  content: '\\E276';\n}\n.t-icon-letters-g:before {\n  content: '\\E277';\n}\n.t-icon-letters-h:before {\n  content: '\\E278';\n}\n.t-icon-letters-i:before {\n  content: '\\E279';\n}\n.t-icon-letters-j:before {\n  content: '\\E27A';\n}\n.t-icon-letters-k:before {\n  content: '\\E27B';\n}\n.t-icon-letters-l:before {\n  content: '\\E27C';\n}\n.t-icon-letters-m:before {\n  content: '\\E27D';\n}\n.t-icon-letters-n:before {\n  content: '\\E27E';\n}\n.t-icon-letters-o:before {\n  content: '\\E27F';\n}\n.t-icon-letters-p:before {\n  content: '\\E280';\n}\n.t-icon-letters-q:before {\n  content: '\\E281';\n}\n.t-icon-letters-r:before {\n  content: '\\E282';\n}\n.t-icon-letters-s:before {\n  content: '\\E283';\n}\n.t-icon-letters-t:before {\n  content: '\\E284';\n}\n.t-icon-letters-u:before {\n  content: '\\E285';\n}\n.t-icon-letters-v:before {\n  content: '\\E286';\n}\n.t-icon-letters-w:before {\n  content: '\\E287';\n}\n.t-icon-letters-x:before {\n  content: '\\E288';\n}\n.t-icon-letters-y:before {\n  content: '\\E289';\n}\n.t-icon-letters-z:before {\n  content: '\\E28A';\n}\n.t-icon-lightbulb-circle:before {\n  content: '\\E28B';\n}\n.t-icon-lightbulb:before {\n  content: '\\E28C';\n}\n.t-icon-lighthouse-1:before {\n  content: '\\E28D';\n}\n.t-icon-lighthouse-2:before {\n  content: '\\E28E';\n}\n.t-icon-lighthouse:before {\n  content: '\\E28F';\n}\n.t-icon-lighting-circle:before {\n  content: '\\E290';\n}\n.t-icon-line-height:before {\n  content: '\\E291';\n}\n.t-icon-link-1:before {\n  content: '\\E292';\n}\n.t-icon-link-unlink:before {\n  content: '\\E293';\n}\n.t-icon-link:before {\n  content: '\\E294';\n}\n.t-icon-liquor:before {\n  content: '\\E295';\n}\n.t-icon-list-numbered:before {\n  content: '\\E296';\n}\n.t-icon-list:before {\n  content: '\\E297';\n}\n.t-icon-load:before {\n  content: '\\E298';\n}\n.t-icon-loading:before {\n  content: '\\E299';\n}\n.t-icon-location-1:before {\n  content: '\\E29A';\n}\n.t-icon-location-enlargement:before {\n  content: '\\E29B';\n}\n.t-icon-location-error:before {\n  content: '\\E29C';\n}\n.t-icon-location-parking-place:before {\n  content: '\\E29D';\n}\n.t-icon-location-reduction:before {\n  content: '\\E29E';\n}\n.t-icon-location-setting:before {\n  content: '\\E29F';\n}\n.t-icon-location:before {\n  content: '\\E2A0';\n}\n.t-icon-lock-off-filled:before {\n  content: '\\E2A1';\n}\n.t-icon-lock-off:before {\n  content: '\\E2A2';\n}\n.t-icon-lock-on-filled:before {\n  content: '\\E2A3';\n}\n.t-icon-lock-on:before {\n  content: '\\E2A4';\n}\n.t-icon-lock-time:before {\n  content: '\\E2A5';\n}\n.t-icon-login:before {\n  content: '\\E2A6';\n}\n.t-icon-logo-adobe-illustrate:before {\n  content: '\\E2A7';\n}\n.t-icon-logo-adobe-photoshop-1:before {\n  content: '\\E2A8';\n}\n.t-icon-logo-adobe-photoshop:before {\n  content: '\\E2A9';\n}\n.t-icon-logo-android:before {\n  content: '\\E2AA';\n}\n.t-icon-logo-apple-filled:before {\n  content: '\\E2AB';\n}\n.t-icon-logo-apple:before {\n  content: '\\E2AC';\n}\n.t-icon-logo-behance:before {\n  content: '\\E2AD';\n}\n.t-icon-logo-chrome-filled:before {\n  content: '\\E2AE';\n}\n.t-icon-logo-chrome:before {\n  content: '\\E2AF';\n}\n.t-icon-logo-cinema4d:before {\n  content: '\\E2B0';\n}\n.t-icon-logo-codepen:before {\n  content: '\\E2B1';\n}\n.t-icon-logo-codesandbox:before {\n  content: '\\E2B2';\n}\n.t-icon-logo-dribbble:before {\n  content: '\\E2B3';\n}\n.t-icon-logo-facebook:before {\n  content: '\\E2B4';\n}\n.t-icon-logo-figma:before {\n  content: '\\E2B5';\n}\n.t-icon-logo-framer:before {\n  content: '\\E2B6';\n}\n.t-icon-logo-github-filled:before {\n  content: '\\E2B7';\n}\n.t-icon-logo-github:before {\n  content: '\\E2B8';\n}\n.t-icon-logo-gitlab:before {\n  content: '\\E2B9';\n}\n.t-icon-logo-ie-filled:before {\n  content: '\\E2BA';\n}\n.t-icon-logo-ie:before {\n  content: '\\E2BB';\n}\n.t-icon-logo-instagram:before {\n  content: '\\E2BC';\n}\n.t-icon-logo-qq:before {\n  content: '\\E2BD';\n}\n.t-icon-logo-twitter:before {\n  content: '\\E2BE';\n}\n.t-icon-logo-wechat-stroke:before {\n  content: '\\E2BF';\n}\n.t-icon-logo-wechat:before {\n  content: '\\E2C0';\n}\n.t-icon-logo-wecom:before {\n  content: '\\E2C1';\n}\n.t-icon-logo-windows-filled:before {\n  content: '\\E2C2';\n}\n.t-icon-logo-windows:before {\n  content: '\\E2C3';\n}\n.t-icon-logo-youtube:before {\n  content: '\\E2C4';\n}\n.t-icon-logout:before {\n  content: '\\E2C5';\n}\n.t-icon-look-around:before {\n  content: '\\E2C6';\n}\n.t-icon-loudspeaker:before {\n  content: '\\E2C7';\n}\n.t-icon-mail:before {\n  content: '\\E2C8';\n}\n.t-icon-map-3d:before {\n  content: '\\E2C9';\n}\n.t-icon-map-add:before {\n  content: '\\E2CA';\n}\n.t-icon-map-aiming:before {\n  content: '\\E2CB';\n}\n.t-icon-map-blocked:before {\n  content: '\\E2CC';\n}\n.t-icon-map-bubble:before {\n  content: '\\E2CD';\n}\n.t-icon-map-cancel:before {\n  content: '\\E2CE';\n}\n.t-icon-map-chat:before {\n  content: '\\E2CF';\n}\n.t-icon-map-checked:before {\n  content: '\\E2D0';\n}\n.t-icon-map-collection:before {\n  content: '\\E2D1';\n}\n.t-icon-map-connection:before {\n  content: '\\E2D2';\n}\n.t-icon-map-distance:before {\n  content: '\\E2D3';\n}\n.t-icon-map-double:before {\n  content: '\\E2D4';\n}\n.t-icon-map-edit:before {\n  content: '\\E2D5';\n}\n.t-icon-map-grid:before {\n  content: '\\E2D6';\n}\n.t-icon-map-information-1:before {\n  content: '\\E2D7';\n}\n.t-icon-map-information-2:before {\n  content: '\\E2D8';\n}\n.t-icon-map-information:before {\n  content: '\\E2D9';\n}\n.t-icon-map-location:before {\n  content: '\\E2DA';\n}\n.t-icon-map-locked:before {\n  content: '\\E2DB';\n}\n.t-icon-map-marked:before {\n  content: '\\E2DC';\n}\n.t-icon-map-navigation:before {\n  content: '\\E2DD';\n}\n.t-icon-map-outline:before {\n  content: '\\E2DE';\n}\n.t-icon-map-route-planning:before {\n  content: '\\E2DF';\n}\n.t-icon-map-ruler:before {\n  content: '\\E2E0';\n}\n.t-icon-map-safety:before {\n  content: '\\E2E1';\n}\n.t-icon-map-search-1:before {\n  content: '\\E2E2';\n}\n.t-icon-map-search:before {\n  content: '\\E2E3';\n}\n.t-icon-map-setting:before {\n  content: '\\E2E4';\n}\n.t-icon-map-unlocked:before {\n  content: '\\E2E5';\n}\n.t-icon-map:before {\n  content: '\\E2E6';\n}\n.t-icon-mark-as-unread:before {\n  content: '\\E2E7';\n}\n.t-icon-markup:before {\n  content: '\\E2E8';\n}\n.t-icon-mathematics:before {\n  content: '\\E2E9';\n}\n.t-icon-measurement-1:before {\n  content: '\\E2EA';\n}\n.t-icon-measurement-2:before {\n  content: '\\E2EB';\n}\n.t-icon-measurement:before {\n  content: '\\E2EC';\n}\n.t-icon-meat-pepper:before {\n  content: '\\E2ED';\n}\n.t-icon-media-library:before {\n  content: '\\E2EE';\n}\n.t-icon-member:before {\n  content: '\\E2EF';\n}\n.t-icon-menu-application:before {\n  content: '\\E2F0';\n}\n.t-icon-menu-fold:before {\n  content: '\\E2F1';\n}\n.t-icon-menu-unfold:before {\n  content: '\\E2F2';\n}\n.t-icon-menu:before {\n  content: '\\E2F3';\n}\n.t-icon-merge-cells:before {\n  content: '\\E2F4';\n}\n.t-icon-microphone-1:before {\n  content: '\\E2F5';\n}\n.t-icon-microphone-2:before {\n  content: '\\E2F6';\n}\n.t-icon-microphone:before {\n  content: '\\E2F7';\n}\n.t-icon-milk:before {\n  content: '\\E2F8';\n}\n.t-icon-minus-circle-filled:before {\n  content: '\\E2F9';\n}\n.t-icon-minus-circle:before {\n  content: '\\E2FA';\n}\n.t-icon-minus-rectangle-filled:before {\n  content: '\\E2FB';\n}\n.t-icon-minus-rectangle:before {\n  content: '\\E2FC';\n}\n.t-icon-minus:before {\n  content: '\\E2FD';\n}\n.t-icon-mirror:before {\n  content: '\\E2FE';\n}\n.t-icon-mobile-blocked:before {\n  content: '\\E2FF';\n}\n.t-icon-mobile-list:before {\n  content: '\\E300';\n}\n.t-icon-mobile-navigation:before {\n  content: '\\E301';\n}\n.t-icon-mobile-shortcut:before {\n  content: '\\E302';\n}\n.t-icon-mobile-vibrate:before {\n  content: '\\E303';\n}\n.t-icon-mobile:before {\n  content: '\\E304';\n}\n.t-icon-mode-dark:before {\n  content: '\\E305';\n}\n.t-icon-mode-light:before {\n  content: '\\E306';\n}\n.t-icon-module:before {\n  content: '\\E307';\n}\n.t-icon-money:before {\n  content: '\\E308';\n}\n.t-icon-monument:before {\n  content: '\\E309';\n}\n.t-icon-moon-fall:before {\n  content: '\\E30A';\n}\n.t-icon-moon-rising:before {\n  content: '\\E30B';\n}\n.t-icon-moon:before {\n  content: '\\E30C';\n}\n.t-icon-more:before {\n  content: '\\E30D';\n}\n.t-icon-mosque-1:before {\n  content: '\\E30E';\n}\n.t-icon-mosque:before {\n  content: '\\E30F';\n}\n.t-icon-mouse:before {\n  content: '\\E310';\n}\n.t-icon-move-1:before {\n  content: '\\E311';\n}\n.t-icon-move:before {\n  content: '\\E312';\n}\n.t-icon-movie-clapper:before {\n  content: '\\E313';\n}\n.t-icon-multiply:before {\n  content: '\\E314';\n}\n.t-icon-museum-1:before {\n  content: '\\E315';\n}\n.t-icon-museum-2:before {\n  content: '\\E316';\n}\n.t-icon-museum:before {\n  content: '\\E317';\n}\n.t-icon-mushroom-1:before {\n  content: '\\E318';\n}\n.t-icon-mushroom:before {\n  content: '\\E319';\n}\n.t-icon-music-1:before {\n  content: '\\E31A';\n}\n.t-icon-music-2:before {\n  content: '\\E31B';\n}\n.t-icon-music-rectangle-add:before {\n  content: '\\E31C';\n}\n.t-icon-music:before {\n  content: '\\E31D';\n}\n.t-icon-navigation-arrow:before {\n  content: '\\E31E';\n}\n.t-icon-next:before {\n  content: '\\E31F';\n}\n.t-icon-no-expression:before {\n  content: '\\E320';\n}\n.t-icon-noodle:before {\n  content: '\\E321';\n}\n.t-icon-notification-add:before {\n  content: '\\E322';\n}\n.t-icon-notification-circle:before {\n  content: '\\E323';\n}\n.t-icon-notification-error:before {\n  content: '\\E324';\n}\n.t-icon-notification-filled:before {\n  content: '\\E325';\n}\n.t-icon-notification:before {\n  content: '\\E326';\n}\n.t-icon-numbers-0-1:before {\n  content: '\\E327';\n}\n.t-icon-numbers-0:before {\n  content: '\\E328';\n}\n.t-icon-numbers-1-1:before {\n  content: '\\E329';\n}\n.t-icon-numbers-1:before {\n  content: '\\E32A';\n}\n.t-icon-numbers-2-1:before {\n  content: '\\E32B';\n}\n.t-icon-numbers-2:before {\n  content: '\\E32C';\n}\n.t-icon-numbers-3-1:before {\n  content: '\\E32D';\n}\n.t-icon-numbers-3:before {\n  content: '\\E32E';\n}\n.t-icon-numbers-4-1:before {\n  content: '\\E32F';\n}\n.t-icon-numbers-4:before {\n  content: '\\E330';\n}\n.t-icon-numbers-5-1:before {\n  content: '\\E331';\n}\n.t-icon-numbers-5:before {\n  content: '\\E332';\n}\n.t-icon-numbers-6-1:before {\n  content: '\\E333';\n}\n.t-icon-numbers-6:before {\n  content: '\\E334';\n}\n.t-icon-numbers-7-1:before {\n  content: '\\E335';\n}\n.t-icon-numbers-7:before {\n  content: '\\E336';\n}\n.t-icon-numbers-8-1:before {\n  content: '\\E337';\n}\n.t-icon-numbers-8:before {\n  content: '\\E338';\n}\n.t-icon-numbers-9-1:before {\n  content: '\\E339';\n}\n.t-icon-numbers-9:before {\n  content: '\\E33A';\n}\n.t-icon-nut:before {\n  content: '\\E33B';\n}\n.t-icon-object-storage:before {\n  content: '\\E33C';\n}\n.t-icon-open-mouth:before {\n  content: '\\E33D';\n}\n.t-icon-opera:before {\n  content: '\\E33E';\n}\n.t-icon-order-adjustment-column:before {\n  content: '\\E33F';\n}\n.t-icon-order-ascending:before {\n  content: '\\E340';\n}\n.t-icon-order-descending:before {\n  content: '\\E341';\n}\n.t-icon-outbox:before {\n  content: '\\E342';\n}\n.t-icon-page-first:before {\n  content: '\\E343';\n}\n.t-icon-page-head:before {\n  content: '\\E344';\n}\n.t-icon-page-last:before {\n  content: '\\E345';\n}\n.t-icon-palace-1:before {\n  content: '\\E346';\n}\n.t-icon-palace-2:before {\n  content: '\\E347';\n}\n.t-icon-palace-3:before {\n  content: '\\E348';\n}\n.t-icon-palace-4:before {\n  content: '\\E349';\n}\n.t-icon-palace:before {\n  content: '\\E34A';\n}\n.t-icon-palette-1:before {\n  content: '\\E34B';\n}\n.t-icon-palette:before {\n  content: '\\E34C';\n}\n.t-icon-panorama-horizontal:before {\n  content: '\\E34D';\n}\n.t-icon-panorama-vertical:before {\n  content: '\\E34E';\n}\n.t-icon-pantone:before {\n  content: '\\E34F';\n}\n.t-icon-parabola:before {\n  content: '\\E350';\n}\n.t-icon-parentheses:before {\n  content: '\\E351';\n}\n.t-icon-paste:before {\n  content: '\\E352';\n}\n.t-icon-patio:before {\n  content: '\\E353';\n}\n.t-icon-pause-circle-filled:before {\n  content: '\\E354';\n}\n.t-icon-pause-circle-stroke:before {\n  content: '\\E355';\n}\n.t-icon-pause-circle:before {\n  content: '\\E356';\n}\n.t-icon-pause:before {\n  content: '\\E357';\n}\n.t-icon-pea:before {\n  content: '\\E358';\n}\n.t-icon-peach:before {\n  content: '\\E359';\n}\n.t-icon-pear:before {\n  content: '\\E35A';\n}\n.t-icon-pearl-of-the-orient:before {\n  content: '\\E35B';\n}\n.t-icon-pen-ball:before {\n  content: '\\E35C';\n}\n.t-icon-pen-brush:before {\n  content: '\\E35D';\n}\n.t-icon-pen-mark:before {\n  content: '\\E35E';\n}\n.t-icon-pen-quill:before {\n  content: '\\E35F';\n}\n.t-icon-pen:before {\n  content: '\\E360';\n}\n.t-icon-pending:before {\n  content: '\\E361';\n}\n.t-icon-percent:before {\n  content: '\\E362';\n}\n.t-icon-personal-information:before {\n  content: '\\E363';\n}\n.t-icon-phone-locked:before {\n  content: '\\E364';\n}\n.t-icon-phone-search:before {\n  content: '\\E365';\n}\n.t-icon-pi:before {\n  content: '\\E366';\n}\n.t-icon-piano:before {\n  content: '\\E367';\n}\n.t-icon-pin-filled:before {\n  content: '\\E368';\n}\n.t-icon-pin:before {\n  content: '\\E369';\n}\n.t-icon-play-circle-filled:before {\n  content: '\\E36A';\n}\n.t-icon-play-circle-stroke-add:before {\n  content: '\\E36B';\n}\n.t-icon-play-circle-stroke:before {\n  content: '\\E36C';\n}\n.t-icon-play-circle:before {\n  content: '\\E36D';\n}\n.t-icon-play-demo:before {\n  content: '\\E36E';\n}\n.t-icon-play-rectangle:before {\n  content: '\\E36F';\n}\n.t-icon-play:before {\n  content: '\\E370';\n}\n.t-icon-plus:before {\n  content: '\\E371';\n}\n.t-icon-popsicle:before {\n  content: '\\E372';\n}\n.t-icon-portrait:before {\n  content: '\\E373';\n}\n.t-icon-pout:before {\n  content: '\\E374';\n}\n.t-icon-poweroff:before {\n  content: '\\E375';\n}\n.t-icon-precise-monitor:before {\n  content: '\\E376';\n}\n.t-icon-previous:before {\n  content: '\\E377';\n}\n.t-icon-print:before {\n  content: '\\E378';\n}\n.t-icon-pumpkin:before {\n  content: '\\E379';\n}\n.t-icon-pyramid-maya:before {\n  content: '\\E37A';\n}\n.t-icon-pyramid:before {\n  content: '\\E37B';\n}\n.t-icon-qrcode:before {\n  content: '\\E37C';\n}\n.t-icon-quadratic:before {\n  content: '\\E37D';\n}\n.t-icon-questionnaire:before {\n  content: '\\E37E';\n}\n.t-icon-queue:before {\n  content: '\\E37F';\n}\n.t-icon-radar:before {\n  content: '\\E380';\n}\n.t-icon-radio-1:before {\n  content: '\\E381';\n}\n.t-icon-radio-2:before {\n  content: '\\E382';\n}\n.t-icon-radish:before {\n  content: '\\E383';\n}\n.t-icon-rain-heavy:before {\n  content: '\\E384';\n}\n.t-icon-rain-light:before {\n  content: '\\E385';\n}\n.t-icon-rain-medium:before {\n  content: '\\E386';\n}\n.t-icon-rainbow:before {\n  content: '\\E387';\n}\n.t-icon-rectangle:before {\n  content: '\\E388';\n}\n.t-icon-refresh:before {\n  content: '\\E389';\n}\n.t-icon-relation:before {\n  content: '\\E38A';\n}\n.t-icon-relativity:before {\n  content: '\\E38B';\n}\n.t-icon-remote-wave:before {\n  content: '\\E38C';\n}\n.t-icon-remove:before {\n  content: '\\E38D';\n}\n.t-icon-replay:before {\n  content: '\\E38E';\n}\n.t-icon-rice-ball:before {\n  content: '\\E38F';\n}\n.t-icon-rice:before {\n  content: '\\E390';\n}\n.t-icon-roast:before {\n  content: '\\E391';\n}\n.t-icon-rocket:before {\n  content: '\\E392';\n}\n.t-icon-rollback:before {\n  content: '\\E393';\n}\n.t-icon-rollfront:before {\n  content: '\\E394';\n}\n.t-icon-root-list:before {\n  content: '\\E395';\n}\n.t-icon-rotate-locked:before {\n  content: '\\E396';\n}\n.t-icon-rotate:before {\n  content: '\\E397';\n}\n.t-icon-rotation:before {\n  content: '\\E398';\n}\n.t-icon-round:before {\n  content: '\\E399';\n}\n.t-icon-router-wave:before {\n  content: '\\E39A';\n}\n.t-icon-rss:before {\n  content: '\\E39B';\n}\n.t-icon-ruler:before {\n  content: '\\E39C';\n}\n.t-icon-sailing-hotel:before {\n  content: '\\E39D';\n}\n.t-icon-sandwich:before {\n  content: '\\E39E';\n}\n.t-icon-saturation:before {\n  content: '\\E39F';\n}\n.t-icon-sausage:before {\n  content: '\\E3A0';\n}\n.t-icon-save:before {\n  content: '\\E3A1';\n}\n.t-icon-saving-pot:before {\n  content: '\\E3A2';\n}\n.t-icon-scan:before {\n  content: '\\E3A3';\n}\n.t-icon-screen-4k:before {\n  content: '\\E3A4';\n}\n.t-icon-screencast:before {\n  content: '\\E3A5';\n}\n.t-icon-screenshot:before {\n  content: '\\E3A6';\n}\n.t-icon-scroll-bar:before {\n  content: '\\E3A7';\n}\n.t-icon-sd-card-1:before {\n  content: '\\E3A8';\n}\n.t-icon-sd-card:before {\n  content: '\\E3A9';\n}\n.t-icon-search-error:before {\n  content: '\\E3AA';\n}\n.t-icon-search:before {\n  content: '\\E3AB';\n}\n.t-icon-secured:before {\n  content: '\\E3AC';\n}\n.t-icon-send-cancel:before {\n  content: '\\E3AD';\n}\n.t-icon-send:before {\n  content: '\\E3AE';\n}\n.t-icon-sensors-1:before {\n  content: '\\E3AF';\n}\n.t-icon-sensors-2:before {\n  content: '\\E3B0';\n}\n.t-icon-sensors-off:before {\n  content: '\\E3B1';\n}\n.t-icon-sensors:before {\n  content: '\\E3B2';\n}\n.t-icon-serenity:before {\n  content: '\\E3B3';\n}\n.t-icon-server:before {\n  content: '\\E3B4';\n}\n.t-icon-service:before {\n  content: '\\E3B5';\n}\n.t-icon-setting-1:before {\n  content: '\\E3B6';\n}\n.t-icon-setting:before {\n  content: '\\E3B7';\n}\n.t-icon-share-1:before {\n  content: '\\E3B8';\n}\n.t-icon-share:before {\n  content: '\\E3B9';\n}\n.t-icon-sharpness:before {\n  content: '\\E3BA';\n}\n.t-icon-shield-error:before {\n  content: '\\E3BB';\n}\n.t-icon-shimen:before {\n  content: '\\E3BC';\n}\n.t-icon-shop-1:before {\n  content: '\\E3BD';\n}\n.t-icon-shop-2:before {\n  content: '\\E3BE';\n}\n.t-icon-shop-3:before {\n  content: '\\E3BF';\n}\n.t-icon-shop-4:before {\n  content: '\\E3C0';\n}\n.t-icon-shop-5:before {\n  content: '\\E3C1';\n}\n.t-icon-shop:before {\n  content: '\\E3C2';\n}\n.t-icon-shrimp:before {\n  content: '\\E3C3';\n}\n.t-icon-shrink-horizontal:before {\n  content: '\\E3C4';\n}\n.t-icon-shrink-vertical:before {\n  content: '\\E3C5';\n}\n.t-icon-shutter:before {\n  content: '\\E3C6';\n}\n.t-icon-shutup:before {\n  content: '\\E3C7';\n}\n.t-icon-sim-card-1:before {\n  content: '\\E3C8';\n}\n.t-icon-sim-card-2:before {\n  content: '\\E3C9';\n}\n.t-icon-sim-card:before {\n  content: '\\E3CA';\n}\n.t-icon-sinister-smile:before {\n  content: '\\E3CB';\n}\n.t-icon-sip:before {\n  content: '\\E3CC';\n}\n.t-icon-slash:before {\n  content: '\\E3CD';\n}\n.t-icon-sleep:before {\n  content: '\\E3CE';\n}\n.t-icon-slice:before {\n  content: '\\E3CF';\n}\n.t-icon-slideshow:before {\n  content: '\\E3D0';\n}\n.t-icon-smile:before {\n  content: '\\E3D1';\n}\n.t-icon-sneer:before {\n  content: '\\E3D2';\n}\n.t-icon-snowflake:before {\n  content: '\\E3D3';\n}\n.t-icon-sonic:before {\n  content: '\\E3D4';\n}\n.t-icon-sound-down:before {\n  content: '\\E3D5';\n}\n.t-icon-sound-high:before {\n  content: '\\E3D6';\n}\n.t-icon-sound-low:before {\n  content: '\\E3D7';\n}\n.t-icon-sound-mute-1:before {\n  content: '\\E3D8';\n}\n.t-icon-sound-mute:before {\n  content: '\\E3D9';\n}\n.t-icon-sound-up:before {\n  content: '\\E3DA';\n}\n.t-icon-sound:before {\n  content: '\\E3DB';\n}\n.t-icon-space:before {\n  content: '\\E3DC';\n}\n.t-icon-speechless-1:before {\n  content: '\\E3DD';\n}\n.t-icon-star-filled:before {\n  content: '\\E3DE';\n}\n.t-icon-star:before {\n  content: '\\E3DF';\n}\n.t-icon-statue-of-jesus:before {\n  content: '\\E3E0';\n}\n.t-icon-sticky-note:before {\n  content: '\\E3E1';\n}\n.t-icon-stop-circle-filled:before {\n  content: '\\E3E2';\n}\n.t-icon-stop-circle-stroke:before {\n  content: '\\E3E3';\n}\n.t-icon-stop-circle:before {\n  content: '\\E3E4';\n}\n.t-icon-stop:before {\n  content: '\\E3E5';\n}\n.t-icon-store:before {\n  content: '\\E3E6';\n}\n.t-icon-street-road-1:before {\n  content: '\\E3E7';\n}\n.t-icon-street-road:before {\n  content: '\\E3E8';\n}\n.t-icon-subtitle:before {\n  content: '\\E3E9';\n}\n.t-icon-subway-line:before {\n  content: '\\E3EA';\n}\n.t-icon-sum:before {\n  content: '\\E3EB';\n}\n.t-icon-sun-fall:before {\n  content: '\\E3EC';\n}\n.t-icon-sun-rising:before {\n  content: '\\E3ED';\n}\n.t-icon-sunny:before {\n  content: '\\E3EE';\n}\n.t-icon-support:before {\n  content: '\\E3EF';\n}\n.t-icon-surprised-1:before {\n  content: '\\E3F0';\n}\n.t-icon-surprised:before {\n  content: '\\E3F1';\n}\n.t-icon-swap-left:before {\n  content: '\\E3F2';\n}\n.t-icon-swap-right:before {\n  content: '\\E3F3';\n}\n.t-icon-swap:before {\n  content: '\\E3F4';\n}\n.t-icon-swear-1:before {\n  content: '\\E3F5';\n}\n.t-icon-swear-2:before {\n  content: '\\E3F6';\n}\n.t-icon-system-2:before {\n  content: '\\E3F7';\n}\n.t-icon-system-3:before {\n  content: '\\E3F8';\n}\n.t-icon-system-application:before {\n  content: '\\E3F9';\n}\n.t-icon-system-blocked:before {\n  content: '\\E3FA';\n}\n.t-icon-system-code:before {\n  content: '\\E3FB';\n}\n.t-icon-system-components:before {\n  content: '\\E3FC';\n}\n.t-icon-system-coordinate:before {\n  content: '\\E3FD';\n}\n.t-icon-system-device:before {\n  content: '\\E3FE';\n}\n.t-icon-system-interface:before {\n  content: '\\E3FF';\n}\n.t-icon-system-location:before {\n  content: '\\E400';\n}\n.t-icon-system-locked:before {\n  content: '\\E401';\n}\n.t-icon-system-log:before {\n  content: '\\E402';\n}\n.t-icon-system-marked:before {\n  content: '\\E403';\n}\n.t-icon-system-messages:before {\n  content: '\\E404';\n}\n.t-icon-system-regulation:before {\n  content: '\\E405';\n}\n.t-icon-system-search:before {\n  content: '\\E406';\n}\n.t-icon-system-setting:before {\n  content: '\\E407';\n}\n.t-icon-system-storage:before {\n  content: '\\E408';\n}\n.t-icon-system-sum:before {\n  content: '\\E409';\n}\n.t-icon-system-unlocked:before {\n  content: '\\E40A';\n}\n.t-icon-tab:before {\n  content: '\\E40B';\n}\n.t-icon-table-1:before {\n  content: '\\E40C';\n}\n.t-icon-table-2:before {\n  content: '\\E40D';\n}\n.t-icon-table-add:before {\n  content: '\\E40E';\n}\n.t-icon-table-split:before {\n  content: '\\E40F';\n}\n.t-icon-table:before {\n  content: '\\E410';\n}\n.t-icon-tag:before {\n  content: '\\E411';\n}\n.t-icon-tangerinr:before {\n  content: '\\E412';\n}\n.t-icon-tape:before {\n  content: '\\E413';\n}\n.t-icon-task-1:before {\n  content: '\\E414';\n}\n.t-icon-task-add-1:before {\n  content: '\\E415';\n}\n.t-icon-task-add:before {\n  content: '\\E416';\n}\n.t-icon-task-checked:before {\n  content: '\\E417';\n}\n.t-icon-task-error:before {\n  content: '\\E418';\n}\n.t-icon-task-location:before {\n  content: '\\E419';\n}\n.t-icon-task-marked:before {\n  content: '\\E41A';\n}\n.t-icon-task-setting:before {\n  content: '\\E41B';\n}\n.t-icon-task-visible:before {\n  content: '\\E41C';\n}\n.t-icon-task:before {\n  content: '\\E41D';\n}\n.t-icon-tea:before {\n  content: '\\E41E';\n}\n.t-icon-teahouse:before {\n  content: '\\E41F';\n}\n.t-icon-template:before {\n  content: '\\E420';\n}\n.t-icon-temple:before {\n  content: '\\E421';\n}\n.t-icon-terminal-rectangle-1:before {\n  content: '\\E422';\n}\n.t-icon-terminal-rectangle:before {\n  content: '\\E423';\n}\n.t-icon-terminal-window:before {\n  content: '\\E424';\n}\n.t-icon-terminal:before {\n  content: '\\E425';\n}\n.t-icon-textbox:before {\n  content: '\\E426';\n}\n.t-icon-textformat-bold:before {\n  content: '\\E427';\n}\n.t-icon-textformat-color:before {\n  content: '\\E428';\n}\n.t-icon-textformat-italic:before {\n  content: '\\E429';\n}\n.t-icon-textformat-strikethrough:before {\n  content: '\\E42A';\n}\n.t-icon-textformat-underline:before {\n  content: '\\E42B';\n}\n.t-icon-textformat-wrap:before {\n  content: '\\E42C';\n}\n.t-icon-theaters:before {\n  content: '\\E42D';\n}\n.t-icon-thumb-down-1:before {\n  content: '\\E42E';\n}\n.t-icon-thumb-down-2:before {\n  content: '\\E42F';\n}\n.t-icon-thumb-down:before {\n  content: '\\E430';\n}\n.t-icon-thumb-up-1:before {\n  content: '\\E431';\n}\n.t-icon-thumb-up-2:before {\n  content: '\\E432';\n}\n.t-icon-thumb-up:before {\n  content: '\\E433';\n}\n.t-icon-thunder:before {\n  content: '\\E434';\n}\n.t-icon-thunderstorm-night:before {\n  content: '\\E435';\n}\n.t-icon-thunderstorm-sunny:before {\n  content: '\\E436';\n}\n.t-icon-thunderstorm:before {\n  content: '\\E437';\n}\n.t-icon-ticket:before {\n  content: '\\E438';\n}\n.t-icon-time-filled:before {\n  content: '\\E439';\n}\n.t-icon-time:before {\n  content: '\\E43A';\n}\n.t-icon-tips-double:before {\n  content: '\\E43B';\n}\n.t-icon-tips:before {\n  content: '\\E43C';\n}\n.t-icon-tomato:before {\n  content: '\\E43D';\n}\n.t-icon-tools-circle:before {\n  content: '\\E43E';\n}\n.t-icon-tools:before {\n  content: '\\E43F';\n}\n.t-icon-tornado:before {\n  content: '\\E440';\n}\n.t-icon-tower-1:before {\n  content: '\\E441';\n}\n.t-icon-tower-2:before {\n  content: '\\E442';\n}\n.t-icon-tower-3:before {\n  content: '\\E443';\n}\n.t-icon-tower-clock:before {\n  content: '\\E444';\n}\n.t-icon-tower:before {\n  content: '\\E445';\n}\n.t-icon-town:before {\n  content: '\\E446';\n}\n.t-icon-traffic-events:before {\n  content: '\\E447';\n}\n.t-icon-traffic:before {\n  content: '\\E448';\n}\n.t-icon-transform-1:before {\n  content: '\\E449';\n}\n.t-icon-transform-2:before {\n  content: '\\E44A';\n}\n.t-icon-transform-3:before {\n  content: '\\E44B';\n}\n.t-icon-transform:before {\n  content: '\\E44C';\n}\n.t-icon-translate-1:before {\n  content: '\\E44D';\n}\n.t-icon-translate:before {\n  content: '\\E44E';\n}\n.t-icon-tree-list:before {\n  content: '\\E44F';\n}\n.t-icon-tree-round-dot-vertical:before {\n  content: '\\E450';\n}\n.t-icon-tree-round-dot:before {\n  content: '\\E451';\n}\n.t-icon-tree-square-dot-vertical:before {\n  content: '\\E452';\n}\n.t-icon-tree-square-dot:before {\n  content: '\\E453';\n}\n.t-icon-trending-down:before {\n  content: '\\E454';\n}\n.t-icon-trending-up:before {\n  content: '\\E455';\n}\n.t-icon-tv-1:before {\n  content: '\\E456';\n}\n.t-icon-tv-2:before {\n  content: '\\E457';\n}\n.t-icon-tv:before {\n  content: '\\E458';\n}\n.t-icon-typography:before {\n  content: '\\E459';\n}\n.t-icon-uncomfortable-1:before {\n  content: '\\E45A';\n}\n.t-icon-uncomfortable-2:before {\n  content: '\\E45B';\n}\n.t-icon-uncomfortable:before {\n  content: '\\E45C';\n}\n.t-icon-undertake-delivery:before {\n  content: '\\E45D';\n}\n.t-icon-undertake-environment-protection:before {\n  content: '\\E45E';\n}\n.t-icon-undertake-hold-up:before {\n  content: '\\E45F';\n}\n.t-icon-undertake-transaction:before {\n  content: '\\E460';\n}\n.t-icon-undertake:before {\n  content: '\\E461';\n}\n.t-icon-unfold-less:before {\n  content: '\\E462';\n}\n.t-icon-unfold-more:before {\n  content: '\\E463';\n}\n.t-icon-unhappy-1:before {\n  content: '\\E464';\n}\n.t-icon-unhappy:before {\n  content: '\\E465';\n}\n.t-icon-uninstall:before {\n  content: '\\E466';\n}\n.t-icon-upload-1:before {\n  content: '\\E467';\n}\n.t-icon-upload:before {\n  content: '\\E468';\n}\n.t-icon-upscale:before {\n  content: '\\E469';\n}\n.t-icon-usb:before {\n  content: '\\E46A';\n}\n.t-icon-user-1:before {\n  content: '\\E46B';\n}\n.t-icon-user-add:before {\n  content: '\\E46C';\n}\n.t-icon-user-arrow-down:before {\n  content: '\\E46D';\n}\n.t-icon-user-arrow-left:before {\n  content: '\\E46E';\n}\n.t-icon-user-arrow-right:before {\n  content: '\\E46F';\n}\n.t-icon-user-arrow-up:before {\n  content: '\\E470';\n}\n.t-icon-user-avatar:before {\n  content: '\\E471';\n}\n.t-icon-user-blocked:before {\n  content: '\\E472';\n}\n.t-icon-user-business:before {\n  content: '\\E473';\n}\n.t-icon-user-checked-1:before {\n  content: '\\E474';\n}\n.t-icon-user-checked:before {\n  content: '\\E475';\n}\n.t-icon-user-circle:before {\n  content: '\\E476';\n}\n.t-icon-user-clear:before {\n  content: '\\E477';\n}\n.t-icon-user-error-1:before {\n  content: '\\E478';\n}\n.t-icon-user-invisible:before {\n  content: '\\E479';\n}\n.t-icon-user-list:before {\n  content: '\\E47A';\n}\n.t-icon-user-locked:before {\n  content: '\\E47B';\n}\n.t-icon-user-marked:before {\n  content: '\\E47C';\n}\n.t-icon-user-password:before {\n  content: '\\E47D';\n}\n.t-icon-user-safety:before {\n  content: '\\E47E';\n}\n.t-icon-user-search:before {\n  content: '\\E47F';\n}\n.t-icon-user-setting:before {\n  content: '\\E480';\n}\n.t-icon-user-talk-1:before {\n  content: '\\E481';\n}\n.t-icon-user-talk-off-1:before {\n  content: '\\E482';\n}\n.t-icon-user-talk:before {\n  content: '\\E483';\n}\n.t-icon-user-time:before {\n  content: '\\E484';\n}\n.t-icon-user-transmit:before {\n  content: '\\E485';\n}\n.t-icon-user-unknown:before {\n  content: '\\E486';\n}\n.t-icon-user-unlocked:before {\n  content: '\\E487';\n}\n.t-icon-user-vip:before {\n  content: '\\E488';\n}\n.t-icon-user-visible:before {\n  content: '\\E489';\n}\n.t-icon-user:before {\n  content: '\\E48A';\n}\n.t-icon-usergroup-add:before {\n  content: '\\E48B';\n}\n.t-icon-usergroup-clear:before {\n  content: '\\E48C';\n}\n.t-icon-usergroup:before {\n  content: '\\E48D';\n}\n.t-icon-vehicle:before {\n  content: '\\E48E';\n}\n.t-icon-verified:before {\n  content: '\\E48F';\n}\n.t-icon-verify:before {\n  content: '\\E490';\n}\n.t-icon-video-camera-1:before {\n  content: '\\E491';\n}\n.t-icon-video-camera-2:before {\n  content: '\\E492';\n}\n.t-icon-video-camera-dollar:before {\n  content: '\\E493';\n}\n.t-icon-video-camera-minus:before {\n  content: '\\E494';\n}\n.t-icon-video-camera-music:before {\n  content: '\\E495';\n}\n.t-icon-video-camera-off:before {\n  content: '\\E496';\n}\n.t-icon-video-camera:before {\n  content: '\\E497';\n}\n.t-icon-video-library:before {\n  content: '\\E498';\n}\n.t-icon-video:before {\n  content: '\\E499';\n}\n.t-icon-view-agenda:before {\n  content: '\\E49A';\n}\n.t-icon-view-column:before {\n  content: '\\E49B';\n}\n.t-icon-view-in-ar:before {\n  content: '\\E49C';\n}\n.t-icon-view-list:before {\n  content: '\\E49D';\n}\n.t-icon-view-module:before {\n  content: '\\E49E';\n}\n.t-icon-visual-recognition:before {\n  content: '\\E49F';\n}\n.t-icon-wallet:before {\n  content: '\\E4A0';\n}\n.t-icon-watch:before {\n  content: '\\E4A1';\n}\n.t-icon-watermelon:before {\n  content: '\\E4A2';\n}\n.t-icon-wave-left:before {\n  content: '\\E4A3';\n}\n.t-icon-wave-right:before {\n  content: '\\E4A4';\n}\n.t-icon-wealth-1:before {\n  content: '\\E4A5';\n}\n.t-icon-wealth:before {\n  content: '\\E4A6';\n}\n.t-icon-widget:before {\n  content: '\\E4A7';\n}\n.t-icon-wifi-1:before {\n  content: '\\E4A8';\n}\n.t-icon-wifi-off-1:before {\n  content: '\\E4A9';\n}\n.t-icon-wifi-off:before {\n  content: '\\E4AA';\n}\n.t-icon-wifi:before {\n  content: '\\E4AB';\n}\n.t-icon-window-1:before {\n  content: '\\E4AC';\n}\n.t-icon-window:before {\n  content: '\\E4AD';\n}\n.t-icon-windy-rain:before {\n  content: '\\E4AE';\n}\n.t-icon-windy:before {\n  content: '\\E4AF';\n}\n.t-icon-wink:before {\n  content: '\\E4B0';\n}\n.t-icon-work-history:before {\n  content: '\\E4B1';\n}\n.t-icon-work-off:before {\n  content: '\\E4B2';\n}\n.t-icon-work:before {\n  content: '\\E4B3';\n}\n.t-icon-wry-smile:before {\n  content: '\\E4B4';\n}\n.t-icon-zoom-in:before {\n  content: '\\E4B5';\n}\n.t-icon-zoom-out:before {\n  content: '\\E4B6';\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/icon/props.d.ts",
    "content": "import { TdIconProps } from './type';\ndeclare const props: TdIconProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/icon/props.js",
    "content": "const props = {\n    color: {\n        type: String,\n        value: '',\n    },\n    name: {\n        type: String,\n        value: '',\n        required: true,\n    },\n    prefix: {\n        type: String,\n        value: '',\n    },\n    size: {\n        type: null,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/icon/type.d.ts",
    "content": "export interface TdIconProps {\n    color?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    name: {\n        type: StringConstructor;\n        value?: string;\n        required?: boolean;\n    };\n    prefix?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    size?: {\n        type: null;\n        value?: string | number;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/icon/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Image Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nerror | String / Slot | 'default' | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nheight | String / Number | - | \\- | N\nlazy | Boolean | false | \\- | N\nloading | String / Slot | 'default' | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmode | String | scaleToFill | options: scaleToFill/aspectFit/aspectFill/widthFix/heightFix/top/bottom/center/left/right/top left/top right/bottom left/bottom right | N\nshape | String | square | options: circle/round/square | N\nshow-menu-by-longpress | Boolean | false | \\- | N\nsrc | String | - | src attribute of `<img>`. image File can also be loaded | N\nt-id | String | - | `1.2.10`。image tag id | N\nwebp | Boolean | false | \\- | N\nwidth | String / Number | - | \\- | N\n\n### Image Events\n\nname | params | description\n-- | -- | --\nerror | - | trigger on image load failed\nload | - | trigger on image loaded\n### Image External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-load | \\-\nt-class-image | \\-\nt-class-error | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description\n-- | -- | --\n--td-image-color | @font-gray-3 | -\n--td-image-loading-bg-color | @bg-color-secondarycontainer | -\n--td-image-loading-color | @font-gray-3 | -\n--td-image-round-radius | @radius-default | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/README.md",
    "content": "---\ntitle: Image 图片\ndescription: 用于展示效果，主要为上下左右居中裁切、拉伸、平铺等方式。\nspline: base\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-100%25-blue\" /></span>\n\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n    \"t-image\": \"tdesign-miniprogram/image/image\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/wP7zUima7kSF\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 裁切样式\n\n{{ base }}\n\n### 加载状态\n\n{{ status }}\n\n## 常见问题\n\n<details>\n  <summary>\n    本地图片无法正确引用?\n    <span class=\"icon\">👇</span>\n  </summary>\n  <p style=\"margin-top: 10px; color: rgba(0, 0, 0, .6)\">\n    建议使用绝对路径，而不是相对路径。绝对路径以 app.json 所在位置为基准。\n  </p>\n</details>\n\n## API\n\n### Image Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nerror | String / Slot | 'default' | 加载失败时显示的内容。值为 `default` 则表示使用默认加载失败风格；值为空或者 `slot` 表示使用插槽渲染，插槽名称为 `error`；值为其他则表示普通文本内容，如“加载失败”。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nheight | String / Number | - | 高度，默认单位为`px` | N\nlazy | Boolean | false | 是否开启图片懒加载 | N\nloading | String / Slot | 'default' | 加载态内容。值为 `default` 则表示使用默认加载中风格；值为其他则表示普通文本内容，如“加载中”。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmode | String | scaleToFill | 图片裁剪、缩放的模式；[小程序官方文档](https://developers.weixin.qq.com/miniprogram/dev/component/image.html)。可选项：scaleToFill/aspectFit/aspectFill/widthFix/heightFix/top/bottom/center/left/right/top left/top right/bottom left/bottom right | N\nshape | String | square | 图片圆角类型。可选项：circle/round/square | N\nshow-menu-by-longpress | Boolean | false | 长按图片显示发送给朋友、收藏、保存图片、搜一搜、打开名片/前往群聊/打开小程序（若图片中包含对应二维码或小程序码）的菜单。 | N\nsrc | String | - | 图片链接 | N\nt-id | String | - | `1.2.10`。图片标签id | N\nwebp | Boolean | false | 默认不解析 webP 格式，只支持网络资源 | N\nwidth | String / Number | - | 宽度，默认单位为`px` | N\n\n### Image Events\n\n名称 | 参数 | 描述\n-- | -- | --\nerror | - | 图片加载失败时触发\nload | - | 图片加载完成时触发\n### Image External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-load | 加载样式类\nt-class-image | 图片样式类\nt-class-error | 加载失败样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述\n-- | -- | --\n--td-image-color | @font-gray-3 | -\n--td-image-loading-bg-color | @bg-color-secondarycontainer | -\n--td-image-loading-color | @font-gray-3 | -\n--td-image-round-radius | @radius-default | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/image-info.json",
    "content": "{\n  \"key\": \"Image\",\n  \"label\": \"图片\",\n  \"icon\": \"\",\n  \"properties\": [\n    {\n      \"key\": \"error\",\n      \"type\": [\"String\", \"TNode\"],\n      \"defaultValue\": \"'default'\",\n      \"desc\": \"加载失败时显示的内容。值为 `default` 则表示使用默认加载失败风格；值为空或者 `slot` 表示使用插槽渲染，插槽名称为 `error`；值为其他则表示普通文本内容，如“加载失败”\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"externalClasses\",\n      \"type\": [\"Array\"],\n      \"defaultValue\": \"\",\n      \"desc\": \"组件类名，分别用于设置加载组件外层元素，中间内容等元素类名\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"lazy\",\n      \"type\": [\"Boolean\"],\n      \"defaultValue\": \"false\",\n      \"desc\": \"是否开启图片懒加载\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"loading\",\n      \"type\": [\"String\", \"TNode\"],\n      \"defaultValue\": \"'default'\",\n      \"desc\": \"加载态内容。值为 `default` 则表示使用默认加载中风格；值为空或者 `slot` 表示使用插槽渲染，插槽名称为 `loading`；值为其他则表示普通文本内容，如“加载中”\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"MP_EXCLUDE_PROPS\",\n      \"type\": [\"String\"],\n      \"defaultValue\": \"\",\n      \"desc\": \"为避免重复或冲突，需要过滤掉的小程序原生属性\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"MP_PROPS\",\n      \"type\": [\"String\"],\n      \"defaultValue\": \"\",\n      \"desc\": \"[小程序原生属性](https://developers.weixin.qq.com/miniprogram/dev/component/image.html)\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"shape\",\n      \"type\": [\"String\"],\n      \"defaultValue\": \"square\",\n      \"desc\": \"图片圆角类型\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"src\",\n      \"type\": [\"String\"],\n      \"defaultValue\": \"\",\n      \"desc\": \"图片链接\",\n      \"label\": \"\"\n    }\n  ],\n  \"events\": [\n    {\n      \"key\": \"error\",\n      \"desc\": \"图片加载失败时触发\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"load\",\n      \"desc\": \"图片加载完成时触发\",\n      \"label\": \"\"\n    }\n  ]\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/image.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nexport default class Image extends SuperComponent {\n    externalClasses: string[];\n    options: {\n        multipleSlots: boolean;\n    };\n    properties: import(\"./type\").TdImageProps;\n    data: {\n        prefix: string;\n        isLoading: boolean;\n        isFailed: boolean;\n        innerStyle: string;\n        classPrefix: string;\n    };\n    preSrc: string;\n    observers: {\n        src(): void;\n        'width, height'(width: any, height: any): void;\n    };\n    methods: {\n        onLoaded(e: any): void;\n        onLoadError(e: any): void;\n        calcSize(width: any, height: any): void;\n        update(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/image.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport ImageProps from './props';\nimport config from '../common/config';\nimport { addUnit, getRect, appBaseInfo } from '../common/utils';\nimport { compareVersion } from '../common/version';\nconst { prefix } = config;\nconst name = `${prefix}-image`;\nlet Image = class Image extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-load`, `${prefix}-class-image`, `${prefix}-class-error`];\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = ImageProps;\n        this.data = {\n            prefix,\n            isLoading: true,\n            isFailed: false,\n            innerStyle: '',\n            classPrefix: name,\n        };\n        this.preSrc = '';\n        this.observers = {\n            src() {\n                if (this.preSrc === this.properties.src)\n                    return;\n                this.update();\n            },\n            'width, height'(width, height) {\n                this.calcSize(width, height);\n            },\n        };\n        this.methods = {\n            onLoaded(e) {\n                const sdkVersion = appBaseInfo.SDKVersion;\n                const { mode, tId } = this.properties;\n                const isInCompatible = compareVersion(sdkVersion, '2.10.3') < 0;\n                if (mode === 'heightFix' && isInCompatible) {\n                    const { height: picHeight, width: picWidth } = e.detail;\n                    getRect(this, `#${tId || 'image'}`).then((rect) => {\n                        const { height } = rect;\n                        const resultWidth = ((height / picHeight) * picWidth).toFixed(2);\n                        this.setData({ innerStyle: `height: ${addUnit(height)}; width: ${resultWidth}px;` });\n                    });\n                }\n                this.setData({\n                    isLoading: false,\n                    isFailed: false,\n                });\n                this.triggerEvent('load', e.detail);\n            },\n            onLoadError(e) {\n                this.setData({\n                    isLoading: false,\n                    isFailed: true,\n                });\n                this.triggerEvent('error', e.detail);\n            },\n            calcSize(width, height) {\n                let innerStyle = '';\n                if (width) {\n                    innerStyle += `width: ${addUnit(width)};`;\n                }\n                if (height) {\n                    innerStyle += `height: ${addUnit(height)};`;\n                }\n                this.setData({\n                    innerStyle,\n                });\n            },\n            update() {\n                const { src } = this.properties;\n                this.preSrc = src;\n                if (!src) {\n                    this.onLoadError({ errMsg: '图片链接为空' });\n                }\n                else {\n                    this.setData({\n                        isLoading: true,\n                        isFailed: false,\n                    });\n                }\n            },\n        };\n    }\n};\nImage = __decorate([\n    wxComponent()\n], Image);\nexport default Image;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/image.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-loading\": \"../loading/loading\",\n    \"t-icon\": \"../icon/icon\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/image.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view style=\"{{_._style([style, customStyle])}}\" class=\"class {{prefix}}-class {{classPrefix}}\">\n  <!-- 加载中占位 -->\n  <view\n    wx:if=\"{{isLoading}}\"\n    style=\"{{_._style([innerStyle])}}\"\n    class=\"{{classPrefix}}__mask {{classPrefix}}--loading {{classPrefix}}--shape-{{shape}}\"\n    aria-hidden=\"{{ariaHidden}}\"\n  >\n    <t-loading\n      wx:if=\"{{loading === 'default'}}\"\n      theme=\"dots\"\n      size=\"44rpx\"\n      loading\n      inherit-color\n      t-class=\"t-class-load\"\n      t-class-text=\"{{classPrefix}}--loading-text\"\n    ></t-loading>\n    <view wx:elif=\"{{loading !== '' && loading !== 'slot'}}\" class=\"{{classPrefix}}__common {{prefix}}-class-load\">\n      {{loading}}\n    </view>\n    <slot wx:else name=\"loading\" />\n  </view>\n  <!-- 加载失败占位 -->\n  <view\n    wx:elif=\"{{isFailed}}\"\n    style=\"{{_._style([innerStyle])}}\"\n    class=\"{{classPrefix}}__mask {{classPrefix}}--failed {{classPrefix}}--shape-{{shape}} {{prefix}}-class-error\"\n    aria-hidden=\"{{ariaHidden}}\"\n  >\n    <view wx:if=\"{{error === 'default'}}\" style=\"font-size: 44rpx\" class=\"{{prefix}}-class-load\">\n      <t-icon name=\"close\" aria-role=\"img\" aria-label=\"加载失败\" />\n    </view>\n    <view wx:elif=\"{{error && error !== 'slot'}}\" class=\"{{classPrefix}}__common {{prefix}}-class-load\">\n      {{error}}\n    </view>\n    <slot wx:else name=\"error\" />\n  </view>\n  <!-- 图片 -->\n  <image\n    id=\"{{tId||'image'}}\"\n    wx:if=\"{{ !isFailed }}\"\n    style=\"{{_._style([innerStyle])}}\"\n    class=\"{{classPrefix}}__img {{classPrefix}}--shape-{{shape}} {{isLoading ? classPrefix + '--lazy' : ''}} {{prefix}}-class-image\"\n    src=\"{{src}}\"\n    mode=\"{{mode}}\"\n    webp=\"{{webp}}\"\n    lazy-load=\"{{lazy}}\"\n    bind:load=\"onLoaded\"\n    bind:error=\"onLoadError\"\n    show-menu-by-longpress=\"{{showMenuByLongpress}}\"\n    aria-hidden=\"{{ariaHidden || isLoading || isFailed}}\"\n    aria-label=\"{{ariaLabel}}\"\n  />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/image.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-image {\n  position: relative;\n  display: inline-block;\n}\n.t-image__mask,\n.t-image__img {\n  color: var(--td-image-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n  vertical-align: top;\n  width: inherit;\n  height: inherit;\n}\n.t-image__mask {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background-color: var(--td-image-loading-bg-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n  color: var(--td-image-loading-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n}\n.t-image--loading-text {\n  width: 0;\n  height: 0;\n}\n.t-image__common {\n  width: 100%;\n  height: 100%;\n}\n.t-image--lazy {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: -1;\n}\n.t-image--shape-circle {\n  border-radius: 50%;\n  overflow: hidden;\n}\n.t-image--shape-round {\n  border-radius: var(--td-image-round-radius, var(--td-radius-default, 12rpx));\n  overflow: hidden;\n}\n.t-image--shape-square {\n  border-radius: 0;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/index.d.ts",
    "content": "import { TdImageProps } from './type';\nexport declare type ImageProps = TdImageProps;\nexport * from './props';\nexport * from './image';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/index.js",
    "content": "export * from './props';\nexport * from './image';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/props.d.ts",
    "content": "import { TdImageProps } from './type';\ndeclare const props: TdImageProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/props.js",
    "content": "const props = {\n    error: {\n        type: String,\n        value: 'default',\n    },\n    height: {\n        type: null,\n    },\n    lazy: {\n        type: Boolean,\n        value: false,\n    },\n    loading: {\n        type: String,\n        value: 'default',\n    },\n    mode: {\n        type: String,\n        value: 'scaleToFill',\n    },\n    shape: {\n        type: String,\n        value: 'square',\n    },\n    showMenuByLongpress: {\n        type: Boolean,\n        value: false,\n    },\n    src: {\n        type: String,\n        value: '',\n    },\n    tId: {\n        type: String,\n        value: '',\n    },\n    webp: {\n        type: Boolean,\n        value: false,\n    },\n    width: {\n        type: null,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/type.d.ts",
    "content": "export interface TdImageProps {\n    error?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    height?: {\n        type: null;\n        value?: string | number;\n    };\n    lazy?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    loading?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    mode?: {\n        type: StringConstructor;\n        value?: 'scaleToFill' | 'aspectFit' | 'aspectFill' | 'widthFix' | 'heightFix' | 'top' | 'bottom' | 'center' | 'left' | 'right' | 'top left' | 'top right' | 'bottom left' | 'bottom right';\n    };\n    shape?: {\n        type: StringConstructor;\n        value?: 'circle' | 'round' | 'square';\n    };\n    showMenuByLongpress?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    src?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    tId?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    webp?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    width?: {\n        type: null;\n        value?: string | number;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/image/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/index.d.ts",
    "content": "export { default as ActionSheet, ActionSheetTheme } from './action-sheet/index';\nexport { default as Dialog } from './dialog/index';\nexport { default as Message } from './message/index';\nexport { default as Toast } from './toast/index';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/index.js",
    "content": "export { default as ActionSheet, ActionSheetTheme } from './action-sheet/index';\nexport { default as Dialog } from './dialog/index';\nexport { default as Message } from './message/index';\nexport { default as Toast } from './toast/index';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Loading Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ndelay | Number | 0 | \\- | N\nduration | Number | 800 | \\- | N\nindicator | Boolean / Slot | true | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ninherit-color | Boolean | false | \\- | N\nlayout | String | horizontal | options: horizontal/vertical | N\nloading | Boolean | true | \\- | N\npause | Boolean | false | \\- | N\nprogress | Number | - | \\- | N\nreverse | Boolean | - | \\- | N\nsize | String | '40rpx' | \\- | N\ntext | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ntheme | String | circular | options: circular/spinner/dots | N\n### Loading External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-indicator | \\-\nt-class-text | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-loading-color | @brand-color | - \n--td-loading-text-color | inherit | - \n--td-loading-text-font-size | 24rpx | - \n--td-loading-text-line-height | 40rpx | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/README.md",
    "content": "---\ntitle: Loading 加载\ndescription: 用于表示页面或操作的加载状态，给予用户反馈的同时减缓等待的焦虑感，由一个或一组反馈动效组成。\nspline: message\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-95%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-95%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-83%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-loading\": \"tdesign-miniprogram/loading/loading\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/Jraocimc7mSr\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 纯icon\n\n{{ base }}\n\n### icon加文字横向\n\n{{ horizontal }}\n\n### icon加文字竖向\n\n{{ vertical }}\n\n### 纯文字\n\n{{ text }}\n\n### 加载失败\n\n{{ error }}\n\n### 状态\n\n{{ status }}\n\n### 加载速度\n\n{{ duration }}\n\n### 规格\n\n{{ size }}\n\n## API\n\n### Loading Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ndelay | Number | 0 | 延迟显示加载效果的时间，用于防止请求速度过快引起的加载闪烁，单位：毫秒 | N\nduration | Number | 800 | 加载动画执行完成一次的时间，单位：毫秒 | N\nindicator | Boolean / Slot | true | 加载指示符，值为 true 显示默认指示符，值为 false 则不显示，也可以自定义指示符。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ninherit-color | Boolean | false | 是否继承父元素颜色 | N\nlayout | String | horizontal | 对齐方式。可选项：horizontal/vertical | N\nloading | Boolean | true | 是否处于加载状态 | N\npause | Boolean | false | 是否暂停动画 | N\nprogress | Number | - | 加载进度 | N\nreverse | Boolean | - | 加载动画是否反向 | N\nsize | String | '40rpx' | 尺寸，示例：40rpx/20px | N\ntext | String / Slot | - | 加载提示文案。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ntheme | String | circular | 加载组件类型。可选项：circular/spinner/dots，skyline 模式下暂不支持枚举值 circular | N\n### Loading External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-indicator | 指示符样式类\nt-class-text | 文本样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-loading-color | @brand-color | - \n--td-loading-text-color | inherit | - \n--td-loading-text-font-size | 24rpx | - \n--td-loading-text-line-height | 40rpx | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/index.d.ts",
    "content": "export * from './props';\nexport * from './type';\nexport * from './loading';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/index.js",
    "content": "export * from './props';\nexport * from './type';\nexport * from './loading';\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/loading.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nimport type { TdLoadingProps } from './type';\nexport interface LoadingProps extends TdLoadingProps {\n}\nexport default class Loading extends SuperComponent {\n    externalClasses: string[];\n    data: {\n        prefix: string;\n        classPrefix: string;\n        show: boolean;\n    };\n    options: {\n        multipleSlots: boolean;\n    };\n    properties: {\n        delay?: {\n            type: NumberConstructor;\n            value?: number;\n        };\n        duration?: {\n            type: NumberConstructor;\n            value?: number;\n        };\n        externalClasses?: {\n            type: ArrayConstructor;\n            value?: [\"t-class\", \"t-class-text\", \"t-class-indicator\"];\n        };\n        indicator?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        inheritColor?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        layout?: {\n            type: StringConstructor;\n            value?: \"horizontal\" | \"vertical\";\n        };\n        loading?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        pause?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        progress?: {\n            type: NumberConstructor;\n            value?: number;\n        };\n        reverse?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        size?: {\n            type: StringConstructor;\n            value?: string;\n        };\n        text?: {\n            type: StringConstructor;\n            value?: string;\n        };\n        theme?: {\n            type: StringConstructor;\n            value?: \"circular\" | \"spinner\" | \"dots\";\n        };\n    };\n    timer: any;\n    observers: {\n        loading(this: any, cur: any): void;\n    };\n    lifetimes: {\n        detached(): void;\n    };\n    refreshPage(): void;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/loading.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-loading`;\nlet Loading = class Loading extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-text`, `${prefix}-class-indicator`];\n        this.data = {\n            prefix,\n            classPrefix: name,\n            show: true,\n        };\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = Object.assign({}, props);\n        this.timer = null;\n        this.observers = {\n            loading(cur) {\n                const { delay } = this.properties;\n                if (this.timer) {\n                    clearTimeout(this.timer);\n                }\n                if (cur) {\n                    if (delay) {\n                        this.timer = setTimeout(() => {\n                            this.setData({ show: cur });\n                            this.timer = null;\n                        }, delay);\n                    }\n                    else {\n                        this.setData({ show: cur });\n                    }\n                }\n                else {\n                    this.setData({ show: cur });\n                }\n            },\n        };\n        this.lifetimes = {\n            detached() {\n                clearTimeout(this.timer);\n            },\n        };\n    }\n    refreshPage() {\n        this.triggerEvent('reload');\n    }\n};\nLoading = __decorate([\n    wxComponent()\n], Loading);\nexport default Loading;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/loading.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/loading.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n<view\n  style=\"{{_._style([style, customStyle, !text ? ('width: ' + _.addUnit(size) + '; height: ' + _.addUnit(size)) : '', show ? '' : 'display: none', inheritColor ? 'color: inherit' : ''])}}\"\n  class=\"class {{prefix}}-class {{classPrefix}} {{classPrefix + '--' + layout}}\"\n>\n  <view\n    wx:if=\"{{indicator}}\"\n    class=\"{{prefix}}-class-indicator {{classPrefix}}__spinner {{classPrefix}}__spinner--{{ theme }} {{reverse ? 'reverse' : ''}}\"\n    style=\"width: {{ _.addUnit(size) }}; height: {{ _.addUnit(size) }}; {{inheritColor ? 'color: inherit;' : ''}} {{indicator ? '' : 'display: none;'}} {{duration ? 'animation-duration: ' + duration / 1000 + 's;' : ''}} animation-play-state: {{pause ? 'paused' : 'running'}};\"\n    aria-role=\"{{ariaRole  || 'img'}}\"\n    aria-label=\"{{ ariaLabel || text || '加载中'  }}\"\n  >\n    <view\n      wx:if=\"{{ theme === 'spinner' }}\"\n      wx:for=\"{{12}}\"\n      wx:key=\"index\"\n      class=\"{{classPrefix}}__dot {{classPrefix}}__dot-{{index}}\"\n    />\n    <view wx:if=\"{{ theme === 'circular' }}\" class=\"{{classPrefix}}__circular\" />\n    <block wx:if=\"{{ theme === 'dots' }}\">\n      <view\n        class=\"{{classPrefix}}__dot\"\n        style=\"{{duration ? 'animation-duration: ' + duration/1000 + 's; animation-delay:' + 0 + 's;' : ''}} animation-play-state: {{pause ? 'paused' : 'running'}};\"\n      ></view>\n      <view\n        class=\"{{classPrefix}}__dot\"\n        style=\"{{duration ? 'animation-duration: ' + duration/1000 + 's; animation-delay:' + duration * 1 / 3000 + 's;' : ''}} animation-play-state: {{pause ? 'paused' : 'running'}};\"\n      ></view>\n      <view\n        class=\"{{classPrefix}}__dot\"\n        style=\"{{duration ? 'animation-duration: ' + duration/1000 + 's; animation-delay:' + duration * 2 / 3000 + 's;' : ''}} animation-play-state: {{pause ? 'paused' : 'running'}};\"\n      ></view>\n    </block>\n    <slot name=\"indicator\" />\n  </view>\n  <view\n    class=\"{{_.cls(classPrefix + '__text', [layout])}} {{prefix}}-class-text\"\n    aria-hidden=\"{{indicator}}\"\n    aria-label=\"{{ ariaLabel || text }}\"\n  >\n    <block wx:if=\"{{text}}\">{{text}}</block>\n    <slot name=\"text\" />\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/loading.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-loading {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 24rpx;\n}\n.t-loading__spinner {\n  position: relative;\n  box-sizing: border-box;\n  width: 100%;\n  height: 100%;\n  max-width: 100%;\n  max-height: 100%;\n  animation: rotate 0.8s linear infinite;\n  color: var(--td-loading-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-loading__spinner.reverse {\n  animation-name: rotateReverse;\n}\n.t-loading__spinner--spinner {\n  animation-timing-function: steps(12);\n  color: var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9)));\n}\n.t-loading__spinner--spinner .t-loading__dot {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n.t-loading__spinner--spinner .t-loading__dot::before {\n  display: block;\n  width: 5rpx;\n  height: 25%;\n  margin: 0 auto;\n  background-color: var(--td-loading-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  border-radius: 40%;\n  content: ' ';\n}\n.t-loading__spinner--circular .t-loading__circular {\n  border-radius: 100%;\n  width: 100%;\n  height: 100%;\n  background: conic-gradient(from 180deg at 50% 50%, rgba(255, 255, 255, 0) 0deg, rgba(255, 255, 255, 0) 60deg, currentColor 330deg, rgba(255, 255, 255, 0) 360deg);\n  mask: radial-gradient(transparent calc(50% - 1rpx), #fff 50%);\n  /* stylelint-disable-next-line */\n  -webkit-mask: radial-gradient(transparent calc(50% - 1rpx), #fff 50%);\n}\n.t-loading__spinner--dots {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  animation: none;\n}\n.t-loading__spinner--dots .t-loading__dot {\n  width: 20%;\n  height: 20%;\n  border-radius: 50%;\n  background-color: var(--td-loading-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  animation-duration: 1.8s;\n  animation-name: dotting;\n  animation-timing-function: linear;\n  animation-iteration-count: infinite;\n  animation-fill-mode: both;\n}\n.t-loading__text {\n  color: var(--td-loading-text-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  font-size: var(--td-loading-text-font-size, 24rpx);\n  line-height: var(--td-loading-text-line-height, 40rpx);\n}\n.t-loading__text--vertical:not(:first-child):not(:empty) {\n  margin-top: 12rpx;\n}\n.t-loading__text--horizontal:not(:first-child):not(:empty) {\n  margin-left: 16rpx;\n}\n.t-loading--vertical {\n  flex-direction: column;\n}\n.t-loading--horizontal {\n  flex-direction: row;\n  vertical-align: top;\n}\n@keyframes t-bar {\n  0% {\n    width: 0;\n  }\n  50% {\n    width: 70%;\n  }\n  100% {\n    width: 80%;\n  }\n}\n@keyframes t-bar-loaded {\n  0% {\n    height: 6rpx;\n    opacity: 1;\n    width: 90%;\n  }\n  50% {\n    height: 6rpx;\n    opacity: 1;\n    width: 100%;\n  }\n  100% {\n    height: 0;\n    opacity: 0;\n    width: 100%;\n  }\n}\n.t-loading__dot-1 {\n  transform: rotate(30deg);\n  opacity: 0;\n}\n.t-loading__dot-2 {\n  transform: rotate(60deg);\n  opacity: 0.08333333;\n}\n.t-loading__dot-3 {\n  transform: rotate(90deg);\n  opacity: 0.16666667;\n}\n.t-loading__dot-4 {\n  transform: rotate(120deg);\n  opacity: 0.25;\n}\n.t-loading__dot-5 {\n  transform: rotate(150deg);\n  opacity: 0.33333333;\n}\n.t-loading__dot-6 {\n  transform: rotate(180deg);\n  opacity: 0.41666667;\n}\n.t-loading__dot-7 {\n  transform: rotate(210deg);\n  opacity: 0.5;\n}\n.t-loading__dot-8 {\n  transform: rotate(240deg);\n  opacity: 0.58333333;\n}\n.t-loading__dot-9 {\n  transform: rotate(270deg);\n  opacity: 0.66666667;\n}\n.t-loading__dot-10 {\n  transform: rotate(300deg);\n  opacity: 0.75;\n}\n.t-loading__dot-11 {\n  transform: rotate(330deg);\n  opacity: 0.83333333;\n}\n.t-loading__dot-12 {\n  transform: rotate(360deg);\n  opacity: 0.91666667;\n}\n@keyframes rotate {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n@keyframes rotateReverse {\n  from {\n    transform: rotate(360deg);\n  }\n  to {\n    transform: rotate(0deg);\n  }\n}\n@keyframes dotting {\n  0% {\n    opacity: 0.15;\n  }\n  1% {\n    opacity: 0.8;\n  }\n  33% {\n    opacity: 0.8;\n  }\n  34% {\n    opacity: 0.15;\n  }\n  100% {\n    opacity: 0.15;\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/props.d.ts",
    "content": "import { TdLoadingProps } from './type';\ndeclare const props: TdLoadingProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/props.js",
    "content": "const props = {\n    delay: {\n        type: Number,\n        value: 0,\n    },\n    duration: {\n        type: Number,\n        value: 800,\n    },\n    externalClasses: {\n        type: Array,\n    },\n    indicator: {\n        type: Boolean,\n        value: true,\n    },\n    inheritColor: {\n        type: Boolean,\n        value: false,\n    },\n    layout: {\n        type: String,\n        value: 'horizontal',\n    },\n    loading: {\n        type: Boolean,\n        value: true,\n    },\n    pause: {\n        type: Boolean,\n        value: false,\n    },\n    progress: {\n        type: Number,\n    },\n    reverse: {\n        type: Boolean,\n    },\n    size: {\n        type: String,\n        value: '40rpx',\n    },\n    text: {\n        type: String,\n    },\n    theme: {\n        type: String,\n        value: 'circular',\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/type.d.ts",
    "content": "export interface TdLoadingProps {\n    delay?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    duration?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    externalClasses?: {\n        type: ArrayConstructor;\n        value?: ['t-class', 't-class-text', 't-class-indicator'];\n    };\n    indicator?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    inheritColor?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    layout?: {\n        type: StringConstructor;\n        value?: 'horizontal' | 'vertical';\n    };\n    loading?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    pause?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    progress?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    reverse?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    size?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    text?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    theme?: {\n        type: StringConstructor;\n        value?: 'circular' | 'spinner' | 'dots';\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/loading/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/mixins/page-scroll.d.ts",
    "content": "declare const _default: (funcName?: string) => string;\nexport default _default;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/mixins/page-scroll.js",
    "content": "import { getCurrentPage } from '../common/utils';\nconst onPageScroll = function (event) {\n    const page = getCurrentPage();\n    if (!page)\n        return;\n    const { pageScroller } = page;\n    pageScroller === null || pageScroller === void 0 ? void 0 : pageScroller.forEach((scroller) => {\n        if (typeof scroller === 'function') {\n            scroller(event);\n        }\n    });\n};\nexport default (funcName = 'onScroll') => {\n    return Behavior({\n        attached() {\n            var _a;\n            const page = getCurrentPage();\n            if (!page)\n                return;\n            const bindScroller = (_a = this[funcName]) === null || _a === void 0 ? void 0 : _a.bind(this);\n            if (bindScroller) {\n                this._pageScroller = bindScroller;\n            }\n            if (Array.isArray(page.pageScroller)) {\n                page.pageScroller.push(bindScroller);\n            }\n            else {\n                page.pageScroller =\n                    typeof page.onPageScroll === 'function' ? [page.onPageScroll.bind(page), bindScroller] : [bindScroller];\n            }\n            page.onPageScroll = onPageScroll;\n        },\n        detached() {\n            var _a;\n            const page = getCurrentPage();\n            if (!page)\n                return;\n            page.pageScroller = ((_a = page.pageScroller) === null || _a === void 0 ? void 0 : _a.filter((item) => item !== this._pageScroller)) || [];\n        },\n    });\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/mixins/theme-change.d.ts",
    "content": "declare const themeChangeBehavior: string;\nexport default themeChangeBehavior;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/mixins/theme-change.js",
    "content": "import { appBaseInfo } from '../common/utils';\nconst themeChangeBehavior = Behavior({\n    data: {\n        theme: 'light',\n    },\n    attached() {\n        this._initTheme();\n    },\n    methods: {\n        _initTheme() {\n            const that = this;\n            that.setData({\n                theme: appBaseInfo.theme,\n            });\n            wx.onThemeChange((res) => {\n                that.setData({\n                    theme: res.theme,\n                });\n            });\n        },\n    },\n});\nexport default themeChangeBehavior;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/mixins/touch.d.ts",
    "content": "declare const _default: string;\nexport default _default;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/mixins/touch.js",
    "content": "const MinDistance = 10;\nconst getDirection = (x, y) => {\n    if (x > y && x > MinDistance) {\n        return 'horizontal';\n    }\n    if (y > x && y > MinDistance) {\n        return 'vertical';\n    }\n    return '';\n};\nexport default Behavior({\n    methods: {\n        resetTouchStatus() {\n            this.direction = '';\n            this.deltaX = 0;\n            this.deltaY = 0;\n            this.offsetX = 0;\n            this.offsetY = 0;\n        },\n        touchStart(event) {\n            this.resetTouchStatus();\n            const [touch] = event.touches;\n            this.startX = touch.clientX;\n            this.startY = touch.clientY;\n        },\n        touchMove(event) {\n            const [touch] = event.touches;\n            this.deltaX = touch.clientX - this.startX;\n            this.deltaY = touch.clientY - this.startY;\n            this.offsetX = Math.abs(this.deltaX);\n            this.offsetY = Math.abs(this.deltaY);\n            this.direction = getDirection(this.offsetX, this.offsetY);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/mixins/transition.d.ts",
    "content": "export default function transition(): string;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/mixins/transition.js",
    "content": "import config from '../common/config';\nconst { prefix } = config;\nexport default function transition() {\n    return Behavior({\n        properties: {\n            visible: {\n                type: Boolean,\n                value: null,\n                observer: 'watchVisible',\n            },\n            appear: Boolean,\n            name: {\n                type: String,\n                value: 'fade',\n            },\n            durations: {\n                type: Number,\n                optionalTypes: [Array],\n            },\n        },\n        data: {\n            transitionClass: '',\n            transitionDurations: 300,\n            className: '',\n            realVisible: false,\n        },\n        created() {\n            this.status = '';\n            this.transitionT = 0;\n        },\n        attached() {\n            this.durations = this.getDurations();\n            if (this.data.visible) {\n                this.enter();\n            }\n            this.inited = true;\n        },\n        detached() {\n            clearTimeout(this.transitionT);\n        },\n        methods: {\n            watchVisible(curr, prev) {\n                if (this.inited && curr !== prev) {\n                    curr ? this.enter() : this.leave();\n                }\n            },\n            getDurations() {\n                const { durations } = this.data;\n                if (Array.isArray(durations)) {\n                    return durations.map((item) => Number(item));\n                }\n                return [Number(durations), Number(durations)];\n            },\n            enter() {\n                const { name } = this.data;\n                const [duration] = this.durations;\n                this.status = 'entering';\n                this.setData({\n                    realVisible: true,\n                    transitionClass: `${prefix}-${name}-enter ${prefix}-${name}-enter-active`,\n                });\n                setTimeout(() => {\n                    this.setData({\n                        transitionClass: `${prefix}-${name}-enter-active ${prefix}-${name}-enter-to`,\n                    });\n                }, 30);\n                if (typeof duration === 'number' && duration > 0) {\n                    this.transitionT = setTimeout(this.entered.bind(this), duration + 30);\n                }\n            },\n            entered() {\n                this.customDuration = false;\n                clearTimeout(this.transitionT);\n                this.status = 'entered';\n                this.setData({\n                    transitionClass: '',\n                });\n            },\n            leave() {\n                const { name } = this.data;\n                const [, duration] = this.durations;\n                this.status = 'leaving';\n                this.setData({\n                    transitionClass: `${prefix}-${name}-leave  ${prefix}-${name}-leave-active`,\n                });\n                clearTimeout(this.transitionT);\n                setTimeout(() => {\n                    this.setData({\n                        transitionClass: `${prefix}-${name}-leave-active ${prefix}-${name}-leave-to`,\n                    });\n                }, 30);\n                if (typeof duration === 'number' && duration > 0) {\n                    this.customDuration = true;\n                    this.transitionT = setTimeout(this.leaved.bind(this), duration + 30);\n                }\n            },\n            leaved() {\n                this.customDuration = false;\n                this.triggerEvent('leaved');\n                clearTimeout(this.transitionT);\n                this.status = 'leaved';\n                this.setData({\n                    transitionClass: '',\n                });\n            },\n            onTransitionEnd() {\n                if (this.customDuration) {\n                    return;\n                }\n                clearTimeout(this.transitionT);\n                if (this.status === 'entering' && this.data.visible) {\n                    this.entered();\n                }\n                else if (this.status === 'leaving' && !this.data.visible) {\n                    this.leaved();\n                    this.setData({\n                        realVisible: false,\n                    });\n                }\n            },\n        },\n    });\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/mixins/using-custom-navbar.d.ts",
    "content": "declare const useCustomNavbarBehavior: string;\nexport default useCustomNavbarBehavior;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/mixins/using-custom-navbar.js",
    "content": "import { systemInfo } from '../common/utils';\nconst useCustomNavbarBehavior = Behavior({\n    properties: {\n        usingCustomNavbar: {\n            type: Boolean,\n            value: false,\n        },\n        customNavbarHeight: {\n            type: Number,\n            value: 0,\n        },\n    },\n    data: {\n        distanceTop: 0,\n    },\n    lifetimes: {\n        attached() {\n            if (this.properties.usingCustomNavbar) {\n                this.calculateCustomNavbarDistanceTop();\n            }\n        },\n    },\n    methods: {\n        calculateCustomNavbarDistanceTop() {\n            const { statusBarHeight } = systemInfo;\n            const menuButton = wx.getMenuButtonBoundingClientRect();\n            const distance = menuButton.top + menuButton.bottom - statusBarHeight;\n            this.setData({\n                distanceTop: Math.max(distance, this.properties.customNavbarHeight + statusBarHeight),\n            });\n        },\n    },\n});\nexport default useCustomNavbarBehavior;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/navbar/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Navbar Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nanimation | Boolean | true | \\- | N\ncapsule | Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndelta | Number | 1 | \\- | N\nfixed | Boolean | true | \\- | N\nleft | Slot | - | `0.26.0`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nleft-arrow | Boolean | false | `0.26.0` | N\ntitle | String / Slot | - | page title。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ntitle-max-length | Number | - | \\- | N\nvisible | Boolean | true | \\- | N\n\n### Navbar Events\n\nname | params | description\n-- | -- | --\ncomplete | \\- | \\-\nfail | \\- | \\-\ngo-back | \\- | \\-\nsuccess | \\- | \\-\n### Navbar External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-capsule | \\-\nt-class-center | \\-\nt-class-home-icon | \\-\nt-class-left | \\-\nt-class-left-icon | \\-\nt-class-nav-btn | \\-\nt-class-title | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-navbar-bg-color | @bg-color-container | - \n--td-navbar-capsule-border-color | #e3e6ea | - \n--td-navbar-capsule-border-radius | 32rpx | - \n--td-navbar-capsule-height | 64rpx | - \n--td-navbar-capsule-width | 176rpx | - \n--td-navbar-color | @font-gray-1 | - \n--td-navbar-height | 96rpx | - \n--td-navbar-left-arrow-size | 48rpx | - \n--td-navbar-title-font-size | 36rpx | - \n--td-navbar-title-font-weight | 600 | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/navbar/README.md",
    "content": "---\ntitle: Navbar 导航栏\ndescription: 用于不同页面之间切换或者跳转，位于内容区的上方，系统状态栏的下方。\nspline: navigation\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-97%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-87%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-95%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-84%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-navbar\": \"tdesign-miniprogram/navbar/navbar\",\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/REHT3emm7kS5\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n\n### 基础导航栏\n\n{{ base }}\n\n### 胶囊样式导航栏\n\n{{ back-home }}\n\n### 带搜索导航栏\n\n{{ search }}\n\n### 带图片导航栏\n\n{{ img }}\n\n### 组件样式\n\n{{ left-title }}\n\n### 自定义颜色\n\n{{ custom-color }}\n\n## API\n\n### Navbar Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nanimation | Boolean | true | 是否添加动画效果 | N\ncapsule | Slot | - | 左侧胶囊区域。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndelta | Number | 1 | 后退按钮后退层数，含义参考 [wx.navigateBack](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateBack.html)，特殊的，传入 0 不会发生执行 wx.navigateBack | N\nfixed | Boolean | true | 是否固定在顶部 | N\nleft | Slot | - | `0.26.0`。左侧内容区域。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nleft-arrow | Boolean | false | `0.26.0`。是否展示左侧箭头 | N\ntitle | String / Slot | - | 页面标题。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ntitle-max-length | Number | - | 标题文字最大长度，超出的范围使用 `...` 表示 | N\nvisible | Boolean | true | 是否显示 | N\n\n### Navbar Events\n\n名称 | 参数 | 描述\n-- | -- | --\ncomplete | \\- | navigateBack 执行完成后触发（失败或成功均会触发）\nfail | \\- | navigateBack 执行失败后触发\ngo-back | \\- | 点击左侧箭头时触发\nsuccess | \\- | navigateBack 执行成功后触发\n### Navbar External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-capsule | 左侧胶囊区域样式类\nt-class-center | 中间内容样式类\nt-class-home-icon | 首页图标样式类\nt-class-left | 左侧内容样式类\nt-class-left-icon | 左侧图标样式类\nt-class-nav-btn | 导航按钮样式类\nt-class-title | 标题样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-navbar-bg-color | @bg-color-container | - \n--td-navbar-capsule-border-color | #e3e6ea | - \n--td-navbar-capsule-border-radius | 32rpx | - \n--td-navbar-capsule-height | 64rpx | - \n--td-navbar-capsule-width | 176rpx | - \n--td-navbar-color | @font-gray-1 | - \n--td-navbar-height | 96rpx | - \n--td-navbar-left-arrow-size | 48rpx | - \n--td-navbar-title-font-size | 36rpx | - \n--td-navbar-title-font-weight | 600 | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/navbar/navbar.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nexport default class Navbar extends SuperComponent {\n    externalClasses: string[];\n    timer: any;\n    options: {\n        multipleSlots: boolean;\n    };\n    properties: import(\"./type\").TdNavbarProps;\n    observers: {\n        visible(this: Navbar, visible: any): void;\n        'title,titleMaxLength'(this: any): void;\n    };\n    data: {\n        prefix: string;\n        classPrefix: string;\n        boxStyle: string;\n        showTitle: string;\n        hideLeft: boolean;\n        hideCenter: boolean;\n    };\n    attached(): Promise<void>;\n    detached(): void;\n    methods: {\n        queryElements(capsuleRect: any): void;\n        goBack(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/navbar/navbar.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport { getRect, systemInfo } from '../common/utils';\nimport config from '../common/config';\nimport props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-navbar`;\nlet Navbar = class Navbar extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [\n            `${prefix}-class`,\n            `${prefix}-class-placeholder`,\n            `${prefix}-class-content`,\n            `${prefix}-class-title`,\n            `${prefix}-class-left`,\n            `${prefix}-class-center`,\n            `${prefix}-class-left-icon`,\n            `${prefix}-class-home-icon`,\n            `${prefix}-class-capsule`,\n            `${prefix}-class-nav-btn`,\n        ];\n        this.timer = null;\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = props;\n        this.observers = {\n            visible(visible) {\n                const { animation } = this.properties;\n                const visibleClass = `${name}${visible ? '--visible' : '--hide'}`;\n                this.setData({\n                    visibleClass: `${visibleClass}${animation ? '-animation' : ''}`,\n                });\n                if (this.timer) {\n                    clearTimeout(this.timer);\n                }\n                if (animation) {\n                    this.timer = setTimeout(() => {\n                        this.setData({\n                            visibleClass,\n                        });\n                    }, 300);\n                }\n            },\n            'title,titleMaxLength'() {\n                const { title } = this.properties;\n                const titleMaxLength = this.properties.titleMaxLength || Number.MAX_SAFE_INTEGER;\n                let temp = title.slice(0, titleMaxLength);\n                if (titleMaxLength < title.length)\n                    temp += '...';\n                this.setData({\n                    showTitle: temp,\n                });\n            },\n        };\n        this.data = {\n            prefix,\n            classPrefix: name,\n            boxStyle: '',\n            showTitle: '',\n            hideLeft: false,\n            hideCenter: false,\n        };\n        this.methods = {\n            queryElements(capsuleRect) {\n                Promise.all([\n                    getRect(this, `.${this.data.classPrefix}__left`),\n                    getRect(this, `.${this.data.classPrefix}__center`),\n                ]).then(([leftRect, centerRect]) => {\n                    if (leftRect.right > capsuleRect.left) {\n                        this.setData({\n                            hideLeft: true,\n                            hideCenter: true,\n                        });\n                    }\n                    else if (centerRect.right > capsuleRect.left) {\n                        this.setData({\n                            hideLeft: false,\n                            hideCenter: true,\n                        });\n                    }\n                    else {\n                        this.setData({\n                            hideLeft: false,\n                            hideCenter: false,\n                        });\n                    }\n                });\n            },\n            goBack() {\n                const { delta } = this.data;\n                const that = this;\n                this.triggerEvent('go-back');\n                if (delta > 0) {\n                    wx.navigateBack({\n                        delta,\n                        fail(e) {\n                            that.triggerEvent('fail', e);\n                        },\n                        complete(e) {\n                            that.triggerEvent('complete', e);\n                        },\n                        success(e) {\n                            that.triggerEvent('success', e);\n                        },\n                    });\n                }\n            },\n        };\n    }\n    attached() {\n        return __awaiter(this, void 0, void 0, function* () {\n            let rect = null;\n            if (wx.getMenuButtonBoundingClientRect) {\n                rect = wx.getMenuButtonBoundingClientRect();\n            }\n            if (!rect || !systemInfo)\n                return;\n            const { right } = yield getRect(this, `.${name}__left`);\n            const boxStyleList = [];\n            boxStyleList.push(`--td-navbar-padding-top: ${systemInfo.statusBarHeight}px`);\n            if (rect && (systemInfo === null || systemInfo === void 0 ? void 0 : systemInfo.windowWidth)) {\n                const maxSpacing = Math.max(right, systemInfo.windowWidth - rect.left);\n                boxStyleList.push(`--td-navbar-center-left: ${maxSpacing}px`);\n                boxStyleList.push(`--td-navbar-center-width: ${rect.left - maxSpacing}px`);\n                boxStyleList.push(`--td-navbar-right: ${systemInfo.windowWidth - rect.left}px`);\n            }\n            boxStyleList.push(`--td-navbar-capsule-height: ${rect.height}px`);\n            boxStyleList.push(`--td-navbar-capsule-width: ${rect.width}px`);\n            boxStyleList.push(`--td-navbar-height: ${(rect.top - systemInfo.statusBarHeight) * 2 + rect.height}px`);\n            this.setData({\n                boxStyle: `${boxStyleList.join('; ')}`,\n            });\n            if (wx.onMenuButtonBoundingClientRectWeightChange) {\n                wx.onMenuButtonBoundingClientRectWeightChange((res) => this.queryElements(res));\n            }\n        });\n    }\n    detached() {\n        if (wx.offMenuButtonBoundingClientRectWeightChange) {\n            wx.offMenuButtonBoundingClientRectWeightChange((res) => this.queryElements(res));\n        }\n    }\n};\nNavbar = __decorate([\n    wxComponent()\n], Navbar);\nexport default Navbar;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/navbar/navbar.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/navbar/navbar.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n<view\n  class=\"{{_.cls(classPrefix, [['fixed', fixed]])}} {{visibleClass}} class {{prefix}}-class\"\n  style=\"{{_._style([boxStyle, style, customStyle])}}\"\n>\n  <view wx:if=\"{{fixed}}\" class=\"{{classPrefix}}__placeholder {{prefix}}-class-placeholder\" />\n  <view class=\"{{classPrefix}}__content {{prefix}}-class-content\">\n    <view class=\"{{classPrefix}}__left {{hideLeft ? classPrefix + '__left--hide' : ''}} {{prefix}}-class-left\">\n      <view wx:if=\"{{leftArrow}}\" class=\"{{classPrefix}}__btn\" bind:tap=\"goBack\" aria-role=\"button\" aria-label=\"返回\">\n        <t-icon name=\"chevron-left\" class=\"{{classPrefix}}__left-arrow\" />\n      </view>\n      <slot name=\"left\" />\n      <view class=\"{{classPrefix}}__capsule {{prefix}}-class-capsule\">\n        <slot name=\"capsule\" />\n      </view>\n    </view>\n    <view class=\"{{classPrefix}}__center {{hideCenter ? classPrefix + '__center--hide' : ''}} {{prefix}}-class-center\">\n      <slot name=\"title\" />\n      <text wx:if=\"{{title}}\" class=\"{{classPrefix}}__center-title {{prefix}}-class-title\">{{showTitle}}</text>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/navbar/navbar.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-navbar--fixed .t-navbar__content {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 5001;\n}\n.t-navbar--visible {\n  display: '';\n}\n.t-navbar--visible-animation {\n  opacity: 1;\n  transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.t-navbar--hide-animation {\n  opacity: 0;\n  transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.t-navbar--hide {\n  display: none;\n}\n.t-navbar__placeholder {\n  height: var(--td-navbar-height, 48px);\n  padding-top: var(--td-navbar-padding-top, 20px);\n  position: relative;\n  visibility: hidden;\n  box-sizing: content-box;\n}\n.t-navbar__content {\n  position: relative;\n  z-index: 1;\n  height: var(--td-navbar-height, 48px);\n  width: calc(100% - var(--td-navbar-right, 95px));\n  padding-right: var(--td-navbar-right, 95px);\n  padding-top: var(--td-navbar-padding-top, 20px);\n  color: var(--td-navbar-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  background-color: var(--td-navbar-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n  display: flex;\n  align-items: center;\n  box-sizing: content-box;\n}\n.t-navbar__left {\n  position: relative;\n  box-sizing: border-box;\n  display: flex;\n  align-items: center;\n  margin-left: var(--td-spacer-1, 24rpx);\n  transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.t-navbar__left-arrow {\n  font-size: var(--td-navbar-left-arrow-size, 24px);\n}\n.t-navbar__left--hide {\n  opacity: 0;\n}\n.t-navbar__capsule {\n  box-sizing: border-box;\n  width: var(--td-navbar-capsule-width, 88px);\n  height: var(--td-navbar-capsule-height, 32px);\n  display: flex;\n  align-items: center;\n}\n.t-navbar__capsule::before {\n  content: '';\n  position: absolute;\n  z-index: -1;\n  top: 0;\n  left: 0;\n  width: 200%;\n  height: 200%;\n  transform: scale(0.5);\n  transform-origin: 0 0;\n  box-sizing: border-box;\n  border-radius: calc(var(--td-navbar-capsule-border-radius, 16px) * 2);\n  border: 2rpx solid var(--td-navbar-capsule-border-color, var(--td-border-level-1-color, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-navbar__capsule:empty {\n  display: none;\n}\n.t-navbar__center {\n  font-size: 18px;\n  text-align: center;\n  position: absolute;\n  bottom: 0;\n  left: var(--td-navbar-center-left, var(--td-navbar-right, 95px));\n  width: var(--td-navbar-center-width);\n  height: var(--td-navbar-height, 48px);\n  line-height: var(--td-navbar-height, 48px);\n  flex: 1;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  overflow: hidden;\n  transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.t-navbar__center:empty {\n  display: none;\n}\n.t-navbar__center-title {\n  font-size: var(--td-navbar-title-font-size, 18px);\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  font-weight: var(--td-navbar-title-font-weight, 600);\n}\n.t-navbar__center--hide {\n  opacity: 0;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/navbar/props.d.ts",
    "content": "import { TdNavbarProps } from './type';\ndeclare const props: TdNavbarProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/navbar/props.js",
    "content": "const props = {\n    animation: {\n        type: Boolean,\n        value: true,\n    },\n    delta: {\n        type: Number,\n        value: 1,\n    },\n    fixed: {\n        type: Boolean,\n        value: true,\n    },\n    leftArrow: {\n        type: Boolean,\n        value: false,\n    },\n    title: {\n        type: String,\n    },\n    titleMaxLength: {\n        type: Number,\n    },\n    visible: {\n        type: Boolean,\n        value: true,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/navbar/type.d.ts",
    "content": "export interface TdNavbarProps {\n    animation?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    delta?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    fixed?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    leftArrow?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    title?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    titleMaxLength?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    visible?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/navbar/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/row/README.md",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/row/props.d.ts",
    "content": "import { TdRowProps } from './type';\ndeclare const props: TdRowProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/row/props.js",
    "content": "const props = {\n    gutter: {\n        type: null,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/row/row.d.ts",
    "content": "import { SuperComponent, RelationsOptions } from '../common/src/index';\nexport default class Row extends SuperComponent {\n    externalClasses: any[];\n    properties: import(\"./type\").TdRowProps;\n    data: {\n        prefix: string;\n    };\n    relations: RelationsOptions;\n    observers: {\n        gutter(): void;\n    };\n    methods: {\n        setGutter(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/row/row.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nconst { prefix } = config;\nlet Row = class Row extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [];\n        this.properties = props;\n        this.data = {\n            prefix,\n        };\n        this.relations = {\n            '../col/col': {\n                type: 'child',\n                linked(target) {\n                    const { gutter } = this.data;\n                    if (gutter) {\n                        target.setData({ gutter });\n                    }\n                },\n            },\n        };\n        this.observers = {\n            gutter() {\n                this.setGutter();\n            },\n        };\n        this.methods = {\n            setGutter() {\n                const { gutter } = this.data;\n                const cols = this.$children;\n                cols.forEach((col) => {\n                    col.setData({ gutter });\n                });\n            },\n        };\n    }\n};\nRow = __decorate([\n    wxComponent()\n], Row);\nexport default Row;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/row/row.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/row/row.wxml",
    "content": "<wxs src=\"./row.wxs\" module=\"utils\" />\n\n<view class=\"class {{prefix}}-row\" style=\"{{ utils.getRowStyles(gutter, style, customStyle) }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/row/row.wxs",
    "content": "var utils = require('../common/utils.wxs');\n\nfunction getRowStyles(gutter, style, customStyle) {\n  var _style = '';\n  if (gutter) {\n    _style = utils._style({\n      'margin-right': utils.addUnit(-gutter / 2),\n      'margin-left': utils.addUnit(-gutter / 2),\n    });\n  }\n\n  return utils._style([style, customStyle]) + _style;\n}\n\nmodule.exports = {\n  getRowStyles: getRowStyles,\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/row/row.wxss",
    "content": ".t-row {\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  box-sizing: border-box;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/row/type.d.ts",
    "content": "export interface TdRowProps {\n    gutter?: {\n        type: null;\n        value?: string | number;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/row/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/search/README.en-US.md",
    "content": "\n## API\n\n### Search Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\naction | String / Slot | '' | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nadjust-position | Boolean | true | \\- | N\nalways-embed | Boolean | false | \\- | N\ncenter | Boolean | false | \\- | N\nclearable | Boolean | true | \\- | N\nconfirm-hold | Boolean | false | \\- | N\nconfirm-type | String | search | options: send/search/next/go/done | N\ncursor | Number | - | required | Y\ncursor-spacing | Number | 0 | \\- | N\ndisabled | Boolean | false | \\- | N\nfocus | Boolean | false | \\- | N\nhold-keyboard | Boolean | false | \\- | N\nlabel | String | '' | `deprecated` | N\nleft-icon | String / Slot | 'search' | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmaxcharacter | Number | - | \\- | N\nmaxlength | Number | -1 | \\- | N\nplaceholder | String | '' | \\- | N\nplaceholder-class | String | input-placeholder | \\- | N\nplaceholder-style | String | - | required | Y\nresult-list | Array | [] | Typescript：`Array<string>` | N\nright-icon | String / Slot | 'close-circle-filled' | `deprecated`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nselection-end | Number | -1 | \\- | N\nselection-start | Number | -1 | \\- | N\nshape | String | 'square' | options: square/round | N\ntype | String | 'text' | options: text/number/idcard/digit/nickname | N\nvalue | String | '' | \\- | N\n\n### Search Events\n\nname | params | description\n-- | -- | --\naction-click | `({})` | \\-\nblur | `({ value: string })` | \\-\nchange | `({ value: string })` | \\-\nclear | `({ value: string })` | \\-\nfocus | `({ value: string })` | \\-\nsubmit | `({ value: string })` | \\-\n### Search External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-action | \\-\nt-class-clear | \\-\nt-class-input | \\-\nt-class-input-container | \\-\nt-class-left | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-search-action-color | @brand-color | - \n--td-search-bg-color | @bg-color-secondarycontainer | - \n--td-search-clear-icon-color | @font-gray-3 | - \n--td-search-font-size | @font-size-m | - \n--td-search-height | 80rpx | - \n--td-search-icon-color | @font-gray-3 | - \n--td-search-label-color | @font-gray-1 | - \n--td-search-padding | 16rpx 24rpx | - \n--td-search-placeholder-color | @font-gray-3 | - \n--td-search-square-radius | @radius-default | - \n--td-search-text-color | @font-gray-1 | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/search/README.md",
    "content": "---\ntitle: Search 搜索框\ndescription: 用于用户输入搜索信息，并进行页面内容搜索。\nspline: form\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-96%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-86%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-96%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-100%25-blue\" /></span>\n\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-search\": \"tdesign-miniprogram/search/search\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/wG6pximT7xSH\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 01 组件类型\n\n基础搜索框\n\n{{ base }}\n\n获取焦点后显示取消按钮\n\n{{ action }}\n\n### 02 组件样式\n\n搜索框形状\n\n{{ shape }}\n\n### 03 组件状态\n\n默认状态其他对齐方式\n\n{{ other }}\n\n## API\n\n### Search Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\naction | String / Slot | '' | 自定义右侧操作按钮文字。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nadjust-position | Boolean | true | 键盘弹起时，是否自动上推页面 | N\nalways-embed | Boolean | false | 强制 input 处于同层状态，默认 focus 时 input 会切到非同层状态 (仅在 iOS 下生效) | N\ncenter | Boolean | false | 是否居中 | N\nclearable | Boolean | true | 是否启用清除控件 | N\nconfirm-hold | Boolean | false | 点击键盘右下角按钮时是否保持键盘不收起 | N\nconfirm-type | String | search | 设置键盘右下角按钮的文字，仅在type='text'时生效。<br />具体释义：<br />`send` 右下角按钮为“发送”；<br />`search` 右下角按钮为“搜索”；<br />`next` 右下角按钮为“下一个”；<br />`go` 右下角按钮为“前往”；<br />`done` 右下角按钮为“完成”。<br />[小程序官方文档](https://developers.weixin.qq.com/miniprogram/dev/component/input.html)。可选项：send/search/next/go/done | N\ncursor | Number | - | 必需。指定 focus 时的光标位置 | Y\ncursor-spacing | Number | 0 | 搜索框聚焦时底部与键盘的距离 | N\ndisabled | Boolean | false | 是否禁用 | N\nfocus | Boolean | false | 是否聚焦 | N\nhold-keyboard | Boolean | false | focus时，点击页面的时候不收起键盘 | N\nlabel | String | '' | 已废弃。左侧文本 | N\nleft-icon | String / Slot | 'search' | 左侧图标。如果需要使用 `Slot` 进行自定义，必须将该值设置为假值。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmaxcharacter | Number | - | 用户最多可以输入的字符个数，一个中文汉字表示两个字符长度。`maxcharacter` 和 `maxlength` 二选一使用 | N\nmaxlength | Number | -1 | 用户最多可以输入的文本长度，一个中文等于一个计数长度。默认为 -1，不限制输入长度。`maxcharacter` 和 `maxlength` 二选一使用 | N\nplaceholder | String | '' | 占位符 | N\nplaceholder-class | String | input-placeholder | 指定 placeholder 的样式类 | N\nplaceholder-style | String | - | 必需。指定 placeholder 的样式 | Y\nresult-list | Array | [] | 预览结果列表。TS 类型：`Array<string>` | N\nright-icon | String / Slot | 'close-circle-filled' | 已废弃。右侧图标。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nselection-end | Number | -1 | 光标结束位置，自动聚集时有效，需与 selection-start 搭配使用 | N\nselection-start | Number | -1 | 光标起始位置，自动聚集时有效，需与 selection-end 搭配使用 | N\nshape | String | 'square' | 搜索框形状。可选项：square/round | N\ntype | String | 'text' | 拉起键盘的类型。可选项：text/number/idcard/digit/nickname | N\nvalue | String | '' | 值 | N\n\n### Search Events\n\n名称 | 参数 | 描述\n-- | -- | --\naction-click | `({})` | 点击右侧操作按钮文字时触发\nblur | `({ value: string })` | 失去焦点时触发\nchange | `({ value: string })` | 值发生变化时触发\nclear | `({ value: string })` | 点击清除时触发\nfocus | `({ value: string })` | 聚焦时触发\nsubmit | `({ value: string })` | 提交时触发\n### Search External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-action | 操作按钮样式类\nt-class-clear | 右侧图标样式类\nt-class-input | 输入框样式类\nt-class-input-container | 输入框容器样式类\nt-class-left | 左侧图标样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述\n-- | -- | --\n--td-search-action-color | @brand-color | -\n--td-search-bg-color | @bg-color-secondarycontainer | -\n--td-search-clear-icon-color | @font-gray-3 | -\n--td-search-font-size | @font-size-m | -\n--td-search-height | 80rpx | -\n--td-search-icon-color | @font-gray-3 | -\n--td-search-label-color | @font-gray-1 | -\n--td-search-padding | 16rpx 24rpx | -\n--td-search-placeholder-color | @font-gray-3 | -\n--td-search-result-high-light-color | @brand-color | -\n--td-search-square-radius | @radius-default | -\n--td-search-text-color | @font-gray-1 | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/search/props.d.ts",
    "content": "import { TdSearchProps } from './type';\ndeclare const props: TdSearchProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/search/props.js",
    "content": "const props = {\n    action: {\n        type: String,\n        value: '',\n    },\n    adjustPosition: {\n        type: Boolean,\n        value: true,\n    },\n    alwaysEmbed: {\n        type: Boolean,\n        value: false,\n    },\n    center: {\n        type: Boolean,\n        value: false,\n    },\n    clearable: {\n        type: Boolean,\n        value: true,\n    },\n    confirmHold: {\n        type: Boolean,\n        value: false,\n    },\n    confirmType: {\n        type: String,\n        value: 'search',\n    },\n    cursor: {\n        type: Number,\n        required: true,\n    },\n    cursorSpacing: {\n        type: Number,\n        value: 0,\n    },\n    disabled: {\n        type: Boolean,\n        value: false,\n    },\n    focus: {\n        type: Boolean,\n        value: false,\n    },\n    holdKeyboard: {\n        type: Boolean,\n        value: false,\n    },\n    leftIcon: {\n        type: String,\n        value: 'search',\n    },\n    maxcharacter: {\n        type: Number,\n    },\n    maxlength: {\n        type: Number,\n        value: -1,\n    },\n    placeholder: {\n        type: String,\n        value: '',\n    },\n    placeholderClass: {\n        type: String,\n        value: 'input-placeholder',\n    },\n    placeholderStyle: {\n        type: String,\n        value: '',\n        required: true,\n    },\n    resultList: {\n        type: Array,\n        value: [],\n    },\n    selectionEnd: {\n        type: Number,\n        value: -1,\n    },\n    selectionStart: {\n        type: Number,\n        value: -1,\n    },\n    shape: {\n        type: String,\n        value: 'square',\n    },\n    style: {\n        type: String,\n        value: '',\n    },\n    type: {\n        type: String,\n        value: 'text',\n    },\n    value: {\n        type: String,\n        value: '',\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/search/search.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nexport default class Search extends SuperComponent {\n    externalClasses: string[];\n    options: {\n        multipleSlots: boolean;\n    };\n    properties: import(\"./type\").TdSearchProps;\n    observers: {\n        resultList(val: any): void;\n    };\n    data: {\n        classPrefix: string;\n        prefix: string;\n        isShowResultList: boolean;\n        isSelected: boolean;\n    };\n    onInput(e: any): void;\n    onFocus(e: any): void;\n    onBlur(e: any): void;\n    handleClear(): void;\n    onConfirm(e: any): void;\n    onActionClick(): void;\n    onSelectResultItem(e: any): void;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/search/search.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport { getCharacterLength } from '../common/utils';\nconst { prefix } = config;\nconst name = `${prefix}-search`;\nlet Search = class Search extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [\n            `${prefix}-class`,\n            `${prefix}-class-input-container`,\n            `${prefix}-class-input`,\n            `${prefix}-class-action`,\n            `${prefix}-class-left`,\n            `${prefix}-class-clear`,\n        ];\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = props;\n        this.observers = {\n            resultList(val) {\n                const { isSelected } = this.data;\n                if (val.length) {\n                    if (isSelected) {\n                        this.setData({\n                            isShowResultList: false,\n                            isSelected: false,\n                        });\n                    }\n                    else {\n                        this.setData({\n                            isShowResultList: true,\n                        });\n                    }\n                }\n                else {\n                    this.setData({\n                        isShowResultList: false,\n                    });\n                }\n            },\n        };\n        this.data = {\n            classPrefix: name,\n            prefix,\n            isShowResultList: false,\n            isSelected: false,\n        };\n    }\n    onInput(e) {\n        let { value } = e.detail;\n        const { maxcharacter } = this.properties;\n        if (maxcharacter && typeof maxcharacter === 'number' && maxcharacter > 0) {\n            const { characters } = getCharacterLength('maxcharacter', value, maxcharacter);\n            value = characters;\n        }\n        this.setData({\n            value,\n        });\n        this.triggerEvent('change', { value });\n    }\n    onFocus(e) {\n        const { value } = e.detail;\n        this.triggerEvent('focus', { value });\n    }\n    onBlur(e) {\n        const { value } = e.detail;\n        this.triggerEvent('blur', { value });\n    }\n    handleClear() {\n        this.setData({ value: '' });\n        this.triggerEvent('clear', { value: '' });\n        this.triggerEvent('change', { value: '' });\n    }\n    onConfirm(e) {\n        const { value } = e.detail;\n        this.triggerEvent('submit', { value });\n    }\n    onActionClick() {\n        this.triggerEvent('action-click');\n    }\n    onSelectResultItem(e) {\n        const { index } = e.currentTarget.dataset;\n        const item = this.properties.resultList[index];\n        this.setData({\n            value: item,\n            isSelected: true,\n        });\n        this.triggerEvent('change', { value: item });\n        this.triggerEvent('selectresult', { index, item });\n    }\n};\nSearch = __decorate([\n    wxComponent()\n], Search);\nexport default Search;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/search/search.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\",\n    \"t-cell\": \"../cell/cell\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/search/search.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n<wxs src=\"./search.wxs\" module=\"this\"></wxs>\n\n<view style=\"{{_._style([style, customStyle])}}\" class=\"class {{classPrefix}} {{prefix}}-class\">\n  <view\n    class=\"{{classPrefix}}__input-box {{prefix}}-{{focus ? 'is-focused' : 'not-focused'}} {{classPrefix}}__input-box--{{center ? 'center' : ''}} {{classPrefix}}__input-box--{{shape}} {{prefix}}-class-input-container\"\n  >\n    <!-- <view wx:if=\"{{label}}\" class=\"{{classPrefix}}__label {{prefix}}-class-label\">{{label}}</view>\n    <slot name=\"label\" /> -->\n    <t-icon\n      wx:if=\"{{leftIcon}}\"\n      name=\"{{leftIcon}}\"\n      size=\"48rpx\"\n      class=\"{{prefix}}-icon {{prefix}}-class-left\"\n      aria-hidden=\"{{true}}\"\n    />\n    <slot wx:else name=\"left-icon\" />\n\n    <input\n      type=\"{{type}}\"\n      name=\"input\"\n      maxlength=\"{{maxlength}}\"\n      disabled=\"{{disabled}}\"\n      class=\"{{prefix}}-input__keyword {{prefix}}-class-input\"\n      focus=\"{{focus}}\"\n      value=\"{{value}}\"\n      confirm-type=\"{{confirmType}}\"\n      confirm-hold=\"{{confirmHold}}\"\n      cursor=\"{{cursor}}\"\n      adjust-position=\"{{adjustPosition}}\"\n      always-embed=\"{{alwaysEmbed}}\"\n      selection-start=\"{{selectionStart}}\"\n      selection-end=\"{{selectionEnd}}\"\n      hold-keyboard=\"{{holdKeyboard}}\"\n      cursor-spacing=\"{{cursorSpacing}}\"\n      placeholder=\"{{placeholder}}\"\n      placeholder-style=\"{{placeholderStyle}}\"\n      placeholder-class=\"{{placeholderClass}} {{classPrefix}}__placeholder {{classPrefix}}__placeholder--{{center ? 'center': 'normal'}}\"\n      bind:input=\"onInput\"\n      bind:focus=\"onFocus\"\n      bind:blur=\"onBlur\"\n      bind:confirm=\"onConfirm\"\n    />\n    <view\n      wx:if=\"{{value !=='' && clearable}}\"\n      class=\"{{classPrefix}}__clear {{prefix}}-class-clear\"\n      catch:tap=\"handleClear\"\n      aria-role=\"button\"\n      aria-label=\"清除\"\n    >\n      <t-icon name=\"close-circle-filled\" size=\"48rpx\" />\n    </view>\n  </view>\n  <view\n    wx:if=\"{{action}}\"\n    class=\"{{classPrefix}}__search-action {{prefix}}-class-action\"\n    catch:tap=\"onActionClick\"\n    aria-role=\"button\"\n  >\n    {{action}}\n  </view>\n  <slot wx:else name=\"action\" />\n</view>\n\n<view wx:if=\"{{isShowResultList && !isSelected}}\" class=\"{{classPrefix}}__result-list\" aria-role=\"listbox\">\n  <t-cell\n    wx:for=\"{{resultList}}\"\n    wx:key=\"index\"\n    data-index=\"{{index}}\"\n    class=\"{{classPrefix}}__result-item\"\n    hover\n    bind:tap=\"onSelectResultItem\"\n    aria-role=\"option\"\n  >\n    <rich-text slot=\"title\" nodes=\"{{this.highLight(item, value)}}\"></rich-text>\n  </t-cell>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/search/search.wxs",
    "content": "var highLight = function (label, keyword) {\n  return label.replace(keyword, '<span class=\"t-search__result-item--highLight\">' + keyword + '</span>');\n};\nmodule.exports = {\n  highLight: highLight,\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/search/search.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-search {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n.t-search__label {\n  padding: 8rpx;\n  color: var(--td-search-label-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n}\n.t-search__input-box {\n  flex: 1;\n  box-sizing: border-box;\n  display: flex;\n  height: var(--td-search-height, 80rpx);\n  align-items: center;\n  border: 2rpx solid var(--td-search-bg-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n  background: var(--td-search-bg-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n  padding: var(--td-search-padding, 16rpx 24rpx);\n}\n.t-search__input-box.t-is-focused {\n  border-color: var(--td-search-bg-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n}\n.t-search__input-box--round {\n  border-radius: calc(var(--td-search-height, 80rpx) / 2);\n}\n.t-search__input-box--square {\n  border-radius: var(--td-search-square-radius, var(--td-radius-default, 12rpx));\n}\n.t-search__input-box--center {\n  text-align: center;\n}\n.t-search__input-box .t-input__keyword {\n  display: inline-block;\n  flex: 1;\n  color: var(--td-search-text-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  font-size: var(--td-search-font-size, var(--td-font-size-m, 32rpx));\n  padding-left: 10rpx;\n  min-height: 48rpx;\n  line-height: 48rpx;\n}\n.t-search__input-box .t-icon {\n  color: var(--td-search-icon-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n}\n.t-search__clear {\n  position: relative;\n  margin-left: 10px;\n  color: var(--td-search-clear-icon-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n}\n.t-search__clear.relative {\n  position: relative;\n}\n.t-search__clear::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-search__search-action {\n  margin-left: 30rpx;\n  font-size: var(--td-search-font-size, var(--td-font-size-m, 32rpx));\n  color: var(--td-search-action-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-search__placeholder {\n  color: var(--td-search-placeholder-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n}\n.t-search__placeholder--center {\n  text-align: center;\n}\n.t-search__result-item--highLight {\n  color: var(--td-search-result-high-light-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-search__result-list .t-search__result-item {\n  padding-left: 0;\n}\n.t-search__result-list .t-search__result-item::after {\n  left: 0;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/search/type.d.ts",
    "content": "export interface TdSearchProps {\n    action?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    adjustPosition?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    alwaysEmbed?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    center?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    clearable?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    confirmHold?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    confirmType?: {\n        type: StringConstructor;\n        value?: 'send' | 'search' | 'next' | 'go' | 'done';\n    };\n    cursor: {\n        type: NumberConstructor;\n        value?: number;\n        required?: boolean;\n    };\n    cursorSpacing?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    focus?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    holdKeyboard?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    leftIcon?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    maxcharacter?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    maxlength?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    placeholder?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    placeholderClass?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    placeholderStyle: {\n        type: StringConstructor;\n        value?: string;\n        required?: boolean;\n    };\n    resultList?: {\n        type: ArrayConstructor;\n        value?: Array<string>;\n    };\n    selectionEnd?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    selectionStart?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    shape?: {\n        type: StringConstructor;\n        value?: 'square' | 'round';\n    };\n    style?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    type?: {\n        type: StringConstructor;\n        value?: 'text' | 'number' | 'idcard' | 'digit' | 'nickname';\n    };\n    value?: {\n        type: StringConstructor;\n        value?: string;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/search/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/tag/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Tag Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nclosable | Boolean / Object / Slot | false | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndisabled | Boolean | false | \\- | N\nicon | String / Object / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmax-width | String / Number | - | \\- | N\nshape | String | square | options: square/round/mark | N\nsize | String | medium | options: small/medium/large/extra-large | N\ntheme | String | default | options: default/primary/warning/danger/success | N\nvariant | String | dark | options: dark/light/outline/light-outline | N\n\n### Tag Events\n\nname | params | description\n-- | -- | --\nclick | - | \\-\nclose | - | \\-\n### Tag External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\n\n\n### CheckTag Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nchecked | Boolean | undefined | \\- | N\ndefault-checked | Boolean | undefined | uncontrolled property | N\nclosable | Boolean | false | \\- | N\ncontent | String / Number / Array / Slot | - | Typescript：`string \\| number \\| string[]` | N\ndisabled | Boolean | false | \\- | N\nicon | String / Object / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nshape | String | square | options: square/round/mark | N\nsize | String | medium | options: small/medium/large。Typescript：`SizeEnum`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nvariant | String | dark | `0.26.0`。options: dark/light/outline/light-outline | N\n\n### CheckTag Events\n\nname | params | description\n-- | -- | --\nchange | `(checked: boolean)` | \\-\nclick | - | \\-\nclose | \\- | \\-\n### CheckTag External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-tag-close-icon-color | @font-gray-3 | - \n--td-tag-danger-color | @error-color | - \n--td-tag-danger-light-color | @error-color-1 | - \n--td-tag-default-color | @bg-color-component | - \n--td-tag-default-font-color | @font-gray-1 | - \n--td-tag-default-light-color | @bg-color-secondarycontainer | - \n--td-tag-disabled-background-color | @bg-color-component-disabled | - \n--td-tag-disabled-border-color | @component-border | - \n--td-tag-disabled-color | @font-gray-4 | - \n--td-tag-extra-large-font-size | @font-size-base | - \n--td-tag-extra-large-height | 80rpx | - \n--td-tag-extra-large-icon-size | 32rpx | - \n--td-tag-extra-large-padding | 32rpx - 1px | - \n--td-tag-large-font-size | @font-size-base | - \n--td-tag-large-height | 56rpx | - \n--td-tag-large-icon-size | 32rpx | - \n--td-tag-large-padding | 16rpx - 1px | - \n--td-tag-mark-border-radius | @tag-round-border-radius | - \n--td-tag-medium-font-size | @font-size-s | - \n--td-tag-medium-height | 48rpx | - \n--td-tag-medium-icon-size | 28rpx | - \n--td-tag-medium-padding | 16rpx - 1px | - \n--td-tag-outline-bg-color | @bg-color-container | - \n--td-tag-primary-color | @brand-color | - \n--td-tag-primary-light-color | @brand-color-light | - \n--td-tag-round-border-radius | 999px | - \n--td-tag-small-font-size | @font-size | - \n--td-tag-small-height | 40rpx | - \n--td-tag-small-icon-size | 24rpx | - \n--td-tag-small-padding | 12rpx - 1px | - \n--td-tag-square-border-radius | 8rpx | - \n--td-tag-success-color | @success-color | - \n--td-tag-success-light-color | @success-color-1 | - \n--td-tag-warning-color | @warning-color | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/tag/README.md",
    "content": "---\ntitle: Tag 标签\ndescription: 用于表明主体的类目，属性或状态。\nspline: data\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-100%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-tag\": \"tdesign-miniprogram/tag/tag\",\n  \"t-check-tag\": \"tdesign-miniprogram/check-tag/check-tag\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/NTaYTim77JSf\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 组件类型\n\n{{ type }}\n\n可关闭的标签\n\n{{ closable }}\n\n可点击的标签\n\n{{ checkable }}\n\n### 组件状态\n\n展示型标签\n\n{{ theme }}\n\n### 组件尺寸\n\n{{ size }}\n\n\n## API\n\n### Tag Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nclosable | Boolean / Object / Slot | false | 标签是否可关闭。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndisabled | Boolean | false | 标签禁用态，失效标签不能触发事件。默认风格（theme=default）才有禁用态 | N\nicon | String / Object / Slot | - | 标签中的图标，可自定义图标呈现。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmax-width | String / Number | - | 标签最大宽度，宽度超出后会出现省略号。示例：'50px' / 80 | N\nshape | String | square | 标签类型，有三种：方形、圆角方形、标记型。可选项：square/round/mark | N\nsize | String | medium | 标签尺寸。可选项：small/medium/large/extra-large | N\ntheme | String | default | 组件风格，用于描述组件不同的应用场景。可选项：default/primary/warning/danger/success | N\nvariant | String | dark | 标签风格变体。可选项：dark/light/outline/light-outline | N\n\n### Tag Events\n\n名称 | 参数 | 描述\n-- | -- | --\nclick | - | 点击时触发\nclose | - | 如果关闭按钮存在，点击关闭按钮时触发\n### Tag External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\n\n\n### CheckTag Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nchecked | Boolean | undefined | 标签选中的状态，默认风格（theme=default）才有选中态 | N\ndefault-checked | Boolean | undefined | 标签选中的状态，默认风格（theme=default）才有选中态。非受控属性 | N\nclosable | Boolean | false | 标签是否可关闭 | N\ncontent | String / Number / Array / Slot | - | 组件子元素；传入数组时：[选中内容，非选中内容]。TS 类型：`string \\| number \\| string[]` | N\ndisabled | Boolean | false | 标签禁用态，失效标签不能触发事件。默认风格（theme=default）才有禁用态 | N\nicon | String / Object / Slot | - | 标签图标。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nshape | String | square | 标签类型，有三种：方形、圆角方形、标记型。可选项：square/round/mark | N\nsize | String | medium | 标签尺寸。可选项：small/medium/large。TS 类型：`SizeEnum`。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nvariant | String | dark | `0.26.0`。标签风格变体。可选项：dark/light/outline/light-outline | N\n\n### CheckTag Events\n\n名称 | 参数 | 描述\n-- | -- | --\nchange | `(checked: boolean)` | 状态切换时触发\nclick | - | 点击标签时触发\nclose | \\- | 如果关闭按钮存在，点击关闭按钮时触发\n### CheckTag External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-tag-close-icon-color | @font-gray-3 | - \n--td-tag-danger-color | @error-color | - \n--td-tag-danger-light-color | @error-color-1 | - \n--td-tag-default-color | @bg-color-component | - \n--td-tag-default-font-color | @font-gray-1 | - \n--td-tag-default-light-color | @bg-color-secondarycontainer | - \n--td-tag-disabled-background-color | @bg-color-component-disabled | - \n--td-tag-disabled-border-color | @component-border | - \n--td-tag-disabled-color | @font-gray-4 | - \n--td-tag-extra-large-font-size | @font-size-base | - \n--td-tag-extra-large-height | 80rpx | - \n--td-tag-extra-large-icon-size | 32rpx | - \n--td-tag-extra-large-padding | 32rpx - 1px | - \n--td-tag-large-font-size | @font-size-base | - \n--td-tag-large-height | 56rpx | - \n--td-tag-large-icon-size | 32rpx | - \n--td-tag-large-padding | 16rpx - 1px | - \n--td-tag-mark-border-radius | @tag-round-border-radius | - \n--td-tag-medium-font-size | @font-size-s | - \n--td-tag-medium-height | 48rpx | - \n--td-tag-medium-icon-size | 28rpx | - \n--td-tag-medium-padding | 16rpx - 1px | - \n--td-tag-outline-bg-color | @bg-color-container | - \n--td-tag-primary-color | @brand-color | - \n--td-tag-primary-light-color | @brand-color-light | - \n--td-tag-round-border-radius | 999px | - \n--td-tag-small-font-size | @font-size | - \n--td-tag-small-height | 40rpx | - \n--td-tag-small-icon-size | 24rpx | - \n--td-tag-small-padding | 12rpx - 1px | - \n--td-tag-square-border-radius | 8rpx | - \n--td-tag-success-color | @success-color | - \n--td-tag-success-light-color | @success-color-1 | - \n--td-tag-warning-color | @warning-color | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/tag/props.d.ts",
    "content": "import { TdTagProps } from './type';\ndeclare const props: TdTagProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/tag/props.js",
    "content": "const props = {\n    closable: {\n        type: null,\n        value: false,\n    },\n    disabled: {\n        type: Boolean,\n        value: false,\n    },\n    externalClasses: {\n        type: Array,\n    },\n    icon: {\n        type: null,\n    },\n    maxWidth: {\n        type: null,\n    },\n    shape: {\n        type: String,\n        value: 'square',\n    },\n    size: {\n        type: String,\n        value: 'medium',\n    },\n    theme: {\n        type: String,\n        value: 'default',\n    },\n    variant: {\n        type: String,\n        value: 'dark',\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/tag/tag.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\nimport { SuperComponent } from '../common/src/index';\nexport default class Tag extends SuperComponent {\n    data: {\n        prefix: string;\n        classPrefix: string;\n        className: string;\n        tagStyle: string;\n    };\n    properties: import(\"./type\").TdTagProps;\n    externalClasses: string[];\n    options: WechatMiniprogram.Component.ComponentOptions;\n    lifetimes: {\n        attached(): void;\n    };\n    observers: {\n        'size, shape, theme, variant, closable, disabled'(): void;\n        maxWidth(): void;\n        icon(v: any): void;\n        closable(v: any): void;\n    };\n    methods: {\n        setClass(): void;\n        setTagStyle(): string;\n        handleClick(e: WechatMiniprogram.BaseEvent): void;\n        handleClose(e: WechatMiniprogram.BaseEvent): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/tag/tag.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { wxComponent, SuperComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport { classNames, isNumber, calcIcon } from '../common/utils';\nconst { prefix } = config;\nconst name = `${prefix}-tag`;\nlet Tag = class Tag extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.data = {\n            prefix,\n            classPrefix: name,\n            className: '',\n            tagStyle: '',\n        };\n        this.properties = props;\n        this.externalClasses = [`${prefix}-class`];\n        this.options = {\n            multipleSlots: true,\n        };\n        this.lifetimes = {\n            attached() {\n                this.setClass();\n                this.setTagStyle();\n            },\n        };\n        this.observers = {\n            'size, shape, theme, variant, closable, disabled'() {\n                this.setClass();\n            },\n            maxWidth() {\n                this.setTagStyle();\n            },\n            icon(v) {\n                this.setData({\n                    _icon: calcIcon(v),\n                });\n            },\n            closable(v) {\n                this.setData({\n                    _closable: calcIcon(v, 'close'),\n                });\n            },\n        };\n        this.methods = {\n            setClass() {\n                const { prefix, classPrefix } = this.data;\n                const { size, shape, theme, variant, closable, disabled } = this.properties;\n                const tagClass = [\n                    classPrefix,\n                    `${classPrefix}--${theme || 'default'}`,\n                    `${classPrefix}--${variant}`,\n                    closable ? `${classPrefix}--closable ${prefix}-is-closable` : '',\n                    disabled ? `${classPrefix}--disabled ${prefix}-is-disabled` : '',\n                    `${classPrefix}--${size}`,\n                    `${classPrefix}--${shape}`,\n                ];\n                const className = classNames(tagClass);\n                this.setData({\n                    className,\n                });\n            },\n            setTagStyle() {\n                const { maxWidth } = this.properties;\n                if (!maxWidth) {\n                    return '';\n                }\n                const width = isNumber(maxWidth) ? `${maxWidth}px` : maxWidth;\n                this.setData({ tagStyle: `max-width:${width};` });\n            },\n            handleClick(e) {\n                if (this.data.disabled)\n                    return;\n                this.triggerEvent('click', e);\n            },\n            handleClose(e) {\n                if (this.data.disabled)\n                    return;\n                this.triggerEvent('close', e);\n            },\n        };\n    }\n};\nTag = __decorate([\n    wxComponent()\n], Tag);\nexport default Tag;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/tag/tag.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \".././icon/icon\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/tag/tag.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n<import src=\"../common/template/icon.wxml\" />\n\n<view\n  class=\"{{className}} class {{prefix}}-class\"\n  style=\"{{_._style([tagStyle, style, customStyle])}}\"\n  bind:tap=\"handleClick\"\n>\n  <view aria-hidden=\"{{true}}\" class=\"{{classPrefix}}__icon\">\n    <template wx:if=\"{{_icon}}\" is=\"icon\" data=\"{{ tClass: prefix + '-icon', ..._icon }}\" />\n    <slot name=\"icon\" />\n  </view>\n  <view class=\"{{classPrefix}}__text\">\n    <slot />\n  </view>\n  <template\n    wx:if=\"{{_closable}}\"\n    is=\"icon\"\n    data=\"{{class: classPrefix + '__icon-close', tClass: prefix + '-icon', bindclick: 'handleClose',  ariaRole: 'button', ariaLabel: '关闭',  ..._closable }}\"\n    catch:tap=\"handleClose\"\n  />\n  <slot wx:else name=\"closable\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/tag/tag.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-tag {\n  display: inline-flex;\n  align-items: center;\n  border: 2rpx solid transparent;\n  box-sizing: border-box;\n  border-radius: var(--td-tag-square-border-radius, 8rpx);\n  font-size: var(--td-tag-medium-font-size, var(--td-font-size-s, 24rpx));\n  user-select: none;\n  vertical-align: middle;\n}\n.t-tag__text {\n  word-wrap: normal;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.t-tag__icon,\n.t-tag__icon-close {\n  display: flex;\n  align-items: center;\n}\n.t-tag__icon-close {\n  color: var(--td-tag-close-icon-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n}\n.t-tag__icon:not(:empty) + .t-tag__text:not(:empty),\n.t-tag__text:not(:empty) + .t-tag__icon-close:not(:empty) {\n  margin-left: 8rpx;\n}\n.t-tag.t-tag--small {\n  height: var(--td-tag-small-height, 40rpx);\n  line-height: var(--td-tag-small-height, 40rpx);\n  padding: 0 var(--td-tag-small-padding, 11rpx);\n  font-size: var(--td-tag-small-font-size, var(--td-font-size, 20rpx));\n}\n.t-tag.t-tag--small .t-icon,\n.t-tag.t-tag--small .t-icon-close {\n  font-size: var(--td-tag-small-icon-size, 24rpx);\n}\n.t-tag.t-tag--small .t-tag__icon:not(:empty) + .t-tag__text:not(:empty),\n.t-tag.t-tag--small .t-tag__text:not(:empty) + .t-tag__icon-close:not(:empty) {\n  margin-left: 4rpx;\n}\n.t-tag.t-tag--medium {\n  height: var(--td-tag-medium-height, 48rpx);\n  line-height: var(--td-tag-medium-height, 48rpx);\n  padding: 0 var(--td-tag-medium-padding, 15rpx);\n  font-size: var(--td-tag-medium-font-size, var(--td-font-size-s, 24rpx));\n}\n.t-tag.t-tag--medium .t-icon,\n.t-tag.t-tag--medium .t-icon-close {\n  font-size: var(--td-tag-medium-icon-size, 28rpx);\n}\n.t-tag.t-tag--large {\n  height: var(--td-tag-large-height, 56rpx);\n  line-height: var(--td-tag-large-height, 56rpx);\n  padding: 0 var(--td-tag-large-padding, 15rpx);\n  font-size: var(--td-tag-large-font-size, var(--td-font-size-base, 28rpx));\n}\n.t-tag.t-tag--large .t-icon,\n.t-tag.t-tag--large .t-icon-close {\n  font-size: var(--td-tag-large-icon-size, 32rpx);\n}\n.t-tag.t-tag--extra-large {\n  height: var(--td-tag-extra-large-height, 80rpx);\n  line-height: var(--td-tag-extra-large-height, 80rpx);\n  padding: 0 var(--td-tag-extra-large-padding, 31rpx);\n  font-size: var(--td-tag-extra-large-font-size, var(--td-font-size-base, 28rpx));\n}\n.t-tag.t-tag--extra-large .t-icon,\n.t-tag.t-tag--extra-large .t-icon-close {\n  font-size: var(--td-tag-extra-large-icon-size, 32rpx);\n}\n.t-tag.t-tag--square {\n  border-radius: var(--td-tag-square-border-radius, 8rpx);\n}\n.t-tag.t-tag--round {\n  border-radius: var(--td-tag-round-border-radius, 999px);\n}\n.t-tag.t-tag--mark {\n  border-radius: 0;\n  border-top-right-radius: var(--td-tag-mark-border-radius, var(--td-tag-round-border-radius, 999px));\n  border-bottom-right-radius: var(--td-tag-mark-border-radius, var(--td-tag-round-border-radius, 999px));\n}\n.t-tag--dark.t-tag--default {\n  color: var(--td-text-color-anti, var(--td-font-white-1, #ffffff));\n  border-color: var(--td-tag-default-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  background-color: var(--td-tag-default-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-tag--dark.t-tag--primary {\n  color: var(--td-text-color-anti, var(--td-font-white-1, #ffffff));\n  border-color: var(--td-tag-primary-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  background-color: var(--td-tag-primary-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-tag--dark.t-tag--success {\n  color: var(--td-text-color-anti, var(--td-font-white-1, #ffffff));\n  border-color: var(--td-tag-success-color, var(--td-success-color, var(--td-success-color-5, #2ba471)));\n  background-color: var(--td-tag-success-color, var(--td-success-color, var(--td-success-color-5, #2ba471)));\n}\n.t-tag--dark.t-tag--warning {\n  color: var(--td-text-color-anti, var(--td-font-white-1, #ffffff));\n  border-color: var(--td-tag-warning-color, var(--td-warning-color, var(--td-warning-color-5, #e37318)));\n  background-color: var(--td-tag-warning-color, var(--td-warning-color, var(--td-warning-color-5, #e37318)));\n}\n.t-tag--dark.t-tag--danger {\n  color: var(--td-text-color-anti, var(--td-font-white-1, #ffffff));\n  border-color: var(--td-tag-danger-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n  background-color: var(--td-tag-danger-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n}\n.t-tag--dark.t-tag--default {\n  color: var(--td-tag-default-font-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n}\n.t-tag--outline.t-tag--default {\n  color: var(--td-tag-default-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  border-color: var(--td-tag-default-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  background-color: var(--td-tag-default-light-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n}\n.t-tag--outline.t-tag--primary {\n  color: var(--td-tag-primary-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  border-color: var(--td-tag-primary-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  background-color: var(--td-tag-primary-light-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n}\n.t-tag--outline.t-tag--success {\n  color: var(--td-tag-success-color, var(--td-success-color, var(--td-success-color-5, #2ba471)));\n  border-color: var(--td-tag-success-color, var(--td-success-color, var(--td-success-color-5, #2ba471)));\n  background-color: var(--td-tag-success-light-color, var(--td-success-color-1, #e3f9e9));\n}\n.t-tag--outline.t-tag--warning {\n  color: var(--td-tag-warning-color, var(--td-warning-color, var(--td-warning-color-5, #e37318)));\n  border-color: var(--td-tag-warning-color, var(--td-warning-color, var(--td-warning-color-5, #e37318)));\n  background-color: var(--td-tag-warning-light-color, var(--td-warning-color-1, #fff1e9));\n}\n.t-tag--outline.t-tag--danger {\n  color: var(--td-tag-danger-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n  border-color: var(--td-tag-danger-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n  background-color: var(--td-tag-danger-light-color, var(--td-error-color-1, #fff0ed));\n}\n.t-tag--outline.t-tag--default {\n  color: var(--td-tag-default-font-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n}\n.t-tag--outline.t-tag--default {\n  background-color: var(--td-tag-outline-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n}\n.t-tag--outline.t-tag--primary {\n  background-color: var(--td-tag-outline-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n}\n.t-tag--outline.t-tag--success {\n  background-color: var(--td-tag-outline-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n}\n.t-tag--outline.t-tag--warning {\n  background-color: var(--td-tag-outline-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n}\n.t-tag--outline.t-tag--danger {\n  background-color: var(--td-tag-outline-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n}\n.t-tag--light.t-tag--default {\n  color: var(--td-tag-default-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  border-color: var(--td-tag-default-light-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n  background-color: var(--td-tag-default-light-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n}\n.t-tag--light.t-tag--primary {\n  color: var(--td-tag-primary-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  border-color: var(--td-tag-primary-light-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n  background-color: var(--td-tag-primary-light-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n}\n.t-tag--light.t-tag--success {\n  color: var(--td-tag-success-color, var(--td-success-color, var(--td-success-color-5, #2ba471)));\n  border-color: var(--td-tag-success-light-color, var(--td-success-color-1, #e3f9e9));\n  background-color: var(--td-tag-success-light-color, var(--td-success-color-1, #e3f9e9));\n}\n.t-tag--light.t-tag--warning {\n  color: var(--td-tag-warning-color, var(--td-warning-color, var(--td-warning-color-5, #e37318)));\n  border-color: var(--td-tag-warning-light-color, var(--td-warning-color-1, #fff1e9));\n  background-color: var(--td-tag-warning-light-color, var(--td-warning-color-1, #fff1e9));\n}\n.t-tag--light.t-tag--danger {\n  color: var(--td-tag-danger-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n  border-color: var(--td-tag-danger-light-color, var(--td-error-color-1, #fff0ed));\n  background-color: var(--td-tag-danger-light-color, var(--td-error-color-1, #fff0ed));\n}\n.t-tag--light.t-tag--default {\n  color: var(--td-tag-default-font-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n}\n.t-tag--light-outline.t-tag--default {\n  color: var(--td-tag-default-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  border-color: var(--td-tag-default-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  background-color: var(--td-tag-default-light-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n}\n.t-tag--light-outline.t-tag--primary {\n  color: var(--td-tag-primary-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  border-color: var(--td-tag-primary-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  background-color: var(--td-tag-primary-light-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n}\n.t-tag--light-outline.t-tag--success {\n  color: var(--td-tag-success-color, var(--td-success-color, var(--td-success-color-5, #2ba471)));\n  border-color: var(--td-tag-success-color, var(--td-success-color, var(--td-success-color-5, #2ba471)));\n  background-color: var(--td-tag-success-light-color, var(--td-success-color-1, #e3f9e9));\n}\n.t-tag--light-outline.t-tag--warning {\n  color: var(--td-tag-warning-color, var(--td-warning-color, var(--td-warning-color-5, #e37318)));\n  border-color: var(--td-tag-warning-color, var(--td-warning-color, var(--td-warning-color-5, #e37318)));\n  background-color: var(--td-tag-warning-light-color, var(--td-warning-color-1, #fff1e9));\n}\n.t-tag--light-outline.t-tag--danger {\n  color: var(--td-tag-danger-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n  border-color: var(--td-tag-danger-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n  background-color: var(--td-tag-danger-light-color, var(--td-error-color-1, #fff0ed));\n}\n.t-tag--light-outline.t-tag--default {\n  color: var(--td-tag-default-font-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  border-color: var(--td-component-border, var(--td-gray-color-4, #dcdcdc));\n}\n.t-tag.t-tag--closable.t-tag--disabled {\n  cursor: not-allowed;\n  color: var(--td-tag-disabled-color, var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26))));\n  background-color: var(--td-tag-disabled-background-color, var(--td-bg-color-component-disabled, var(--td-gray-color-2, #eeeeee)));\n  border-color: var(--td-tag-disabled-border-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/tag/type.d.ts",
    "content": "export interface TdTagProps {\n    closable?: {\n        type: null;\n        value?: boolean | object;\n    };\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    externalClasses?: {\n        type: ArrayConstructor;\n        value?: ['t-class'];\n    };\n    icon?: {\n        type: null;\n        value?: string | object;\n    };\n    maxWidth?: {\n        type: null;\n        value?: string | number;\n    };\n    shape?: {\n        type: StringConstructor;\n        value?: 'square' | 'round' | 'mark';\n    };\n    size?: {\n        type: StringConstructor;\n        value?: 'small' | 'medium' | 'large' | 'extra-large';\n    };\n    theme?: {\n        type: StringConstructor;\n        value?: 'default' | 'primary' | 'warning' | 'danger' | 'success';\n    };\n    variant?: {\n        type: StringConstructor;\n        value?: 'dark' | 'light' | 'outline' | 'light-outline';\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/tag/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Toast Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ndirection | String | row | options: row/column | N\nduration | Number | 2000 | \\- | N\nicon | String / Object / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmessage | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\noverlay-props | Object | - | Typescript：`OverlayProps `，[Overlay API Documents](./overlay?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/toast/type.ts) | N\nplacement | String | middle | options:  top/middle/bottom | N\nprevent-scroll-through | Boolean | false | \\- | N\nshow-overlay | Boolean | false | \\- | N\ntheme | String | - | options: loading/success/error | N\nusing-custom-navbar | Boolean | false | \\- | N\n\n### Toast Events\n\nname | params | description\n-- | -- | --\nclose | \\- | \\-\ndestroy | \\- | \\-\n### Toast External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-toast-bg-color | @font-gray-2 | - \n--td-toast-color | @font-white-1 | - \n--td-toast-column-icon-size | 64rpx | - \n--td-toast-max-width | 374rpx | - \n--td-toast-radius | 8rpx | - \n--td-toast-row-icon-size | 48rpx | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/README.md",
    "content": "---\ntitle: Toast 轻提示\ndescription: 用于轻量级反馈或提示，不会打断用户操作。\nspline: message\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-83%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-toast\": \"tdesign-miniprogram/toast/toast\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/l0azMimf7CSu\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 基础提示\n\n{{ base }}\n\n### 组件状态\n\n{{ theme }}\n\n### 显示遮罩\n{{ cover }}\n\n### 手动关闭\n{{ close }}\n## API\n\n### Toast Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ndirection | String | row | 图标排列方式。可选项：row/column | N\nduration | Number | 2000 | 弹窗显示毫秒数 | N\nicon | String / Object / Slot | - | 自定义图标。传入对象则透传至 Icon 组件。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmessage | String / Slot | - | 弹窗显示文字。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\noverlay-props | Object | - | 遮罩层属性，透传至 Overlay。TS 类型：`OverlayProps `，[Overlay API Documents](./overlay?tab=api)。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/toast/type.ts) | N\nplacement | String | middle | 弹窗展示位置。可选项： top/middle/bottom | N\nprevent-scroll-through | Boolean | false | 防止滚动穿透，即不允许点击和滚动 | N\nshow-overlay | Boolean | false | 是否显示遮罩层 | N\ntheme | String | - | 提示类型。可选项：loading/success/error | N\nusing-custom-navbar | Boolean | false | 是否使用了自定义导航栏 | N\n\n### Toast Events\n\n名称 | 参数 | 描述\n-- | -- | --\nclose | \\- | 轻提示隐藏的时候触发\ndestroy | \\- | 轻提示销毁的时候触发\n### Toast External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-toast-bg-color | @font-gray-2 | - \n--td-toast-color | @font-white-1 | - \n--td-toast-column-icon-size | 64rpx | - \n--td-toast-max-width | 374rpx | - \n--td-toast-radius | 8rpx | - \n--td-toast-row-icon-size | 48rpx | -"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/index.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\n/// <reference types=\"miniprogram-api-typings\" />\ndeclare type Context = WechatMiniprogram.Page.TrivialInstance | WechatMiniprogram.Component.TrivialInstance;\ndeclare type ToastType = 'loading' | 'success' | 'error';\ndeclare type ToastPositionType = 'top' | 'middle' | 'bottom';\ndeclare type ToastDirectionType = 'row' | 'column';\nexport declare type ToastOptionsType = {\n    context?: Context;\n    selector?: string;\n    icon?: string;\n    message?: string;\n    duration?: number;\n    theme?: ToastType;\n    placement?: ToastPositionType;\n    preventScrollThrough?: boolean;\n    direction?: ToastDirectionType;\n    close?: () => void;\n};\ndeclare function Toast(options: ToastOptionsType): void;\ndeclare function showToast(options?: ToastOptionsType): void;\ndeclare function hideToast(options?: ToastOptionsType): void;\nexport { Toast as default, showToast, hideToast };\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/index.js",
    "content": "var __rest = (this && this.__rest) || function (s, e) {\n    var t = {};\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n        t[p] = s[p];\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                t[p[i]] = s[p[i]];\n        }\n    return t;\n};\nimport { getInstance } from '../common/utils';\nfunction Toast(options) {\n    var _a;\n    const { context, selector = '#t-toast' } = options, Options = __rest(options, [\"context\", \"selector\"]);\n    const instance = getInstance(context, selector);\n    if (instance) {\n        instance.show(Object.assign(Object.assign({}, Options), { duration: (_a = Options.duration) !== null && _a !== void 0 ? _a : 2000 }));\n    }\n}\nfunction showToast(options = {}) {\n    Toast(options);\n}\nfunction hideToast(options = {}) {\n    const { context, selector = '#t-toast' } = options;\n    const instance = getInstance(context, selector);\n    if (instance) {\n        instance.hide();\n    }\n}\nexport { Toast as default, showToast, hideToast };\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/props.d.ts",
    "content": "import { TdToastProps } from './type';\ndeclare const props: TdToastProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/props.js",
    "content": "const props = {\n    direction: {\n        type: String,\n        value: 'row',\n    },\n    duration: {\n        type: Number,\n        value: 2000,\n    },\n    icon: {\n        type: null,\n    },\n    message: {\n        type: String,\n    },\n    overlayProps: {\n        type: Object,\n    },\n    placement: {\n        type: String,\n        value: 'middle',\n    },\n    preventScrollThrough: {\n        type: Boolean,\n        value: false,\n    },\n    showOverlay: {\n        type: Boolean,\n        value: false,\n    },\n    theme: {\n        type: String,\n    },\n    usingCustomNavbar: {\n        type: Boolean,\n        value: false,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/toast.d.ts",
    "content": "/// <reference types=\"node\" />\nimport { SuperComponent } from '../common/src/index';\nimport { ToastOptionsType } from './index';\ndeclare type Timer = NodeJS.Timeout | null;\nexport default class Toast extends SuperComponent {\n    externalClasses: string[];\n    options: {\n        multipleSlots: boolean;\n    };\n    behaviors: string[];\n    hideTimer: Timer;\n    data: {\n        prefix: string;\n        classPrefix: string;\n        typeMapIcon: string;\n    };\n    properties: import(\"./type\").TdToastProps;\n    lifetimes: {\n        detached(): void;\n    };\n    pageLifetimes: {\n        hide(): void;\n    };\n    methods: {\n        show(options: ToastOptionsType): void;\n        hide(): void;\n        destroyed(): void;\n        loop(): void;\n    };\n}\nexport {};\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/toast.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport transition from '../mixins/transition';\nimport { calcIcon } from '../common/utils';\nimport useCustomNavbar from '../mixins/using-custom-navbar';\nconst { prefix } = config;\nconst name = `${prefix}-toast`;\nlet Toast = class Toast extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`];\n        this.options = {\n            multipleSlots: true,\n        };\n        this.behaviors = [transition(), useCustomNavbar];\n        this.hideTimer = null;\n        this.data = {\n            prefix,\n            classPrefix: name,\n            typeMapIcon: '',\n        };\n        this.properties = props;\n        this.lifetimes = {\n            detached() {\n                this.destroyed();\n            },\n        };\n        this.pageLifetimes = {\n            hide() {\n                this.hide();\n            },\n        };\n        this.methods = {\n            show(options) {\n                if (this.hideTimer)\n                    clearTimeout(this.hideTimer);\n                const iconMap = {\n                    loading: 'loading',\n                    success: 'check-circle',\n                    warning: 'error-circle',\n                    error: 'close-circle',\n                };\n                const typeMapIcon = iconMap[options === null || options === void 0 ? void 0 : options.theme];\n                const defaultOptions = {\n                    direction: props.direction.value,\n                    duration: props.duration.value,\n                    icon: props.icon.value,\n                    message: props.message.value,\n                    placement: props.placement.value,\n                    preventScrollThrough: props.preventScrollThrough.value,\n                    theme: props.theme.value,\n                };\n                const data = Object.assign(Object.assign(Object.assign({}, defaultOptions), options), { visible: true, isLoading: (options === null || options === void 0 ? void 0 : options.theme) === 'loading', _icon: calcIcon(typeMapIcon !== null && typeMapIcon !== void 0 ? typeMapIcon : options.icon) });\n                const { duration } = data;\n                this.setData(data);\n                if (duration > 0) {\n                    this.hideTimer = setTimeout(() => {\n                        this.hide();\n                    }, duration);\n                }\n            },\n            hide() {\n                var _a, _b;\n                if (!this.data.visible)\n                    return;\n                this.setData({ visible: false });\n                (_b = (_a = this.data) === null || _a === void 0 ? void 0 : _a.close) === null || _b === void 0 ? void 0 : _b.call(_a);\n                this.triggerEvent('close');\n            },\n            destroyed() {\n                if (this.hideTimer) {\n                    clearTimeout(this.hideTimer);\n                    this.hideTimer = null;\n                }\n                this.triggerEvent('destory');\n            },\n            loop() { },\n        };\n    }\n};\nToast = __decorate([\n    wxComponent()\n], Toast);\nexport default Toast;\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/toast.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\",\n    \"t-loading\": \"../loading/loading\",\n    \"t-overlay\": \"../overlay/overlay\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/toast.wxml",
    "content": "<import src=\"../common/template/icon.wxml\" />\n<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  wx:if=\"{{realVisible}}\"\n  class=\"{{_.cls(classPrefix, [direction, theme, ['with-text', message]])}} class {{prefix}}-class {{transitionClass}}\"\n  style=\"{{_._style([ 'top:' + (placement === 'top' ? '25%' : placement === 'bottom' ? '75%': '45%'), style, customStyle])}}\"\n  bind:transitionend=\"onTransitionEnd\"\n  catch:touchstart=\"loop\"\n>\n  <view class=\"{{classPrefix}}__content {{classPrefix}}__content--{{direction}}\">\n    <t-loading\n      wx:if=\"{{isLoading}}\"\n      theme=\"circular\"\n      size=\"{{direction === 'row' ? '48rpx' : '64rpx'}}\"\n      loading\n      inherit-color\n      layout=\"vertical\"\n    />\n    <template\n      wx:elif=\"{{_icon}}\"\n      is=\"icon\"\n      data=\"{{ ariaHidden: true, tClass: classPrefix + '__icon ' + classPrefix + '__icon--' + direction, ..._icon }}\"\n    />\n    <slot name=\"icon\" />\n    <view aria-role=\"alert\" class=\"{{classPrefix}}__text {{classPrefix}}__text--{{direction}}\">{{message}}</view>\n    <slot name=\"message\" />\n  </view>\n</view>\n<t-overlay\n  style=\"{{ overlayProps && overlayProps.style || ''}}\"\n  visible=\"{{realVisible && (showOverlay || preventScrollThrough)}}\"\n  z-index=\"{{overlayProps && overlayProps.zIndex || 11000}}\"\n  duration=\"{{overlayProps && overlayProps.duration || 300}}\"\n  usingCustomNavbar=\"{{overlayProps && overlayProps.usingCustomNavbar || usingCustomNavbar}}\"\n  backgroundColor=\"{{preventScrollThrough ? 'transparent' : overlayProps && overlayProps.backgroundColor || ''}}\"\n  preventScrollThrough=\"{{preventScrollThrough || overlayProps && overlayProps.preventScrollThrough}}\"\n/>\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/toast.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-toast {\n  position: fixed;\n  right: -50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  z-index: 12001;\n  opacity: 1;\n  transition: opacity 300ms ease;\n  background-color: var(--td-toast-bg-color, var(--td-font-gray-2, rgba(0, 0, 0, 0.6)));\n  border-radius: var(--td-toast-radius, 8rpx);\n  font-size: 28rpx;\n  color: var(--td-toast-color, var(--td-text-color-anti, var(--td-font-white-1, #ffffff)));\n  max-width: var(--td-toast-max-width, 374rpx);\n  width: fit-content;\n  box-sizing: border-box;\n}\n.t-toast--column {\n  padding: 48rpx;\n  min-width: 160rpx;\n  min-height: 160rpx;\n  border-radius: 16rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.t-toast--loading.t-toast--with-text {\n  min-width: 204rpx;\n  min-height: 204rpx;\n  padding-top: 0;\n  padding-bottom: 0;\n}\n.t-toast__content {\n  align-items: center;\n  line-height: 44rpx;\n}\n.t-toast__content--row {\n  display: flex;\n  text-align: left;\n  padding: 28rpx 44rpx;\n}\n.t-toast__content--column {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n}\n.t-toast__icon--row {\n  display: flex;\n  font-size: var(--td-toast-row-icon-size, 48rpx);\n}\n.t-toast__icon--column {\n  font-size: var(--td-toast-column-icon-size, 64rpx);\n}\n.t-toast__text {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  -webkit-line-clamp: 3;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  white-space: pre-line;\n}\n.t-toast__text--column:not(:empty):not(:only-child) {\n  margin-top: 16rpx;\n}\n.t-toast__text--row:not(:empty):not(:only-child) {\n  margin-left: 16rpx;\n}\n.t-toast.t-fade-enter,\n.t-toast.t-fade-leave-to {\n  opacity: 0;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/type.d.ts",
    "content": "import { OverlayProps } from '../overlay/index';\nexport interface TdToastProps {\n    direction?: {\n        type: StringConstructor;\n        value?: 'row' | 'column';\n    };\n    duration?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    icon?: {\n        type: null;\n        value?: string | object;\n    };\n    message?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    overlayProps?: {\n        type: ObjectConstructor;\n        value?: OverlayProps;\n    };\n    placement?: {\n        type: StringConstructor;\n        value?: 'top' | 'middle' | 'bottom';\n    };\n    preventScrollThrough?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    showOverlay?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    theme?: {\n        type: StringConstructor;\n        value?: 'loading' | 'success' | 'error';\n    };\n    usingCustomNavbar?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/components/tdesign-miniprogram/toast/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/mobilenet/classify.js",
    "content": "\nconst modelWidth = 224.0;\nconst modelHeight = 224.0;\nconst modelChannel = 3;\n\nvar inferenceStart;\nvar inferenceEnd;\n\nconst classNames = {\n  c0: \"tench, Tinca tinca\",\n  c1: \"goldfish, Carassius auratus\",\n  c2: \"great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias\",\n  c3: \"tiger shark, Galeocerdo cuvieri\",\n  c4: \"hammerhead, hammerhead shark\",\n  c5: \"electric ray, crampfish, numbfish, torpedo\",\n  c6: \"stingray\",\n  c7: \"cock\",\n  c8: \"hen\",\n  c9: \"ostrich, Struthio camelus\",\n  c10: \"brambling, Fringilla montifringilla\",\n  c11: \"goldfinch, Carduelis carduelis\",\n  c12: \"house finch, linnet, Carpodacus mexicanus\",\n  c13: \"junco, snowbird\",\n  c14: \"indigo bunting, indigo finch, indigo bird, Passerina cyanea\",\n  c15: \"robin, American robin, Turdus migratorius\",\n  c16: \"bulbul\",\n  c17: \"jay\",\n  c18: \"magpie\",\n  c19: \"chickadee\",\n  c20: \"water ouzel, dipper\",\n  c21: \"kite\",\n  c22: \"bald eagle, American eagle, Haliaeetus leucocephalus\",\n  c23: \"vulture\",\n  c24: \"great grey owl, great gray owl, Strix nebulosa\",\n  c25: \"European fire salamander, Salamandra salamandra\",\n  c26: \"common newt, Triturus vulgaris\",\n  c27: \"eft\",\n  c28: \"spotted salamander, Ambystoma maculatum\",\n  c29: \"axolotl, mud puppy, Ambystoma mexicanum\",\n  c30: \"bullfrog, Rana catesbeiana\",\n  c31: \"tree frog, tree-frog\",\n  c32: \"tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui\",\n  c33: \"loggerhead, loggerhead turtle, Caretta caretta\",\n  c34: \"leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea\",\n  c35: \"mud turtle\",\n  c36: \"terrapin\",\n  c37: \"box turtle, box tortoise\",\n  c38: \"banded gecko\",\n  c39: \"common iguana, iguana, Iguana iguana\",\n  c40: \"American chameleon, anole, Anolis carolinensis\",\n  c41: \"whiptail, whiptail lizard\",\n  c42: \"agama\",\n  c43: \"frilled lizard, Chlamydosaurus kingi\",\n  c44: \"alligator lizard\",\n  c45: \"Gila monster, Heloderma suspectum\",\n  c46: \"green lizard, Lacerta viridis\",\n  c47: \"African chameleon, Chamaeleo chamaeleon\",\n  c48: \"Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis\",\n  c49: \"African crocodile, Nile crocodile, Crocodylus niloticus\",\n  c50: \"American alligator, Alligator mississipiensis\",\n  c51: \"triceratops\",\n  c52: \"thunder snake, worm snake, Carphophis amoenus\",\n  c53: \"ringneck snake, ring-necked snake, ring snake\",\n  c54: \"hognose snake, puff adder, sand viper\",\n  c55: \"green snake, grass snake\",\n  c56: \"king snake, kingsnake\",\n  c57: \"garter snake, grass snake\",\n  c58: \"water snake\",\n  c59: \"vine snake\",\n  c60: \"night snake, Hypsiglena torquata\",\n  c61: \"boa constrictor, Constrictor constrictor\",\n  c62: \"rock python, rock snake, Python sebae\",\n  c63: \"Indian cobra, Naja naja\",\n  c64: \"green mamba\",\n  c65: \"sea snake\",\n  c66: \"horned viper, cerastes, sand viper, horned asp, Cerastes cornutus\",\n  c67: \"diamondback, diamondback rattlesnake, Crotalus adamanteus\",\n  c68: \"sidewinder, horned rattlesnake, Crotalus cerastes\",\n  c69: \"trilobite\",\n  c70: \"harvestman, daddy longlegs, Phalangium opilio\",\n  c71: \"scorpion\",\n  c72: \"black and gold garden spider, Argiope aurantia\",\n  c73: \"barn spider, Araneus cavaticus\",\n  c74: \"garden spider, Aranea diademata\",\n  c75: \"black widow, Latrodectus mactans\",\n  c76: \"tarantula\",\n  c77: \"wolf spider, hunting spider\",\n  c78: \"tick\",\n  c79: \"centipede\",\n  c80: \"black grouse\",\n  c81: \"ptarmigan\",\n  c82: \"ruffed grouse, partridge, Bonasa umbellus\",\n  c83: \"prairie chicken, prairie grouse, prairie fowl\",\n  c84: \"peacock\",\n  c85: \"quail\",\n  c86: \"partridge\",\n  c87: \"African grey, African gray, Psittacus erithacus\",\n  c88: \"macaw\",\n  c89: \"sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita\",\n  c90: \"lorikeet\",\n  c91: \"coucal\",\n  c92: \"bee eater\",\n  c93: \"hornbill\",\n  c94: \"hummingbird\",\n  c95: \"jacamar\",\n  c96: \"toucan\",\n  c97: \"drake\",\n  c98: \"red-breasted merganser, Mergus serrator\",\n  c99: \"goose\",\n  c100: \"black swan, Cygnus atratus\",\n  c101: \"tusker\",\n  c102: \"echidna, spiny anteater, anteater\",\n  c103: \"platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus\",\n  c104: \"wallaby, brush kangaroo\",\n  c105: \"koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus\",\n  c106: \"wombat\",\n  c107: \"jellyfish\",\n  c108: \"sea anemone, anemone\",\n  c109: \"brain coral\",\n  c110: \"flatworm, platyhelminth\",\n  c111: \"nematode, nematode worm, roundworm\",\n  c112: \"conch\",\n  c113: \"snail\",\n  c114: \"slug\",\n  c115: \"sea slug, nudibranch\",\n  c116: \"chiton, coat-of-mail shell, sea cradle, polyplacophore\",\n  c117: \"chambered nautilus, pearly nautilus, nautilus\",\n  c118: \"Dungeness crab, Cancer magister\",\n  c119: \"rock crab, Cancer irroratus\",\n  c120: \"fiddler crab\",\n  c121: \"king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica\",\n  c122: \"American lobster, Northern lobster, Maine lobster, Homarus americanus\",\n  c123: \"spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish\",\n  c124: \"crayfish, crawfish, crawdad, crawdaddy\",\n  c125: \"hermit crab\",\n  c126: \"isopod\",\n  c127: \"white stork, Ciconia ciconia\",\n  c128: \"black stork, Ciconia nigra\",\n  c129: \"spoonbill\",\n  c130: \"flamingo\",\n  c131: \"little blue heron, Egretta caerulea\",\n  c132: \"American egret, great white heron, Egretta albus\",\n  c133: \"bittern\",\n  c134: \"crane\",\n  c135: \"limpkin, Aramus pictus\",\n  c136: \"European gallinule, Porphyrio porphyrio\",\n  c137: \"American coot, marsh hen, mud hen, water hen, Fulica americana\",\n  c138: \"bustard\",\n  c139: \"ruddy turnstone, Arenaria interpres\",\n  c140: \"red-backed sandpiper, dunlin, Erolia alpina\",\n  c141: \"redshank, Tringa totanus\",\n  c142: \"dowitcher\",\n  c143: \"oystercatcher, oyster catcher\",\n  c144: \"pelican\",\n  c145: \"king penguin, Aptenodytes patagonica\",\n  c146: \"albatross, mollymawk\",\n  c147: \"grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus\",\n  c148: \"killer whale, killer, orca, grampus, sea wolf, Orcinus orca\",\n  c149: \"dugong, Dugong dugon\",\n  c150: \"sea lion\",\n  c151: \"Chihuahua\",\n  c152: \"Japanese spaniel\",\n  c153: \"Maltese dog, Maltese terrier, Maltese\",\n  c154: \"Pekinese, Pekingese, Peke\",\n  c155: \"Shih-Tzu\",\n  c156: \"Blenheim spaniel\",\n  c157: \"papillon\",\n  c158: \"toy terrier\",\n  c159: \"Rhodesian ridgeback\",\n  c160: \"Afghan hound, Afghan\",\n  c161: \"basset, basset hound\",\n  c162: \"beagle\",\n  c163: \"bloodhound, sleuthhound\",\n  c164: \"bluetick\",\n  c165: \"black-and-tan coonhound\",\n  c166: \"Walker hound, Walker foxhound\",\n  c167: \"English foxhound\",\n  c168: \"redbone\",\n  c169: \"borzoi, Russian wolfhound\",\n  c170: \"Irish wolfhound\",\n  c171: \"Italian greyhound\",\n  c172: \"whippet\",\n  c173: \"Ibizan hound, Ibizan Podenco\",\n  c174: \"Norwegian elkhound, elkhound\",\n  c175: \"otterhound, otter hound\",\n  c176: \"Saluki, gazelle hound\",\n  c177: \"Scottish deerhound, deerhound\",\n  c178: \"Weimaraner\",\n  c179: \"Staffordshire bullterrier, Staffordshire bull terrier\",\n  c180: \"American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier\",\n  c181: \"Bedlington terrier\",\n  c182: \"Border terrier\",\n  c183: \"Kerry blue terrier\",\n  c184: \"Irish terrier\",\n  c185: \"Norfolk terrier\",\n  c186: \"Norwich terrier\",\n  c187: \"Yorkshire terrier\",\n  c188: \"wire-haired fox terrier\",\n  c189: \"Lakeland terrier\",\n  c190: \"Sealyham terrier, Sealyham\",\n  c191: \"Airedale, Airedale terrier\",\n  c192: \"cairn, cairn terrier\",\n  c193: \"Australian terrier\",\n  c194: \"Dandie Dinmont, Dandie Dinmont terrier\",\n  c195: \"Boston bull, Boston terrier\",\n  c196: \"miniature schnauzer\",\n  c197: \"giant schnauzer\",\n  c198: \"standard schnauzer\",\n  c199: \"Scotch terrier, Scottish terrier, Scottie\",\n  c200: \"Tibetan terrier, chrysanthemum dog\",\n  c201: \"silky terrier, Sydney silky\",\n  c202: \"soft-coated wheaten terrier\",\n  c203: \"West Highland white terrier\",\n  c204: \"Lhasa, Lhasa apso\",\n  c205: \"flat-coated retriever\",\n  c206: \"curly-coated retriever\",\n  c207: \"golden retriever\",\n  c208: \"Labrador retriever\",\n  c209: \"Chesapeake Bay retriever\",\n  c210: \"German short-haired pointer\",\n  c211: \"vizsla, Hungarian pointer\",\n  c212: \"English setter\",\n  c213: \"Irish setter, red setter\",\n  c214: \"Gordon setter\",\n  c215: \"Brittany spaniel\",\n  c216: \"clumber, clumber spaniel\",\n  c217: \"English springer, English springer spaniel\",\n  c218: \"Welsh springer spaniel\",\n  c219: \"cocker spaniel, English cocker spaniel, cocker\",\n  c220: \"Sussex spaniel\",\n  c221: \"Irish water spaniel\",\n  c222: \"kuvasz\",\n  c223: \"schipperke\",\n  c224: \"groenendael\",\n  c225: \"malinois\",\n  c226: \"briard\",\n  c227: \"kelpie\",\n  c228: \"komondor\",\n  c229: \"Old English sheepdog, bobtail\",\n  c230: \"Shetland sheepdog, Shetland sheep dog, Shetland\",\n  c231: \"collie\",\n  c232: \"Border collie\",\n  c233: \"Bouvier des Flandres, Bouviers des Flandres\",\n  c234: \"Rottweiler\",\n  c235: \"German shepherd, German shepherd dog, German police dog, alsatian\",\n  c236: \"Doberman, Doberman pinscher\",\n  c237: \"miniature pinscher\",\n  c238: \"Greater Swiss Mountain dog\",\n  c239: \"Bernese mountain dog\",\n  c240: \"Appenzeller\",\n  c241: \"EntleBucher\",\n  c242: \"boxer\",\n  c243: \"bull mastiff\",\n  c244: \"Tibetan mastiff\",\n  c245: \"French bulldog\",\n  c246: \"Great Dane\",\n  c247: \"Saint Bernard, St Bernard\",\n  c248: \"Eskimo dog, husky\",\n  c249: \"malamute, malemute, Alaskan malamute\",\n  c250: \"Siberian husky\",\n  c251: \"dalmatian, coach dog, carriage dog\",\n  c252: \"affenpinscher, monkey pinscher, monkey dog\",\n  c253: \"basenji\",\n  c254: \"pug, pug-dog\",\n  c255: \"Leonberg\",\n  c256: \"Newfoundland, Newfoundland dog\",\n  c257: \"Great Pyrenees\",\n  c258: \"Samoyed, Samoyede\",\n  c259: \"Pomeranian\",\n  c260: \"chow, chow chow\",\n  c261: \"keeshond\",\n  c262: \"Brabancon griffon\",\n  c263: \"Pembroke, Pembroke Welsh corgi\",\n  c264: \"Cardigan, Cardigan Welsh corgi\",\n  c265: \"toy poodle\",\n  c266: \"miniature poodle\",\n  c267: \"standard poodle\",\n  c268: \"Mexican hairless\",\n  c269: \"timber wolf, grey wolf, gray wolf, Canis lupus\",\n  c270: \"white wolf, Arctic wolf, Canis lupus tundrarum\",\n  c271: \"red wolf, maned wolf, Canis rufus, Canis niger\",\n  c272: \"coyote, prairie wolf, brush wolf, Canis latrans\",\n  c273: \"dingo, warrigal, warragal, Canis dingo\",\n  c274: \"dhole, Cuon alpinus\",\n  c275: \"African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus\",\n  c276: \"hyena, hyaena\",\n  c277: \"red fox, Vulpes vulpes\",\n  c278: \"kit fox, Vulpes macrotis\",\n  c279: \"Arctic fox, white fox, Alopex lagopus\",\n  c280: \"grey fox, gray fox, Urocyon cinereoargenteus\",\n  c281: \"tabby, tabby cat\",\n  c282: \"tiger cat\",\n  c283: \"Persian cat\",\n  c284: \"Siamese cat, Siamese\",\n  c285: \"Egyptian cat\",\n  c286: \"cougar, puma, catamount, mountain lion, painter, panther, Felis concolor\",\n  c287: \"lynx, catamount\",\n  c288: \"leopard, Panthera pardus\",\n  c289: \"snow leopard, ounce, Panthera uncia\",\n  c290: \"jaguar, panther, Panthera onca, Felis onca\",\n  c291: \"lion, king of beasts, Panthera leo\",\n  c292: \"tiger, Panthera tigris\",\n  c293: \"cheetah, chetah, Acinonyx jubatus\",\n  c294: \"brown bear, bruin, Ursus arctos\",\n  c295: \"American black bear, black bear, Ursus americanus, Euarctos americanus\",\n  c296: \"ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus\",\n  c297: \"sloth bear, Melursus ursinus, Ursus ursinus\",\n  c298: \"mongoose\",\n  c299: \"meerkat, mierkat\",\n  c300: \"tiger beetle\",\n  c301: \"ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle\",\n  c302: \"ground beetle, carabid beetle\",\n  c303: \"long-horned beetle, longicorn, longicorn beetle\",\n  c304: \"leaf beetle, chrysomelid\",\n  c305: \"dung beetle\",\n  c306: \"rhinoceros beetle\",\n  c307: \"weevil\",\n  c308: \"fly\",\n  c309: \"bee\",\n  c310: \"ant, emmet, pismire\",\n  c311: \"grasshopper, hopper\",\n  c312: \"cricket\",\n  c313: \"walking stick, walkingstick, stick insect\",\n  c314: \"cockroach, roach\",\n  c315: \"mantis, mantid\",\n  c316: \"cicada, cicala\",\n  c317: \"leafhopper\",\n  c318: \"lacewing, lacewing fly\",\n  c319: \"dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk\",\n  c320: \"damselfly\",\n  c321: \"admiral\",\n  c322: \"ringlet, ringlet butterfly\",\n  c323: \"monarch, monarch butterfly, milkweed butterfly, Danaus plexippus\",\n  c324: \"cabbage butterfly\",\n  c325: \"sulphur butterfly, sulfur butterfly\",\n  c326: \"lycaenid, lycaenid butterfly\",\n  c327: \"starfish, sea star\",\n  c328: \"sea urchin\",\n  c329: \"sea cucumber, holothurian\",\n  c330: \"wood rabbit, cottontail, cottontail rabbit\",\n  c331: \"hare\",\n  c332: \"Angora, Angora rabbit\",\n  c333: \"hamster\",\n  c334: \"porcupine, hedgehog\",\n  c335: \"fox squirrel, eastern fox squirrel, Sciurus niger\",\n  c336: \"marmot\",\n  c337: \"beaver\",\n  c338: \"guinea pig, Cavia cobaya\",\n  c339: \"sorrel\",\n  c340: \"zebra\",\n  c341: \"hog, pig, grunter, squealer, Sus scrofa\",\n  c342: \"wild boar, boar, Sus scrofa\",\n  c343: \"warthog\",\n  c344: \"hippopotamus, hippo, river horse, Hippopotamus amphibius\",\n  c345: \"ox\",\n  c346: \"water buffalo, water ox, Asiatic buffalo, Bubalus bubalis\",\n  c347: \"bison\",\n  c348: \"ram, tup\",\n  c349: \"bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis\",\n  c350: \"ibex, Capra ibex\",\n  c351: \"hartebeest\",\n  c352: \"impala, Aepyceros melampus\",\n  c353: \"gazelle\",\n  c354: \"Arabian camel, dromedary, Camelus dromedarius\",\n  c355: \"llama\",\n  c356: \"weasel\",\n  c357: \"mink\",\n  c358: \"polecat, fitch, foulmart, foumart, Mustela putorius\",\n  c359: \"black-footed ferret, ferret, Mustela nigripes\",\n  c360: \"otter\",\n  c361: \"skunk, polecat, wood pussy\",\n  c362: \"badger\",\n  c363: \"armadillo\",\n  c364: \"three-toed sloth, ai, Bradypus tridactylus\",\n  c365: \"orangutan, orang, orangutang, Pongo pygmaeus\",\n  c366: \"gorilla, Gorilla gorilla\",\n  c367: \"chimpanzee, chimp, Pan troglodytes\",\n  c368: \"gibbon, Hylobates lar\",\n  c369: \"siamang, Hylobates syndactylus, Symphalangus syndactylus\",\n  c370: \"guenon, guenon monkey\",\n  c371: \"patas, hussar monkey, Erythrocebus patas\",\n  c372: \"baboon\",\n  c373: \"macaque\",\n  c374: \"langur\",\n  c375: \"colobus, colobus monkey\",\n  c376: \"proboscis monkey, Nasalis larvatus\",\n  c377: \"marmoset\",\n  c378: \"capuchin, ringtail, Cebus capucinus\",\n  c379: \"howler monkey, howler\",\n  c380: \"titi, titi monkey\",\n  c381: \"spider monkey, Ateles geoffroyi\",\n  c382: \"squirrel monkey, Saimiri sciureus\",\n  c383: \"Madagascar cat, ring-tailed lemur, Lemur catta\",\n  c384: \"indri, indris, Indri indri, Indri brevicaudatus\",\n  c385: \"Indian elephant, Elephas maximus\",\n  c386: \"African elephant, Loxodonta africana\",\n  c387: \"lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens\",\n  c388: \"giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca\",\n  c389: \"barracouta, snoek\",\n  c390: \"eel\",\n  c391: \"coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch\",\n  c392: \"rock beauty, Holocanthus tricolor\",\n  c393: \"anemone fish\",\n  c394: \"sturgeon\",\n  c395: \"gar, garfish, garpike, billfish, Lepisosteus osseus\",\n  c396: \"lionfish\",\n  c397: \"puffer, pufferfish, blowfish, globefish\",\n  c398: \"abacus\",\n  c399: \"abaya\",\n  c400: \"academic gown, academic robe, judge's robe\",\n  c401: \"accordion, piano accordion, squeeze box\",\n  c402: \"acoustic guitar\",\n  c403: \"aircraft carrier, carrier, flattop, attack aircraft carrier\",\n  c404: \"airliner\",\n  c405: \"airship, dirigible\",\n  c406: \"altar\",\n  c407: \"ambulance\",\n  c408: \"amphibian, amphibious vehicle\",\n  c409: \"analog clock\",\n  c410: \"apiary, bee house\",\n  c411: \"apron\",\n  c412: \"ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin\",\n  c413: \"assault rifle, assault gun\",\n  c414: \"backpack, back pack, knapsack, packsack, rucksack, haversack\",\n  c415: \"bakery, bakeshop, bakehouse\",\n  c416: \"balance beam, beam\",\n  c417: \"balloon\",\n  c418: \"ballpoint, ballpoint pen, ballpen, Biro\",\n  c419: \"Band Aid\",\n  c420: \"banjo\",\n  c421: \"bannister, banister, balustrade, balusters, handrail\",\n  c422: \"barbell\",\n  c423: \"barber chair\",\n  c424: \"barbershop\",\n  c425: \"barn\",\n  c426: \"barometer\",\n  c427: \"barrel, cask\",\n  c428: \"barrow, garden cart, lawn cart, wheelbarrow\",\n  c429: \"baseball\",\n  c430: \"basketball\",\n  c431: \"bassinet\",\n  c432: \"bassoon\",\n  c433: \"bathing cap, swimming cap\",\n  c434: \"bath towel\",\n  c435: \"bathtub, bathing tub, bath, tub\",\n  c436: \"beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon\",\n  c437: \"beacon, lighthouse, beacon light, pharos\",\n  c438: \"beaker\",\n  c439: \"bearskin, busby, shako\",\n  c440: \"beer bottle\",\n  c441: \"beer glass\",\n  c442: \"bell cote, bell cot\",\n  c443: \"bib\",\n  c444: \"bicycle-built-for-two, tandem bicycle, tandem\",\n  c445: \"bikini, two-piece\",\n  c446: \"binder, ring-binder\",\n  c447: \"binoculars, field glasses, opera glasses\",\n  c448: \"birdhouse\",\n  c449: \"boathouse\",\n  c450: \"bobsled, bobsleigh, bob\",\n  c451: \"bolo tie, bolo, bola tie, bola\",\n  c452: \"bonnet, poke bonnet\",\n  c453: \"bookcase\",\n  c454: \"bookshop, bookstore, bookstall\",\n  c455: \"bottlecap\",\n  c456: \"bow\",\n  c457: \"bow tie, bow-tie, bowtie\",\n  c458: \"brass, memorial tablet, plaque\",\n  c459: \"brassiere, bra, bandeau\",\n  c460: \"breakwater, groin, groyne, mole, bulwark, seawall, jetty\",\n  c461: \"breastplate, aegis, egis\",\n  c462: \"broom\",\n  c463: \"bucket, pail\",\n  c464: \"buckle\",\n  c465: \"bulletproof vest\",\n  c466: \"bullet train, bullet\",\n  c467: \"butcher shop, meat market\",\n  c468: \"cab, hack, taxi, taxicab\",\n  c469: \"caldron, cauldron\",\n  c470: \"candle, taper, wax light\",\n  c471: \"cannon\",\n  c472: \"canoe\",\n  c473: \"can opener, tin opener\",\n  c474: \"cardigan\",\n  c475: \"car mirror\",\n  c476: \"carousel, carrousel, merry-go-round, roundabout, whirligig\",\n  c477: \"carpenter's kit, tool kit\",\n  c478: \"carton\",\n  c479: \"car wheel\",\n  c480: \"cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM\",\n  c481: \"cassette\",\n  c482: \"cassette player\",\n  c483: \"castle\",\n  c484: \"catamaran\",\n  c485: \"CD player\",\n  c486: \"cello, violoncello\",\n  c487: \"cellular telephone, cellular phone, cellphone, cell, mobile phone\",\n  c488: \"chain\",\n  c489: \"chainlink fence\",\n  c490: \"chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour\",\n  c491: \"chain saw, chainsaw\",\n  c492: \"chest\",\n  c493: \"chiffonier, commode\",\n  c494: \"chime, bell, gong\",\n  c495: \"china cabinet, china closet\",\n  c496: \"Christmas stocking\",\n  c497: \"church, church building\",\n  c498: \"cinema, movie theater, movie theatre, movie house, picture palace\",\n  c499: \"cleaver, meat cleaver, chopper\",\n  c500: \"cliff dwelling\",\n  c501: \"cloak\",\n  c502: \"clog, geta, patten, sabot\",\n  c503: \"cocktail shaker\",\n  c504: \"coffee mug\",\n  c505: \"coffeepot\",\n  c506: \"coil, spiral, volute, whorl, helix\",\n  c507: \"combination lock\",\n  c508: \"computer keyboard, keypad\",\n  c509: \"confectionery, confectionary, candy store\",\n  c510: \"container ship, containership, container vessel\",\n  c511: \"convertible\",\n  c512: \"corkscrew, bottle screw\",\n  c513: \"cornet, horn, trumpet, trump\",\n  c514: \"cowboy boot\",\n  c515: \"cowboy hat, ten-gallon hat\",\n  c516: \"cradle\",\n  c517: \"crane\",\n  c518: \"crash helmet\",\n  c519: \"crate\",\n  c520: \"crib, cot\",\n  c521: \"Crock Pot\",\n  c522: \"croquet ball\",\n  c523: \"crutch\",\n  c524: \"cuirass\",\n  c525: \"dam, dike, dyke\",\n  c526: \"desk\",\n  c527: \"desktop computer\",\n  c528: \"dial telephone, dial phone\",\n  c529: \"diaper, nappy, napkin\",\n  c530: \"digital clock\",\n  c531: \"digital watch\",\n  c532: \"dining table, board\",\n  c533: \"dishrag, dishcloth\",\n  c534: \"dishwasher, dish washer, dishwashing machine\",\n  c535: \"disk brake, disc brake\",\n  c536: \"dock, dockage, docking facility\",\n  c537: \"dogsled, dog sled, dog sleigh\",\n  c538: \"dome\",\n  c539: \"doormat, welcome mat\",\n  c540: \"drilling platform, offshore rig\",\n  c541: \"drum, membranophone, tympan\",\n  c542: \"drumstick\",\n  c543: \"dumbbell\",\n  c544: \"Dutch oven\",\n  c545: \"electric fan, blower\",\n  c546: \"electric guitar\",\n  c547: \"electric locomotive\",\n  c548: \"entertainment center\",\n  c549: \"envelope\",\n  c550: \"espresso maker\",\n  c551: \"face powder\",\n  c552: \"feather boa, boa\",\n  c553: \"file, file cabinet, filing cabinet\",\n  c554: \"fireboat\",\n  c555: \"fire engine, fire truck\",\n  c556: \"fire screen, fireguard\",\n  c557: \"flagpole, flagstaff\",\n  c558: \"flute, transverse flute\",\n  c559: \"folding chair\",\n  c560: \"football helmet\",\n  c561: \"forklift\",\n  c562: \"fountain\",\n  c563: \"fountain pen\",\n  c564: \"four-poster\",\n  c565: \"freight car\",\n  c566: \"French horn, horn\",\n  c567: \"frying pan, frypan, skillet\",\n  c568: \"fur coat\",\n  c569: \"garbage truck, dustcart\",\n  c570: \"gasmask, respirator, gas helmet\",\n  c571: \"gas pump, gasoline pump, petrol pump, island dispenser\",\n  c572: \"goblet\",\n  c573: \"go-kart\",\n  c574: \"golf ball\",\n  c575: \"golfcart, golf cart\",\n  c576: \"gondola\",\n  c577: \"gong, tam-tam\",\n  c578: \"gown\",\n  c579: \"grand piano, grand\",\n  c580: \"greenhouse, nursery, glasshouse\",\n  c581: \"grille, radiator grille\",\n  c582: \"grocery store, grocery, food market, market\",\n  c583: \"guillotine\",\n  c584: \"hair slide\",\n  c585: \"hair spray\",\n  c586: \"half track\",\n  c587: \"hammer\",\n  c588: \"hamper\",\n  c589: \"hand blower, blow dryer, blow drier, hair dryer, hair drier\",\n  c590: \"hand-held computer, hand-held microcomputer\",\n  c591: \"handkerchief, hankie, hanky, hankey\",\n  c592: \"hard disc, hard disk, fixed disk\",\n  c593: \"harmonica, mouth organ, harp, mouth harp\",\n  c594: \"harp\",\n  c595: \"harvester, reaper\",\n  c596: \"hatchet\",\n  c597: \"holster\",\n  c598: \"home theater, home theatre\",\n  c599: \"honeycomb\",\n  c600: \"hook, claw\",\n  c601: \"hoopskirt, crinoline\",\n  c602: \"horizontal bar, high bar\",\n  c603: \"horse cart, horse-cart\",\n  c604: \"hourglass\",\n  c605: \"iPod\",\n  c606: \"iron, smoothing iron\",\n  c607: \"jack-o'-lantern\",\n  c608: \"jean, blue jean, denim\",\n  c609: \"jeep, landrover\",\n  c610: \"jersey, T-shirt, tee shirt\",\n  c611: \"jigsaw puzzle\",\n  c612: \"jinrikisha, ricksha, rickshaw\",\n  c613: \"joystick\",\n  c614: \"kimono\",\n  c615: \"knee pad\",\n  c616: \"knot\",\n  c617: \"lab coat, laboratory coat\",\n  c618: \"ladle\",\n  c619: \"lampshade, lamp shade\",\n  c620: \"laptop, laptop computer\",\n  c621: \"lawn mower, mower\",\n  c622: \"lens cap, lens cover\",\n  c623: \"letter opener, paper knife, paperknife\",\n  c624: \"library\",\n  c625: \"lifeboat\",\n  c626: \"lighter, light, igniter, ignitor\",\n  c627: \"limousine, limo\",\n  c628: \"liner, ocean liner\",\n  c629: \"lipstick, lip rouge\",\n  c630: \"Loafer\",\n  c631: \"lotion\",\n  c632: \"loudspeaker, speaker, speaker unit, loudspeaker system, speaker system\",\n  c633: \"loupe, jeweler's loupe\",\n  c634: \"lumbermill, sawmill\",\n  c635: \"magnetic compass\",\n  c636: \"mailbag, postbag\",\n  c637: \"mailbox, letter box\",\n  c638: \"maillot\",\n  c639: \"maillot, tank suit\",\n  c640: \"manhole cover\",\n  c641: \"maraca\",\n  c642: \"marimba, xylophone\",\n  c643: \"mask\",\n  c644: \"matchstick\",\n  c645: \"maypole\",\n  c646: \"maze, labyrinth\",\n  c647: \"measuring cup\",\n  c648: \"medicine chest, medicine cabinet\",\n  c649: \"megalith, megalithic structure\",\n  c650: \"microphone, mike\",\n  c651: \"microwave, microwave oven\",\n  c652: \"military uniform\",\n  c653: \"milk can\",\n  c654: \"minibus\",\n  c655: \"miniskirt, mini\",\n  c656: \"minivan\",\n  c657: \"missile\",\n  c658: \"mitten\",\n  c659: \"mixing bowl\",\n  c660: \"mobile home, manufactured home\",\n  c661: \"Model T\",\n  c662: \"modem\",\n  c663: \"monastery\",\n  c664: \"monitor\",\n  c665: \"moped\",\n  c666: \"mortar\",\n  c667: \"mortarboard\",\n  c668: \"mosque\",\n  c669: \"mosquito net\",\n  c670: \"motor scooter, scooter\",\n  c671: \"mountain bike, all-terrain bike, off-roader\",\n  c672: \"mountain tent\",\n  c673: \"mouse, computer mouse\",\n  c674: \"mousetrap\",\n  c675: \"moving van\",\n  c676: \"muzzle\",\n  c677: \"nail\",\n  c678: \"neck brace\",\n  c679: \"necklace\",\n  c680: \"nipple\",\n  c681: \"notebook, notebook computer\",\n  c682: \"obelisk\",\n  c683: \"oboe, hautboy, hautbois\",\n  c684: \"ocarina, sweet potato\",\n  c685: \"odometer, hodometer, mileometer, milometer\",\n  c686: \"oil filter\",\n  c687: \"organ, pipe organ\",\n  c688: \"oscilloscope, scope, cathode-ray oscilloscope, CRO\",\n  c689: \"overskirt\",\n  c690: \"oxcart\",\n  c691: \"oxygen mask\",\n  c692: \"packet\",\n  c693: \"paddle, boat paddle\",\n  c694: \"paddlewheel, paddle wheel\",\n  c695: \"padlock\",\n  c696: \"paintbrush\",\n  c697: \"pajama, pyjama, pj's, jammies\",\n  c698: \"palace\",\n  c699: \"panpipe, pandean pipe, syrinx\",\n  c700: \"paper towel\",\n  c701: \"parachute, chute\",\n  c702: \"parallel bars, bars\",\n  c703: \"park bench\",\n  c704: \"parking meter\",\n  c705: \"passenger car, coach, carriage\",\n  c706: \"patio, terrace\",\n  c707: \"pay-phone, pay-station\",\n  c708: \"pedestal, plinth, footstall\",\n  c709: \"pencil box, pencil case\",\n  c710: \"pencil sharpener\",\n  c711: \"perfume, essence\",\n  c712: \"Petri dish\",\n  c713: \"photocopier\",\n  c714: \"pick, plectrum, plectron\",\n  c715: \"pickelhaube\",\n  c716: \"picket fence, paling\",\n  c717: \"pickup, pickup truck\",\n  c718: \"pier\",\n  c719: \"piggy bank, penny bank\",\n  c720: \"pill bottle\",\n  c721: \"pillow\",\n  c722: \"ping-pong ball\",\n  c723: \"pinwheel\",\n  c724: \"pirate, pirate ship\",\n  c725: \"pitcher, ewer\",\n  c726: \"plane, carpenter's plane, woodworking plane\",\n  c727: \"planetarium\",\n  c728: \"plastic bag\",\n  c729: \"plate rack\",\n  c730: \"plow, plough\",\n  c731: \"plunger, plumber's helper\",\n  c732: \"Polaroid camera, Polaroid Land camera\",\n  c733: \"pole\",\n  c734: \"police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria\",\n  c735: \"poncho\",\n  c736: \"pool table, billiard table, snooker table\",\n  c737: \"pop bottle, soda bottle\",\n  c738: \"pot, flowerpot\",\n  c739: \"potter's wheel\",\n  c740: \"power drill\",\n  c741: \"prayer rug, prayer mat\",\n  c742: \"printer\",\n  c743: \"prison, prison house\",\n  c744: \"projectile, missile\",\n  c745: \"projector\",\n  c746: \"puck, hockey puck\",\n  c747: \"punching bag, punch bag, punching ball, punchball\",\n  c748: \"purse\",\n  c749: \"quill, quill pen\",\n  c750: \"quilt, comforter, comfort, puff\",\n  c751: \"racer, race car, racing car\",\n  c752: \"racket, racquet\",\n  c753: \"radiator\",\n  c754: \"radio, wireless\",\n  c755: \"radio telescope, radio reflector\",\n  c756: \"rain barrel\",\n  c757: \"recreational vehicle, RV, R.V.\",\n  c758: \"reel\",\n  c759: \"reflex camera\",\n  c760: \"refrigerator, icebox\",\n  c761: \"remote control, remote\",\n  c762: \"restaurant, eating house, eating place, eatery\",\n  c763: \"revolver, six-gun, six-shooter\",\n  c764: \"rifle\",\n  c765: \"rocking chair, rocker\",\n  c766: \"rotisserie\",\n  c767: \"rubber eraser, rubber, pencil eraser\",\n  c768: \"rugby ball\",\n  c769: \"rule, ruler\",\n  c770: \"running shoe\",\n  c771: \"safe\",\n  c772: \"safety pin\",\n  c773: \"saltshaker, salt shaker\",\n  c774: \"sandal\",\n  c775: \"sarong\",\n  c776: \"sax, saxophone\",\n  c777: \"scabbard\",\n  c778: \"scale, weighing machine\",\n  c779: \"school bus\",\n  c780: \"schooner\",\n  c781: \"scoreboard\",\n  c782: \"screen, CRT screen\",\n  c783: \"screw\",\n  c784: \"screwdriver\",\n  c785: \"seat belt, seatbelt\",\n  c786: \"sewing machine\",\n  c787: \"shield, buckler\",\n  c788: \"shoe shop, shoe-shop, shoe store\",\n  c789: \"shoji\",\n  c790: \"shopping basket\",\n  c791: \"shopping cart\",\n  c792: \"shovel\",\n  c793: \"shower cap\",\n  c794: \"shower curtain\",\n  c795: \"ski\",\n  c796: \"ski mask\",\n  c797: \"sleeping bag\",\n  c798: \"slide rule, slipstick\",\n  c799: \"sliding door\",\n  c800: \"slot, one-armed bandit\",\n  c801: \"snorkel\",\n  c802: \"snowmobile\",\n  c803: \"snowplow, snowplough\",\n  c804: \"soap dispenser\",\n  c805: \"soccer ball\",\n  c806: \"sock\",\n  c807: \"solar dish, solar collector, solar furnace\",\n  c808: \"sombrero\",\n  c809: \"soup bowl\",\n  c810: \"space bar\",\n  c811: \"space heater\",\n  c812: \"space shuttle\",\n  c813: \"spatula\",\n  c814: \"speedboat\",\n  c815: \"spider web, spider's web\",\n  c816: \"spindle\",\n  c817: \"sports car, sport car\",\n  c818: \"spotlight, spot\",\n  c819: \"stage\",\n  c820: \"steam locomotive\",\n  c821: \"steel arch bridge\",\n  c822: \"steel drum\",\n  c823: \"stethoscope\",\n  c824: \"stole\",\n  c825: \"stone wall\",\n  c826: \"stopwatch, stop watch\",\n  c827: \"stove\",\n  c828: \"strainer\",\n  c829: \"streetcar, tram, tramcar, trolley, trolley car\",\n  c830: \"stretcher\",\n  c831: \"studio couch, day bed\",\n  c832: \"stupa, tope\",\n  c833: \"submarine, pigboat, sub, U-boat\",\n  c834: \"suit, suit of clothes\",\n  c835: \"sundial\",\n  c836: \"sunglass\",\n  c837: \"sunglasses, dark glasses, shades\",\n  c838: \"sunscreen, sunblock, sun blocker\",\n  c839: \"suspension bridge\",\n  c840: \"swab, swob, mop\",\n  c841: \"sweatshirt\",\n  c842: \"swimming trunks, bathing trunks\",\n  c843: \"swing\",\n  c844: \"switch, electric switch, electrical switch\",\n  c845: \"syringe\",\n  c846: \"table lamp\",\n  c847: \"tank, army tank, armored combat vehicle, armoured combat vehicle\",\n  c848: \"tape player\",\n  c849: \"teapot\",\n  c850: \"teddy, teddy bear\",\n  c851: \"television, television system\",\n  c852: \"tennis ball\",\n  c853: \"thatch, thatched roof\",\n  c854: \"theater curtain, theatre curtain\",\n  c855: \"thimble\",\n  c856: \"thresher, thrasher, threshing machine\",\n  c857: \"throne\",\n  c858: \"tile roof\",\n  c859: \"toaster\",\n  c860: \"tobacco shop, tobacconist shop, tobacconist\",\n  c861: \"toilet seat\",\n  c862: \"torch\",\n  c863: \"totem pole\",\n  c864: \"tow truck, tow car, wrecker\",\n  c865: \"toyshop\",\n  c866: \"tractor\",\n  c867: \"trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi\",\n  c868: \"tray\",\n  c869: \"trench coat\",\n  c870: \"tricycle, trike, velocipede\",\n  c871: \"trimaran\",\n  c872: \"tripod\",\n  c873: \"triumphal arch\",\n  c874: \"trolleybus, trolley coach, trackless trolley\",\n  c875: \"trombone\",\n  c876: \"tub, vat\",\n  c877: \"turnstile\",\n  c878: \"typewriter keyboard\",\n  c879: \"umbrella\",\n  c880: \"unicycle, monocycle\",\n  c881: \"upright, upright piano\",\n  c882: \"vacuum, vacuum cleaner\",\n  c883: \"vase\",\n  c884: \"vault\",\n  c885: \"velvet\",\n  c886: \"vending machine\",\n  c887: \"vestment\",\n  c888: \"viaduct\",\n  c889: \"violin, fiddle\",\n  c890: \"volleyball\",\n  c891: \"waffle iron\",\n  c892: \"wall clock\",\n  c893: \"wallet, billfold, notecase, pocketbook\",\n  c894: \"wardrobe, closet, press\",\n  c895: \"warplane, military plane\",\n  c896: \"washbasin, handbasin, washbowl, lavabo, wash-hand basin\",\n  c897: \"washer, automatic washer, washing machine\",\n  c898: \"water bottle\",\n  c899: \"water jug\",\n  c900: \"water tower\",\n  c901: \"whiskey jug\",\n  c902: \"whistle\",\n  c903: \"wig\",\n  c904: \"window screen\",\n  c905: \"window shade\",\n  c906: \"Windsor tie\",\n  c907: \"wine bottle\",\n  c908: \"wing\",\n  c909: \"wok\",\n  c910: \"wooden spoon\",\n  c911: \"wool, woolen, woollen\",\n  c912: \"worm fence, snake fence, snake-rail fence, Virginia fence\",\n  c913: \"wreck\",\n  c914: \"yawl\",\n  c915: \"yurt\",\n  c916: \"web site, website, internet site, site\",\n  c917: \"comic book\",\n  c918: \"crossword puzzle, crossword\",\n  c919: \"street sign\",\n  c920: \"traffic light, traffic signal, stoplight\",\n  c921: \"book jacket, dust cover, dust jacket, dust wrapper\",\n  c922: \"menu\",\n  c923: \"plate\",\n  c924: \"guacamole\",\n  c925: \"consomme\",\n  c926: \"hot pot, hotpot\",\n  c927: \"trifle\",\n  c928: \"ice cream, icecream\",\n  c929: \"ice lolly, lolly, lollipop, popsicle\",\n  c930: \"French loaf\",\n  c931: \"bagel, beigel\",\n  c932: \"pretzel\",\n  c933: \"cheeseburger\",\n  c934: \"hotdog, hot dog, red hot\",\n  c935: \"mashed potato\",\n  c936: \"head cabbage\",\n  c937: \"broccoli\",\n  c938: \"cauliflower\",\n  c939: \"zucchini, courgette\",\n  c940: \"spaghetti squash\",\n  c941: \"acorn squash\",\n  c942: \"butternut squash\",\n  c943: \"cucumber, cuke\",\n  c944: \"artichoke, globe artichoke\",\n  c945: \"bell pepper\",\n  c946: \"cardoon\",\n  c947: \"mushroom\",\n  c948: \"Granny Smith\",\n  c949: \"strawberry\",\n  c950: \"orange\",\n  c951: \"lemon\",\n  c952: \"fig\",\n  c953: \"pineapple, ananas\",\n  c954: \"banana\",\n  c955: \"jackfruit, jak, jack\",\n  c956: \"custard apple\",\n  c957: \"pomegranate\",\n  c958: \"hay\",\n  c959: \"carbonara\",\n  c960: \"chocolate sauce, chocolate syrup\",\n  c961: \"dough\",\n  c962: \"meat loaf, meatloaf\",\n  c963: \"pizza, pizza pie\",\n  c964: \"potpie\",\n  c965: \"burrito\",\n  c966: \"red wine\",\n  c967: \"espresso\",\n  c968: \"cup\",\n  c969: \"eggnog\",\n  c970: \"alp\",\n  c971: \"bubble\",\n  c972: \"cliff, drop, drop-off\",\n  c973: \"coral reef\",\n  c974: \"geyser\",\n  c975: \"lakeside, lakeshore\",\n  c976: \"promontory, headland, head, foreland\",\n  c977: \"sandbar, sand bar\",\n  c978: \"seashore, coast, seacoast, sea-coast\",\n  c979: \"valley, vale\",\n  c980: \"volcano\",\n  c981: \"ballplayer, baseball player\",\n  c982: \"groom, bridegroom\",\n  c983: \"scuba diver\",\n  c984: \"rapeseed\",\n  c985: \"daisy\",\n  c986: \"yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum\",\n  c987: \"corn\",\n  c988: \"acorn\",\n  c989: \"hip, rose hip, rosehip\",\n  c990: \"buckeye, horse chestnut, conker\",\n  c991: \"coral fungus\",\n  c992: \"agaric\",\n  c993: \"gyromitra\",\n  c994: \"stinkhorn, carrion fungus\",\n  c995: \"earthstar\",\n  c996: \"hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa\",\n  c997: \"bolete\",\n  c998: \"ear, spike, capitulum\",\n  c999: \"toilet tissue, toilet paper, bathroom tissue\",\n};\n\nexport class Classifier {\n\n  // 图像显示尺寸结构体 { width: Number, height: Number }\n  displaySize;\n\n  // net inference session\n  session;\n\n  // is ready\n  ready;\n\n  // the predicted class\n  mPredClass = \"None\";\n\n  speedTime = 0.0;\n\n  modelInput = null;\n\n  constructor(displaySize) {\n    this.displaySize = {\n      width: displaySize.width,\n      height: displaySize.height,\n    };\n\n    this.modelInput = new Float32Array(modelWidth * modelHeight * modelChannel);\n  \n    this.ready = false;\n  }\n\n  load() {\n    return new Promise((resolve, reject) => {\n\n       const modelPath = `${wx.env.USER_DATA_PATH}/mobilenetv2-12.onnx`;\n\n       // 判断之前是否已经下载过onnx模型\n        wx.getFileSystemManager().access({\n          path: modelPath,\n          success: (res) =>\n          {\n            console.log(\"file already exist at: \" + modelPath)\n              this.createInferenceSession(modelPath).then(() =>\n              {\n                resolve();\n              })\n          },\n          fail: (res) => {\n            console.error(res)\n\n            wx.cloud.init();\n            console.log(\"begin download model\");\n\n            const cloudPath = 'cloud://containertest-0gmw3ulnd8d9bc7b.636f-containertest-0gmw3ulnd8d9bc7b-1258211818/mobilenetv2-12.onnx'\n            this.downloadFile(cloudPath, function(r) {\n              console.log(`下载进度：${r.progress}%，已下载${r.totalBytesWritten}B，共${r.totalBytesExpectedToWrite}B`)\n            }).then(result => {\n        \n              wx.getFileSystemManager().saveFile({\n                tempFilePath:result.tempFilePath,\n                filePath: modelPath,\n                success: (res) => { // 注册回调函数\n                  console.log(res)\n                  // const modelPath = res.savedFilePath +'/mobilenetv2-12.onnx'\n    \n                  const modelPath = res.savedFilePath;\n                  console.log(\"save onnx model at path: \" + modelPath)\n\n                  this.createInferenceSession(modelPath).then(() => {\n                    resolve();\n                  })\n                },\n                fail(res) {\n                  console.error(res)\n                  return\n                }\n              })\n        });\n          }\n        })\n    })\n  }\n\n  createInferenceSession(modelPath) {\n    return new Promise((resolve, reject) => {\n      this.session = wx.createInferenceSession({\n        model: modelPath,\n        /* 0: Lowest  precision e.g., LS16 + A16 + Winograd A16 + approx. math\n           1: Lower   precision e.g., LS16 + A16 + Winograd off + approx. math\n           2: Modest  precision e.g., LS16 + A32 + Winograd A32 + approx. math\n           3: Higher  precision e.g., LS32 + A32 + Winograd A32 + approx. math\n           4: Highest precision e.g., LS32 + A32 + Winograd A32 + precise math\n\n           Higher precision always require longer time to run session\n        */\n        precisionLevel : 4,\n        allowNPU : false,     // wheather use NPU for inference, only useful for IOS\n        allowQuantize: false, // wheather generate quantize model\n      });\n\n      // 监听error事件\n      this.session.onError((error) => {\n        console.error(error);\n        reject(error);\n      });\n      this.session.onLoad(() => {\n        this.ready = true;\n        resolve();\n      });\n    })\n  }\n\n  downloadFile(fileID, onCall = () => {}) {\n    return new Promise((resolve, reject) => {\n      const task = wx.cloud.downloadFile({\n        fileID,\n        success: res => resolve(res),\n        fail: e => {\n          const info = e.toString()\n          if (info.indexOf('abort') != -1) {\n            reject(new Error('【文件下载失败】中断下载'))\n          } else {\n            reject(new Error('【文件下载失败】网络或其他错误'))\n          }\n        }\n      })\n      task.onProgressUpdate((res) => {\n        if (onCall(res) == false) {\n          task.abort()\n        }\n      })\n    })\n  }\n\n  isReady() {\n    return this.ready;\n  }\n  \n  predClass() {\n    return this.mPredClass;\n  }\n\n  // input is rgba uint8 data\n  preProcess(frame, dstInput) {\n\n    return new Promise((resolve, reject) =>\n    {\n      const origData = new Uint8Array(frame.data);\n\n      const hRatio = frame.height / modelHeight;\n\n      const wRatio = frame.width / modelWidth;\n\n      // resize data to model input size, uint8 data to float32 data,\n      // and transpose from nhwc to nchw\n\n      const origHStride = frame.width * 4;\n      const origWStride = 4;\n    \n      const mean = [0.485, 0.456, 0.406]\n\n      const reverse_div = [4.367, 4.464, 4.444]  // reverse of std = [0.229, 0.224, 0.225]\n      const ratio = 1 / 255.0\n\n      const normalized_div = [ratio * reverse_div[0], ratio * reverse_div[1], ratio * reverse_div[2]];\n\n      const normalized_mean = [mean[0] * reverse_div[0], mean[1] * reverse_div[1], mean[2] * reverse_div[2]];\n\n      var idx = 0;\n      for (var c = 0; c < modelChannel; ++c)\n      {\n        for (var h = 0; h < modelHeight; ++h)\n        {\n          const origH = Math.round(h * hRatio);\n\n          const origHOffset = origH * origHStride;\n\n          for (var w = 0; w < modelWidth; ++w)\n          {\n            const origW = Math.round(w * wRatio);\n\n            const origIndex = origHOffset + origW * origWStride + c;\n\n            //var val = ((origData[origIndex] * ratio) - mean[c]) * reverse_div[c];\n\n            var val = origData[origIndex] * (normalized_div[c]) - normalized_mean[c];\n            dstInput[idx] = val;\n\n            idx++;\n          }\n        }\n      } \n\n      resolve();\n    });\n\n  }\n    // run inference and get the output\n  async detect(frame)\n  {\n    return new Promise((resolve, reject) =>\n    {\n      this.preProcess(frame, this.modelInput).then(() => {\n        const xinput = {\n          shape: [1, 3, 224, 224],  // Input data shape in NCHW\n          data: this.modelInput.buffer,\n          type: 'float32',  // Input data type\n        };\n\n        inferenceStart = new Date().getTime()\n\n        this.session.run({\n          // Here string \"input\" Should be the same with the input name in onnx file\n          \"input\": xinput,\n        })\n        .then((res) => {\n          inferenceEnd = new Date().getTime();\n   \n          this.speedTime = inferenceEnd - inferenceStart\n  \n          // Here use res.outputname.data, outputname \n          // Should be the same with the output name in onnx file\n          let num = new Float32Array(res.output.data)\n\n          var maxVar = num[0];\n  \n          var index = 0;\n  \n          for (var i = 1; i < num.length; ++i)\n          {\n            if (maxVar < num[i])\n            {\n              maxVar = num[i]   \n              index = i     \n            }\n          }\n\n          this.getClass(index);\n\n          resolve();\n        }).catch(error => alert(error.message));\n      })\n\n    });\n  }\n\n  getClass(index)\n  {  \n    const cIndex=`c${index}`\n    this.mPredClass = classNames[cIndex];\n  }\n\n  getTime()\n  {\n    return this.speedTime;\n  }\n  dispose() {\n    this.session.destroy();\n  }\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/mobilenet/index.js",
    "content": "// pages/mobilenet/index.ts\n\nimport { Classifier } from './classify'\n\nimport { FpsHelper } from '../../../../util/fps_helper'\n\nconst { appWidth, appHeight, benchmarkLevel } = getApp().globalData\n\nPage({\n  classifier: null,\n  ctx: null,\n  fpsHelper: null,\n\n  predicting: false,\n\n  // For Speed Test\n  constBuffer: null,\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    predClass: 'None',\n    classifier: null,\n    enableSpeedTest: false,\n    avgTime: 110.0,\n    minTime: 110.0\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad() {\n    if (this.data.enableSpeedTest) {\n      this.constBuffer = new Float32Array(3 * 224 * 224)\n    }\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n    this.ctx = wx.createCanvasContext('ssd1')\n    const context = wx.createCameraContext(this)\n    this.initClassifier()\n    this.fpsHelper = new FpsHelper()\n\n    const listener = context.onCameraFrame(frame => {\n      const fps = this.fpsHelper.getAverageFps()\n      console.log(`fps=${fps}`)\n\n      if (this.classifier && this.classifier.isReady() && !this.predicting) {\n        this.executeClassify(frame)\n      }\n    })\n    listener.start()\n    this.fpsHelper.reset()\n  },\n\n  /**\n   * 初始化 SSD models\n   */\n  initClassifier() {\n    wx.showLoading({ title: '模型正在加载...' })\n    this.classifier = new Classifier({ width: appWidth, height: appHeight })\n    this.classifier.load().then(() => {\n      wx.hideLoading()\n    }).catch(err => {\n      console.log('模型加载报错：', err)\n    })\n  },\n\n  /**\n   * 构建模型\n   */\n  async executeClassify(frame) {\n    this.predicting = true\n\n    if (this.classifier && this.classifier.isReady()) {\n      this.fpsHelper.updateFPS()\n\n      this.setData({\n        predClass: this.classifier.predClass(),\n        enableSpeedTest: this.data.enableSpeedTest\n      })\n\n      await this.classifier.detect(frame).then(() => {\n        this.setData({\n          predClass: this.classifier.predClass()\n        })\n      }).catch((err) => {\n        console.log(err)\n      })\n\n      if (this.data.enableSpeedTest) {\n        await this.inferSpeedTest()\n      }\n    }\n\n    this.predicting = false\n  },\n\n  async inferSpeedTest() {\n    console.log('runInferenceSession speed test start run===============================')\n\n    const xinput = {\n      shape: [1, 3, 224, 224],\n      data: this.constBuffer.buffer,\n      type: 'float32',\n    }\n\n    this.data.classifier = this.classifier\n\n    // warm up\n    for (let index = 0; index < 20; index++) {\n      await this.inferOnce(xinput, this.data)\n    }\n\n    for (let l = 0; l < 5; ++l) {\n      const beMs = new Date().getTime()\n\n      for (let index = 0; index < 100; index++) {\n        await this.inferOnce(xinput, this.data)\n      }\n\n      const afMs = new Date().getTime()\n\n      const avgTime = (afMs - beMs) / 100.0\n\n      let overall = 0.0\n      let minTime = 1000000.0\n\n      for (let index = 0; index < 100; index++) {\n        const beMsTmp = new Date().getTime()\n        await this.inferOnce(xinput, this.data)\n        const afMsTmp = new Date().getTime()\n        const tmpTime = (afMsTmp - beMsTmp)\n        if (minTime > tmpTime) {\n          minTime = tmpTime\n        }\n        overall += (afMsTmp - beMsTmp)\n      }\n\n      console.log('Inference min time: ', minTime)\n      console.log('Inference avg time: ', avgTime)\n\n      this.setData({\n        predClass: this.classifier.predClass(),\n        minTime,\n        avgTime,\n      })\n    }\n  },\n\n  inferOnce(xinput, data) {\n    return new Promise(function (resolve, reject) {\n      data.classifier.session.run({\n        input: xinput,\n      }).then(async function (res) {\n        resolve()\n      })\n    })\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n    if (this.classifier && this.classifier.isReady()) {\n      this.classifier.dispose()\n    }\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n    return {\n      title: '微信小程序 × MobileNet',\n      path: 'packageAPI/pages/ai/mobilenet/index',\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/mobilenet/index.json",
    "content": "{\n  \"disableScroll\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/mobilenet/index.less",
    "content": "/* packageAPI/pages/ai/mobilenet/index.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/mobilenet/index.wxml",
    "content": "<!--pages/mobilenet_int8/index.wxml-->\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <camera style=\"  width: 100%; height: 70vh;\" device-position=\"back\" flash=\"off\" frame-size=\"medium\">\n    <canvas  canvas-id=\"ssd1\"></canvas>\n  </camera>\n  <view style=\"margin: 30px auto; position: relative\"> 分类结果： {{predClass}}</view>  \n  <view style=\"margin: 30px auto; position: relative\" wx:if=\"{{enableSpeedTest}}\">\n    <text class=\"subtitle\"> 平均耗时(ms)： {{avgTime}}</text>\n    <text class=\"subtitle\"> 最小耗时(ms)： {{minTime}}</text>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/mobilenet/index.wxss",
    "content": "/* packageAPI/pages/ai/mobilenet/index.wxss */\n/* pages/mobilenet/index.wxss */\n.camera {\n  width: 100%;\n  height: 70vh;\n}\n\n.canvas {\n  width: 100%;\n  height: 100vh;\n}\n\n.textstyle {\n  color: #e0a165;\n  font-size: 28rpx;\n  line-height: 1.6;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/mobilenet_int8/classify.js",
    "content": "\nconst modelWidth = 224.0;\nconst modelHeight = 224.0;\nconst modelChannel = 3;\n\nvar inferenceStart;\nvar inferenceEnd;\n\nconst classNames = {\n  c0: \"tench, Tinca tinca\",\n  c1: \"goldfish, Carassius auratus\",\n  c2: \"great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias\",\n  c3: \"tiger shark, Galeocerdo cuvieri\",\n  c4: \"hammerhead, hammerhead shark\",\n  c5: \"electric ray, crampfish, numbfish, torpedo\",\n  c6: \"stingray\",\n  c7: \"cock\",\n  c8: \"hen\",\n  c9: \"ostrich, Struthio camelus\",\n  c10: \"brambling, Fringilla montifringilla\",\n  c11: \"goldfinch, Carduelis carduelis\",\n  c12: \"house finch, linnet, Carpodacus mexicanus\",\n  c13: \"junco, snowbird\",\n  c14: \"indigo bunting, indigo finch, indigo bird, Passerina cyanea\",\n  c15: \"robin, American robin, Turdus migratorius\",\n  c16: \"bulbul\",\n  c17: \"jay\",\n  c18: \"magpie\",\n  c19: \"chickadee\",\n  c20: \"water ouzel, dipper\",\n  c21: \"kite\",\n  c22: \"bald eagle, American eagle, Haliaeetus leucocephalus\",\n  c23: \"vulture\",\n  c24: \"great grey owl, great gray owl, Strix nebulosa\",\n  c25: \"European fire salamander, Salamandra salamandra\",\n  c26: \"common newt, Triturus vulgaris\",\n  c27: \"eft\",\n  c28: \"spotted salamander, Ambystoma maculatum\",\n  c29: \"axolotl, mud puppy, Ambystoma mexicanum\",\n  c30: \"bullfrog, Rana catesbeiana\",\n  c31: \"tree frog, tree-frog\",\n  c32: \"tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui\",\n  c33: \"loggerhead, loggerhead turtle, Caretta caretta\",\n  c34: \"leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea\",\n  c35: \"mud turtle\",\n  c36: \"terrapin\",\n  c37: \"box turtle, box tortoise\",\n  c38: \"banded gecko\",\n  c39: \"common iguana, iguana, Iguana iguana\",\n  c40: \"American chameleon, anole, Anolis carolinensis\",\n  c41: \"whiptail, whiptail lizard\",\n  c42: \"agama\",\n  c43: \"frilled lizard, Chlamydosaurus kingi\",\n  c44: \"alligator lizard\",\n  c45: \"Gila monster, Heloderma suspectum\",\n  c46: \"green lizard, Lacerta viridis\",\n  c47: \"African chameleon, Chamaeleo chamaeleon\",\n  c48: \"Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis\",\n  c49: \"African crocodile, Nile crocodile, Crocodylus niloticus\",\n  c50: \"American alligator, Alligator mississipiensis\",\n  c51: \"triceratops\",\n  c52: \"thunder snake, worm snake, Carphophis amoenus\",\n  c53: \"ringneck snake, ring-necked snake, ring snake\",\n  c54: \"hognose snake, puff adder, sand viper\",\n  c55: \"green snake, grass snake\",\n  c56: \"king snake, kingsnake\",\n  c57: \"garter snake, grass snake\",\n  c58: \"water snake\",\n  c59: \"vine snake\",\n  c60: \"night snake, Hypsiglena torquata\",\n  c61: \"boa constrictor, Constrictor constrictor\",\n  c62: \"rock python, rock snake, Python sebae\",\n  c63: \"Indian cobra, Naja naja\",\n  c64: \"green mamba\",\n  c65: \"sea snake\",\n  c66: \"horned viper, cerastes, sand viper, horned asp, Cerastes cornutus\",\n  c67: \"diamondback, diamondback rattlesnake, Crotalus adamanteus\",\n  c68: \"sidewinder, horned rattlesnake, Crotalus cerastes\",\n  c69: \"trilobite\",\n  c70: \"harvestman, daddy longlegs, Phalangium opilio\",\n  c71: \"scorpion\",\n  c72: \"black and gold garden spider, Argiope aurantia\",\n  c73: \"barn spider, Araneus cavaticus\",\n  c74: \"garden spider, Aranea diademata\",\n  c75: \"black widow, Latrodectus mactans\",\n  c76: \"tarantula\",\n  c77: \"wolf spider, hunting spider\",\n  c78: \"tick\",\n  c79: \"centipede\",\n  c80: \"black grouse\",\n  c81: \"ptarmigan\",\n  c82: \"ruffed grouse, partridge, Bonasa umbellus\",\n  c83: \"prairie chicken, prairie grouse, prairie fowl\",\n  c84: \"peacock\",\n  c85: \"quail\",\n  c86: \"partridge\",\n  c87: \"African grey, African gray, Psittacus erithacus\",\n  c88: \"macaw\",\n  c89: \"sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita\",\n  c90: \"lorikeet\",\n  c91: \"coucal\",\n  c92: \"bee eater\",\n  c93: \"hornbill\",\n  c94: \"hummingbird\",\n  c95: \"jacamar\",\n  c96: \"toucan\",\n  c97: \"drake\",\n  c98: \"red-breasted merganser, Mergus serrator\",\n  c99: \"goose\",\n  c100: \"black swan, Cygnus atratus\",\n  c101: \"tusker\",\n  c102: \"echidna, spiny anteater, anteater\",\n  c103: \"platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus\",\n  c104: \"wallaby, brush kangaroo\",\n  c105: \"koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus\",\n  c106: \"wombat\",\n  c107: \"jellyfish\",\n  c108: \"sea anemone, anemone\",\n  c109: \"brain coral\",\n  c110: \"flatworm, platyhelminth\",\n  c111: \"nematode, nematode worm, roundworm\",\n  c112: \"conch\",\n  c113: \"snail\",\n  c114: \"slug\",\n  c115: \"sea slug, nudibranch\",\n  c116: \"chiton, coat-of-mail shell, sea cradle, polyplacophore\",\n  c117: \"chambered nautilus, pearly nautilus, nautilus\",\n  c118: \"Dungeness crab, Cancer magister\",\n  c119: \"rock crab, Cancer irroratus\",\n  c120: \"fiddler crab\",\n  c121: \"king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica\",\n  c122: \"American lobster, Northern lobster, Maine lobster, Homarus americanus\",\n  c123: \"spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish\",\n  c124: \"crayfish, crawfish, crawdad, crawdaddy\",\n  c125: \"hermit crab\",\n  c126: \"isopod\",\n  c127: \"white stork, Ciconia ciconia\",\n  c128: \"black stork, Ciconia nigra\",\n  c129: \"spoonbill\",\n  c130: \"flamingo\",\n  c131: \"little blue heron, Egretta caerulea\",\n  c132: \"American egret, great white heron, Egretta albus\",\n  c133: \"bittern\",\n  c134: \"crane\",\n  c135: \"limpkin, Aramus pictus\",\n  c136: \"European gallinule, Porphyrio porphyrio\",\n  c137: \"American coot, marsh hen, mud hen, water hen, Fulica americana\",\n  c138: \"bustard\",\n  c139: \"ruddy turnstone, Arenaria interpres\",\n  c140: \"red-backed sandpiper, dunlin, Erolia alpina\",\n  c141: \"redshank, Tringa totanus\",\n  c142: \"dowitcher\",\n  c143: \"oystercatcher, oyster catcher\",\n  c144: \"pelican\",\n  c145: \"king penguin, Aptenodytes patagonica\",\n  c146: \"albatross, mollymawk\",\n  c147: \"grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus\",\n  c148: \"killer whale, killer, orca, grampus, sea wolf, Orcinus orca\",\n  c149: \"dugong, Dugong dugon\",\n  c150: \"sea lion\",\n  c151: \"Chihuahua\",\n  c152: \"Japanese spaniel\",\n  c153: \"Maltese dog, Maltese terrier, Maltese\",\n  c154: \"Pekinese, Pekingese, Peke\",\n  c155: \"Shih-Tzu\",\n  c156: \"Blenheim spaniel\",\n  c157: \"papillon\",\n  c158: \"toy terrier\",\n  c159: \"Rhodesian ridgeback\",\n  c160: \"Afghan hound, Afghan\",\n  c161: \"basset, basset hound\",\n  c162: \"beagle\",\n  c163: \"bloodhound, sleuthhound\",\n  c164: \"bluetick\",\n  c165: \"black-and-tan coonhound\",\n  c166: \"Walker hound, Walker foxhound\",\n  c167: \"English foxhound\",\n  c168: \"redbone\",\n  c169: \"borzoi, Russian wolfhound\",\n  c170: \"Irish wolfhound\",\n  c171: \"Italian greyhound\",\n  c172: \"whippet\",\n  c173: \"Ibizan hound, Ibizan Podenco\",\n  c174: \"Norwegian elkhound, elkhound\",\n  c175: \"otterhound, otter hound\",\n  c176: \"Saluki, gazelle hound\",\n  c177: \"Scottish deerhound, deerhound\",\n  c178: \"Weimaraner\",\n  c179: \"Staffordshire bullterrier, Staffordshire bull terrier\",\n  c180: \"American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier\",\n  c181: \"Bedlington terrier\",\n  c182: \"Border terrier\",\n  c183: \"Kerry blue terrier\",\n  c184: \"Irish terrier\",\n  c185: \"Norfolk terrier\",\n  c186: \"Norwich terrier\",\n  c187: \"Yorkshire terrier\",\n  c188: \"wire-haired fox terrier\",\n  c189: \"Lakeland terrier\",\n  c190: \"Sealyham terrier, Sealyham\",\n  c191: \"Airedale, Airedale terrier\",\n  c192: \"cairn, cairn terrier\",\n  c193: \"Australian terrier\",\n  c194: \"Dandie Dinmont, Dandie Dinmont terrier\",\n  c195: \"Boston bull, Boston terrier\",\n  c196: \"miniature schnauzer\",\n  c197: \"giant schnauzer\",\n  c198: \"standard schnauzer\",\n  c199: \"Scotch terrier, Scottish terrier, Scottie\",\n  c200: \"Tibetan terrier, chrysanthemum dog\",\n  c201: \"silky terrier, Sydney silky\",\n  c202: \"soft-coated wheaten terrier\",\n  c203: \"West Highland white terrier\",\n  c204: \"Lhasa, Lhasa apso\",\n  c205: \"flat-coated retriever\",\n  c206: \"curly-coated retriever\",\n  c207: \"golden retriever\",\n  c208: \"Labrador retriever\",\n  c209: \"Chesapeake Bay retriever\",\n  c210: \"German short-haired pointer\",\n  c211: \"vizsla, Hungarian pointer\",\n  c212: \"English setter\",\n  c213: \"Irish setter, red setter\",\n  c214: \"Gordon setter\",\n  c215: \"Brittany spaniel\",\n  c216: \"clumber, clumber spaniel\",\n  c217: \"English springer, English springer spaniel\",\n  c218: \"Welsh springer spaniel\",\n  c219: \"cocker spaniel, English cocker spaniel, cocker\",\n  c220: \"Sussex spaniel\",\n  c221: \"Irish water spaniel\",\n  c222: \"kuvasz\",\n  c223: \"schipperke\",\n  c224: \"groenendael\",\n  c225: \"malinois\",\n  c226: \"briard\",\n  c227: \"kelpie\",\n  c228: \"komondor\",\n  c229: \"Old English sheepdog, bobtail\",\n  c230: \"Shetland sheepdog, Shetland sheep dog, Shetland\",\n  c231: \"collie\",\n  c232: \"Border collie\",\n  c233: \"Bouvier des Flandres, Bouviers des Flandres\",\n  c234: \"Rottweiler\",\n  c235: \"German shepherd, German shepherd dog, German police dog, alsatian\",\n  c236: \"Doberman, Doberman pinscher\",\n  c237: \"miniature pinscher\",\n  c238: \"Greater Swiss Mountain dog\",\n  c239: \"Bernese mountain dog\",\n  c240: \"Appenzeller\",\n  c241: \"EntleBucher\",\n  c242: \"boxer\",\n  c243: \"bull mastiff\",\n  c244: \"Tibetan mastiff\",\n  c245: \"French bulldog\",\n  c246: \"Great Dane\",\n  c247: \"Saint Bernard, St Bernard\",\n  c248: \"Eskimo dog, husky\",\n  c249: \"malamute, malemute, Alaskan malamute\",\n  c250: \"Siberian husky\",\n  c251: \"dalmatian, coach dog, carriage dog\",\n  c252: \"affenpinscher, monkey pinscher, monkey dog\",\n  c253: \"basenji\",\n  c254: \"pug, pug-dog\",\n  c255: \"Leonberg\",\n  c256: \"Newfoundland, Newfoundland dog\",\n  c257: \"Great Pyrenees\",\n  c258: \"Samoyed, Samoyede\",\n  c259: \"Pomeranian\",\n  c260: \"chow, chow chow\",\n  c261: \"keeshond\",\n  c262: \"Brabancon griffon\",\n  c263: \"Pembroke, Pembroke Welsh corgi\",\n  c264: \"Cardigan, Cardigan Welsh corgi\",\n  c265: \"toy poodle\",\n  c266: \"miniature poodle\",\n  c267: \"standard poodle\",\n  c268: \"Mexican hairless\",\n  c269: \"timber wolf, grey wolf, gray wolf, Canis lupus\",\n  c270: \"white wolf, Arctic wolf, Canis lupus tundrarum\",\n  c271: \"red wolf, maned wolf, Canis rufus, Canis niger\",\n  c272: \"coyote, prairie wolf, brush wolf, Canis latrans\",\n  c273: \"dingo, warrigal, warragal, Canis dingo\",\n  c274: \"dhole, Cuon alpinus\",\n  c275: \"African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus\",\n  c276: \"hyena, hyaena\",\n  c277: \"red fox, Vulpes vulpes\",\n  c278: \"kit fox, Vulpes macrotis\",\n  c279: \"Arctic fox, white fox, Alopex lagopus\",\n  c280: \"grey fox, gray fox, Urocyon cinereoargenteus\",\n  c281: \"tabby, tabby cat\",\n  c282: \"tiger cat\",\n  c283: \"Persian cat\",\n  c284: \"Siamese cat, Siamese\",\n  c285: \"Egyptian cat\",\n  c286: \"cougar, puma, catamount, mountain lion, painter, panther, Felis concolor\",\n  c287: \"lynx, catamount\",\n  c288: \"leopard, Panthera pardus\",\n  c289: \"snow leopard, ounce, Panthera uncia\",\n  c290: \"jaguar, panther, Panthera onca, Felis onca\",\n  c291: \"lion, king of beasts, Panthera leo\",\n  c292: \"tiger, Panthera tigris\",\n  c293: \"cheetah, chetah, Acinonyx jubatus\",\n  c294: \"brown bear, bruin, Ursus arctos\",\n  c295: \"American black bear, black bear, Ursus americanus, Euarctos americanus\",\n  c296: \"ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus\",\n  c297: \"sloth bear, Melursus ursinus, Ursus ursinus\",\n  c298: \"mongoose\",\n  c299: \"meerkat, mierkat\",\n  c300: \"tiger beetle\",\n  c301: \"ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle\",\n  c302: \"ground beetle, carabid beetle\",\n  c303: \"long-horned beetle, longicorn, longicorn beetle\",\n  c304: \"leaf beetle, chrysomelid\",\n  c305: \"dung beetle\",\n  c306: \"rhinoceros beetle\",\n  c307: \"weevil\",\n  c308: \"fly\",\n  c309: \"bee\",\n  c310: \"ant, emmet, pismire\",\n  c311: \"grasshopper, hopper\",\n  c312: \"cricket\",\n  c313: \"walking stick, walkingstick, stick insect\",\n  c314: \"cockroach, roach\",\n  c315: \"mantis, mantid\",\n  c316: \"cicada, cicala\",\n  c317: \"leafhopper\",\n  c318: \"lacewing, lacewing fly\",\n  c319: \"dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk\",\n  c320: \"damselfly\",\n  c321: \"admiral\",\n  c322: \"ringlet, ringlet butterfly\",\n  c323: \"monarch, monarch butterfly, milkweed butterfly, Danaus plexippus\",\n  c324: \"cabbage butterfly\",\n  c325: \"sulphur butterfly, sulfur butterfly\",\n  c326: \"lycaenid, lycaenid butterfly\",\n  c327: \"starfish, sea star\",\n  c328: \"sea urchin\",\n  c329: \"sea cucumber, holothurian\",\n  c330: \"wood rabbit, cottontail, cottontail rabbit\",\n  c331: \"hare\",\n  c332: \"Angora, Angora rabbit\",\n  c333: \"hamster\",\n  c334: \"porcupine, hedgehog\",\n  c335: \"fox squirrel, eastern fox squirrel, Sciurus niger\",\n  c336: \"marmot\",\n  c337: \"beaver\",\n  c338: \"guinea pig, Cavia cobaya\",\n  c339: \"sorrel\",\n  c340: \"zebra\",\n  c341: \"hog, pig, grunter, squealer, Sus scrofa\",\n  c342: \"wild boar, boar, Sus scrofa\",\n  c343: \"warthog\",\n  c344: \"hippopotamus, hippo, river horse, Hippopotamus amphibius\",\n  c345: \"ox\",\n  c346: \"water buffalo, water ox, Asiatic buffalo, Bubalus bubalis\",\n  c347: \"bison\",\n  c348: \"ram, tup\",\n  c349: \"bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis\",\n  c350: \"ibex, Capra ibex\",\n  c351: \"hartebeest\",\n  c352: \"impala, Aepyceros melampus\",\n  c353: \"gazelle\",\n  c354: \"Arabian camel, dromedary, Camelus dromedarius\",\n  c355: \"llama\",\n  c356: \"weasel\",\n  c357: \"mink\",\n  c358: \"polecat, fitch, foulmart, foumart, Mustela putorius\",\n  c359: \"black-footed ferret, ferret, Mustela nigripes\",\n  c360: \"otter\",\n  c361: \"skunk, polecat, wood pussy\",\n  c362: \"badger\",\n  c363: \"armadillo\",\n  c364: \"three-toed sloth, ai, Bradypus tridactylus\",\n  c365: \"orangutan, orang, orangutang, Pongo pygmaeus\",\n  c366: \"gorilla, Gorilla gorilla\",\n  c367: \"chimpanzee, chimp, Pan troglodytes\",\n  c368: \"gibbon, Hylobates lar\",\n  c369: \"siamang, Hylobates syndactylus, Symphalangus syndactylus\",\n  c370: \"guenon, guenon monkey\",\n  c371: \"patas, hussar monkey, Erythrocebus patas\",\n  c372: \"baboon\",\n  c373: \"macaque\",\n  c374: \"langur\",\n  c375: \"colobus, colobus monkey\",\n  c376: \"proboscis monkey, Nasalis larvatus\",\n  c377: \"marmoset\",\n  c378: \"capuchin, ringtail, Cebus capucinus\",\n  c379: \"howler monkey, howler\",\n  c380: \"titi, titi monkey\",\n  c381: \"spider monkey, Ateles geoffroyi\",\n  c382: \"squirrel monkey, Saimiri sciureus\",\n  c383: \"Madagascar cat, ring-tailed lemur, Lemur catta\",\n  c384: \"indri, indris, Indri indri, Indri brevicaudatus\",\n  c385: \"Indian elephant, Elephas maximus\",\n  c386: \"African elephant, Loxodonta africana\",\n  c387: \"lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens\",\n  c388: \"giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca\",\n  c389: \"barracouta, snoek\",\n  c390: \"eel\",\n  c391: \"coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch\",\n  c392: \"rock beauty, Holocanthus tricolor\",\n  c393: \"anemone fish\",\n  c394: \"sturgeon\",\n  c395: \"gar, garfish, garpike, billfish, Lepisosteus osseus\",\n  c396: \"lionfish\",\n  c397: \"puffer, pufferfish, blowfish, globefish\",\n  c398: \"abacus\",\n  c399: \"abaya\",\n  c400: \"academic gown, academic robe, judge's robe\",\n  c401: \"accordion, piano accordion, squeeze box\",\n  c402: \"acoustic guitar\",\n  c403: \"aircraft carrier, carrier, flattop, attack aircraft carrier\",\n  c404: \"airliner\",\n  c405: \"airship, dirigible\",\n  c406: \"altar\",\n  c407: \"ambulance\",\n  c408: \"amphibian, amphibious vehicle\",\n  c409: \"analog clock\",\n  c410: \"apiary, bee house\",\n  c411: \"apron\",\n  c412: \"ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin\",\n  c413: \"assault rifle, assault gun\",\n  c414: \"backpack, back pack, knapsack, packsack, rucksack, haversack\",\n  c415: \"bakery, bakeshop, bakehouse\",\n  c416: \"balance beam, beam\",\n  c417: \"balloon\",\n  c418: \"ballpoint, ballpoint pen, ballpen, Biro\",\n  c419: \"Band Aid\",\n  c420: \"banjo\",\n  c421: \"bannister, banister, balustrade, balusters, handrail\",\n  c422: \"barbell\",\n  c423: \"barber chair\",\n  c424: \"barbershop\",\n  c425: \"barn\",\n  c426: \"barometer\",\n  c427: \"barrel, cask\",\n  c428: \"barrow, garden cart, lawn cart, wheelbarrow\",\n  c429: \"baseball\",\n  c430: \"basketball\",\n  c431: \"bassinet\",\n  c432: \"bassoon\",\n  c433: \"bathing cap, swimming cap\",\n  c434: \"bath towel\",\n  c435: \"bathtub, bathing tub, bath, tub\",\n  c436: \"beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon\",\n  c437: \"beacon, lighthouse, beacon light, pharos\",\n  c438: \"beaker\",\n  c439: \"bearskin, busby, shako\",\n  c440: \"beer bottle\",\n  c441: \"beer glass\",\n  c442: \"bell cote, bell cot\",\n  c443: \"bib\",\n  c444: \"bicycle-built-for-two, tandem bicycle, tandem\",\n  c445: \"bikini, two-piece\",\n  c446: \"binder, ring-binder\",\n  c447: \"binoculars, field glasses, opera glasses\",\n  c448: \"birdhouse\",\n  c449: \"boathouse\",\n  c450: \"bobsled, bobsleigh, bob\",\n  c451: \"bolo tie, bolo, bola tie, bola\",\n  c452: \"bonnet, poke bonnet\",\n  c453: \"bookcase\",\n  c454: \"bookshop, bookstore, bookstall\",\n  c455: \"bottlecap\",\n  c456: \"bow\",\n  c457: \"bow tie, bow-tie, bowtie\",\n  c458: \"brass, memorial tablet, plaque\",\n  c459: \"brassiere, bra, bandeau\",\n  c460: \"breakwater, groin, groyne, mole, bulwark, seawall, jetty\",\n  c461: \"breastplate, aegis, egis\",\n  c462: \"broom\",\n  c463: \"bucket, pail\",\n  c464: \"buckle\",\n  c465: \"bulletproof vest\",\n  c466: \"bullet train, bullet\",\n  c467: \"butcher shop, meat market\",\n  c468: \"cab, hack, taxi, taxicab\",\n  c469: \"caldron, cauldron\",\n  c470: \"candle, taper, wax light\",\n  c471: \"cannon\",\n  c472: \"canoe\",\n  c473: \"can opener, tin opener\",\n  c474: \"cardigan\",\n  c475: \"car mirror\",\n  c476: \"carousel, carrousel, merry-go-round, roundabout, whirligig\",\n  c477: \"carpenter's kit, tool kit\",\n  c478: \"carton\",\n  c479: \"car wheel\",\n  c480: \"cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM\",\n  c481: \"cassette\",\n  c482: \"cassette player\",\n  c483: \"castle\",\n  c484: \"catamaran\",\n  c485: \"CD player\",\n  c486: \"cello, violoncello\",\n  c487: \"cellular telephone, cellular phone, cellphone, cell, mobile phone\",\n  c488: \"chain\",\n  c489: \"chainlink fence\",\n  c490: \"chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour\",\n  c491: \"chain saw, chainsaw\",\n  c492: \"chest\",\n  c493: \"chiffonier, commode\",\n  c494: \"chime, bell, gong\",\n  c495: \"china cabinet, china closet\",\n  c496: \"Christmas stocking\",\n  c497: \"church, church building\",\n  c498: \"cinema, movie theater, movie theatre, movie house, picture palace\",\n  c499: \"cleaver, meat cleaver, chopper\",\n  c500: \"cliff dwelling\",\n  c501: \"cloak\",\n  c502: \"clog, geta, patten, sabot\",\n  c503: \"cocktail shaker\",\n  c504: \"coffee mug\",\n  c505: \"coffeepot\",\n  c506: \"coil, spiral, volute, whorl, helix\",\n  c507: \"combination lock\",\n  c508: \"computer keyboard, keypad\",\n  c509: \"confectionery, confectionary, candy store\",\n  c510: \"container ship, containership, container vessel\",\n  c511: \"convertible\",\n  c512: \"corkscrew, bottle screw\",\n  c513: \"cornet, horn, trumpet, trump\",\n  c514: \"cowboy boot\",\n  c515: \"cowboy hat, ten-gallon hat\",\n  c516: \"cradle\",\n  c517: \"crane\",\n  c518: \"crash helmet\",\n  c519: \"crate\",\n  c520: \"crib, cot\",\n  c521: \"Crock Pot\",\n  c522: \"croquet ball\",\n  c523: \"crutch\",\n  c524: \"cuirass\",\n  c525: \"dam, dike, dyke\",\n  c526: \"desk\",\n  c527: \"desktop computer\",\n  c528: \"dial telephone, dial phone\",\n  c529: \"diaper, nappy, napkin\",\n  c530: \"digital clock\",\n  c531: \"digital watch\",\n  c532: \"dining table, board\",\n  c533: \"dishrag, dishcloth\",\n  c534: \"dishwasher, dish washer, dishwashing machine\",\n  c535: \"disk brake, disc brake\",\n  c536: \"dock, dockage, docking facility\",\n  c537: \"dogsled, dog sled, dog sleigh\",\n  c538: \"dome\",\n  c539: \"doormat, welcome mat\",\n  c540: \"drilling platform, offshore rig\",\n  c541: \"drum, membranophone, tympan\",\n  c542: \"drumstick\",\n  c543: \"dumbbell\",\n  c544: \"Dutch oven\",\n  c545: \"electric fan, blower\",\n  c546: \"electric guitar\",\n  c547: \"electric locomotive\",\n  c548: \"entertainment center\",\n  c549: \"envelope\",\n  c550: \"espresso maker\",\n  c551: \"face powder\",\n  c552: \"feather boa, boa\",\n  c553: \"file, file cabinet, filing cabinet\",\n  c554: \"fireboat\",\n  c555: \"fire engine, fire truck\",\n  c556: \"fire screen, fireguard\",\n  c557: \"flagpole, flagstaff\",\n  c558: \"flute, transverse flute\",\n  c559: \"folding chair\",\n  c560: \"football helmet\",\n  c561: \"forklift\",\n  c562: \"fountain\",\n  c563: \"fountain pen\",\n  c564: \"four-poster\",\n  c565: \"freight car\",\n  c566: \"French horn, horn\",\n  c567: \"frying pan, frypan, skillet\",\n  c568: \"fur coat\",\n  c569: \"garbage truck, dustcart\",\n  c570: \"gasmask, respirator, gas helmet\",\n  c571: \"gas pump, gasoline pump, petrol pump, island dispenser\",\n  c572: \"goblet\",\n  c573: \"go-kart\",\n  c574: \"golf ball\",\n  c575: \"golfcart, golf cart\",\n  c576: \"gondola\",\n  c577: \"gong, tam-tam\",\n  c578: \"gown\",\n  c579: \"grand piano, grand\",\n  c580: \"greenhouse, nursery, glasshouse\",\n  c581: \"grille, radiator grille\",\n  c582: \"grocery store, grocery, food market, market\",\n  c583: \"guillotine\",\n  c584: \"hair slide\",\n  c585: \"hair spray\",\n  c586: \"half track\",\n  c587: \"hammer\",\n  c588: \"hamper\",\n  c589: \"hand blower, blow dryer, blow drier, hair dryer, hair drier\",\n  c590: \"hand-held computer, hand-held microcomputer\",\n  c591: \"handkerchief, hankie, hanky, hankey\",\n  c592: \"hard disc, hard disk, fixed disk\",\n  c593: \"harmonica, mouth organ, harp, mouth harp\",\n  c594: \"harp\",\n  c595: \"harvester, reaper\",\n  c596: \"hatchet\",\n  c597: \"holster\",\n  c598: \"home theater, home theatre\",\n  c599: \"honeycomb\",\n  c600: \"hook, claw\",\n  c601: \"hoopskirt, crinoline\",\n  c602: \"horizontal bar, high bar\",\n  c603: \"horse cart, horse-cart\",\n  c604: \"hourglass\",\n  c605: \"iPod\",\n  c606: \"iron, smoothing iron\",\n  c607: \"jack-o'-lantern\",\n  c608: \"jean, blue jean, denim\",\n  c609: \"jeep, landrover\",\n  c610: \"jersey, T-shirt, tee shirt\",\n  c611: \"jigsaw puzzle\",\n  c612: \"jinrikisha, ricksha, rickshaw\",\n  c613: \"joystick\",\n  c614: \"kimono\",\n  c615: \"knee pad\",\n  c616: \"knot\",\n  c617: \"lab coat, laboratory coat\",\n  c618: \"ladle\",\n  c619: \"lampshade, lamp shade\",\n  c620: \"laptop, laptop computer\",\n  c621: \"lawn mower, mower\",\n  c622: \"lens cap, lens cover\",\n  c623: \"letter opener, paper knife, paperknife\",\n  c624: \"library\",\n  c625: \"lifeboat\",\n  c626: \"lighter, light, igniter, ignitor\",\n  c627: \"limousine, limo\",\n  c628: \"liner, ocean liner\",\n  c629: \"lipstick, lip rouge\",\n  c630: \"Loafer\",\n  c631: \"lotion\",\n  c632: \"loudspeaker, speaker, speaker unit, loudspeaker system, speaker system\",\n  c633: \"loupe, jeweler's loupe\",\n  c634: \"lumbermill, sawmill\",\n  c635: \"magnetic compass\",\n  c636: \"mailbag, postbag\",\n  c637: \"mailbox, letter box\",\n  c638: \"maillot\",\n  c639: \"maillot, tank suit\",\n  c640: \"manhole cover\",\n  c641: \"maraca\",\n  c642: \"marimba, xylophone\",\n  c643: \"mask\",\n  c644: \"matchstick\",\n  c645: \"maypole\",\n  c646: \"maze, labyrinth\",\n  c647: \"measuring cup\",\n  c648: \"medicine chest, medicine cabinet\",\n  c649: \"megalith, megalithic structure\",\n  c650: \"microphone, mike\",\n  c651: \"microwave, microwave oven\",\n  c652: \"military uniform\",\n  c653: \"milk can\",\n  c654: \"minibus\",\n  c655: \"miniskirt, mini\",\n  c656: \"minivan\",\n  c657: \"missile\",\n  c658: \"mitten\",\n  c659: \"mixing bowl\",\n  c660: \"mobile home, manufactured home\",\n  c661: \"Model T\",\n  c662: \"modem\",\n  c663: \"monastery\",\n  c664: \"monitor\",\n  c665: \"moped\",\n  c666: \"mortar\",\n  c667: \"mortarboard\",\n  c668: \"mosque\",\n  c669: \"mosquito net\",\n  c670: \"motor scooter, scooter\",\n  c671: \"mountain bike, all-terrain bike, off-roader\",\n  c672: \"mountain tent\",\n  c673: \"mouse, computer mouse\",\n  c674: \"mousetrap\",\n  c675: \"moving van\",\n  c676: \"muzzle\",\n  c677: \"nail\",\n  c678: \"neck brace\",\n  c679: \"necklace\",\n  c680: \"nipple\",\n  c681: \"notebook, notebook computer\",\n  c682: \"obelisk\",\n  c683: \"oboe, hautboy, hautbois\",\n  c684: \"ocarina, sweet potato\",\n  c685: \"odometer, hodometer, mileometer, milometer\",\n  c686: \"oil filter\",\n  c687: \"organ, pipe organ\",\n  c688: \"oscilloscope, scope, cathode-ray oscilloscope, CRO\",\n  c689: \"overskirt\",\n  c690: \"oxcart\",\n  c691: \"oxygen mask\",\n  c692: \"packet\",\n  c693: \"paddle, boat paddle\",\n  c694: \"paddlewheel, paddle wheel\",\n  c695: \"padlock\",\n  c696: \"paintbrush\",\n  c697: \"pajama, pyjama, pj's, jammies\",\n  c698: \"palace\",\n  c699: \"panpipe, pandean pipe, syrinx\",\n  c700: \"paper towel\",\n  c701: \"parachute, chute\",\n  c702: \"parallel bars, bars\",\n  c703: \"park bench\",\n  c704: \"parking meter\",\n  c705: \"passenger car, coach, carriage\",\n  c706: \"patio, terrace\",\n  c707: \"pay-phone, pay-station\",\n  c708: \"pedestal, plinth, footstall\",\n  c709: \"pencil box, pencil case\",\n  c710: \"pencil sharpener\",\n  c711: \"perfume, essence\",\n  c712: \"Petri dish\",\n  c713: \"photocopier\",\n  c714: \"pick, plectrum, plectron\",\n  c715: \"pickelhaube\",\n  c716: \"picket fence, paling\",\n  c717: \"pickup, pickup truck\",\n  c718: \"pier\",\n  c719: \"piggy bank, penny bank\",\n  c720: \"pill bottle\",\n  c721: \"pillow\",\n  c722: \"ping-pong ball\",\n  c723: \"pinwheel\",\n  c724: \"pirate, pirate ship\",\n  c725: \"pitcher, ewer\",\n  c726: \"plane, carpenter's plane, woodworking plane\",\n  c727: \"planetarium\",\n  c728: \"plastic bag\",\n  c729: \"plate rack\",\n  c730: \"plow, plough\",\n  c731: \"plunger, plumber's helper\",\n  c732: \"Polaroid camera, Polaroid Land camera\",\n  c733: \"pole\",\n  c734: \"police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria\",\n  c735: \"poncho\",\n  c736: \"pool table, billiard table, snooker table\",\n  c737: \"pop bottle, soda bottle\",\n  c738: \"pot, flowerpot\",\n  c739: \"potter's wheel\",\n  c740: \"power drill\",\n  c741: \"prayer rug, prayer mat\",\n  c742: \"printer\",\n  c743: \"prison, prison house\",\n  c744: \"projectile, missile\",\n  c745: \"projector\",\n  c746: \"puck, hockey puck\",\n  c747: \"punching bag, punch bag, punching ball, punchball\",\n  c748: \"purse\",\n  c749: \"quill, quill pen\",\n  c750: \"quilt, comforter, comfort, puff\",\n  c751: \"racer, race car, racing car\",\n  c752: \"racket, racquet\",\n  c753: \"radiator\",\n  c754: \"radio, wireless\",\n  c755: \"radio telescope, radio reflector\",\n  c756: \"rain barrel\",\n  c757: \"recreational vehicle, RV, R.V.\",\n  c758: \"reel\",\n  c759: \"reflex camera\",\n  c760: \"refrigerator, icebox\",\n  c761: \"remote control, remote\",\n  c762: \"restaurant, eating house, eating place, eatery\",\n  c763: \"revolver, six-gun, six-shooter\",\n  c764: \"rifle\",\n  c765: \"rocking chair, rocker\",\n  c766: \"rotisserie\",\n  c767: \"rubber eraser, rubber, pencil eraser\",\n  c768: \"rugby ball\",\n  c769: \"rule, ruler\",\n  c770: \"running shoe\",\n  c771: \"safe\",\n  c772: \"safety pin\",\n  c773: \"saltshaker, salt shaker\",\n  c774: \"sandal\",\n  c775: \"sarong\",\n  c776: \"sax, saxophone\",\n  c777: \"scabbard\",\n  c778: \"scale, weighing machine\",\n  c779: \"school bus\",\n  c780: \"schooner\",\n  c781: \"scoreboard\",\n  c782: \"screen, CRT screen\",\n  c783: \"screw\",\n  c784: \"screwdriver\",\n  c785: \"seat belt, seatbelt\",\n  c786: \"sewing machine\",\n  c787: \"shield, buckler\",\n  c788: \"shoe shop, shoe-shop, shoe store\",\n  c789: \"shoji\",\n  c790: \"shopping basket\",\n  c791: \"shopping cart\",\n  c792: \"shovel\",\n  c793: \"shower cap\",\n  c794: \"shower curtain\",\n  c795: \"ski\",\n  c796: \"ski mask\",\n  c797: \"sleeping bag\",\n  c798: \"slide rule, slipstick\",\n  c799: \"sliding door\",\n  c800: \"slot, one-armed bandit\",\n  c801: \"snorkel\",\n  c802: \"snowmobile\",\n  c803: \"snowplow, snowplough\",\n  c804: \"soap dispenser\",\n  c805: \"soccer ball\",\n  c806: \"sock\",\n  c807: \"solar dish, solar collector, solar furnace\",\n  c808: \"sombrero\",\n  c809: \"soup bowl\",\n  c810: \"space bar\",\n  c811: \"space heater\",\n  c812: \"space shuttle\",\n  c813: \"spatula\",\n  c814: \"speedboat\",\n  c815: \"spider web, spider's web\",\n  c816: \"spindle\",\n  c817: \"sports car, sport car\",\n  c818: \"spotlight, spot\",\n  c819: \"stage\",\n  c820: \"steam locomotive\",\n  c821: \"steel arch bridge\",\n  c822: \"steel drum\",\n  c823: \"stethoscope\",\n  c824: \"stole\",\n  c825: \"stone wall\",\n  c826: \"stopwatch, stop watch\",\n  c827: \"stove\",\n  c828: \"strainer\",\n  c829: \"streetcar, tram, tramcar, trolley, trolley car\",\n  c830: \"stretcher\",\n  c831: \"studio couch, day bed\",\n  c832: \"stupa, tope\",\n  c833: \"submarine, pigboat, sub, U-boat\",\n  c834: \"suit, suit of clothes\",\n  c835: \"sundial\",\n  c836: \"sunglass\",\n  c837: \"sunglasses, dark glasses, shades\",\n  c838: \"sunscreen, sunblock, sun blocker\",\n  c839: \"suspension bridge\",\n  c840: \"swab, swob, mop\",\n  c841: \"sweatshirt\",\n  c842: \"swimming trunks, bathing trunks\",\n  c843: \"swing\",\n  c844: \"switch, electric switch, electrical switch\",\n  c845: \"syringe\",\n  c846: \"table lamp\",\n  c847: \"tank, army tank, armored combat vehicle, armoured combat vehicle\",\n  c848: \"tape player\",\n  c849: \"teapot\",\n  c850: \"teddy, teddy bear\",\n  c851: \"television, television system\",\n  c852: \"tennis ball\",\n  c853: \"thatch, thatched roof\",\n  c854: \"theater curtain, theatre curtain\",\n  c855: \"thimble\",\n  c856: \"thresher, thrasher, threshing machine\",\n  c857: \"throne\",\n  c858: \"tile roof\",\n  c859: \"toaster\",\n  c860: \"tobacco shop, tobacconist shop, tobacconist\",\n  c861: \"toilet seat\",\n  c862: \"torch\",\n  c863: \"totem pole\",\n  c864: \"tow truck, tow car, wrecker\",\n  c865: \"toyshop\",\n  c866: \"tractor\",\n  c867: \"trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi\",\n  c868: \"tray\",\n  c869: \"trench coat\",\n  c870: \"tricycle, trike, velocipede\",\n  c871: \"trimaran\",\n  c872: \"tripod\",\n  c873: \"triumphal arch\",\n  c874: \"trolleybus, trolley coach, trackless trolley\",\n  c875: \"trombone\",\n  c876: \"tub, vat\",\n  c877: \"turnstile\",\n  c878: \"typewriter keyboard\",\n  c879: \"umbrella\",\n  c880: \"unicycle, monocycle\",\n  c881: \"upright, upright piano\",\n  c882: \"vacuum, vacuum cleaner\",\n  c883: \"vase\",\n  c884: \"vault\",\n  c885: \"velvet\",\n  c886: \"vending machine\",\n  c887: \"vestment\",\n  c888: \"viaduct\",\n  c889: \"violin, fiddle\",\n  c890: \"volleyball\",\n  c891: \"waffle iron\",\n  c892: \"wall clock\",\n  c893: \"wallet, billfold, notecase, pocketbook\",\n  c894: \"wardrobe, closet, press\",\n  c895: \"warplane, military plane\",\n  c896: \"washbasin, handbasin, washbowl, lavabo, wash-hand basin\",\n  c897: \"washer, automatic washer, washing machine\",\n  c898: \"water bottle\",\n  c899: \"water jug\",\n  c900: \"water tower\",\n  c901: \"whiskey jug\",\n  c902: \"whistle\",\n  c903: \"wig\",\n  c904: \"window screen\",\n  c905: \"window shade\",\n  c906: \"Windsor tie\",\n  c907: \"wine bottle\",\n  c908: \"wing\",\n  c909: \"wok\",\n  c910: \"wooden spoon\",\n  c911: \"wool, woolen, woollen\",\n  c912: \"worm fence, snake fence, snake-rail fence, Virginia fence\",\n  c913: \"wreck\",\n  c914: \"yawl\",\n  c915: \"yurt\",\n  c916: \"web site, website, internet site, site\",\n  c917: \"comic book\",\n  c918: \"crossword puzzle, crossword\",\n  c919: \"street sign\",\n  c920: \"traffic light, traffic signal, stoplight\",\n  c921: \"book jacket, dust cover, dust jacket, dust wrapper\",\n  c922: \"menu\",\n  c923: \"plate\",\n  c924: \"guacamole\",\n  c925: \"consomme\",\n  c926: \"hot pot, hotpot\",\n  c927: \"trifle\",\n  c928: \"ice cream, icecream\",\n  c929: \"ice lolly, lolly, lollipop, popsicle\",\n  c930: \"French loaf\",\n  c931: \"bagel, beigel\",\n  c932: \"pretzel\",\n  c933: \"cheeseburger\",\n  c934: \"hotdog, hot dog, red hot\",\n  c935: \"mashed potato\",\n  c936: \"head cabbage\",\n  c937: \"broccoli\",\n  c938: \"cauliflower\",\n  c939: \"zucchini, courgette\",\n  c940: \"spaghetti squash\",\n  c941: \"acorn squash\",\n  c942: \"butternut squash\",\n  c943: \"cucumber, cuke\",\n  c944: \"artichoke, globe artichoke\",\n  c945: \"bell pepper\",\n  c946: \"cardoon\",\n  c947: \"mushroom\",\n  c948: \"Granny Smith\",\n  c949: \"strawberry\",\n  c950: \"orange\",\n  c951: \"lemon\",\n  c952: \"fig\",\n  c953: \"pineapple, ananas\",\n  c954: \"banana\",\n  c955: \"jackfruit, jak, jack\",\n  c956: \"custard apple\",\n  c957: \"pomegranate\",\n  c958: \"hay\",\n  c959: \"carbonara\",\n  c960: \"chocolate sauce, chocolate syrup\",\n  c961: \"dough\",\n  c962: \"meat loaf, meatloaf\",\n  c963: \"pizza, pizza pie\",\n  c964: \"potpie\",\n  c965: \"burrito\",\n  c966: \"red wine\",\n  c967: \"espresso\",\n  c968: \"cup\",\n  c969: \"eggnog\",\n  c970: \"alp\",\n  c971: \"bubble\",\n  c972: \"cliff, drop, drop-off\",\n  c973: \"coral reef\",\n  c974: \"geyser\",\n  c975: \"lakeside, lakeshore\",\n  c976: \"promontory, headland, head, foreland\",\n  c977: \"sandbar, sand bar\",\n  c978: \"seashore, coast, seacoast, sea-coast\",\n  c979: \"valley, vale\",\n  c980: \"volcano\",\n  c981: \"ballplayer, baseball player\",\n  c982: \"groom, bridegroom\",\n  c983: \"scuba diver\",\n  c984: \"rapeseed\",\n  c985: \"daisy\",\n  c986: \"yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum\",\n  c987: \"corn\",\n  c988: \"acorn\",\n  c989: \"hip, rose hip, rosehip\",\n  c990: \"buckeye, horse chestnut, conker\",\n  c991: \"coral fungus\",\n  c992: \"agaric\",\n  c993: \"gyromitra\",\n  c994: \"stinkhorn, carrion fungus\",\n  c995: \"earthstar\",\n  c996: \"hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa\",\n  c997: \"bolete\",\n  c998: \"ear, spike, capitulum\",\n  c999: \"toilet tissue, toilet paper, bathroom tissue\",\n};\n\nexport class Classifier {\n\n  // 图像显示尺寸结构体 { width: Number, height: Number }\n  displaySize;\n\n  // net inference session\n  session;\n\n  // is ready\n  ready;\n\n  // the predicted class\n  mPredClass = \"None\";\n\n  speedTime = 0.0;\n\n  modelInput = null;\n\n  constructor(displaySize) {\n    this.displaySize = {\n      width: displaySize.width,\n      height: displaySize.height,\n    };\n\n    this.modelInput = new Float32Array(modelWidth * modelHeight * modelChannel);\n  \n    this.ready = false;\n  }\n\n  load() {\n    return new Promise((resolve, reject) => {\n\n       const modelPath = `${wx.env.USER_DATA_PATH}/mobilenetv2_qat.onnx`;\n\n       // 判断之前是否已经下载过onnx模型\n        wx.getFileSystemManager().access({\n          path: modelPath,\n          success: (res) =>\n          {\n            console.log(\"file already exist at: \" + modelPath)\n              this.createInferenceSession(modelPath).then(() =>\n              {\n                resolve();\n              })\n          },\n          fail: (res) => {\n            console.error(res)\n\n            wx.cloud.init();\n            console.log(\"begin download model\");\n\n            const cloudPath = 'cloud://containertest-0gmw3ulnd8d9bc7b.636f-containertest-0gmw3ulnd8d9bc7b-1258211818/mobilenetv2_qat.onnx'\n            this.downloadFile(cloudPath, function(r) {\n              console.log(`下载进度：${r.progress}%，已下载${r.totalBytesWritten}B，共${r.totalBytesExpectedToWrite}B`)\n            }).then(result => {\n        \n              wx.getFileSystemManager().saveFile({\n                tempFilePath:result.tempFilePath,\n                filePath: modelPath,\n                success: (res) => { // 注册回调函数\n                  console.log(res)\n    \n                  const modelPath = res.savedFilePath;\n                  console.log(\"save onnx model at path: \" + modelPath)\n\n                  this.createInferenceSession(modelPath).then(() => {\n                    resolve();\n                  })\n                },\n                fail(res) {\n                  console.error(res)\n                  return\n                }\n              })\n        });\n          }\n        })\n    })\n  }\n\n  createInferenceSession(modelPath) {\n    return new Promise((resolve, reject) => {\n      this.session = wx.createInferenceSession({\n        model: modelPath,\n        /* 0: Lowest  precision e.g., LS16 + A16 + Winograd A16 + approx. math\n           1: Lower   precision e.g., LS16 + A16 + Winograd off + approx. math\n           2: Modest  precision e.g., LS16 + A32 + Winograd A32 + approx. math\n           3: Higher  precision e.g., LS32 + A32 + Winograd A32 + approx. math\n           4: Highest precision e.g., LS32 + A32 + Winograd A32 + precise math\n\n           Higher precision always require longer time to run session\n        */\n        precisionLevel : 4,\n        allowNPU : false,     // wheather use NPU for inference, only useful for IOS\n        allowQuantize: true,  // wheather generate quantize model\n      });\n\n      // 监听error事件\n      this.session.onError((error) => {\n        console.error(error);\n        reject(error);\n      });\n      this.session.onLoad(() => {\n        this.ready = true;\n        resolve();\n      });\n    })\n  }\n\n  downloadFile(fileID, onCall = () => {}) {\n    return new Promise((resolve, reject) => {\n      const task = wx.cloud.downloadFile({\n        fileID,\n        success: res => resolve(res),\n        fail: e => {\n          const info = e.toString()\n          if (info.indexOf('abort') != -1) {\n            reject(new Error('【文件下载失败】中断下载'))\n          } else {\n            reject(new Error('【文件下载失败】网络或其他错误'))\n          }\n        }\n      })\n      task.onProgressUpdate((res) => {\n        if (onCall(res) == false) {\n          task.abort()\n        }\n      })\n    })\n  }\n\n  isReady() {\n    return this.ready;\n  }\n  \n  predClass() {\n    return this.mPredClass;\n  }\n\n  // input is rgba uint8 data\n  preProcess(frame, dstInput) {\n\n    return new Promise((resolve, reject) =>\n    {\n      const origData = new Uint8Array(frame.data);\n\n      const hRatio = frame.height / modelHeight;\n\n      const wRatio = frame.width / modelWidth;\n\n      // resize data to model input size, uint8 data to float32 data,\n      // and transpose from nhwc to nchw\n\n      const origHStride = frame.width * 4;\n      const origWStride = 4;\n    \n      const mean = [0.485, 0.456, 0.406]\n\n      const reverse_div = [4.367, 4.464, 4.444]  // reverse of std = [0.229, 0.224, 0.225]\n      const ratio = 1 / 255.0\n\n      const normalized_div = [ratio * reverse_div[0], ratio * reverse_div[1], ratio * reverse_div[2]];\n\n      const normalized_mean = [mean[0] * reverse_div[0], mean[1] * reverse_div[1], mean[2] * reverse_div[2]];\n\n      var idx = 0;\n      for (var c = 0; c < modelChannel; ++c)\n      {\n        for (var h = 0; h < modelHeight; ++h)\n        {\n          const origH = Math.round(h * hRatio);\n\n          const origHOffset = origH * origHStride;\n\n          for (var w = 0; w < modelWidth; ++w)\n          {\n            const origW = Math.round(w * wRatio);\n\n            const origIndex = origHOffset + origW * origWStride + c;\n\n            //var val = ((origData[origIndex] * ratio) - mean[c]) * reverse_div[c];\n\n            var val = origData[origIndex] * (normalized_div[c]) - normalized_mean[c];\n            dstInput[idx] = val;\n\n            idx++;\n          }\n        }\n      } \n\n      resolve();\n    });\n\n  }\n    // run inference and get the output\n  async detect(frame)\n  {\n    return new Promise((resolve, reject) =>\n    {\n      this.preProcess(frame, this.modelInput).then(() => {\n        const xinput = {\n          shape: [1, 3, 224, 224],  // Input data shape in NCHW\n          data: this.modelInput.buffer,\n          type: 'float32',  // Input data type\n        };\n\n        inferenceStart = new Date().getTime()\n\n        this.session.run({\n          // Here string \"input\" Should be the same with the input name in onnx file\n          \"onnx::QuantizeLinear_0\": xinput,\n        })\n        .then((res) => {\n          inferenceEnd = new Date().getTime();\n   \n          this.speedTime = inferenceEnd - inferenceStart\n  \n          // Here use res.outputname.data, outputname \n          // Should be the same with the output name in onnx file\n          let num = new Float32Array(res[\"1962\"].data)\n\n          var maxVar = num[0];\n  \n          var index = 0;\n  \n          for (var i = 1; i < num.length; ++i)\n          {\n            if (maxVar < num[i])\n            {\n              maxVar = num[i]   \n              index = i     \n            }\n          }\n\n          this.getClass(index);\n\n          resolve();\n        }).catch(error => console.log(\"runing error!: \", error.message));\n      })\n\n    });\n  }\n\n  getClass(index)\n  {  \n    const cIndex=`c${index}`\n    this.mPredClass = classNames[cIndex];\n  }\n\n  getTime()\n  {\n    return this.speedTime;\n  }\n  dispose() {\n    this.session.destroy();\n  }\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/mobilenet_int8/index.js",
    "content": "// pages/mobilenet/index.ts\n\nimport { Classifier } from './classify'\n\nimport { FpsHelper } from '../../../../util/fps_helper'\n\nconst { appWidth, appHeight, benchmarkLevel } = getApp().globalData\n\nPage({\n  classifier: null,\n  ctx: null,\n  fpsHelper: null,\n\n  predicting: false,\n\n  // For Speed Test\n  constBuffer: null,\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    predClass: 'None',\n    classifier: null,\n    enableSpeedTest: false,\n    avgTime: 110.0,\n    minTime: 110.0\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad() {\n    if (this.data.enableSpeedTest) {\n      this.constBuffer = new Float32Array(3 * 224 * 224)\n    }\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n    this.ctx = wx.createCanvasContext('ssd')\n    const context = wx.createCameraContext(this)\n    this.initClassifier()\n    this.fpsHelper = new FpsHelper()\n\n    const listener = context.onCameraFrame(frame => {\n      const fps = this.fpsHelper.getAverageFps()\n      console.log(`fps=${fps}`)\n\n      if (this.classifier && this.classifier.isReady() && !this.predicting) {\n        this.executeClassify(frame)\n      }\n    })\n    listener.start()\n    this.fpsHelper.reset()\n  },\n\n  /**\n   * 初始化 SSD models\n   */\n  initClassifier() {\n    wx.showLoading({ title: '模型正在加载...' })\n    this.classifier = new Classifier({ width: appWidth, height: appHeight })\n    this.classifier.load().then(() => {\n      wx.hideLoading()\n    }).catch(err => {\n      console.log('模型加载报错：', err)\n    })\n  },\n\n  /**\n   * 构建模型\n   */\n  async executeClassify(frame) {\n    this.predicting = true\n\n    if (this.classifier && this.classifier.isReady()) {\n      this.fpsHelper.updateFPS()\n\n      this.setData({\n        predClass: this.classifier.predClass(),\n        enableSpeedTest: this.data.enableSpeedTest\n      })\n\n      await this.classifier.detect(frame).then(() => {\n        this.setData({\n          predClass: this.classifier.predClass()\n        })\n      }).catch((err) => {\n        console.log(err)\n      })\n\n      if (this.data.enableSpeedTest) {\n        await this.inferSpeedTest()\n      }\n    }\n\n    this.predicting = false\n  },\n\n  async inferSpeedTest() {\n    console.log('runInferenceSession speed test start run===============================')\n\n    const xinput = {\n      shape: [1, 3, 224, 224],\n      data: this.constBuffer.buffer,\n      type: 'float32',\n    }\n\n    this.data.classifier = this.classifier\n\n    // warm up\n    for (let index = 0; index < 20; index++) {\n      await this.inferOnce(xinput, this.data)\n    }\n\n    for (let l = 0; l < 5; ++l) {\n      const beMs = new Date().getTime()\n\n      for (let index = 0; index < 100; index++) {\n        await this.inferOnce(xinput, this.data)\n      }\n\n      const afMs = new Date().getTime()\n\n      const avgTime = (afMs - beMs) / 100.0\n\n      let overall = 0.0\n      let minTime = 1000000.0\n\n      for (let index = 0; index < 100; index++) {\n        const beMsTmp = new Date().getTime()\n        await this.inferOnce(xinput, this.data)\n        const afMsTmp = new Date().getTime()\n        const tmpTime = (afMsTmp - beMsTmp)\n        if (minTime > tmpTime) {\n          minTime = tmpTime\n        }\n        overall += (afMsTmp - beMsTmp)\n      }\n\n      console.log('Inference min time: ', minTime)\n      console.log('Inference avg time: ', avgTime)\n\n      this.setData({\n        predClass: this.classifier.predClass(),\n        minTime,\n        avgTime,\n      })\n    }\n  },\n\n  inferOnce(xinput, data) {\n    return new Promise(function (resolve, reject) {\n      data.classifier.session.run({\n        'onnx::QuantizeLinear_0': xinput,\n      }).then(async function (res) {\n        resolve()\n      })\n    })\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n    if (this.classifier && this.classifier.isReady()) {\n      this.classifier.dispose()\n    }\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n    return {\n      title: '微信小程序 × MobileNetInt8',\n      path: 'packageAPI/pages/ai/mobilenet_int8/index',\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/mobilenet_int8/index.json",
    "content": "{\n  \"disableScroll\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/mobilenet_int8/index.less",
    "content": "/* packageAPI/pages/ai/mobilenet/index.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/mobilenet_int8/index.wxml",
    "content": "<!--pages/mobilenet_int8/index.wxml-->\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <camera style=\"  width: 100%; height: 70vh;\" device-position=\"back\" flash=\"off\" frame-size=\"medium\">\n    <canvas  canvas-id=\"ssd\"></canvas>\n  </camera>\n  <view style=\"margin: 30px auto; position: relative\"> 分类结果： {{predClass}}</view>  \n  <view style=\"margin: 30px auto; position: relative\" wx:if=\"{{enableSpeedTest}}\">\n    <text class=\"subtitle\"> 平均耗时(ms)： {{avgTime}}</text>\n    <text class=\"subtitle\"> 最小耗时(ms)： {{minTime}}</text>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/mobilenet_int8/index.wxss",
    "content": "/* packageAPI/pages/ai/mobilenet_int8/index.wxss */\n/* pages/mobilenet_int8/index.wxss */\n.camera {\n  width: 100%;\n  height: 70vh;\n}\n\n.canvas {\n  width: 100%;\n  height: 100vh;\n}\n\n.textstyle {\n  color: #e0a165;\n  font-size: 28rpx;\n  line-height: 1.6;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/style-trans/index.js",
    "content": "// pages/stype-trans/index.js.ts\nPage({\n  session: null,\n\n  canvasCtx: null, // on screen canvas\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    src: '',\n    imageWidth: 224,\n    imageHeight: 224,\n    imageChannel: 3,\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n\n  },\n\n  takePhoto() {\n    const camera = wx.createCameraContext()\n    camera.takePhoto({\n      quality: 'normal',\n      success: (res) => {\n        this.setData({\n          src: res.tempImagePath\n        })\n\n        const canvas = wx.createOffscreenCanvas({ type: '2d', width: this.data.imageWidth, height: this.data.imageHeight })\n\n        const ctx = canvas.getContext('2d')\n\n        const image = canvas.createImage()\n\n        // wait for image upload\n        new Promise(resolve => {\n          image.onload = resolve\n          image.src = this.data.src\n        }).then(() => {\n          // init the inferenceSession\n          this.InitSession().then(() => {\n            // create input\n            ctx.clearRect(0, 0, this.data.imageWidth, this.data.imageHeight)\n            ctx.drawImage(image, 0, 0, this.data.imageWidth, this.data.imageHeight)\n\n            // get the imgdata\n            const imgData = ctx.getImageData(0, 0, this.data.imageWidth, this.data.imageHeight)\n\n            // use the image data\n            this.detect(imgData)\n          })\n        })\n      }\n    })\n  },\n\n  InitSession() {\n    return new Promise((resolve, reject) => {\n      const modelPath = `${wx.env.USER_DATA_PATH}/mosaic-8.onnx`\n\n      // 判断之前是否已经下载过onnx模型\n      wx.getFileSystemManager().access({\n        path: modelPath,\n        success: (res) => {\n          console.log('file already exist at: ' + modelPath)\n          this.createInferenceSession(modelPath).then(() => {\n            resolve()\n          })\n        },\n        fail: (res) => {\n          console.error(res)\n\n          wx.cloud.init()\n          console.log('begin download model')\n\n          const cloudPath = 'cloud://containertest-0gmw3ulnd8d9bc7b.636f-containertest-0gmw3ulnd8d9bc7b-1258211818/mosaic-8.onnx'\n\n          this.downloadFile(cloudPath, function (r) {\n            console.log(`下载进度：${r.progress}%，已下载${r.totalBytesWritten}B，共${r.totalBytesExpectedToWrite}B`)\n          }).then(result => {\n            wx.getFileSystemManager().saveFile({\n              tempFilePath: result.tempFilePath,\n              filePath: modelPath,\n              success: (res) => { // 注册回调函数\n                console.log(res)\n\n                const modelPath = res.savedFilePath\n                console.log('save onnx model at path: ' + modelPath)\n\n                this.createInferenceSession(modelPath).then(() => {\n                  resolve()\n                })\n              },\n              fail(res) {\n                console.error(res)\n              }\n            })\n          })\n        }\n      })\n    })\n  },\n\n  createInferenceSession(modelPath) {\n    return new Promise((resolve, reject) => {\n      this.session = wx.createInferenceSession({\n        model: modelPath,\n        /* 0: Lowest  precision e.g., LS16 + A16 + Winograd A16 + approx. math\n           1: Lower   precision e.g., LS16 + A16 + Winograd off + approx. math\n           2: Modest  precision e.g., LS16 + A32 + Winograd A32 + approx. math\n           3: Higher  precision e.g., LS32 + A32 + Winograd A32 + approx. math\n           4: Highest precision e.g., LS32 + A32 + Winograd A32 + precise math\n\n           Higher precision always require longer time to run session\n        */\n        precisionLevel: 4,\n        allowNPU: false, // wheather use NPU for inference, only useful for IOS\n        allowQuantize: false, // wheather generate quantize model\n      })\n\n      // 监听error事件\n      this.session.onError((error) => {\n        console.error(error)\n        reject(error)\n      })\n      this.session.onLoad(() => {\n        resolve()\n      })\n    })\n  },\n\n  downloadFile(fileID, onCall = () => {}) {\n    return new Promise((resolve, reject) => {\n      const task = wx.cloud.downloadFile({\n        fileID,\n        success: res => resolve(res),\n        fail: e => {\n          const info = e.toString()\n          if (info.indexOf('abort') != -1) {\n            reject(new Error('【文件下载失败】中断下载'))\n          } else {\n            reject(new Error('【文件下载失败】网络或其他错误'))\n          }\n        }\n      })\n      task.onProgressUpdate((res) => {\n        if (onCall(res) == false) {\n          task.abort()\n        }\n      })\n    })\n  },\n\n  detect(imgData) {\n    return new Promise((resolve, reject) => {\n      const uint8Data = new Uint8Array(imgData.data)\n\n      const floatData = new Float32Array(this.data.imageChannel * this.data.imageHeight * this.data.imageWidth)\n\n      // nhwc uint8 data to nchw float32 data, and ignore the alpha channel\n      const modelChannel = this.data.imageChannel\n\n      const imageWH = this.data.imageHeight * this.data.imageWidth\n\n      let idx = 0\n      for (let c = 0; c < modelChannel; ++c) {\n        for (let wh = 0; wh < imageWH; ++wh) {\n          const inputIdx = wh * 4 + c\n          floatData[idx] = uint8Data[inputIdx]\n          idx++\n        }\n      }\n\n      const xinput = {\n        shape: [1, 3, 224, 224], // Input data shape in NCHW\n        data: floatData.buffer,\n        type: 'float32', // Input data type\n      }\n\n      this.session.run({\n        // Here string \"input1\" Should be the same with the input name in onnx file\n        input1: xinput,\n      }).then((res) => {\n        // Here use res.outputname.data, outputname\n        // Should be the same with the output name in onnx file\n        const output = new Float32Array(res.output1.data)\n\n        const hwSize = imgData.height * imgData.width\n\n        const finalout = new Uint8ClampedArray(4 * hwSize)\n\n        // fill the alpha channel\n        finalout.fill(255)\n\n        // convert from nchw to nhwc\n        idx = 0\n        for (let c = 0; c < modelChannel; ++c) {\n          for (let hw = 0; hw < hwSize; ++hw) {\n            const dstIdx = hw * 4 + c\n            finalout[dstIdx] = Math.max(0, Math.min(Math.round(output[idx]), 255))\n            idx++\n          }\n        }\n\n        this.canvasCtx = wx.createCanvasContext('trans')\n\n        wx.canvasPutImageData({\n          canvasId: 'trans',\n          data: finalout,\n          height: 224,\n          width: 224,\n          x: 0,\n          y: 0,\n        }).then((res) => {\n          console.log(res)\n        })\n      })\n\n      resolve()\n    })\n  },\n\n  error(e) {\n    console.log(e.detail)\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/style-trans/index.json",
    "content": "{\n  \"disableScroll\": true\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/style-trans/index.less",
    "content": "/* packageAPI/pages/ai/style-trans/index.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/style-trans/index.wxml",
    "content": "<!--packageAPI/pages/ai/style-trans/index.wxml-->\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\"> \n  <text>packageAPI/pages/ai/style-trans/index.wxml</text>\n\n  <camera class=\"camera\" device-position=\"back\" flash=\"off\" binderror=\"error\" style=\"width: 70%; height: 200px;\"></camera>\n\n\n  <view class=\"btn-area\">\n    <button type=\"primary\" bindtap=\"takePhoto\">拍照</button>\n  </view>\n\n  <view>预览</view>\n  <image style=\"width: 224px; height: 224px; margin-left:25%\"  src=\"{{src}}\"></image> \n\n  <canvas class=\"offcanvas\"  canvas-id=\"trans\"></canvas>\n</view> \n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ai/style-trans/index.wxss",
    "content": "/* packageAPI/pages/ai/style-trans/index.wxss */\n.camera {\n  width: 100%;\n  height: 80vh;\n}\n\n.offcanvas {\n  width: 224px;\n  height: 224px;\n  position: relative;\n  margin-left: 25%;\n}\n\n.btn-area {\n  margin-top: 0;\n}\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/choose-address/choose-address.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '收货地址',\n      path: 'packageAPI/pages/api/choose-address/choose-address'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    addressInfo: null\n  },\n  chooseAddress() {\n    wx.chooseAddress({\n      success: (res) => {\n        this.setData({\n          addressInfo: res\n        })\n      },\n      fail(err) {\n        console.log(err)\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/choose-address/choose-address.json",
    "content": "{\n  \"navigationBarTitleText\": \"收货地址\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/choose-address/choose-address.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'chooseAddress'}}\"/>\n\n  <form>\n    <view class=\"page-section\">\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">收货人姓名</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            {{ addressInfo.userName }}\n          </view>\n        </view>\n\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">邮编</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            {{ addressInfo.postalCode }}\n          </view>\n        </view>\n\n        <view class=\"weui-cell weui-cell_input region\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">地区</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            {{ addressInfo.provinceName }}\n            {{ addressInfo.cityName }}\n            {{ addressInfo.countyName }}\n          </view>\n        </view>\n\n\n        <view class=\"weui-cell weui-cell_input detail\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">收货地址</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            {{ addressInfo.detailInfo }}\n          </view>\n        </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">国家码</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            {{ addressInfo.nationalCode }}\n          </view>\n        </view>\n\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">手机号码</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            {{ addressInfo.telNumber }}\n          </view>\n        </view>\n\n      </view>\n    </view>\n  </form>\n  \n  <view class=\"page-body\">\n    <view class=\"btn-area\">\n    <button type=\"primary\" bindtap=\"chooseAddress\">获取收货地址</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/choose-address/choose-address.wxss",
    "content": "\n\nform {\n  margin-top: 15px;\n}\n\n.weui-cell__bd {\n  display: flex;\n  justify-content: flex-start;\n  align-items: center;\n  padding: 10px 0;\n  min-height: 30px;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/choose-invoice-title/choose-invoice-title.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '获取发票抬头',\n      path: 'packageAPI/pages/api/choose-invoice-title/choose-invoice-title'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    type: '',\n    title: '',\n    taxNumber: '',\n    companyAddress: '',\n    telephone: '',\n    bankName: '',\n    bankAccount: '',\n  },\n  chooseInvoiceTitle() {\n    wx.chooseInvoiceTitle({\n      success: (res) => {\n        this.setData({\n          type: res.type,\n          title: res.title,\n          taxNumber: res.taxNumber,\n          companyAddress: res.companyAddress,\n          telephone: res.telephone,\n          bankName: res.bankName,\n          bankAccount: res.bankAccount\n        })\n      },\n      fail: (err) => {\n        console.error(err)\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/choose-invoice-title/choose-invoice-title.json",
    "content": "{\n  \"navigationBarTitleText\": \"获取发票抬头\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/choose-invoice-title/choose-invoice-title.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'chooseInvoiceTitle'}}\"/>\n\n  <view class=\"page-body\">\n    <form>\n      <view class=\"page-section\">\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">抬头类型</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              {{ type !== '' ? (type === '0' ? '单位' : '个人') : '' }}\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">抬头名称</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              {{ title }}\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">抬头税号</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              {{taxNumber}}\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">单位地址</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              {{companyAddress}}\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">手机号码</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              {{telephone}}\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">银行名称</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              {{bankName}}\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">银行账号</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              {{bankAccount}}\n            </view>\n          </view>\n\n        </view>\n      </view>\n    </form>\n\n    <view class=\"btn-area\">\n      <button type=\"primary\" bindtap=\"chooseInvoiceTitle\">获取发票抬头</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/choose-invoice-title/choose-invoice-title.wxss",
    "content": "\n\nform {\n  margin-top: 15px;\n}\n\n.weui-cell__bd {\n  display: flex;\n  justify-content: flex-start;\n  padding: 10px 0;\n  min-height: 30px;\n  align-items: center;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/custom-message/custom-message.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '客服消息',\n      path: 'packageAPI/pages/api/custom-message/custom-message'\n    }\n  },\n  handleContact(e) {\n    console.log(e.detail.path)\n    console.log(e.detail.query)\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/custom-message/custom-message.json",
    "content": "{\n    \"navigationBarTitleText\": \"客服消息\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/custom-message/custom-message.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'customMessage'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-body-wrapper\">\n      <view class=\"page-body-line\">\n        <button type=\"primary\" open-type=\"contact\" bindcontact=\"handleContact\">客服消息</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/custom-message/custom-message.wxss",
    "content": "/* page/API/pages/custom-message/custom-message.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/get-user-info/get-user-info.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '获取用户信息',\n      path: 'packageAPI/pages/api/get-user-info/get-user-info'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    hasUserInfo: false,\n    canIUseGetUserProfile: false\n  },\n  getUserInfo(info) {\n    console.log('getUserInfo')\n    const userInfo = info.detail.userInfo\n    this.setData({\n      userInfo,\n      hasUserInfo: true\n    })\n  },\n  handleGetUserProfile(e) {\n    console.log('getUserProfile')\n    wx.getUserProfile({\n      desc: '用于演示 wx.getUserProfile', // 声明获取用户个人信息后的用途，后续会展示在弹窗中，请谨慎填写\n      success: (res) => {\n        console.log('wx.getUserProfile: ', res.userInfo)\n        this.setData({\n          userInfo: res.userInfo,\n          hasUserInfo: true\n        })\n      }\n    })\n  },\n  clear() {\n    this.setData({\n      hasUserInfo: false,\n      userInfo: {}\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    if (wx.getUserProfile) {\n      this.setData({\n        canIUseGetUserProfile: true\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/get-user-info/get-user-info.json",
    "content": "{\n    \"navigationBarTitleText\": \"获取用户信息\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/get-user-info/get-user-info.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'getUserInfo'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info\">\n        <view class=\"page-body-title\">用户信息</view>\n        <block wx:if=\"{{hasUserInfo === false}}\">\n          <text class=\"page-body-text\">未获取</text>\n          <text class=\"page-body-text\">点击绿色按钮可获取用户头像及昵称</text>\n        </block>\n        <block wx:if=\"{{hasUserInfo === true}}\">\n          <image class=\"userinfo-avatar\" src=\"{{userInfo.avatarUrl}}\"></image>\n          <text class=\"userinfo-nickname\">{{userInfo.nickName}}</text>\n        </block>\n      </view>\n      <view class=\"btn-area\">\n        <button wx:if=\"{{canIUseGetUserProfile}}\" type=\"primary\" bindtap=\"handleGetUserProfile\"> 获取用户信息GetUserProfile</button>\n        <button wx:else type=\"primary\" open-type=\"getUserInfo\" bindgetuserinfo=\"getUserInfo\">获取用户信息getUserInfo</button>\n        <button bindtap=\"clear\">清空</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/get-user-info/get-user-info.wxss",
    "content": ".page-body-info {\n  padding-bottom: 0;\n  height: 230px;\n}\n.userinfo-avatar {\n  border-radius: 114px;\n  width: 114px;\n  height: 114px;\n}\n.userinfo-nickname {\n  margin-top: 10px;\n  font-size: 19px;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/jump/jump.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '跳转',\n      path: 'packageAPI/pages/api/jump/jump'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    setting: {}\n  },\n  // 打开半屏小程序\n  openhalfscreenminiprogram() {\n    wx.openEmbeddedMiniProgram({\n      appId: 'wxfdcee92a299bcaf1', // 腾讯公益\n      extraData: {\n        foo: 'bar'\n      },\n      // envVersion: 'develop',\n      success(res) {\n        // 打开成功\n      }\n    })\n  },\n  // 打开另一个小程序\n  openanotherminiprogram() {\n    wx.navigateToMiniProgram({\n      appId: 'wxfdcee92a299bcaf1', // 腾讯公益\n      // extraData: {\n      //   foo: 'bar'\n      // },\n      // envVersion: 'develop',\n      success(res) {\n        // 打开成功\n      }\n    })\n  },\n  // 退出当前小程序\n  exitminiprogram() {\n    wx.exitMiniProgram({\n      success() {\n        wx.showToast({\n          title: '退出成功',\n          icon: 'none',\n          duration: 2000\n        })\n      },\n      fail() {\n        wx.showToast({\n          title: '退出失败',\n          icon: 'none',\n          duration: 2000\n        })\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/jump/jump.json",
    "content": "{\n  \"navigationBarTitleText\": \"跳转\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/jump/jump.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'jumpApi'}}\" />\n  <view class=\"page-body\">\n    <!-- 暂时下架 -->\n    <!-- <view class=\"btn-area\">\n      <button type=\"primary\" data-mode=\"fingerPrint\" bindtap=\"openhalfscreenminiprogram\">打开半屏小程序</button>\n    </view> -->\n    <view class=\"btn-area\">\n      <button type=\"primary\" data-mode=\"fingerPrint\" bindtap=\"openanotherminiprogram\">打开小程序</button>\n    </view>\n    <!-- <view class=\"btn-area\">\n      <button type=\"primary\" data-mode=\"fingerPrint\" bindtap=\"returnminiprogram\">返回上一个小程序</button>\n    </view> -->\n    <view class=\"btn-area\">\n      <button type=\"primary\" data-mode=\"fingerPrint\" bindtap=\"exitminiprogram\">退出当前小程序</button>\n    </view>\n  </view>\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/jump/jump.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/api/login/login.js",
    "content": "const app = getApp()\nPage({\n  onShareAppMessage() {\n    return {\n      title: '微信登录',\n      path: 'packageAPI/pages/api/login/login'\n    }\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    this.setData({\n      hasLogin: app.globalData.hasLogin\n    })\n  },\n  data: { theme: 'light' },\n  login() {\n    const that = this\n    wx.login({\n      success() {\n        app.globalData.hasLogin = true\n        that.setData({\n          hasLogin: true\n        })\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/login/login.json",
    "content": "{\n    \"navigationBarTitleText\": \"微信登录\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/login/login.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'Login'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <block wx:if=\"{{hasLogin === true}}\">\n        <text class=\"page-body-title\">已登录</text>\n        <text class=\"page-body-text\">每个微信号中仅需登录 1 次，后续每次进入页面即可根据微信 id 自动拉取用户信息</text>\n      </block>\n      <block wx:if=\"{{hasLogin === false}}\">\n        <text class=\"page-body-text\">每个微信号中仅需登录一次</text>\n        <button class=\"page-body-button\" type=\"primary\" bindtap=\"login\">微信登录</button>\n      </block>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/login/login.wxss",
    "content": "/* @import '../../common.wxss'; */\n\n.page-section {\n  margin-top: 100px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n  padding: 0 25px;\n  box-sizing: border-box;\n}\n.page-body-title {\n  font-size: 30px;\n  line-height: 100px;\n}\n.page-body-text {\n  color: #bbb;\n  font-size: 14px;\n  line-height: 20px;\n  margin: 0 0 50px 0;\n  text-align: center;\n}\n.page-body-button {\n  width: 100%;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/official-account/official-account.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '公众号',\n      path: 'packageAPI/pages/api/official-account/official-account'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    setting: {}\n  },\n  // 打开公众号主页\n  openofficialaccountprofile() {\n    wx.openOfficialAccountProfile({\n      username: 'gh_56fc3b00cc4f',\n      success: (res) => {\n      },\n      fail: (res) => {\n      }\n    })\n  },\n  // 打开公众号文章\n  openofficialaccountarticle() {\n    wx.openOfficialAccountArticle({\n      url: 'https://mp.weixin.qq.com/s/vTt8sZ_tTkTEVYgcydKqew', // 此处填写公众号文章连接\n      success: (res) => {\n      },\n      fail: (res) => {\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/official-account/official-account.json",
    "content": "{\n  \"navigationBarTitleText\": \"公众号\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/official-account/official-account.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'officialAccount'}}\" />\n  <view class=\"page-body\">\n    <view class=\"btn-area\">\n      <button type=\"primary\" data-mode=\"fingerPrint\" bindtap=\"openofficialaccountprofile\">打开公众号主页</button>\n    </view>\n    <view class=\"btn-area\">\n      <button type=\"primary\" data-mode=\"fingerPrint\" bindtap=\"openofficialaccountarticle\">打开公众号文章</button>\n    </view>\n  </view>\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/official-account/official-account.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/api/request-payment/request-payment.js",
    "content": "const app = getApp()\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '发起支付',\n      path: 'packageAPI/pages/api/request-payment/request-payment'\n    }\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  requestPayment() {\n    const self = this\n\n    self.setData({\n      loading: true\n    })\n\n    // 此处需要先调用wx.login方法获取code，然后在服务端调用微信接口使用code换取下单用户的openId\n    // 具体文档参考https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html?t=20161230#wxloginobject\n    app.getUserOpenId(function (err, openid) {\n      if (!err) {\n        wx.cloud.callFunction({\n          name: 'pay',\n          data: {\n            theme: 'light',\n            action: 'unifiedorder',\n            userInfo: {\n              openId: openid\n            },\n            price: 0.01\n          },\n          success: res => {\n            console.warn('[云函数] [openapi] templateMessage.send 调用成功：', res)\n            const data = res.result.data\n            wx.requestPayment({\n              timeStamp: data.time_stamp,\n              nonceStr: data.nonce_str,\n              package: `prepay_id=${data.prepay_id}`,\n              signType: 'MD5',\n              paySign: data.sign,\n              success: () => {\n                wx.showToast({ title: '支付成功' })\n              },\n              fail(err) {\n                self.setData({\n                  loading: false\n                })\n                console.error('支付失败：', err)\n              }\n            })\n          },\n          fail: err => {\n            wx.showToast({\n              icon: 'none',\n              title: '支付失败',\n            })\n            console.error('[云函数] [openapi] templateMessage.send 调用失败：', err)\n          }\n        })\n      } else {\n        console.log('err:', err)\n        self.setData({\n          loading: false\n        })\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/request-payment/request-payment.json",
    "content": "{\n    \"navigationBarTitleText\": \"发起支付\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/request-payment/request-payment.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'requestPayment'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view>支付金额</view>\n      <view class=\"price\">0.01</view>\n      <view class=\"desc\">实际接口应用中可自定义金额</view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"requestPayment\" loading=\"{{loading}}\">支付</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/request-payment/request-payment.wxss",
    "content": ".page-section{\n  width: auto;\n  margin: 15px;\n  padding: 62px 15px;\n  background-color: var(--weui-BG-2);\n  text-align: center;\n  font-size: 14px;\n}\n.desc{\n  color: var(--weui-FG-1);\n}\n.price{\n  margin-top: 15px;\n  margin-bottom: 13px;\n  position: relative;\n  display: inline-block;\n  font-size: 39px;\n  line-height: 1;\n}\n.price:before{\n  content: \"¥\";\n  position: absolute;\n  font-size: 20px;\n  top: 4px;\n  left: -20px;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/setting/setting.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '设置',\n      path: 'packageAPI/pages/api/setting/setting'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    setting: {}\n  },\n\n  getSetting() {\n    wx.getSetting({\n      success: (res) => {\n        console.log(res)\n        this.setData({ setting: res.authSetting })\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/setting/setting.json",
    "content": "{\n  \"navigationBarTitleText\": \"设置\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/setting/setting.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'open/get/Setting'}}\"/>\n\n  <view class=\"page-body\">\n    <form>\n      <view class=\"page-section\">\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">用户信息</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <icon wx:if=\"{{setting['scope.userInfo']}}\" class=\"icon-small\" type=\"success_no_circle\" size=\"23\"></icon>\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">地理位置</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <icon wx:if=\"{{setting['scope.userLocation']}}\" class=\"icon-small\" type=\"success_no_circle\" size=\"23\"></icon>\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input region\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">通讯地址</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <icon wx:if=\"{{setting['scope.address']}}\" class=\"icon-small\" type=\"success_no_circle\" size=\"23\"></icon>\n            </view>\n          </view>\n\n\n          <view class=\"weui-cell weui-cell_input detail\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">发票抬头</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <icon wx:if=\"{{setting['scope.invoiceTitle']}}\" class=\"icon-small\" type=\"success_no_circle\" size=\"23\"></icon>\n            </view>\n          </view>\n\n            <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">微信运动步数</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <icon wx:if=\"{{setting['scope.werun']}}\" class=\"icon-small\" type=\"success_no_circle\" size=\"23\"></icon>\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">录音功能</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <icon wx:if=\"{{setting['scope.record']}}\" class=\"icon-small\" type=\"success_no_circle\" size=\"23\"></icon>\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">保存到相册</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <icon wx:if=\"{{setting['scope.writePhotosAlbum']}}\" class=\"icon-small\" type=\"success_no_circle\" size=\"23\"></icon>\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">摄像头</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <icon wx:if=\"{{setting['scope.camera']}}\" class=\"icon-small\" type=\"success_no_circle\" size=\"23\"></icon>\n            </view>\n          </view>\n\n        </view>\n      </view>\n    </form>\n\n    <view class=\"btn-area\">\n      <button type=\"primary\" bindtap=\"getSetting\">获取小程序设置</button>\n      <button open-type=\"openSetting\" type=\"default\">打开小程序设置</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/setting/setting.wxss",
    "content": "\n\nform {\n  margin-top: 15px;\n}\n\n.weui-cell__bd {\n  display: flex;\n  justify-content: center;\n  padding: 10px 0;\n  min-height: 30px;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/share/share.js",
    "content": "Page({\n  data: {\n    theme: 'light',\n    sharedata: {\n      theme: 'light',\n      title: '自定义转发标题',\n      desc: '自定义转发描述',\n      path: 'packageAPI/pages/api/share/share'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  onShareAppMessage() {\n    return this.data.shareData\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/share/share.json",
    "content": "{\n    \"navigationBarTitleText\": \"转发\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/share/share.wxml",
    "content": "<import src=\"../../../../common/head.wxml\"/>\n<import src=\"../../../../common/foot.wxml\"/>\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'onShareAppMessage'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"weui-cells__title\">发送内容（以下字段可自由适配）</view>\n    <view class=\"weui-cells weui-cells_after-title\">\n      <view class=\"weui-cell weui-cell_input\">\n        <view class=\"weui-cell__hd\">\n          <view class=\"weui-label\">标题</view>\n        </view>\n        <view class=\"weui-cell__bd\">\n          <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\" value=\"{{shareData.title}}\"></input>\n        </view>\n      </view>\n      <view class=\"weui-cell weui-cell_input\">\n        <view class=\"weui-cell__hd\">\n          <view class=\"weui-label\">描述</view>\n        </view>\n        <view class=\"weui-cell__bd\">\n          <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\" value=\"{{shareData.desc}}\"></input>\n        </view>\n      </view>\n      <view class=\"weui-cell weui-cell_input\">\n        <view class=\"weui-cell__hd\">\n          <view class=\"weui-label\">跳转页面</view>\n        </view>\n        <view class=\"weui-cell__bd\">\n          <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\" value=\"{{shareData.path}}\"></input>\n        </view>\n      </view>\n    </view>\n    <view class=\"weui-cells__tips\">点击右上角菜单转发给好友</view>\n  </view>\n\n  <template is=\"foot\"/>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/share/share.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/api/share-button/share-button.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '转发按钮',\n      path: 'packageAPI/pages/api/share-button/share-button'\n    }\n  },\n  handleTapShareButton() {\n    if (!((typeof wx.canIUse === 'function') && wx.canIUse('button.open-type.share'))) {\n      wx.showModal({\n        title: '当前版本不支持转发按钮',\n        content: '请升级至最新版本微信客户端',\n        showCancel: false\n      })\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/share-button/share-button.json",
    "content": "{\n    \"navigationBarTitleText\": \"转发按钮\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/share-button/share-button.wxml",
    "content": "<import src=\"../../../../common/head.wxml\"/>\n<import src=\"../../../../common/foot.wxml\"/>\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'share-button'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-body-wrapper\">\n      <text class=\"page-body-title\">\n        轻触下方图标即可转发\n      </text>\n      <view class=\"page-body-line\">\n        <button bindtap=\"handleTapShareButton\" open-type=\"share\" class=\"button-share\" id=\"share-button\">\n        </button>\n        <label for=\"share-button\"><image style=\"width: 27px; height: 27px\" src=\"/image/share.png\" /></label>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\"/>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/share-button/share-button.wxss",
    "content": ".button-share {\n  display: none;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/soter-authentication/soter-authentication.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '生物认证',\n      path: 'packageAPI/pages/api/soter-authentication/soter-authentication'\n    }\n  },\n\n  startAuth(e) {\n    console.log(e)\n    const AUTH_MODE = e.currentTarget.dataset.mode\n    console.log(AUTH_MODE)\n    const startSoterAuthentication = () => {\n      wx.startSoterAuthentication({\n        requestAuthModes: [AUTH_MODE],\n        challenge: 'test',\n        authContent: '小程序示例',\n        success: () => {\n          wx.showToast({\n            title: '认证成功'\n          })\n        },\n        fail: (err) => {\n          console.error(err)\n          wx.showModal({\n            title: '失败',\n            content: '认证失败',\n            showCancel: false\n          })\n        }\n      })\n    }\n\n    const checkIsEnrolled = () => {\n      wx.checkIsSoterEnrolledInDevice({\n        checkAuthMode: AUTH_MODE,\n        success: (res) => {\n          console.log(res)\n          if (parseInt(res.isEnrolled, 10) <= 0) {\n            wx.showModal({\n              title: '错误',\n              content: `您暂未录入${AUTH_MODE === 'facial' ? '人脸' : '指纹'}信息，请录入后重试`,\n              showCancel: false\n            })\n            return\n          }\n          startSoterAuthentication()\n        },\n        fail: (err) => {\n          console.error(err)\n        }\n      })\n    }\n\n    const notSupported = () => {\n      wx.showModal({\n        title: '错误',\n        content: `您的设备不支持${AUTH_MODE === 'facial' ? '人脸' : '指纹'}识别`,\n        showCancel: false\n      })\n    }\n\n    wx.checkIsSupportSoterAuthentication({\n      success: (res) => {\n        console.log(res)\n        if (!res || res.supportMode.length === 0 || res.supportMode.indexOf(AUTH_MODE) < 0) {\n          notSupported()\n          return\n        }\n        checkIsEnrolled()\n      },\n      fail: (err) => {\n        console.error(err)\n        notSupported()\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/soter-authentication/soter-authentication.json",
    "content": "{\n  \"navigationBarTitleText\": \"生物认证\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/soter-authentication/soter-authentication.wxml",
    "content": "<import src=\"../../../../common/head.wxml\"/>\n<import src=\"../../../../common/foot.wxml\"/>\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'startSoterAuthentication'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"btn-area\">\n      <button type=\"primary\" data-mode=\"fingerPrint\" bindtap=\"startAuth\">指纹认证</button>\n    </view>\n     <view class=\"btn-area\">\n      <button type=\"primary\"data-mode=\"facial\" bindtap=\"startAuth\">人脸认证</button>\n    </view>\n  </view>\n\n  <template is=\"foot\"/>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/soter-authentication/soter-authentication.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/api/subscribe-message/subscribe-message.js",
    "content": "Page({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    theme: 'light',\n\n  },\n\n  // 请求订阅\n  requestSubscribeMessage() {\n    const self = this\n    wx.requestSubscribeMessage({\n      tmplIds: ['y1bXHAg_oDuvrQ3pHgcODcMPl-2hZHenWugsqdB2CXY'],\n      success(res) {\n        console.log(res)\n        if (res.errMsg === 'requestSubscribeMessage:ok') {\n          self.subscribeMessageSend()\n        }\n      },\n      complete(res) {\n        console.log(res)\n      }\n    })\n  },\n\n  // 下发订阅消息\n  subscribeMessageSend() {\n    wx.cloud.callFunction({\n      name: 'openapi',\n      data: {\n        theme: 'light',\n        action: 'sendSubscribeMessage'\n      },\n      success: res => {\n        console.warn('[云函数] [openapi] templateMessage.send 调用成功：', res)\n        wx.showModal({\n          title: '订阅成功',\n          content: '请返回微信主界面查看',\n          showCancel: false,\n        })\n      },\n      fail: err => {\n        wx.showToast({\n          icon: 'none',\n          title: '调用失败',\n        })\n        console.error('[云函数] [openapi] templateMessage.send 调用失败：', err)\n      }\n    })\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n    return {\n      title: '订阅消息',\n      path: 'packageAPI/pages/api/subscribe-message/subscribe-message'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/subscribe-message/subscribe-message.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/subscribe-message/subscribe-message.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: '订阅消息'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <block>\n        <text class=\"page-body-text\">点击提交，调用示例订阅消息</text>\n        <button class=\"page-body-button\" type=\"primary\" bindtap=\"requestSubscribeMessage\">提交</button>\n      </block>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/api/subscribe-message/subscribe-message.wxss",
    "content": ".page-section {\n  margin-top: 100px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n  padding: 0 25px;\n  box-sizing: border-box;\n}\n.page-body-title {\n  font-size: 30px;\n  line-height: 100px;\n}\n.page-body-text {\n  color: var(--weui-FG-1);\n  font-size: 14px;\n  line-height: 20px;\n  margin: 0 0 50px 0;\n  text-align: center;\n}\n.page-body-button {\n  width: 100%;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/2dmarker-ar/2dmarker-ar.js",
    "content": "import arBehavior from '../behavior/behavior-ar'\nimport threeBehavior from '../behavior/behavior-three'\n\n// VK 投影矩阵参数定义\nconst NEAR = 0.01\nconst FAR = 1000\n\nComponent({\n  behaviors: [arBehavior, threeBehavior],\n  data: {\n    theme: 'light',\n    widthScale: 1, // canvas宽度缩放值\n    heightScale: 0.6, // canvas高度缩放值\n    markerImgList: [], // 使用的 marker 列表\n    chooseImgList: [], // 使用的 图片 列表\n    hintBoxList: [], // 显示提示盒子列表\n  },\n  markerIndex: 0, // 使用的 marker 索引\n  hintInfo: undefined, // 提示框信息\n  lifetimes: {\n    /**\n      * 生命周期函数--监听页面加载\n      */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n\n  methods: {\n    // 对应案例的初始化逻辑，由统一的 behavior 触发\n    init() {\n      // 初始化 Three.js，用于模型相关的渲染\n      this.initTHREE()\n\n      // 初始化 GL，基于 Three.js 的 Context，用于相机YUV渲染\n      this.initYUV()\n\n      // 初始化VK\n      // start完毕后，进行更新渲染循环\n      this.initVK()\n\n      this.markerIndex = 0\n\n      // 添加 识别包围盒子\n      this.add3DBox()\n    },\n    initVK() {\n      // VKSession 配置\n      const session = this.session = wx.createVKSession({\n        track: {\n          plane: {\n            mode: 1\n          },\n          marker: true,\n        },\n        version: 'v1',\n        gl: this.gl\n      })\n\n      session.start(err => {\n        if (err) return console.error('VK error: ', err)\n\n        console.log('@@@@@@@@ VKSession.version', session.version)\n\n        //  VKSession EVENT resize\n        session.on('resize', () => {\n          this.calcCanvasSize()\n        })\n\n        // VKSession EVENT addAnchors\n        session.on('addAnchors', anchors => {\n          console.log(\"addAnchor\", anchors);\n\n          this.left.visible = true\n          this.right.visible = true\n          this.top.visible = true\n          this.bottom.visible = true\n        })\n\n        // VKSession EVENT updateAnchors\n        session.on('updateAnchors', anchors => {\n          // marker 模式下，目前仅有一个识别目标，可以直接取\n          const anchor = anchors[0]\n          const markerId = anchor.id\n          const size = anchor.size\n          this.hintInfo = {\n            markerId,\n            size\n          }\n        })\n\n        // VKSession removeAnchors\n        // 识别目标丢失时，会触发一次\n        session.on('removeAnchors', anchors => {\n          this.left.visible = false\n          this.right.visible = false\n          this.top.visible = false\n          this.bottom.visible = false\n\n          if (this.data.hintBoxList && this.data.hintBoxList.length > 0) {\n            // 清理信息\n            this.hintInfo = undefined\n            // 存在列表的情况，去除remove\n            this.setData({\n              hintBoxList: []\n            })\n          }\n        })\n\n        console.log('ready to initloop')\n        // start 初始化完毕后，进行更新渲染循环\n        this.initLoop()\n      })\n    },\n    loop() {\n      // console.log('loop')\n\n      // 获取 VKFrame\n      const frame = this.session.getVKFrame(this.canvas.width, this.canvas.height)\n\n      // 成功获取 VKFrame 才进行\n      if (!frame) { return }\n\n      // 更新相机 YUV 数据\n      this.renderYUV(frame)\n\n      // 获取 VKCamera\n      const VKCamera = frame.camera\n\n      // 相机\n      if (VKCamera) {\n        // 接管 ThreeJs 相机矩阵更新，Marker模式下，主要由视图和投影矩阵改变渲染效果\n        this.camera.matrixAutoUpdate = false\n\n        // 视图矩阵\n        this.camera.matrixWorldInverse.fromArray(VKCamera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        // 投影矩阵\n        const projectionMatrix = VKCamera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      // 绘制而为提示框的逻辑\n      if (this.hintInfo) {\n        // 存在提示信息，则更新\n        const THREE = this.THREE\n\n        // 原点偏移矩阵，VK情况下，marker 点对应就是 0 0 0，世界矩阵可以认为是一个单位矩阵\n        // marker 右侧点可以理解是 0.5 0 0\n        const center = new THREE.Vector3()\n        const right = new THREE.Vector3(0.5, 0, 0)\n\n        // 获取设备空间坐标\n        const devicePos = center.clone().project(this.camera)\n\n        // 转换坐标系，从 (-1, 1) 转到 (0, 100)，同时移到左上角 0 0，右下角 1 1\n        const screenPos = new THREE.Vector3(0, 0, 0)\n        screenPos.x = devicePos.x * 50 + 50\n        screenPos.y = 50 - devicePos.y * 50\n\n        // 获取右侧点信息\n        const deviceRightPos = right.clone().project(this.camera)\n        const screenRightPos = new THREE.Vector3(0, 0, 0)\n        screenRightPos.x = deviceRightPos.x * 50 + 50\n\n        const markerHalfWidth = screenRightPos.x - screenPos.x\n\n        this.setData({\n          hintBoxList: [\n            {\n              markerId: this.hintInfo.markerId,\n              left: screenPos.x - markerHalfWidth,\n              top: screenPos.y - markerHalfWidth,\n              width: markerHalfWidth * this.data.domWidth * 2 / 100,\n              height: markerHalfWidth * this.data.domWidth * 2 / 100,\n            }\n          ]\n        })\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.state.setCullFace(this.THREE.CullFaceBack)\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n    },\n    add3DBox() {\n      // 添加marker需要的 三维包围框\n\n      const THREE = this.THREE\n      const scene = this.scene\n\n      const material = new THREE.MeshPhysicalMaterial({\n        metalness: 0.0,\n        roughness: 0.1,\n        color: 0x64f573,\n      })\n      const geometry = new THREE.BoxGeometry(1, 1, 1)\n\n      const borderSize = 0.1\n\n      const left = new THREE.Mesh(geometry, material)\n      left.position.set(-0.5, 0, 0)\n      left.rotation.set(-Math.PI / 2, 0, 0)\n      left.scale.set(borderSize, 1.1, borderSize)\n      scene.add(left)\n      left.visible = false\n      this.left = left\n\n      const right = new THREE.Mesh(geometry, material)\n      right.position.set(0.5, 0, 0)\n      right.rotation.set(-Math.PI / 2, 0, 0)\n      right.scale.set(borderSize, 1.1, borderSize)\n      scene.add(right)\n      right.visible = false\n      this.right = right\n\n      const top = new THREE.Mesh(geometry, material)\n      top.position.set(0, 0, 0.5)\n      top.rotation.set(0, 0, 0)\n      top.scale.set(1.1, borderSize, borderSize)\n      scene.add(top)\n      top.visible = false\n      this.top = top\n\n      const bottom = new THREE.Mesh(geometry, material)\n      bottom.position.set(0, 0, -0.5)\n      bottom.rotation.set(0, 0, 0)\n      bottom.scale.set(1.1, borderSize, borderSize)\n      scene.add(bottom)\n      bottom.visible = false\n      this.bottom = bottom\n\n      console.log('add3DBox is finish')\n    },\n    chooseMedia() {\n      // marker图片上传逻辑\n      wx.chooseMedia({\n        count: 9,\n        mediaType: ['image'],\n        sizeType: ['original'],\n        success: res => {\n          console.log('chooseMedia res', res)\n\n          const chooseImgListRes = []\n          for (let i = 0; i < res.tempFiles.length; i++) {\n            const imgUrl = res.tempFiles[i].tempFilePath\n            chooseImgListRes.push(imgUrl)\n          }\n\n          console.log('set chooseImgList', chooseImgListRes)\n          this.setData({\n            chooseImgList: chooseImgListRes,\n          })\n        },\n        fail: res => {\n          console.error(res)\n        }\n      })\n    },\n    async addMarker() {\n      console.log('addMarker')\n      const fs = wx.getFileSystemManager()\n\n      const markerImgListRes = this.data.markerImgList.concat([])\n      const preMarkerIndex = this.markerIndex\n\n      console.log('pre markerImgList', preMarkerIndex, markerImgListRes)\n\n      // 检查与添加 marker 函数\n      const chooseImgCount = this.data.chooseImgList.length\n      let handledCount = 0\n      const checkMarkerAdded = () => {\n        if (handledCount === chooseImgCount) {\n          this.markerIndex = markerImgListRes.length\n\n          console.log('markerImgList set', markerImgListRes, this.markerIndex)\n          this.setData({\n            chooseImgList: [],\n            markerImgList: markerImgListRes\n          })\n        }\n      }\n\n      // 准备进行choose的图片保存到fs\n      for (let i = 0; i < chooseImgCount; i++) {\n        const chooseImgUrl = this.data.chooseImgList[i]\n        const fileEnd = chooseImgUrl.split('.').slice(-1)[0]\n        const fileIndex = preMarkerIndex + i\n        // 算法侧目前只认 map png jpg jpeg 后缀文件\n        const filePath = `${wx.env.USER_DATA_PATH}/marker-ar-${fileIndex}.${fileEnd}`\n\n        const saveAndAddMarker = () => {\n          console.log('saveFileSync start', filePath, chooseImgUrl)\n          // 存入文件系统，并添加到marker\n          fs.saveFile({\n            filePath,\n            tempFilePath: chooseImgUrl,\n            success: () => {\n              console.log('[addMarker] --> ', filePath)\n              const markerId = this.session.addMarker(filePath)\n              markerImgListRes.push({\n                markerId,\n                filePath\n              })\n              handledCount++\n              checkMarkerAdded()\n            },\n            fail: res => {\n              console.error(res)\n              console.log('文件保存失败', filePath)\n              handledCount++\n              checkMarkerAdded()\n            }\n          })\n        }\n\n        console.log('uploadFile Path', filePath)\n        // 确定文件，存在即删除\n        fs.stat({\n          path: filePath,\n          success: (res) => {\n            if (res.stats.isFile()) {\n              fs.unlinkSync(filePath)\n              console.log('fs unlinkSync', filePath)\n            }\n            saveAndAddMarker()\n          },\n          fail: (res) => {\n            console.error(res)\n            console.log('fs中不存在，直接写入', filePath)\n\n            saveAndAddMarker()\n          }\n        })\n      }\n    },\n    removeMarker() {\n      if (this.data.markerImgList) {\n        for (let i = 0; i < this.data.markerImgList.length; i++) {\n          const markerImg = this.data.markerImgList[i]\n          this.session.removeMarker(markerImg.markerId)\n        }\n        this.markerIndex = 0\n        this.setData({\n          markerImgList: [],\n        })\n      }\n    },\n    getAllMarker() {\n      console.log(this.session.getAllMarker())\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/2dmarker-ar/2dmarker-ar.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"2DMarkerAR\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/2dmarker-ar/2dmarker-ar.wxml",
    "content": "\n<view class=\"page wrap-fix\" data-weui-theme=\"{{theme}}\">\n  <view class=\"canvas-wrap\" style=\"width: {{widthScale * 100}}%; height: {{heightScale * 100}}%\">\n    <canvas type=\"webgl\" id=\"canvas\"></canvas>\n    \n    <view class=\"hint-box\"  wx:for=\"{{hintBoxList}}\"  wx:for-item=\"hintBox\" wx:key=\"hintBoxId\"\n      style=\"left: {{hintBox.left}}%; top: {{hintBox.top}}%; width: {{hintBox.width}}px;  height: {{hintBox.height}}px;\"\n    >\n      <p class=\"hint-id\">识别id: {{hintBox.markerId}}</p>\n    </view>\n  </view>\n\n  <view class=\"hint-words\">提示：选择用于识别的图片, 点击添加为marker, 然后手机摄像头对准下方所选图片</view>\n\n  <view class=\"wrap-option\">\n    <button type=\"primary\" disabled=\"{{markerImgList.length === 0}}\" bindtap=\"removeMarker\">删除已有 marker</button>\n    <button type=\"primary\" disabled=\"{{markerImgList.length === 0}}\" bindtap=\"getAllMarker\">获取所有 marker</button>\n  </view>\n  <view class=\"wrap-marker\">\n    <view class=\"wrap-left\">\n      <button type=\"primary\" class=\"btn-left\" disabled=\"{{chooseImgList.length === 0}}\" bindtap=\"addMarker\">添加 marker</button>\n    </view>\n    <view class=\"wrap-right img-list\">\n      <view class=\"img-list\">\n        <image wx:for=\"{{markerImgList}}\"  wx:for-item=\"markerImg\" wx:key=\"markerIndex\" src=\"{{markerImg.filePath}}\" mode=\"aspectFit\" />\n      </view>\n      <view class=\"hint-empty\" wx:if=\"{{markerImgList.length === 0}}\">\n        <p>上传图片后点击左侧按钮<br/>将图片添加到 Marker 识别列表</p>\n      </view>\n    </view>\n  </view>\n  <view class=\"wrap-choose\">\n    <view class=\"wrap-left\">\n      <button type=\"primary\" class=\"btn-left\" bindtap=\"chooseMedia\">选择识别图片</button>\n    </view>\n    <view class=\"wrap-right\">\n      <view class=\"img-list\">\n        <image wx:for=\"{{chooseImgList}}\"  wx:for-item=\"chooseImg\" wx:key=\"chooseIndex\" src=\"{{chooseImg}}\" mode=\"aspectFit\" />\n      </view>\n      <view class=\"hint-empty\" wx:if=\"{{chooseImgList.length === 0}}\">\n        <p>点击左侧按钮上传图片（允许上传1-9张）</p>\n      </view>\n    </view>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/2dmarker-ar/2dmarker-ar.wxss",
    "content": ".canvas-wrap {\n  position: relative;\n  width: 100%;\n  background-color: #000;\n}\n\n.canvas-wrap #canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.hint-box {\n  position: absolute;\n  left: 0%;\n  top: 0%;\n  width: 0;\n  height: 0;\n}\n.hint-id {\n  position: absolute;\n  left: -6rpx;\n  right: -6rpx;\n  bottom: 100%;\n  color: #fff;\n  font-size: 20rpx;\n  line-height: 40rpx;\n  text-align: center;\n  text-overflow: ellipsis;\n  background-color: #07c160;\n  border-radius: 8rpx;\n\n}\n\n.wrap-fix {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.hint-words {\n  position: absolute;\n  left: 20rpx;\n  top: 20rpx;\n  right: 20rpx;\n  padding: 10rpx 20rpx;\n  line-height: 40rpx;\n  text-align: center;\n  border-radius: 6rpx;\n  background-color: rgba(0, 0, 0, .3);\n  font-size: 26rpx;\n  color: #fff;\n}\n\n.wrap-left {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 30rpx;\n  width: 160rpx;\n}\n\nbutton.btn-left {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  padding: 12rpx;\n  font-size: 30rpx;\n  line-height: 1.2;\n}\n\n.wrap-right {\n  position: absolute;\n  left: 180rpx;\n  right: 20rpx;\n  top: 0;\n  bottom: 30rpx;\n  display: flex;\n}\n\n.img-list {\n  display: flex;\n  overflow: auto;\n}\n\n.img-list image {\n  height: 100%;\n}\n\n.hint-empty {\n  position: relative;\n  flex: 1;\n  border: 4rpx dotted rgba(0, 0, 0, .3);\n  border-radius: 6rpx;\n}\n\n.hint-empty p {\n  position: absolute;\n  left: 20rpx;\n  right: 20rpx;\n  top: 50%;\n  transform: translate(0, -50%);\n  text-align: center;\n  font-size: 26rpx;\n  color: rgba(0, 0, 0, .3);\n}\n\n.wrap-choose {\n  position: absolute;\n  left: 20rpx;\n  right: 20rpx;\n  bottom: 0;\n  height: 15%;\n}\n\n.wrap-marker {\n  position: absolute;\n  left: 20rpx;\n  right: 20rpx;\n  bottom: 15%;\n  height: 15%;\n}\n\n.wrap-option {\n  position: absolute;\n  left: 20rpx;\n  right: 0;\n  bottom: 30%;\n  height: 10%;\n  display: flex;\n}\n\n.wrap-option button {\n  flex: 1;\n  margin: 20rpx 20rpx 20rpx 0;\n  font-size: 30rpx;\n  line-height: 1.2;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/3dmarker-ar.js",
    "content": "import arBehavior from '../behavior/behavior-ar'\nimport xrFrameBehavior from '../behavior/behavior-xrframe'\n\n// protobuf 相关逻辑\nconst protobuf = require('./protobuf/protobuf.js')\nconst json = require('./proto/arModelProto.js')\n\nconst root = protobuf.Root.fromJSON(json)\nconst message = root.lookupType('ARModelData')\n\nlet gltfIndex = 0\n\n// VK 投影矩阵参数定义\nconst NEAR = 0.01\nconst FAR = 1000\n\n// 针对 vk 生成模型的矫正\nconst modelScale = 0.16\n\nComponent({\n  behaviors: [arBehavior, xrFrameBehavior],\n  data: {\n    theme: 'light',\n    widthScale: 1, // canvas宽度缩放值\n    heightScale: 0.6, // canvas高度缩放值\n    hintBoxList: [], // 显示提示盒子列表\n    usingMarkerId: false, // 使用中的markerId\n    haveMap: false, // 存在map\n    haveGLTF: false, // 存在gltf\n  },\n  markerIndex: 0, // 使用的 marker 索引\n  hintInfo: undefined, // 提示框信息\n  selectCosid: 0, // 选中的cosid\n  selectResp: undefined, // 选中的回调信息\n  parsedMapUrl: undefined, // 使用中的mapUrl\n  parsedGlbUrl: undefined, // 使用中的glbUrl\n  lifetimes: {\n    /**\n      * 生命周期函数--监听页面加载\n      */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    // 对应案例的初始化逻辑，由统一的 behavior 触发\n    init() {\n      this.markerIndex = 0\n\n      // 初始化VK\n      // start完毕后，进行更新渲染循环\n      this.initVK()\n    },\n    initVK() {\n      // VKSession 配置\n      const session = this.session = wx.createVKSession({\n        track: {\n          plane: {\n            mode: 1\n          },\n          marker: true,\n        },\n        version: 'v1',\n        gl: this.gl\n      })\n\n      session.start(err => {\n        if (err) return console.error('VK error: ', err)\n\n        console.log('@@@@@@@@ VKSession.version', session.version)\n\n        //  VKSession EVENT resize\n        session.on('resize', () => {\n          this.calcCanvasSize()\n        })\n\n        // VKSession EVENT addAnchors\n        session.on('addAnchors', anchors => {\n          console.log('addAnchor', anchors)\n        })\n\n        // VKSession EVENT updateAnchors\n        session.on('updateAnchors', anchors => {\n          // marker 模式下，目前仅有一个识别目标，可以直接取\n          const anchor = anchors[0]\n          const markerId = anchor.id\n          const size = anchor.size\n          this.hintInfo = {\n            markerId,\n            size\n          }\n\n          console.log('update a')\n          if (!this.modelShow) {\n            if (this.modelTrs) {\n              this.modelTrs.scale.x = modelScale\n              this.modelTrs.scale.y = modelScale\n              this.modelTrs.scale.z = modelScale\n            }\n\n            this.xAxis.visible = true\n            this.yAxis.visible = true\n            this.zAxis.visible = true\n\n            this.modelShow = true\n          }\n        })\n\n        // VKSession removeAnchors\n        // 识别目标丢失时，会触发一次\n        session.on('removeAnchors', anchors => {\n          console.log('remove a')\n\n          if (this.modelShow) {\n            if (this.modelTrs) {\n              this.modelTrs.scale.x = 0\n              this.modelTrs.scale.y = 0\n              this.modelTrs.scale.z = 0\n            }\n\n            this.xAxis.visible = false\n            this.yAxis.visible = false\n            this.zAxis.visible = false\n\n            this.modelShow = false\n          }\n        })\n\n        console.log('ready to initloop')\n        // start 初始化完毕后，进行更新渲染循环\n        this.initLoop()\n      })\n    },\n    // 针对 xr-frame 的初始化逻辑\n    async initXRFrame() {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const scene = this.xrScene\n      const { rootShadow } = scene\n\n      // 初始化YUV相机配置\n      this.initXRYUVCamera()\n\n      // 添加marker 提示用的 三个轴\n      const geometryCube = scene.assets.getAsset('geometry', 'cube')\n      const effectCube = scene.assets.getAsset('effect', 'standard')\n      const axisScale = 1.0\n      const lineScale = 0.05\n\n      const elX = scene.createElement(xrFrameSystem.XRNode, {\n        position: `${axisScale / 2} 0 0`,\n        scale: `${axisScale} ${lineScale} ${lineScale}`,\n      })\n      const elXTrs = elX.getComponent(xrFrameSystem.Transform)\n      const matX = scene.createMaterial(effectCube)\n      matX.setVector('u_baseColorFactor', xrFrameSystem.Vector4.createFromNumber(1, 0.2, 0.2, 1.0))\n      const meshX = elX.addComponent(xrFrameSystem.Mesh, {\n        geometry: geometryCube,\n        material: matX,\n      })\n      this.xAxis = elXTrs\n      rootShadow.addChild(elX)\n      this.xAxis.visible = false\n\n      const elY = scene.createElement(xrFrameSystem.XRNode, {\n        position: `0 ${axisScale / 2} 0`,\n        scale: `${lineScale} ${axisScale} ${lineScale}`,\n      })\n      const elYTrs = elY.getComponent(xrFrameSystem.Transform)\n      const matY = scene.createMaterial(effectCube)\n      matY.setVector('u_baseColorFactor', xrFrameSystem.Vector4.createFromNumber(0.2, 1, 0.2, 1.0))\n      const meshY = elY.addComponent(xrFrameSystem.Mesh, {\n        geometry: geometryCube,\n        material: matY,\n      })\n      this.yAxis = elYTrs\n      rootShadow.addChild(elY)\n      this.yAxis.visible = false\n\n      const elZ = scene.createElement(xrFrameSystem.XRNode, {\n        position: `0 0 ${axisScale / 2}`,\n        scale: `${lineScale} ${lineScale} ${axisScale}`,\n      })\n      const elZTrs = elZ.getComponent(xrFrameSystem.Transform)\n      const matZ = scene.createMaterial(effectCube)\n      matZ.setVector('u_baseColorFactor', xrFrameSystem.Vector4.createFromNumber(0.2, 0.2, 1, 1.0))\n      const meshZ = elZ.addComponent(xrFrameSystem.Mesh, {\n        geometry: geometryCube,\n        material: matZ,\n      })\n      this.zAxis = elZTrs\n      rootShadow.addChild(elZ)\n      this.zAxis.visible = false\n      console.log('add3DAxis is finish')\n    },\n    loop() {\n      // 获取 VKFrame\n      const frame = this.session.getVKFrame(this.data.domWidth, this.data.domHeight)\n\n      // 成功获取 VKFrame 才进行\n      if (!frame) { return }\n\n      // 更新相机 YUV 数据\n      this.updataXRYUV(frame)\n\n      // 获取 VKCamera\n      const VKCamera = frame.camera\n\n      // 更新 xrFrame 相机矩阵\n      this.updataXRCameraMatrix(VKCamera, NEAR, FAR)\n    },\n    async parseAddMarker() {\n      // 目前未选中cosid 跳过\n      if (!this.selectCosid) {\n        console.log('目前未选中cosid，请选中后重试')\n        return\n      }\n      // 存在marker的情况下，无法继续添加marker\n      if (this.data.usingMarkerId) {\n        console.log('已添加 marker，请删除后重试')\n        return\n      }\n      if (this.parseAddMarkerLoading) {\n        console.log('加载中，请稍后重试')\n        return\n      }\n\n      const resp = this.selectResp\n      console.log('开始添加 marker')\n      console.log('获取的模型的cosID为', this.selectCosid)\n      console.log(this.selectResp)\n      const filePath = wx.env.USER_DATA_PATH + '/temp'\n      console.log('请求地址')\n      console.log(resp.result.respBody.url)\n\n      // 简单的加载锁\n      this.parseAddMarkerLoading = true\n      // 开始下载文件\n      wx.downloadFile({\n        filePath,\n        url: resp.result.respBody.url,\n        success: (res) => {\n          console.log('下载回调', res)\n          const fs = wx.getFileSystemManager()\n          fs.readFile({\n            filePath: res.filePath,\n            position: 0,\n            success: async (res) => {\n              console.log('读文件回调，结果返回为', res)\n              wx.hideLoading()\n\n              // 开始解析具体信息 protobuf\n              try {\n                console.log('开始解析回调')\n                var data = message.decode(res.data)\n                console.log('反序列化完成')\n                console.log(data)\n              } catch (e) {\n                wx.hideLoading()\n                console.log('模型数据解析有误')\n                console.log(e)\n                if (e instanceof protobuf.util.ProtocolError) {\n                  // missing required field\n                  console.log('missing required field')\n                } else {\n                  // wire format is invalid\n                  console.log('wire format is invalid')\n                }\n                throw e\n              }\n\n              let mapSuccess = true\n              let gltfSuccess = true\n\n              // map文件\n              if (data.meshModel && data.meshModel.byteLength !== 0) {\n                // map文件成功\n                this.setData({\n                  haveMap: true,\n                })\n\n                // 解析完毕，进行 buffer 具体处理\n                // map文件\n                const byteOffset = data.meshModel.byteOffset\n                const byteLength = data.meshModel.byteLength\n                const mapContent = data.meshModel.buffer.slice(byteOffset, byteOffset + byteLength)\n                console.log('byteOffset:', byteOffset)\n                console.log('byteLength:', byteLength)\n\n                // 写入文件后的地址\n                const mapUrl = this.saveLocalFile(mapContent, 'model.map')\n                console.log('map文件的本地路径', mapUrl)\n                this.parsedMapUrl = mapUrl\n\n                // 添加marker\n                const markerId = this.session.addMarker(mapUrl)\n                console.log('add Marker', markerId, mapUrl)\n                this.setData({\n                  usingMarkerId: markerId\n                })\n              } else {\n                mapSuccess = false\n              }\n\n              // glb文件\n              if (data.meshBlob && data.meshBlob.byteLength !== 0) {\n                // 简单过滤下无模型情况\n                const glbByteOffset = data.meshBlob.byteOffset\n                const glbByteLength = data.meshBlob.byteLength\n                const glbContent = data.meshBlob.buffer.slice(glbByteOffset, glbByteOffset + glbByteLength)\n                console.log('glbContent', glbContent)\n                const glbUrl = this.saveLocalFile(glbContent, 'result.glb')\n                console.log('glb文件的本地路径', glbUrl)\n                this.parsedGlbUrl = glbUrl\n\n                // @optional\n                // 后续为添加渲染产物模型的逻辑\n                // xrFrame 加载模型相关\n\n                // 加载生成模型\n                const xrFrameSystem = wx.getXrFrameSystem()\n                const scene = this.xrScene\n\n                // gltf索引更新\n                gltfIndex++\n\n                const resultModel = await scene.assets.loadAsset({\n                  type: 'gltf',\n                  assetId: `gltf-result-${gltfIndex}`,\n                  src: `${wx.env.USER_DATA_PATH}/result.glb`,\n                })\n                console.log('resultModel', resultModel.value)\n                const el = scene.createElement(xrFrameSystem.XRGLTF, {\n                  model: `gltf-result-${gltfIndex}`,\n                  position: `0 -${modelScale} -${modelScale}`,\n                  rotation: '90 0 0',\n                  scale: '0 0 0', // 默认先不显示\n                })\n                this.model = el\n                this.modelTrs = el.getComponent(xrFrameSystem.Transform)\n                this.modelShow = false\n                this.xrScene.rootShadow.addChild(el)\n\n                // Three 场景相关\n                // const THREE = this.THREE;\n                // // 控制容器节点\n                // this.modelWrap = new THREE.Object3D();\n                // this.scene.add( this.modelWrap );\n\n                // // 加载模模型\n                // const loader = this.loader = new THREE.GLTFLoader()\n                // loader.parse( glbContent, './', ( gltf ) =>{\n                //   console.log('gltf loaded', gltf.scene);\n\n                //   // 设置模型索引以及缩放比\n                //   this.model = gltf.scene;\n                //   this.model.position.set(0, 0, 0);\n                //   // 默认缩放设置到0.1\n                //   this.model.scale.set(0.1, 0.1, 0.1);\n                //   this.model.visible = false;\n\n                //   console.log('gltf set', this.model);\n\n                //   // 模型加载到场上\n                //   this.modelWrap.add(this.model);\n                // });\n              } else {\n                gltfSuccess = false\n              }\n\n              // 更新产物状态\n              this.setData({\n                haveMap: mapSuccess,\n                haveGLTF: gltfSuccess\n              })\n\n              if (!mapSuccess || !gltfSuccess) {\n                // 文件生成失败提示\n                const mapWord = !mapSuccess ? 'map文件' : ''\n                const gltfWord = !gltfSuccess ? 'glTF文件' : ''\n\n                wx.showToast({\n                  title: `${mapWord} ${gltfWord} 生成失败`,\n                  icon: 'none',\n                  duration: 2000\n                })\n              }\n\n              this.parseAddMarkerLoading = false\n            },\n            fail(res) {\n              wx.hideLoading()\n              wx.showToast({\n                title: res.errMsg,\n                icon: 'none',\n                duration: 2000\n              })\n\n              this.parseAddMarkerLoading = false\n            }\n          })\n        },\n        fail(res) {\n          wx.hideLoading()\n          wx.showToast({\n            title: res.errMsg,\n            icon: 'none',\n            duration: 2000\n          })\n          console.error(res)\n          this.parseAddMarkerLoading = false\n        }\n      })\n    },\n    saveLocalFile(bufferContent, name) {\n      const url = `${wx.env.USER_DATA_PATH}/${name}`\n\n      const fs = wx.getFileSystemManager()\n      try {\n        const res = fs.writeFileSync(\n          url,\n          bufferContent,\n          'utf8'\n        )\n        console.log(res)\n      } catch (e) {\n        console.error(e)\n      }\n\n      return url\n    },\n    removeMarker() {\n      // 清理所有 marker\n      this.session.removeMarker(this.data.usingMarkerId)\n      this.setData({\n        usingMarkerId: null\n      })\n      // 释放xrframe资源\n      if (this.model) {\n        const scene = this.xrScene\n        scene.assets.releaseAsset('gltf', `gltf-result-${gltfIndex}`)\n        scene.rootShadow.removeChild(this.model)\n        this.model = undefined\n      }\n    },\n    getAllMarker() {\n      console.log(this.session.getAllMarker())\n    },\n    changeSelect(e) {\n      console.log('触发选择更改')\n      console.log(e.detail)\n\n      this.selectCosid = e.detail.cosid\n      this.selectResp = e.detail.modelResp\n    },\n    saveMap() {\n      if (!this.parsedMapUrl) {\n        console.log('不存在使用中的map地址')\n        return\n      }\n      wx.shareFileMessage({\n        filePath: this.parsedMapUrl,\n      })\n    },\n    saveGlTF() {\n      if (!this.parsedGlbUrl) {\n        console.log('不存在使用中的glb地址')\n        return\n      }\n\n      wx.shareFileMessage({\n        filePath: this.parsedGlbUrl,\n      })\n    },\n    useDefaultMarker() {\n      // 简单的加载锁\n      if (this.parseAddMarkerLoading) {\n        console.log('加载中，请稍后重试')\n        return\n      }\n      this.parseAddMarkerLoading = true\n\n      // 开始下载文件\n      const filePath = wx.env.USER_DATA_PATH + '/default.map'\n      wx.downloadFile({\n        filePath,\n        url: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/default.map',\n        success: (res) => {\n          console.log('下载回调', res)\n          // 添加marker\n          const markerId = this.session.addMarker(res.filePath)\n          console.log('add Default Marker', markerId)\n          this.modelShow = false\n          this.setData({\n            usingMarkerId: markerId\n          })\n\n          this.parseAddMarkerLoading = false\n        },\n        fail(res) {\n          wx.hideLoading()\n          wx.showToast({\n            title: res.errMsg,\n            icon: 'none',\n            duration: 2000\n          })\n          console.error(res)\n          this.parseAddMarkerLoading = false\n        }\n      })\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/3dmarker-ar.json",
    "content": "{\n  \"usingComponents\": {\n    \"ar-model-component\": \"./Components/arModelComponent\",\n    \"xr-frame-canvas\": \"../components/xr-frame/index\"\n  },\n  \"enablePullDownRefresh\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"3D Marker\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/3dmarker-ar.wxml",
    "content": "<view class=\"page wrap-fix\" data-weui-theme=\"{{theme}}\">\n  <view class=\"canvas-wrap\" style=\"width: {{widthScale * 100}}%; height: {{heightScale * 100}}%\">\n    <xr-frame-canvas\n      disable-scroll\n      id=\"canvas\"\n      width=\"{{width}}\"\n      height=\"{{height}}\"\n      style=\"width:{{domWidth}}px;height:{{domHeight}}px;\"\n      bind:sceneReady=\"handleXRSceneReady\"\n    ></xr-frame-canvas>\n     \n    <view class=\"hint-box\"  wx:for=\"{{hintBoxList}}\"  wx:for-item=\"hintBox\" wx:key=\"hintBoxId\"\n      style=\"left: {{hintBox.left}}%; top: {{hintBox.top}}%; width: {{hintBox.width}}px;  height: {{hintBox.height}}px;\"\n    >\n      <p class=\"hint-id\">识别id: {{hintBox.markerId}}</p>\n    </view>\n  </view>\n\n  <view class=\"hint-words\">提示：点击 `添加按钮`，提交绕目标一圈的视频；点选列表中已完成的模型；点击 `解析添加marker` 进行实际文件解析；将手机对准识别目标进行marker识别；解析后，可下载marker识别用产物map、渲染用产物 glTF。</view>\n\n  <view class=\"wrap-option small\">\n     <button type=\"primary\" disabled=\"{{usingMarkerId}}\" bindtap=\"useDefaultMarker\">使用默认 Marker（维他柠檬茶）</button>\n  </view>\n  <view class=\"wrap-option\">\n    <button type=\"primary\" disabled=\"{{usingMarkerId}}\" bindtap=\"parseAddMarker\">解析添加 Marker</button>\n    <button type=\"primary\" disabled=\"{{!usingMarkerId}}\" bindtap=\"removeMarker\">清理使用 marker</button>\n    <button type=\"primary\" disabled=\"{{!haveMap}}\" bindtap=\"saveMap\">保存使用的 map 文件</button>\n    <button type=\"primary\" disabled=\"{{!haveGLTF}}\" bindtap=\"saveGlTF\">保存使用的 glTF 文件</button>\n  </view>\n\n  <view class=\"model-wrap\">\n    <!-- 3D marker 模型上传 以及 现有列表相关逻辑 -->\n    <ar-model-component\n      id=\"arModelComponent\"\n      bindselectEvent=\"changeSelect\"\n    ></ar-model-component>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/3dmarker-ar.wxss",
    "content": ".canvas-wrap {\n  position: relative;\n  width: 100%;\n  background-color: #000;\n}\n\n.canvas-wrap canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.hint-box {\n  position: absolute;\n  left: 0%;\n  top: 0%;\n  width: 0;\n  height: 0;\n}\n.hint-id {\n  position: absolute;\n  left: -6rpx;\n  right: -6rpx;\n  bottom: 100%;\n  color: #fff;\n  font-size: 20rpx;\n  line-height: 40rpx;\n  text-align: center;\n  text-overflow: ellipsis;\n  background-color: #07c160;\n  border-radius: 8rpx;\n}\n\n\n.wrap-fix {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.hint-words {\n  position: absolute;\n  left: 20rpx;\n  top: 20rpx;\n  right: 20rpx;\n  padding: 10rpx 20rpx;\n  line-height: 40rpx;\n  text-align: center;\n  border-radius: 6rpx;\n  background-color: rgba(0, 0, 0, .3);\n  font-size: 26rpx;\n  color: #fff;\n}\n\n.wrap-option {\n  margin-left: 20rpx;\n  height: 160rpx;\n  display: flex;\n}\n\n.wrap-option.small {\n  height: 100rpx;\n}\n\n.wrap-option.small button {\n  margin: 20rpx 20rpx 0rpx 0;\n}\n\n.wrap-option button {\n  flex: 1;\n  margin: 20rpx 20rpx 20rpx 0;\n  padding: 4rpx;\n  font-size: 28rpx;\n  line-height: 1.2;\n}\n\n.model-wrap {\n  position: relative;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/Components/arModelComponent.js",
    "content": "Component({\n  behaviors: ['wx://component-export'],\n  export() {\n    return { getARModelList: this.getARModelList.bind(this) }\n  },\n  data: {\n    chooseMapFile: null,\n    envId: 'test-f0b102',\n    modelName: 'arDemo',\n    // 模型数据\n    // @ modelStatus 模型状态\n    // @ cosid\n    // @ uploadTime 上传时间\n    // @ errMsg 错误信息\n    models: [],\n  },\n  modelRespMap: {},\n  lifetimes: {\n    ready() {\n      if (!wx.cloud) {\n        console.error('请使用 2.2.3 或以上的基础库以使用云能力')\n      } else {\n        wx.cloud.init({\n          traceUser: true,\n        })\n        console.log('初始化云函数成功')\n      }\n\n      // 缓存resp map\n      this.modelRespMap = {}\n\n      const keyNumber = (new Date()).getTime() * 10 + Math.floor(Math.random() * 10)\n      this.setData({\n        modelName: 'arDemo' + keyNumber\n      })\n\n      console.log('当前上传模型名称为 ' + 'arDemo' + keyNumber)\n\n      // 获取已有数据\n      this.getARModelList()\n    }\n  },\n\n  methods: {\n    // 上传视频逻辑\n    uploadARModel() {\n      const callback = this.generateARModel.bind(this)\n      const cloudUpload = this.cloudUploadARModel.bind(this)\n      const timeNow = Date.now() / 1000 | 0\n      const modelInfos = wx.getStorageSync('modelsInfo')\n      console.log('modelInfos的值为：')\n      console.log(modelInfos)\n      if (modelInfos && modelInfos.length != 0) {\n        if (timeNow - modelInfos[0].timeStamp < 100) {\n          wx.showToast({\n            title: '每15分钟允许上传一次视频',\n            icon: 'none',\n            duration: 2000\n          })\n          return\n        }\n      }\n      // 上传视频\n      wx.chooseMedia({\n        count: 1,\n        mediaType: ['video'],\n        sourceType: ['camera', 'album'],\n        sizeType: ['original'], // 关闭压缩\n        maxDuration: 60,\n        camera: 'back',\n        success: (res) => {\n          console.log('录制成功，结果为')\n          console.log(res)\n          const tempFileInfo = res.tempFiles[0]\n          // 保证视频时长在 10-30秒 之间\n          if (tempFileInfo.duration >= 10 && tempFileInfo.duration <= 30) {\n            const rate = tempFileInfo.width / tempFileInfo.height\n\n            let min = tempFileInfo.width\n            let max = tempFileInfo.height\n            if (rate > 1) {\n              min = tempFileInfo.height\n              max = tempFileInfo.width\n            }\n            // 保证长边在 720 以上\n            if (max > 720) {\n              // 不接受比例在 3:1 以上的视频\n              if (rate < 1 / 3 || rate > 3) {\n                wx.showModal({\n                  content: '长宽比尽量为16:9或4:3，不接受比例大于3:1的视频',\n                  confirmText: '继续上传',\n                  cancelText: '取消上传',\n                  success: (button) => {\n                    if (button.confirm) {\n                      cloudUpload(res, callback)\n                    } else if (button.cancel) {\n                    }\n                  }\n                })\n              } else {\n                cloudUpload(res, callback)\n              }\n            } else {\n              wx.showModal({\n                content: '建议长边在720以上',\n                confirmText: '继续上传',\n                cancelText: '取消上传',\n                success: (button) => {\n                  if (button.confirm) {\n                    cloudUpload(res, callback)\n                  } else if (button.cancel) {\n                  }\n                }\n              })\n            }\n          } else {\n            wx.showToast({\n              title: '请录制10~30秒内的视频',\n              icon: 'none',\n              duration: 2000\n            })\n          }\n        }\n      })\n    },\n    // 生成具体模型\n    generateARModel(url) {\n      console.log('当前地址为：', url)\n      wx.showLoading({\n        title: '生成模型中……',\n      })\n\n      const reqData = {\n        type: 'GenerateARModel',\n        name: this.data.modelName,\n        url,\n        algoType: 2,\n        getMesh: true,\n        getTexture: true\n      }\n\n      console.log('调用参数为:', reqData)\n\n      wx.cloud.callFunction({\n        name: 'ARDemo',\n        config: {\n          env: this.data.envId\n        },\n        data: reqData\n      }).then((resp) => {\n        console.log('生成模型成功')\n        console.log(resp)\n        wx.showToast({\n          title: '生成模型成功',\n          icon: 'none',\n          duration: 2000\n        })\n\n        wx.hideLoading()\n\n        let modelInfos = wx.getStorageSync('modelsInfo')\n        if (modelInfos == undefined || modelInfos.length == 0) {\n          modelInfos = []\n        }\n        console.log('原有的缓存列表', modelInfos)\n\n        const returnCosid = resp.result.respBody.cosid\n\n        // 5分钟内上传相同文件，会返回相同的cosid，需要过滤掉\n        let matched = false\n        for (let j = modelInfos.length - 1; j >= 0; j--) {\n          if (modelInfos[j].cosid === returnCosid) {\n            matched = true\n            break\n          }\n        }\n        if (!matched) {\n          console.log('缓存对cosid进行push')\n          console.log('当前生成模型的cosid为：', returnCosid)\n\n          console.log()\n          modelInfos.push({\n            cosid: resp.result.respBody.cosid,\n            uploadTime: this.convertToTime(Date.parse(new Date()) / 1000),\n            timeStamp: Date.now() / 1000 | 0,\n            modelStatus: 0,\n            restTime: 0,\n            statusMsg: '准备中'\n          })\n        }\n\n        modelInfos.sort(function (a, b) {\n          if (a.uploadTime > b.uploadTime) {\n            return -1\n          } else if (a.uploadTime < b.uploadTime) {\n            return 1\n          }\n          return 0\n        })\n\n        wx.setStorage({\n          key: 'modelsInfo',\n          data: modelInfos,\n          success() {\n            console.log('存储cosID集合为:', modelInfos)\n          }\n        })\n\n        this.setData({\n          models: modelInfos\n        })\n      }).catch((e) => {\n        console.log(e)\n        wx.showToast({\n          title: e.errMsg,\n          icon: 'none',\n          duration: 2000\n        })\n        this.setData({\n          showUploadTip: true\n        })\n        wx.hideLoading()\n      })\n    },\n    // 获取现有模型列表\n    getARModelList() {\n      // 获取本地缓存\n      const modelInfos = wx.getStorageSync('modelsInfo')\n      if (modelInfos == undefined || modelInfos.length == 0) {\n        // 无缓存，跳过\n        return\n      }\n\n      const countModelInfo = modelInfos.length\n      let countLoaded = 0\n\n      const modelInfosNew = []\n\n      // 统一的获取处理回调\n      const handleLoadModelInfo = () => {\n        if (countLoaded === countModelInfo) {\n          // 加载完毕\n          console.log('基于本地缓存请求列表结束', modelInfosNew)\n\n          // 新列表，基于创建时间排序\n          modelInfosNew.sort(function (a, b) {\n            if (a.uploadTime > b.uploadTime) {\n              return -1\n            } else if (a.uploadTime < b.uploadTime) {\n              return 1\n            }\n            return 0\n          })\n\n          // 写入缓存\n          wx.setStorage({\n            key: 'modelsInfo',\n            data: modelInfosNew,\n            success() {\n              console.log('存储cosID集合为:', modelInfosNew)\n              wx.hideLoading()\n            }\n          })\n\n          // 更新显示列表\n          this.setData({\n            models: modelInfosNew,\n          })\n        }\n      }\n\n      // 基于缓存列表请求\n      for (let i = 0; i < countModelInfo; i++) {\n        const modelInfo = modelInfos[i]\n        const cosid = modelInfo.cosid\n        wx.cloud.callFunction({\n          name: 'ARDemo',\n          config: {\n            env: this.data.envId\n          },\n          data: {\n            type: 'GetARModel',\n            cosid,\n            modelType: 3,\n            needData: 0,\n            useIntranet: 0,\n            expireTime: 1200\n          }\n        }).then(resp => {\n          countLoaded++\n\n          const modelStatus = resp.result.respBody.status\n\n          console.log('获取的模型的cosID为', cosid)\n          console.log(resp)\n          console.log('status', modelStatus)\n\n          // 根据返回信息，更新模型信息\n          const modelInfoNew = {\n            cosid,\n            uploadTime: modelInfo.uploadTime,\n            timeStamp: modelInfo.timeStamp,\n            modelStatus, // 0 生成中 1 生成成功 2 过期 3 生成失败\n            restTime: 0,\n            statusMsg: '准备中',\n          }\n          // 回调写入缓存map，方便读取\n          this.modelRespMap[cosid] = resp\n\n          // 根据状态设置描述\n          if (modelStatus === 1) {\n            // 生成成功\n            modelInfoNew.statusMsg = '已完成'\n            // 运算过期时间\n            const expireTime = resp.result.respBody.expireTime\n            const nowTime = Date.now() / 1000 | 0\n            const restTime = Math.floor((expireTime - nowTime) / 60 / 60 / 24)\n            modelInfoNew.restTime = restTime\n          } else if (modelStatus === 2) {\n            // 资源过期\n            modelInfoNew.statusMsg = '资源过期'\n          } else if (modelStatus === 3) {\n            // 生成失败\n            const errMsg = resp.result.respBody.errMsg\n            console.log('errMsg', errMsg)\n\n            modelInfoNew.statusMsg = '生成失败'\n            if (errMsg) {\n              modelInfoNew.errMsg = errMsg\n            }\n          }\n\n          modelInfosNew.push(modelInfoNew)\n\n          handleLoadModelInfo()\n        }).catch((e) => {\n          countLoaded++\n\n          console.log(e)\n        })\n      }\n    },\n    cloudUploadARModel(res, callback) {\n      wx.showLoading({\n        title: '文件上传中……',\n      })\n\n      const second = (new Date()).getSeconds()\n\n      // 组成规则 第一位随机数（1 / 2）第二位是秒的个位\n      const id = Math.ceil(Math.random() * 2) * 10 + second % 10\n\n      wx.cloud.uploadFile({\n        cloudPath: `3dmarker/arVideo${id}.mp4`,\n        filePath: res.tempFiles[0].tempFilePath, // 文件路径\n        config: {\n          env: this.data.envId\n        },\n        timeout: 60000,\n        success(res) {\n          wx.hideLoading()\n          const data = res.data\n          console.log('上传文件success:', res)\n          wx.showToast({\n            title: '上传文件成功',\n            icon: 'none',\n            duration: 2000\n          })\n          wx.cloud.getTempFileURL({\n            fileList: [res.fileID],\n            success: res => {\n              callback(res.fileList[0].tempFileURL)\n              console.log('生成模型中……')\n            },\n            fail: err => {\n              console.log('发生错误：', err)\n              wx.showToast({\n                title: err.errMsg,\n                icon: 'none',\n                duration: 2000\n              })\n            }\n          })\n        },\n        fail: err => {\n          wx.hideLoading()\n          console.log('上传文件error:', err)\n          wx.showToast({\n            title: err.errMsg,\n            icon: 'none',\n            duration: 2000\n          })\n        }\n      })\n    },\n    // 工具函数 转换时间戳\n    convertToTime(timestamp) {\n      const now = new Date(timestamp * 1000)\n      const y = now.getFullYear()\n      const m = now.getMonth() + 1\n      const d = now.getDate()\n      const x = y + '-' + (m < 10 ? '0' + m : m) + '-' + (d < 10 ? '0' + d : d) + ' \\n' + now.toTimeString().substr(0, 8)\n      return x\n    },\n    // 选择模型\n    chooseARModel(event) {\n      // 被选中cosid\n      const selectCosid = event.currentTarget.dataset.cosid\n      // 已选中cosid\n      const targetCosId = this.data.targetCosId\n\n      // 不同的情况下，更新选中目标\n      if (selectCosid !== targetCosId) {\n        const modelResp = this.modelRespMap[selectCosid]\n\n        const modelStatus = modelResp.result.respBody.status\n        // 成功才允许点击\n        if (modelStatus === 1) {\n          this.setData({\n            targetCosId: selectCosid\n          })\n\n          // 选择的时候，通知上层\n          this.triggerEvent('selectEvent', {\n            cosid: selectCosid,\n            modelResp,\n          })\n        }\n      }\n    },\n    // 删除模型本地缓存\n    deleteARModel(event) {\n      // 被选中cosid\n      const selectCosid = event.currentTarget.dataset.cosid\n\n      wx.showModal({\n        content: `是否删除当前缓存模型（删除后不可恢复），模型id ${selectCosid}`,\n        confirmText: '确定删除',\n        cancelText: '取消',\n        success: (res) => {\n          if (res.confirm) {\n            console.log('确定删除')\n            // 获取本地缓存\n            const modelInfos = wx.getStorageSync('modelsInfo')\n            if (modelInfos == undefined || modelInfos.length == 0) {\n              // 无缓存，跳过\n              return\n            }\n\n            // 新列表，过滤掉删除的cosid\n            const modelInfosNew = modelInfos.filter(\n              (modelInfo) => modelInfo.cosid !== selectCosid\n            )\n\n            // 写入缓存\n            wx.setStorage({\n              key: 'modelsInfo',\n              data: modelInfosNew,\n              success() {\n                console.log('存储cosID集合为:', modelInfosNew)\n                wx.hideLoading()\n              }\n            })\n\n            // 更新显示列表\n            this.setData({\n              models: modelInfosNew,\n            })\n          } else if (res.cancel) {\n            console.log('取消')\n          }\n        }\n      })\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/Components/arModelComponent.json",
    "content": "{\n    \"component\": true,\n    \"usingComponents\": {}\n  }"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/Components/arModelComponent.wxml",
    "content": "<view class=\"wrap-choose\">\n  <view class=\"wrap-left\">\n      <button type=\"primary\" class=\"btn-left\" bindtap=\"uploadARModel\">\n        <view class=\"cross-v\"/>\n        <view class=\"cross-h\"/>\n        <view class=\"info-wrap\">\n          <p>上传视频</p>\n          <p>（长边 720 以上）</p>\n          <p>（时长 10-30秒 之间）</p>\n          <p>（比例 3:1 以下的视频）</p>\n        </view>\n      </button>\n    </view>\n  <view class=\"wrap-right\">\n    <view class=\"model-item\" wx:for=\"{{models}}\" wx:key=\"modelIndex\" wx:for-item=\"modelItem\">\n      <view\n        class=\"model-info {{modelItem.modelStatus === 0 ? 'loading': ''}} {{modelItem.modelStatus === 1 ? 'done': '' }} {{modelItem.modelStatus === 2 ? 'expired': '' }} {{modelItem.modelStatus === 3 ? 'error': '' }} {{targetCosId != null && modelItem.cosid == targetCosId ? 'choosed' : '' }}\"\n        bindtap=\"chooseARModel\"\n        data-cosid=\"{{modelItem.cosid}}\"\n      >\n        <text class=\"status\">{{modelItem.statusMsg}}</text>\n        <text class=\"timeStamp\">{{modelItem.uploadTime}}</text>\n        <text class=\"cosid\">{{modelItem.cosid !== undefined ? modelItem.cosid : '不存在cosid'}}</text>\n        <text wx:if=\"{{modelItem.restTime !== 0}}\" class=\"restTime\">剩余 {{modelItem.restTime}} 天过期</text>\n        <text class=\"errMsg\" wx:if=\"{{modelItem.errMsg !== undefined}}\">{{modelItem.errMsg}}</text>\n        <view class=\"buttonDelete\" bindtap=\"deleteARModel\" data-cosid=\"{{modelItem.cosid}}\">\n          <view class=\"linel\"></view><view class=\"liner\"></view>\n        </view>\n      </view>\n    </view>\n\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/Components/arModelComponent.wxss",
    "content": ".wrap-choose {\n  margin-left: 20rpx;\n}\n\n.wrap-left {\n  position: absolute;\n  left: 40rpx;\n  top: 30rpx;\n  width: 200rpx;\n  height: 268rpx;\n}\n\nbutton.btn-left {\n  position: absolute;\n  left: 0;\n  top: 0%;\n  width: 100%;\n  height: 100%;\n  padding: 12rpx;\n  border-radius: 20rpx;\n}\nbutton.btn-left .info-wrap {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 20rpx;\n  text-align: center;\n}\n.info-wrap p {\n  display: block;\n  color: #fff;\n  font-size: 16rpx;\n  text-align: center;\n  line-height: 24rpx;\n  white-space: nowrap;\n}\n.info-wrap p:first-child {\n  font-size: 36rpx;\n  line-height: 60rpx;\n}\n\nbutton.btn-left .cross-v {\n  position: absolute;\n  left: 50%;\n  top: 26%;\n  width: 10rpx;\n  height: 80rpx;\n  transform: translate(-50%, -50%);\n  background-color: rgba(255, 255, 255, 1);\n  border-radius: 6rpx;\n}\n\nbutton.btn-left .cross-h {\n  position: absolute;\n  left: 50%;\n  top: 26%;\n  width: 80rpx;\n  height: 10rpx;\n  transform: translate(-50%, -50%);\n  background-color: rgba(255, 255, 255, 1);\n  border-radius: 6rpx;\n}\n.wrap-right {\n  text-align: left;\n  padding: 10rpx;\n  padding-right: 0;\n  margin-right: 20rpx;\n  min-height: 280rpx;\n  border-radius: 20rpx;\n  border: 4rpx dotted rgba(0, 0, 0, .3);\n}\n\n.model-item {\n  position: relative;\n  display: inline-block;\n  margin: 10rpx 10rpx 0 10rpx;\n  width: 206rpx;\n  height: 280rpx;\n  border-radius: 20rpx;\n}\n.model-item:first-child {\n  margin-left: 230rpx;\n}\n\n.model-info {\n  position: absolute;\n  left: 0rpx;\n  top: 0rpx;\n  width: 100%;\n  height: 100%;\n  border-radius: 20rpx;\n  box-sizing: border-box;\n  background-color: #a0a0a0;\n}\n\n.model-info.loading {\n  background-color: #a0a0a0;\n  border: 8rpx #a0a0a0 solid;\n}\n.model-info.done {\n  background-color: #2B3467;\n  border: 8rpx #2B3467 solid;\n}\n.model-info.expired {\n  background-color: #ed6c10;\n  border: 8rpx #ed6c10 solid;\n}\n.model-info.error {\n  background-color: #f73a3a;\n  border: 8rpx #f73a3a solid;\n}\n.model-info.choosed {\n  border-color: #07c160;\n}\n\n.model-info .status {\n  position: absolute;\n  left: 20rpx;\n  right: 20rpx;\n  bottom: 20rpx;\n  height: 50rpx;\n  border-radius: 10rpx;\n  line-height: 50rpx;\n  font-size: 22rpx;\n  text-align: center;\n  background-color: #fff;\n}\n\n.model-info .cosid {\n  position: absolute;\n  left: 20rpx;\n  right: 20rpx;\n  bottom: 140rpx;\n  height: 40rpx;\n  line-height: 20rpx;\n  font-size: 16rpx;\n  text-align: center;\n  color: #fff;\n  word-break: break-all;\n}\n\n.model-info.done .cosid {\n  color: #d0d0d0;\n}\n\n.model-info .timeStamp {\n  position: absolute;\n  left: 10rpx;\n  right: 10rpx;\n  top: 15rpx;\n  color: #fff;\n  font-size: 26rpx;\n  text-align: center;\n  line-height: 34rpx;\n}\n\n.model-info .restTime {\n  position: absolute;\n  left: 10rpx;\n  right: 10rpx;\n  bottom: 76rpx;\n  color: #fff;\n  font-size: 22rpx;\n  text-align: center;\n  line-height: 38rpx;\n}\n\n.model-info .errMsg {\n  position: absolute;\n  left: 10rpx;\n  right: 10rpx;\n  bottom: 76rpx;\n  color: #fff;\n  font-size: 16rpx;\n  text-align: center;\n  line-height: 26rpx;\n  background-color: #000;\n  padding: 6rpx;\n  border-radius: 6rpx;\n}\n\n.model-info .buttonDelete {\n  position: absolute;\n  right: -20rpx;\n  top: -16rpx;\n  width: 40rpx;\n  height: 40rpx;\n  background-color: #FF6969;\n  border: 2rpx solid #fff;\n  border-radius: 12rpx;\n}\n\n.buttonDelete .linel {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  width: 8%;\n  height: 70%;\n  background-color: #fff;\n  border-radius: 2rpx;\n  transform: translate(-50%, -50%) rotate(45deg);\n}\n\n.buttonDelete .liner {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  width: 8%;\n  height: 70%;\n  background-color: #fff;\n  border-radius: 2rpx;\n  transform: translate(-50%, -50%) rotate(-45deg);\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/proto/arModelProto.js",
    "content": "module.exports = {\n  nested: {\n    ARModelData: {\n      fields: {\n        meshModel: {\n          type: 'bytes',\n          id: 1\n        },\n        textureModel: {\n          type: 'bytes',\n          id: 2\n        },\n        preview: {\n          type: 'bytes',\n          id: 3\n        },\n        meshBlob: {\n          type: 'bytes',\n          id: 4\n        },\n        textureBlob: {\n          type: 'bytes',\n          id: 5\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/proto/arModelProto.proto",
    "content": "message ARModelData\n{\n    optional bytes mesh_model = 1;  // 文本(点面信息)\n    optional bytes texture_model = 2; // 图像png\n    optional bytes preview = 3;\n    optional bytes mesh_blob = 4; // obj二进制, getmesh = true时返回\n    optional bytes texture_blob = 5; // 纹理二进制, gettexture = true时返回\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/protobuf.js",
    "content": "/**\n * Created by zhangmiao on 2018/3/13.\n */\n\n\n\n(function (protobufFactory){\n    //if (typeof define === 'function')//这里会不会定义重复呢?怎么去掉呢\n    //    define('protobuf', protobufFactory);\n    //else\n        module.exports = protobufFactory();\n})(function(){\n    var protobuf = {};\n//app.globalData.protobuf = protobuf;\n\n    /**\n     * Build type, one of `\"full\"`, `\"light\"` or `\"minimal\"`.\n     * @name build\n     * @type {string}\n     * @const\n     */\n    protobuf.build = \"minimal\";\n\n// Serialization\n    protobuf.Writer       = require(\"./src/writer\");\n    protobuf.encoder      = require(\"./src/encoder\");\n    protobuf.Reader       = require(\"./src/reader\");\n\n// Utility\n    protobuf.util         = require(\"./src/util\");\n    protobuf.rpc          = require(\"./src/rpc/service\");\n    protobuf.roots        = require(\"./src/roots\");\n    protobuf.verifier     = require(\"./src/verifier\");\n\n    protobuf.tokenize         = require(\"./src/tokenize\");\n    protobuf.parse            = require(\"./src/parse\");\n    protobuf.common           = require(\"./src/common\");\n\n    protobuf.ReflectionObject = require(\"./src/object\");\n    protobuf.Namespace        = require(\"./src/namespace\");\n    protobuf.Root             = require(\"./src/root\");\n    protobuf.Enum             = require(\"./src/enum\");\n    protobuf.Type             = require(\"./src/type\");\n    protobuf.Field            = require(\"./src/field\");\n    protobuf.OneOf            = require(\"./src/oneof\");\n    protobuf.MapField         = require(\"./src/mapField\");\n    protobuf.Service          = require(\"./src/service\");\n    protobuf.Method           = require(\"./src/method\");\n    protobuf.converter        = require(\"./src/converter\");\n    protobuf.decoder          = require(\"./src/decoder\");\n\n// Runtime\n    protobuf.Message          = require(\"./src/message\");\n    protobuf.wrappers         = require(\"./src/wrappers\");\n\n// Utility\n    protobuf.types            = require(\"./src/types\");\n    protobuf.util             = require(\"./src/util\");\n\n    protobuf.configure    = configure;\n\n\n    function load(filename, root, callback) {\n        if (typeof root === \"function\") {\n            callback = root;\n            root = new protobuf.Root();\n        } else if (!root)\n            root = new protobuf.Root();\n        return root.load(filename, callback);\n    }\n\n    protobuf.load = load;\n\n    function loadSync(filename, root) {\n        if (!root)\n            root = new protobuf.Root();\n        return root.loadSync(filename);\n    }\n\n    protobuf.loadSync = loadSync;\n\n\n//新增weichat支持的解析pbConfig接口\n    function parseFromPbString(pbString, root, callback){\n        if (typeof root === \"function\") {\n            callback = root;\n            root = new protobuf.Root();\n        } else if (!root)\n            root = new protobuf.Root();\n        return root.parseFromPbString(pbString, callback);\n    }\n\n    protobuf.parseFromPbString = parseFromPbString;\n\n    /**\n     * Reconfigures the library according to the environment.\n     * @returns {undefined}\n     */\n    function configure() {\n\n        protobuf.converter._configure();\n        protobuf.decoder._configure();\n        protobuf.encoder._configure();\n        protobuf.Field._configure();\n        protobuf.MapField._configure();\n        protobuf.Message._configure();\n        protobuf.Namespace._configure();\n        protobuf.Method._configure();\n        protobuf.ReflectionObject._configure();\n        protobuf.OneOf._configure();\n        protobuf.parse._configure();\n        protobuf.Reader._configure();\n        protobuf.Root._configure();\n        protobuf.Service._configure();\n        protobuf.verifier._configure();\n        protobuf.Type._configure();\n        protobuf.types._configure();\n        protobuf.wrappers._configure();\n        protobuf.Writer._configure();\n    }\n    configure();\n\n    if(arguments&&arguments.length){\n        for (var  i = 0 ;i < arguments.length; i++){\n            var argument = arguments[i];\n            if(argument.hasOwnProperty(\"exports\")){\n                argument.exports = protobuf;\n                return;\n            }\n        }\n    }\n    return protobuf;\n});\n\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/EventEmitter.js",
    "content": "\"use strict\";\nmodule.exports = EventEmitter;\n\n/**\n * Constructs a new event emitter instance.\n * @classdesc A minimal event emitter.\n * @memberof util\n * @constructor\n */\nfunction EventEmitter() {\n\n    /**\n     * Registered listeners.\n     * @type {Object.<string,*>}\n     * @private\n     */\n    this._listeners = {};\n}\n\n/**\n * Registers an event listener.\n * @param {string} evt Event name\n * @param {function} fn Listener\n * @param {*} [ctx] Listener context\n * @returns {util.EventEmitter} `this`\n */\nEventEmitter.prototype.on = function on(evt, fn, ctx) {\n    (this._listeners[evt] || (this._listeners[evt] = [])).push({\n        fn  : fn,\n        ctx : ctx || this\n    });\n    return this;\n};\n\n/**\n * Removes an event listener or any matching listeners if arguments are omitted.\n * @param {string} [evt] Event name. Removes all listeners if omitted.\n * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.\n * @returns {util.EventEmitter} `this`\n */\nEventEmitter.prototype.off = function off(evt, fn) {\n    if (evt === undefined)\n        this._listeners = {};\n    else {\n        if (fn === undefined)\n            this._listeners[evt] = [];\n        else {\n            var listeners = this._listeners[evt];\n            for (var i = 0; i < listeners.length;)\n                if (listeners[i].fn === fn)\n                    listeners.splice(i, 1);\n                else\n                    ++i;\n        }\n    }\n    return this;\n};\n\n/**\n * Emits an event by calling its listeners with the specified arguments.\n * @param {string} evt Event name\n * @param {...*} args Arguments\n * @returns {util.EventEmitter} `this`\n */\nEventEmitter.prototype.emit = function emit(evt) {\n    var listeners = this._listeners[evt];\n    if (listeners) {\n        var args = [],\n            i = 1;\n        for (; i < arguments.length;)\n            args.push(arguments[i++]);\n        for (i = 0; i < listeners.length;)\n            listeners[i].fn.apply(listeners[i++].ctx, args);\n    }\n    return this;\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/asPromise.js",
    "content": "\"use strict\";\nmodule.exports = asPromise;\n\n/**\n * Callback as used by {@link util.asPromise}.\n * @typedef asPromiseCallback\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {...*} params Additional arguments\n * @returns {undefined}\n */\n\n/**\n * Returns a promise from a node-style callback function.\n * @memberof util\n * @param {asPromiseCallback} fn Function to call\n * @param {*} ctx Function context\n * @param {...*} params Function arguments\n * @returns {Promise<*>} Promisified function\n */\nfunction asPromise(fn, ctx/*, varargs */) {\n    var params  = new Array(arguments.length - 1),\n        offset  = 0,\n        index   = 2,\n        pending = true;\n    while (index < arguments.length)\n        params[offset++] = arguments[index++];\n    return new Promise(function executor(resolve, reject) {\n        params[offset] = function callback(err/*, varargs */) {\n            if (pending) {\n                pending = false;\n                if (err)\n                    reject(err);\n                else {\n                    var params = new Array(arguments.length - 1),\n                        offset = 0;\n                    while (offset < params.length)\n                        params[offset++] = arguments[offset];\n                    resolve.apply(null, params);\n                }\n            }\n        };\n        try {\n            fn.apply(ctx || null, params);\n        } catch (err) {\n            if (pending) {\n                pending = false;\n                reject(err);\n            }\n        }\n    });\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/base64.js",
    "content": "\"use strict\";\n\n/**\n * A minimal base64 implementation for number arrays.\n * @memberof util\n * @namespace\n */\nvar base64 = module.exports;\n\n/**\n * Calculates the byte length of a base64 encoded string.\n * @param {string} string Base64 encoded string\n * @returns {number} Byte length\n */\nbase64.length = function length(string) {\n    var p = string.length;\n    if (!p)\n        return 0;\n    var n = 0;\n    while (--p % 4 > 1 && string.charAt(p) === \"=\")\n        ++n;\n    return Math.ceil(string.length * 3) / 4 - n;\n};\n\n// Base64 encoding table\nvar b64 = new Array(64);\n\n// Base64 decoding table\nvar s64 = new Array(123);\n\n// 65..90, 97..122, 48..57, 43, 47\nfor (var i = 0; i < 64;)\n    s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\n\n/**\n * Encodes a buffer to a base64 encoded string.\n * @param {Uint8Array} buffer Source buffer\n * @param {number} start Source start\n * @param {number} end Source end\n * @returns {string} Base64 encoded string\n */\nbase64.encode = function encode(buffer, start, end) {\n    var parts = null,\n        chunk = [];\n    var i = 0, // output index\n        j = 0, // goto index\n        t;     // temporary\n    while (start < end) {\n        var b = buffer[start++];\n        switch (j) {\n            case 0:\n                chunk[i++] = b64[b >> 2];\n                t = (b & 3) << 4;\n                j = 1;\n                break;\n            case 1:\n                chunk[i++] = b64[t | b >> 4];\n                t = (b & 15) << 2;\n                j = 2;\n                break;\n            case 2:\n                chunk[i++] = b64[t | b >> 6];\n                chunk[i++] = b64[b & 63];\n                j = 0;\n                break;\n        }\n        if (i > 8191) {\n            (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\n            i = 0;\n        }\n    }\n    if (j) {\n        chunk[i++] = b64[t];\n        chunk[i++] = 61;\n        if (j === 1)\n            chunk[i++] = 61;\n    }\n    if (parts) {\n        if (i)\n            parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\n        return parts.join(\"\");\n    }\n    return String.fromCharCode.apply(String, chunk.slice(0, i));\n};\n\nvar invalidEncoding = \"invalid encoding\";\n\n/**\n * Decodes a base64 encoded string to a buffer.\n * @param {string} string Source string\n * @param {Uint8Array} buffer Destination buffer\n * @param {number} offset Destination offset\n * @returns {number} Number of bytes written\n * @throws {Error} If encoding is invalid\n */\nbase64.decode = function decode(string, buffer, offset) {\n    var start = offset;\n    var j = 0, // goto index\n        t;     // temporary\n    for (var i = 0; i < string.length;) {\n        var c = string.charCodeAt(i++);\n        if (c === 61 && j > 1)\n            break;\n        if ((c = s64[c]) === undefined)\n            throw Error(invalidEncoding);\n        switch (j) {\n            case 0:\n                t = c;\n                j = 1;\n                break;\n            case 1:\n                buffer[offset++] = t << 2 | (c & 48) >> 4;\n                t = c;\n                j = 2;\n                break;\n            case 2:\n                buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;\n                t = c;\n                j = 3;\n                break;\n            case 3:\n                buffer[offset++] = (t & 3) << 6 | c;\n                j = 0;\n                break;\n        }\n    }\n    if (j === 1)\n        throw Error(invalidEncoding);\n    return offset - start;\n};\n\n/**\n * Tests if the specified string appears to be base64 encoded.\n * @param {string} string String to test\n * @returns {boolean} `true` if probably base64 encoded, otherwise false\n */\nbase64.test = function test(string) {\n    return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/common.js",
    "content": "module.exports = common;\n\nvar commonRe = /\\/|\\./;\n\n/**\n * Provides common type definitions.\n * Can also be used to provide additional google types or your own custom types.\n * @param {string} name Short name as in `google/protobuf/[name].proto` or full file name\n * @param {Object.<string,*>} json JSON definition within `google.protobuf` if a short name, otherwise the file's root definition\n * @returns {undefined}\n * @property {INamespace} google/protobuf/any.proto Any\n * @property {INamespace} google/protobuf/duration.proto Duration\n * @property {INamespace} google/protobuf/empty.proto Empty\n * @property {INamespace} google/protobuf/field_mask.proto FieldMask\n * @property {INamespace} google/protobuf/struct.proto Struct, Value, NullValue and ListValue\n * @property {INamespace} google/protobuf/timestamp.proto Timestamp\n * @property {INamespace} google/protobuf/wrappers.proto Wrappers\n * @example\n * // manually provides descriptor.proto (assumes google/protobuf/ namespace and .proto extension)\n * protobuf.common(\"descriptor\", descriptorJson);\n *\n * // manually provides a custom definition (uses my.foo namespace)\n * protobuf.common(\"my/foo/bar.proto\", myFooBarJson);\n */\nfunction common(name, json) {\n    if (!commonRe.test(name)) {\n        name = \"google/protobuf/\" + name + \".proto\";\n        json = { nested: { google: { nested: { protobuf: { nested: json } } } } };\n    }\n    common[name] = json;\n}\n\n// Not provided because of limited use (feel free to discuss or to provide yourself):\n//\n// google/protobuf/descriptor.proto\n// google/protobuf/source_context.proto\n// google/protobuf/type.proto\n//\n// Stripped and pre-parsed versions of these non-bundled files are instead available as part of\n// the repository or package within the google/protobuf directory.\n\ncommon(\"any\", {\n\n    /**\n     * Properties of a google.protobuf.Any message.\n     * @interface IAny\n     * @type {Object}\n     * @property {string} [typeUrl]\n     * @property {Uint8Array} [bytes]\n     * @memberof common\n     */\n    Any: {\n        fields: {\n            type_url: {\n                type: \"string\",\n                id: 1\n            },\n            value: {\n                type: \"bytes\",\n                id: 2\n            }\n        }\n    }\n});\n\nvar timeType;\n\ncommon(\"duration\", {\n\n    /**\n     * Properties of a google.protobuf.Duration message.\n     * @interface IDuration\n     * @type {Object}\n     * @property {number|Long} [seconds]\n     * @property {number} [nanos]\n     * @memberof common\n     */\n    Duration: timeType = {\n        fields: {\n            seconds: {\n                type: \"int64\",\n                id: 1\n            },\n            nanos: {\n                type: \"int32\",\n                id: 2\n            }\n        }\n    }\n});\n\ncommon(\"timestamp\", {\n\n    /**\n     * Properties of a google.protobuf.Timestamp message.\n     * @interface ITimestamp\n     * @type {Object}\n     * @property {number|Long} [seconds]\n     * @property {number} [nanos]\n     * @memberof common\n     */\n    Timestamp: timeType\n});\n\ncommon(\"empty\", {\n\n    /**\n     * Properties of a google.protobuf.Empty message.\n     * @interface IEmpty\n     * @memberof common\n     */\n    Empty: {\n        fields: {}\n    }\n});\n\ncommon(\"struct\", {\n\n    /**\n     * Properties of a google.protobuf.Struct message.\n     * @interface IStruct\n     * @type {Object}\n     * @property {Object.<string,IValue>} [fields]\n     * @memberof common\n     */\n    Struct: {\n        fields: {\n            fields: {\n                keyType: \"string\",\n                type: \"Value\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.Value message.\n     * @interface IValue\n     * @type {Object}\n     * @property {string} [kind]\n     * @property {0} [nullValue]\n     * @property {number} [numberValue]\n     * @property {string} [stringValue]\n     * @property {boolean} [boolValue]\n     * @property {IStruct} [structValue]\n     * @property {IListValue} [listValue]\n     * @memberof common\n     */\n    Value: {\n        oneofs: {\n            kind: {\n                oneof: [\n                    \"nullValue\",\n                    \"numberValue\",\n                    \"stringValue\",\n                    \"boolValue\",\n                    \"structValue\",\n                    \"listValue\"\n                ]\n            }\n        },\n        fields: {\n            nullValue: {\n                type: \"NullValue\",\n                id: 1\n            },\n            numberValue: {\n                type: \"double\",\n                id: 2\n            },\n            stringValue: {\n                type: \"string\",\n                id: 3\n            },\n            boolValue: {\n                type: \"bool\",\n                id: 4\n            },\n            structValue: {\n                type: \"Struct\",\n                id: 5\n            },\n            listValue: {\n                type: \"ListValue\",\n                id: 6\n            }\n        }\n    },\n\n    NullValue: {\n        values: {\n            NULL_VALUE: 0\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.ListValue message.\n     * @interface IListValue\n     * @type {Object}\n     * @property {Array.<IValue>} [values]\n     * @memberof common\n     */\n    ListValue: {\n        fields: {\n            values: {\n                rule: \"repeated\",\n                type: \"Value\",\n                id: 1\n            }\n        }\n    }\n});\n\ncommon(\"wrappers\", {\n\n    /**\n     * Properties of a google.protobuf.DoubleValue message.\n     * @interface IDoubleValue\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    DoubleValue: {\n        fields: {\n            value: {\n                type: \"double\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.FloatValue message.\n     * @interface IFloatValue\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    FloatValue: {\n        fields: {\n            value: {\n                type: \"float\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.Int64Value message.\n     * @interface IInt64Value\n     * @type {Object}\n     * @property {number|Long} [value]\n     * @memberof common\n     */\n    Int64Value: {\n        fields: {\n            value: {\n                type: \"int64\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.UInt64Value message.\n     * @interface IUInt64Value\n     * @type {Object}\n     * @property {number|Long} [value]\n     * @memberof common\n     */\n    UInt64Value: {\n        fields: {\n            value: {\n                type: \"uint64\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.Int32Value message.\n     * @interface IInt32Value\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    Int32Value: {\n        fields: {\n            value: {\n                type: \"int32\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.UInt32Value message.\n     * @interface IUInt32Value\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    UInt32Value: {\n        fields: {\n            value: {\n                type: \"uint32\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.BoolValue message.\n     * @interface IBoolValue\n     * @type {Object}\n     * @property {boolean} [value]\n     * @memberof common\n     */\n    BoolValue: {\n        fields: {\n            value: {\n                type: \"bool\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.StringValue message.\n     * @interface IStringValue\n     * @type {Object}\n     * @property {string} [value]\n     * @memberof common\n     */\n    StringValue: {\n        fields: {\n            value: {\n                type: \"string\",\n                id: 1\n            }\n        }\n    },\n\n    /**\n     * Properties of a google.protobuf.BytesValue message.\n     * @interface IBytesValue\n     * @type {Object}\n     * @property {Uint8Array} [value]\n     * @memberof common\n     */\n    BytesValue: {\n        fields: {\n            value: {\n                type: \"bytes\",\n                id: 1\n            }\n        }\n    }\n});\n\ncommon(\"field_mask\", {\n\n    /**\n     * Properties of a google.protobuf.FieldMask message.\n     * @interface IDoubleValue\n     * @type {Object}\n     * @property {number} [value]\n     * @memberof common\n     */\n    FieldMask: {\n        fields: {\n            paths: {\n                rule: \"repeated\",\n                type: \"string\",\n                id: 1\n            }\n        }\n    }\n});\n\n/**\n * Gets the root definition of the specified common proto file.\n *\n * Bundled definitions are:\n * - google/protobuf/any.proto\n * - google/protobuf/duration.proto\n * - google/protobuf/empty.proto\n * - google/protobuf/field_mask.proto\n * - google/protobuf/struct.proto\n * - google/protobuf/timestamp.proto\n * - google/protobuf/wrappers.proto\n *\n * @param {string} file Proto file name\n * @returns {INamespace|null} Root definition or `null` if not defined\n */\ncommon.get = function get(file) {\n    return common[file] || null;\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/converter.js",
    "content": "/**\n * Created by zhangmiao on 2018/3/14.\n * 写这个,有点难;有错误请指出 ,微信中不能Function.Apply 和evl,所以去掉其中所有的gen()\n */\nvar converter = module.exports;\n\nvar Enum,\n    util;\n\n\nconverter._configure = function () {\n    Enum = require('./enum');\n    util = require('./util');\n};\n\nfunction valuePartial_fromObject(field, fieldIndex, propName, options){\n    var m       = options['m'];\n    var d       = options['d'];\n    var _types  = options['types'];\n    var ksi     = options['ksi'];\n    var ksiFlag = typeof ksi != 'undefined';\n    if(field.resolvedType){\n        if(field.resolvedType instanceof Enum){\n            var prop = ksiFlag ? d[propName][ksi] : d[propName];\n            var values = field.resolvedType.values,\n                keys = Object.keys(values);\n            for (var i = 0; i < keys.length; i++){\n                if(field.repeated && values[keys[i]] === field.typeDefault){\n                    continue;\n                }\n                if(keys[i] == prop || values[keys[i]] == prop){\n                    ksiFlag ?\n                        m[propName][ksi] = values[keys[i]] :\n                        m[propName] = values[keys[i]];\n                    break\n                }\n            }\n        }else {\n            if(typeof (ksiFlag ? d[propName][ksi] : d[propName]) !== 'object')\n                throw TypeError(field.fullName + \": object expected\");\n            ksiFlag ?\n                m[propName][ksi] = _types[fieldIndex].fromObject(d[propName][ksi]):\n                m[propName] = _types[fieldIndex].fromObject(d[propName]);\n        }\n    } else {\n        var  isUnsigned = false;\n        switch (field.type){\n            case \"double\":\n            case \"float\":\n                ksiFlag ?\n                    m[propName][ksi] = Number(d[propName][ksi]) :\n                    m[propName] = Number(d[propName]);\n                break;\n            case \"uint32\":\n            case \"fixed32\":\n                ksiFlag ?\n                    m[propName][ksi] = d[propName][ksi] >>> 0:\n                    m[propName] = d[propName] >>> 0;\n                break;\n            case \"int32\":\n            case \"sint32\":\n            case \"sfixed32\":\n                ksiFlag ?\n                    m[propName][ksi] = d[propName][ksi] | 0 :\n                    m[propName] = d[propName] |0;\n                break;\n            case \"uint64\":\n                isUnsigned = true;\n            // eslint-disable-line no-fallthrough\n            case \"int64\":\n            case \"sint64\":\n            case \"fixed64\":\n            case \"sfixed64\":\n                if(util.Long)\n                    ksiFlag ?\n                        m[propName][ksi] = util.Long.fromValue(d[propName][ksi]).unsigned = isUnsigned :\n                        m[propName] = util.Long.fromValue(d[propName]).unsigned = isUnsigned;\n                else if(typeof (ksiFlag ? d[propName][ksi] : d[propName]) === 'string')\n                    ksiFlag ?\n                        m[propName][ksi] =parseInt(d[propName][ksi], 10) :\n                        m[propName] =parseInt(d[propName], 10);\n                else if(typeof (ksiFlag ? d[propName][ksi] : d[propName]) === 'number')\n                    ksiFlag ?\n                        m[propName][ksi] = d[propName][ksi] :\n                        m[propName] = d[propName];\n                else if(typeof (ksiFlag ? d[propName][ksi] : d[propName]) === 'object')\n                    ksiFlag ?\n                        m[propName][ksi] = new util.LongBits(d[propName][ksi].low >>> 0, d[propName][ksi].high >>> 0).toNumber(isUnsigned) :\n                        m[propName] = new util.LongBits(d[propName].low >>> 0, d[propName].high >>> 0).toNumber(isUnsigned);\n                break;\n            case \"bytes\":\n                if(typeof (ksiFlag ? d[propName][ksi] : d[propName]) ===\"string\")\n                    ksiFlag ?\n                        util.base64.decode(d[propName][ksi],m[propName][ksi]=util.newBuffer(util.base64.length(d[propName][ksi])),0) :\n                        util.base64.decode(d[propName],m[propName]=util.newBuffer(util.base64.length(d[propName])),0);\n                else if((ksiFlag ? d[propName][ksi] : d[propName]).length)\n                    ksiFlag?\n                        m[propName][ksi]=d[propName][ksi] :\n                        m[propName]=d[propName];\n                break;\n            case \"string\":\n                ksiFlag?\n                    m[propName][ksi]=String(d[propName][ksi]) :\n                    m[propName]=String(d[propName]);\n                break;\n            case \"bool\":\n                ksiFlag?\n                    m[propName][ksi]=Boolean(d[propName][ksi]):\n                    m[propName]=Boolean(d[propName]);\n                break;\n        }\n    }\n}\n\n/*\n* @param {Type} mtype Message type\n* @returns {Function} Function instance\n*/\nconverter.fromObject = function fromObject(mtype){\n    var fields = mtype.fieldsArray;\n    return function (options){\n        return function (d){\n            if(d instanceof this.ctor)\n                return d;\n            if(!fields.length)\n                return new  this.ctor;\n\n            var  m = new this.ctor;\n            for (var i = 0; i < fields.length; ++i){\n                var field       = fields[i].resolve();\n                var propName    = field.name;\n                var _i;\n                if(field.map){\n                    if(d[propName]){\n                        if(typeof d[propName] !== 'object')\n                            throw TypeError(field.fullName + \": object expected\");\n                        m[propName] = {};\n                    }\n                    var ks = Object.keys(d[propName]);\n                    for ( _i = 0; _i<ks.length ; ++_i)\n                        valuePartial_fromObject(field, i, propName, util.merge(util.copy(options), {m:m,d:d,ksi : ks[_i]}));\n                }else if(field.repeated){\n                    if(d[propName]){\n                        if(!Array.isArray(d[propName]))\n                            throw TypeError(field.fullName + \": array expected\");\n                        m[propName] = [];\n                        for (_i = 0; _i < d[propName].length; ++_i) {\n                            valuePartial_fromObject(field, i, propName, util.merge(util.copy(options), {\n                                m: m,\n                                d: d,\n                                ksi: _i\n                            }));\n                        }\n                    }\n                }else {\n                    if((field.resolvedType instanceof Enum) || d[propName]!=null){\n                        valuePartial_fromObject(field,i,propName, util.merge(util.copy(options), {m:m,d:d}));\n                    }\n                }\n            }\n            return m;\n        }\n    }\n};\n\n\nfunction valuePartial_toObject (field, fieldIndex, propName, options){\n    var m       = options['m'];\n    var d       = options['d'];\n    var _types  = options['types'];\n    var ksi     = options['ksi'];\n    var o       = options['o'];\n    var ksiFlag = typeof ksi != 'undefined';\n    if(field.resolvedType){\n        if (field.resolvedType instanceof  Enum)\n            ksiFlag ?\n                (d[propName][ksi] = o.enums===String?_types[fieldIndex].values[m[propName][ksi]]:m[propName][ksi]) :\n                (d[propName] = o.enums===String?_types[fieldIndex].values[m[propName]]:m[propName]);\n        else\n            ksiFlag ?\n                d[propName][ksi] = _types[fieldIndex].toObject(m[propName][ksi], o) :\n                d[propName] = _types[fieldIndex].toObject(m[propName], o);\n    }else {\n        var isUnsigned = false;\n        switch (field.type) {\n            case \"double\":\n            case \"float\":\n                ksiFlag ? (d[propName][ksi] = o.json && !isFinite(m[propName][ksi])? String(m[propName][ksi]):m[propName][ksi]) :\n                    (d[propName] = o.json && !isFinite(m[propName])? String(m[propName]):m[propName]);\n                break;\n            case \"uint64\":\n                isUnsigned = true;\n            // eslint-disable-line no-fallthrough\n            case \"int64\":\n            case \"sint64\":\n            case \"fixed64\":\n            case \"sfixed64\":\n                if(typeof m[propName][ksi] === 'number')\n                    ksiFlag ?\n                        (d[propName][ksi] = o.longs === String ? String(m[propName][ksi]) : m[propName][ksi]) :\n                        (d[propName] = o.longs === String ? String(m[propName]) : m[propName]);\n                else\n                    ksiFlag ?\n                        (d[propName][ksi] =\n                        o.longs === String ?\n                            util.Long.prototype.toString.call(m[propName][ksi]) :\n                            o.longs === Number ? new  util.LongBits(m[propName][ksi].low >>> 0, m[propName][ksi].high >>> 0).toNumber(isUnsigned) : m[propName][ksi]):\n                        (d[propName] =\n                            o.longs === String ?\n                                util.Long.prototype.toString.call(m[propName]) :\n                                o.longs === Number ? new  util.LongBits(m[propName].low >>> 0, m[propName].high >>> 0).toNumber(isUnsigned) : m[propName]);\n                break;\n            case \"bytes\":\n                ksiFlag?\n                    (d[propName][ksi] =\n                    o.bytes === String ?\n                        util.base64.encode(m[propName][ksi], 0, m[propName][ksi].length) :\n                        o.bytes === Array ? Array.prototype.slice.call(m[propName][ksi]) : m[propName][ksi]):\n                    (d[propName] =\n                        o.bytes === String ?\n                            util.base64.encode(m[propName], 0, m[propName].length) :\n                            o.bytes === Array ? Array.prototype.slice.call(m[propName]) : m[propName]);\n                break;\n            default:\n                ksiFlag ? d[propName][ksi] = m[propName][ksi] : d[propName] = m[propName];\n                break;\n        }\n    }\n}\n\n\nconverter.toObject   = function toObject(mtype){\n    var fields = mtype.fieldsArray.slice().sort(util.compareFieldsById);\n    return function (options){\n        if(!fields.length)\n            return function (){\n                return {};\n            };\n        return function (m, o){\n            o = o || {};\n            var d = {};\n            var repeatedFields = [],\n                mapFields = [],\n                normalFields = [],\n                field,\n                propName,\n                i = 0;\n            for (; i < fields.length; ++i)\n                if (!fields[i].partOf)\n                    ( fields[i].resolve().repeated ? repeatedFields\n                        : fields[i].map ? mapFields\n                        : normalFields).push(fields[i]);\n\n            if (repeatedFields.length) {\n                if(o.arrays || o.defaults ){\n                    for (i = 0; i < repeatedFields.length; ++i)\n                        d[repeatedFields[i].name] = [];\n                }\n            }\n\n            if (mapFields.length) {\n                if(o.objects || o.defaults){\n                    for  (i = 0; i < mapFields.length; ++i)\n                        d[mapFields[i].name] = {};\n                }\n            }\n\n            if(normalFields.length){\n                if(o.defaults){\n                    for (i = 0; i < normalFields.length; ++i){\n                        field       = normalFields[i],\n                        propName    = field.name;\n                        if(field.resolvedType instanceof Enum)\n                            d[propName] = o.enums = String ? field.resolvedType.valuesById[field.typeDefault] : field.typeDefault;\n                        else if(field.long){\n                            if(util.Long){\n                                var n = new util.Long(field.typeDefault.low, field.typeDefault.high, field.typeDefault.unsigned);\n                                d[propName] = o.longs === String ? n.toString() : o.longs === Number ? n.toNumber():n;\n                            }else {\n                                d[propName] = o.longs === String ? field.typeDefault.toString() : field.typeDefault.toNumber();\n                            }\n                        }else if(field.bytes){\n                            d[propName] = o.bytes === String ? String.fromCharCode.apply(String, field.typeDefault) : Array.prototype.slice.call(field.typeDefault).join('*..*').split(\"*..*\");\n                        }else {\n                            d[propName] =field.typeDefault;\n                        }\n\n                    }\n                }\n            }\n            var hasKs2 = false;\n            for (i = 0; i < fields.length; ++i){\n                field       = fields[i];\n                propName    = field.name;\n                var index   = mtype._fieldsArray.indexOf(field);\n                var ks2;\n                var  j;\n                if(field.map){\n                    if (!hasKs2){\n                        hasKs2 = true;\n                    }\n                    if (m[propName]&&(ks2 = Object.keys(m[propName]).length)){\n                        d[propName] = {};\n                        for (j = 0; j < ks2.length; ++j){\n                            valuePartial_toObject(field, index, propName, util.merge(util.copy(options), {m:m,d:d,ksi :ks2[j],o:o}));\n                        }\n                    }\n                }else if(field.repeated){\n                    if(m[propName]&&m[propName].length){\n                        d[propName] = [];\n                        for (j = 0; j < m[propName].length; ++j){\n                            valuePartial_toObject(field, index, propName, util.merge(util.copy(options), {m:m,d:d,ksi:j,o:o}))\n                        }\n                    }\n                }else {\n                    if(m[propName]!=null&& (m.hasOwnProperty(propName)/*|| field.partOf*/)){\n                        valuePartial_toObject(field, index, propName, util.merge(util.copy(options), {m:m,d:d,o:o}))\n                    }\n                    if(field.partOf) {\n                        if (o.oneofs)\n                            d[field.partOf.name] = propName;\n                    }\n                }\n            }\n            return d;\n        }\n    }\n\n\n};"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/decoder.js",
    "content": "/**\n * Created by zhangmiao on 2018/3/13.\n */\n\nvar Enum,\n    types,\n    util;\n\n\nfunction missing(field) {\n    return \"missing required '\" + field.name + \"'\";\n}\n\nfunction decoder(mtype){\n    return function (options){\n        var Reader = options.Reader;\n        var _types = options.types;\n        var _util   = options.util;\n        return function (r, l){\n            if(!(r instanceof Reader))\n                r = Reader.create(r);\n            var c = l === undefined ? r.len : r.pos + l,\n                m = new this.ctor;\n            var k;\n            while (r.pos < c){\n                var t = r.uint32();\n                if (mtype.group){\n                    if((t&7) === 4)\n                        break;\n                }\n                var fieldId = t>>>3;\n                var i = 0;\n                var find = false;\n                for (; i < mtype.fieldsArray.length; ++i){\n                    var field = mtype._fieldsArray[i].resolve(),\n                        name  = field.name,\n                        type  = field.resolvedType instanceof Enum ? \"int32\" : field.type;\n                        //ref   = m[field.name];\n                    if (fieldId != field.id) continue;\n                    find = true;\n                    if (field.map){\n                        r.skip().pos++;\n                        if(m[name] === _util.emptyObject)\n                            m[name] = {};\n                        k = r[field.keyType]();\n                        r.pos++;\n                        if(types.long[field.keyType] != undefined){\n                            if(types.basic[type] == undefined){\n                                m[name][typeof k ==='object' ? _util.longToHash(k):k] = _types[i].decode(r, r.uint32());\n                            }else {\n                                m[name][typeof k ==='object' ? _util.longToHash(k):k] = r[type]();\n                            }\n                        }else {\n                            if(types.basic[type] == undefined){\n                                m[name] = _types[i].decode(r, r.uint32());\n                            }else {\n                                m[name] = r[type]();\n                            }\n                        }\n                    }else if(field.repeated){\n                        if(!(m[name] && m[name].length)){\n                            m[name] = [];\n                        }\n\n                        if(types.packed[type] != undefined && (t&7) === 2){\n                            var c2 = r.uint32()+ r.pos;\n                            while (r.pos < c2)\n                                m[name].push(r[type]())\n                        }else {\n                            if(types.basic[type] == undefined){\n                                field.resolvedType.group ?\n                                    m[name].push(_types[i].decode(r)) :\n                                    m[name].push(_types[i].decode(r, r.uint32()))\n\n                            }else {\n                                m[name].push(r[type]());\n                            }\n                        }\n                    }else if (types.basic[type] == undefined){\n                        if(field.resolvedType.group){\n                            m[name] = _types[i].decode(r);\n                        }else {\n                            m[name] = _types[i].decode(r, r.uint32());\n                        }\n                    }else {\n                        //console.log(\"m\",JSON.stringify(m),\"type\",type,\"field\",field);\n                        m[name] = r[type]();\n                    }\n                    break;\n                }\n\n                if(!find){\n                    console.log(\"t\",t);\n                    r.skipType(t&7)\n                }\n\n            }\n\n            for (i = 0; i < mtype._fieldsArray.length; ++ i){\n                var rfield = mtype._fieldsArray[i];\n                if(rfield.required){\n                    if(!m.hasOwnProperty(rfield.name)){\n                        throw util.ProtocolError(missing(rfield),{instance:m})\n                    }\n                }\n            }\n            //mtype.fieldsArray.filter(function(field) { return field.map; }).length\n            return m;\n        }\n    }\n}\n\nmodule.exports = decoder;\ndecoder._configure  = function (){\n    Enum    = require(\"./enum\");\n    types   = require(\"./types\");\n    util    = require(\"./util\");\n};"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/encoder.js",
    "content": "/**\n * Created by zhangmiao on 2018/3/13.\n * 改写原来的googleProtocolBuffer的encode,请不要告我侵犯版权;/(ㄒoㄒ)/~~\n */\nvar Enum;\nvar types;\n\n\n//得到一个编码过程\nfunction encoder(mtype){\n    return function (options){\n        var Writer = options.Writer;\n        var _types  = options.types;\n        var util   = options.util;\n        return function (message, writer) {\n            writer = writer || Writer.create();\n            var fields = mtype.fieldsArray.slice().sort(util.compareFieldsById);\n            for (var i = 0; i < fields.length; i++) {\n                var field = fields[i];\n                var index = mtype._fieldsArray.indexOf(field);\n\n                var type = field.resolvedType instanceof Enum ? 'uint32' : field.type;\n                var wireType = types.basic[type];\n                var ref      = message[field.name];\n                //此处增加枚举型替换,有可能外界传入的枚举是string,转换成number\n                if(field.resolvedType instanceof Enum && typeof ref === 'string'){\n                    ref = _types[index]['values'][ref];\n                }\n\n                //正式进行序列化\n                if (field.map) {//有待验证\n                    if(ref != null && message.hasOwnProperty(field.name)){\n                        for (var  ks =Object.keys(ref), l = 0; l < ks.length; ++l){\n                            writer.uint32((field.id << 3 | 2) >>> 0).fork().uint32(8 | types.mapKey[field.keyType])[field.keyType](ks[l]);\n                            if(wireType === undefined ){\n                                _types[index].encode(ref[ks[l]], writer.uint32(18).fork()).ldelim().ldelim();\n                            }else {\n                                writer.uint32(16 | wireType)[type](ref[ks[l]]).ldelim();\n                            }\n                        }\n                    }\n                } else if (field.repeated) {\n                    if (ref && ref.length) {\n                        if (field.packed && types.packed[type] !== undefined) {//如果数据可以被packed的话\n                            writer.uint32((field.id << 3 | 2) >>> 0).fork();\n                            for (var j = 0; j < ref.length; j++) {\n                                writer[type](ref[j])\n                            }\n                            writer.ldelim();\n                        } else {//数据不能packed的话\n                            for (var k = 0; k < ref.length; k++) {\n                                if (wireType === undefined) {//如果是一个自定义的数据类型\n                                    if(field.resolvedType.group){\n                                        _types[index].encode(ref[k],writer.uint32((field.id << 3 | 3) >>> 0)).uint32((field.id << 3 | 4) >>> 0);\n                                    }else {\n                                        _types[index].encode(ref[k],writer.uint32((field.id << 3 | 2) >>> 0).fork()).ldelim();\n                                    }\n                                } else {//如果是string 或者 bytes\n                                    writer.uint32((field.id << 3 | wireType) >>> 0)[type](ref[k]);\n                                }\n                            }\n                        }\n                    }\n                } else {\n                    if(!field.optional || (ref != null && (message.hasOwnProperty(field.name) /*|| field.partOf*/))){\n                        if(!field.optional && (ref == null || !message.hasOwnProperty(field.name))){\n                            console.warn('注意啦!!!很大概率会报错 类型:',message.$type ? message.$type.name : \"不晓得\",'没有设置对应的属性:',field.name,'检查是不是proto文件属性设置为了required');\n                        }\n                        if(wireType === undefined){\n                            if(field.resolvedType.group){\n                                _types[index].encode(ref,writer.uint32((field.id << 3 | 3) >>> 0)).uint32((field.id << 3 | 4) >>> 0);\n                            }else {\n                                _types[index].encode(ref,writer.uint32((field.id << 3 | 2) >>> 0).fork()).ldelim();\n                            }\n                        }else {\n                            writer.uint32((field.id << 3 | wireType) >>> 0)[type](ref);\n                        }\n                    }\n                }\n            }\n            return writer;\n        }\n    };\n}\n\nmodule.exports = encoder;\n\nencoder._configure  = function (){\n    Enum    = require(\"./enum\");\n    types   = require(\"./types\");\n};"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/enum.js",
    "content": "/**\n * Created by zhangmiao on 2018/3/12.\n */\n\nmodule.exports = Enum;\n\nvar ReflectionObject = require(\"./object\");\n\n((Enum.prototype = Object.create(ReflectionObject.prototype)).constructor = Enum).className = \"Enum\";\nvar Namespace = require(\"./namespace\");\n\nfunction Enum(name, values, options, comment, comments) {\n    ReflectionObject.call(this, name, options);\n\n    if (values && typeof values !== \"object\")\n        throw TypeError(\"values must be an object\");\n\n    /**\n     * Enum values by id.\n     * @type {Object.<number,string>}\n     */\n    this.valuesById = {};\n\n    /**\n     * Enum values by name.\n     * @type {Object.<string,number>}\n     */\n    this.values = Object.create(this.valuesById); // toJSON, marker\n\n    /**\n     * Enum comment text.\n     * @type {string|null}\n     */\n    this.comment = comment;\n\n    /**\n     * Value comment texts, if any.\n     * @type {Object.<string,string>}\n     */\n    this.comments = comments || {};\n\n    /**\n     * Reserved ranges, if any.\n     * @type {Array.<number[]|string>}\n     */\n    this.reserved = undefined; // toJSON\n\n    // Note that values inherit valuesById on their prototype which makes them a TypeScript-\n    // compatible enum. This is used by pbts to write actual enum definitions that work for\n    // static and reflection code alike instead of emitting generic object definitions.\n\n    if (values)\n        for (var keys = Object.keys(values), i = 0; i < keys.length; ++i)\n            if (typeof values[keys[i]] === \"number\") // use forward entries only\n                this.valuesById[ this.values[keys[i]] = values[keys[i]] ] = keys[i];\n}\n\n/**\n * Enum descriptor.\n * @interface IEnum\n * @property {Object.<string,number>} values Enum values\n * @property {Object.<string,*>} [options] Enum options\n */\n\n/**\n * Constructs an enum from an enum descriptor.\n * @param {string} name Enum name\n * @param {IEnum} json Enum descriptor\n * @returns {Enum} Created enum\n * @throws {TypeError} If arguments are invalid\n */\nEnum.fromJSON = function fromJSON(name, json) {\n    var enm = new Enum(name, json.values, json.options, json.comment, json.comments);\n    enm.reserved = json.reserved;\n    return enm;\n};\n\n/**\n * Converts this enum to an enum descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IEnum} Enum descriptor\n */\nEnum.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"options\"  , this.options,\n        \"values\"   , this.values,\n        \"reserved\" , this.reserved && this.reserved.length ? this.reserved : undefined,\n        \"comment\"  , keepComments ? this.comment : undefined,\n        \"comments\" , keepComments ? this.comments : undefined\n    ]);\n};\n\n/**\n * Adds a value to this enum.\n * @param {string} name Value name\n * @param {number} id Value id\n * @param {string} [comment] Comment, if any\n * @returns {Enum} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If there is already a value with this name or id\n */\nEnum.prototype.add = function add(name, id, comment) {\n    // utilized by the parser but not by .fromJSON\n\n    if (!util.isString(name))\n        throw TypeError(\"name must be a string\");\n\n    if (!util.isInteger(id))\n        throw TypeError(\"id must be an integer\");\n\n    if (this.values[name] !== undefined)\n        throw Error(\"duplicate name '\" + name + \"' in \" + this);\n\n    if (this.isReservedId(id))\n        throw Error(\"id \" + id + \" is reserved in \" + this);\n\n    if (this.isReservedName(name))\n        throw Error(\"name '\" + name + \"' is reserved in \" + this);\n\n    if (this.valuesById[id] !== undefined) {\n        if (!(this.options && this.options.allow_alias))\n            throw Error(\"duplicate id \" + id + \" in \" + this);\n        this.values[name] = id;\n    } else\n        this.valuesById[this.values[name] = id] = name;\n\n    this.comments[name] = comment || null;\n    return this;\n};\n\n/**\n * Removes a value from this enum\n * @param {string} name Value name\n * @returns {Enum} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If `name` is not a name of this enum\n */\nEnum.prototype.remove = function remove(name) {\n\n    if (!util.isString(name))\n        throw TypeError(\"name must be a string\");\n\n    var val = this.values[name];\n    if (val == null)\n        throw Error(\"name '\" + name + \"' does not exist in \" + this);\n\n    delete this.valuesById[val];\n    delete this.values[name];\n    delete this.comments[name];\n\n    return this;\n};\n\n/**\n * Tests if the specified id is reserved.\n * @param {number} id Id to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nEnum.prototype.isReservedId = function isReservedId(id) {\n    return Namespace.isReservedId(this.reserved, id);\n};\n\n/**\n * Tests if the specified name is reserved.\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nEnum.prototype.isReservedName = function isReservedName(name) {\n    return Namespace.isReservedName(this.reserved, name);\n};"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/field.js",
    "content": "/**\n * Created by zhangmiao on 2018/3/12.\n */\n\nmodule.exports = Field;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\n((Field.prototype = Object.create(ReflectionObject.prototype)).constructor = Field).className = \"Field\";\n\nvar Enum,\n    types,\n    util;\n\nvar Type; // cyclic\n\nvar ruleRe = /^required|optional|repeated$/;\n\n/**\n * Constructs a new message field instance. Note that {@link MapField|map fields} have their own class.\n * @name Field\n * @classdesc Reflected message field.\n * @extends FieldBase\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {number} id Unique id within its namespace\n * @param {string} type Value type\n * @param {string|Object.<string,*>} [rule=\"optional\"] Field rule\n * @param {string|Object.<string,*>} [extend] Extended type if different from parent\n * @param {Object.<string,*>} [options] Declared options\n */\n\n/**\n * Constructs a field from a field descriptor.\n * @param {string} name Field name\n * @param {IField} json Field descriptor\n * @returns {Field} Created field\n * @throws {TypeError} If arguments are invalid\n */\nField.fromJSON = function fromJSON(name, json) {\n    return new Field(name, json.id, json.type, json.rule, json.extend, json.options, json.comment);\n};\n\n/**\n * Not an actual constructor. Use {@link Field} instead.\n * @classdesc Base class of all reflected message fields. This is not an actual class but here for the sake of having consistent type definitions.\n * @exports FieldBase\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {number} id Unique id within its namespace\n * @param {string} type Value type\n * @param {string|Object.<string,*>} [rule=\"optional\"] Field rule\n * @param {string|Object.<string,*>} [extend] Extended type if different from parent\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] Comment associated with this field\n */\nfunction Field(name, id, type, rule, extend, options, comment) {\n\n    if (util.isObject(rule)) {\n        comment = extend;\n        options = rule;\n        rule = extend = undefined;\n    } else if (util.isObject(extend)) {\n        comment = options;\n        options = extend;\n        extend = undefined;\n    }\n\n    ReflectionObject.call(this, name, options);\n\n    if (!util.isInteger(id) || id < 0)\n        throw TypeError(\"id must be a non-negative integer\");\n\n    if (!util.isString(type))\n        throw TypeError(\"type must be a string\");\n\n    if (rule !== undefined && !ruleRe.test(rule = rule.toString().toLowerCase()))\n        throw TypeError(\"rule must be a string rule\");\n\n    if (extend !== undefined && !util.isString(extend))\n        throw TypeError(\"extend must be a string\");\n\n    /**\n     * Field rule, if any.\n     * @type {string|undefined}\n     */\n    this.rule = rule && rule !== \"optional\" ? rule : undefined; // toJSON\n\n    /**\n     * Field type.\n     * @type {string}\n     */\n    this.type = type; // toJSON\n\n    /**\n     * Unique field id.\n     * @type {number}\n     */\n    this.id = id; // toJSON, marker\n\n    /**\n     * Extended type if different from parent.\n     * @type {string|undefined}\n     */\n    this.extend = extend || undefined; // toJSON\n\n    /**\n     * Whether this field is required.\n     * @type {boolean}\n     */\n    this.required = rule === \"required\";\n\n    /**\n     * Whether this field is optional.\n     * @type {boolean}\n     */\n    this.optional = !this.required;\n\n    /**\n     * Whether this field is repeated.\n     * @type {boolean}\n     */\n    this.repeated = rule === \"repeated\";\n\n    /**\n     * Whether this field is a map or not.\n     * @type {boolean}\n     */\n    this.map = false;\n\n    /**\n     * Message this field belongs to.\n     * @type {Type|null}\n     */\n    this.message = null;\n\n    /**\n     * OneOf this field belongs to, if any,\n     * @type {OneOf|null}\n     */\n    this.partOf = null;\n\n    /**\n     * The field type's default value.\n     * @type {*}\n     */\n    this.typeDefault = null;\n\n    /**\n     * The field's default value on prototypes.\n     * @type {*}\n     */\n    this.defaultValue = null;\n\n    /**\n     * Whether this field's value should be treated as a long.\n     * @type {boolean}\n     */\n    this.long = util.Long ? types.long[type] !== undefined : /* istanbul ignore next */ false;\n\n    /**\n     * Whether this field's value is a buffer.\n     * @type {boolean}\n     */\n    this.bytes = type === \"bytes\";\n\n    /**\n     * Resolved type if not a basic type.\n     * @type {Type|Enum|null}\n     */\n    this.resolvedType = null;\n\n    /**\n     * Sister-field within the extended type if a declaring extension field.\n     * @type {Field|null}\n     */\n    this.extensionField = null;\n\n    /**\n     * Sister-field within the declaring namespace if an extended field.\n     * @type {Field|null}\n     */\n    this.declaringField = null;\n\n    /**\n     * Internally remembers whether this field is packed.\n     * @type {boolean|null}\n     * @private\n     */\n    this._packed = null;\n\n    /**\n     * Comment for this field.\n     * @type {string|null}\n     */\n    this.comment = comment;\n}\n\n/**\n * Determines whether this field is packed. Only relevant when repeated and working with proto2.\n * @name Field#packed\n * @type {boolean}\n * @readonly\n */\nObject.defineProperty(Field.prototype, \"packed\", {\n    get: function() {\n        // defaults to packed=true if not explicity set to false\n        if (this._packed === null)\n            this._packed = this.getOption(\"packed\") !== false;\n        return this._packed;\n    }\n});\n\n/**\n * @override\n */\nField.prototype.setOption = function setOption(name, value, ifNotSet) {\n    if (name === \"packed\") // clear cached before setting\n        this._packed = null;\n    return ReflectionObject.prototype.setOption.call(this, name, value, ifNotSet);\n};\n\n/**\n * Field descriptor.\n * @interface IField\n * @property {string} [rule=\"optional\"] Field rule\n * @property {string} type Field type\n * @property {number} id Field id\n * @property {Object.<string,*>} [options] Field options\n */\n\n/**\n * Extension field descriptor.\n * @interface IExtensionField\n * @extends IField\n * @property {string} extend Extended type\n */\n\n/**\n * Converts this field to a field descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IField} Field descriptor\n */\nField.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"rule\"    , this.rule !== \"optional\" && this.rule || undefined,\n        \"type\"    , this.type,\n        \"id\"      , this.id,\n        \"extend\"  , this.extend,\n        \"options\" , this.options,\n        \"comment\" , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * Resolves this field's type references.\n * @returns {Field} `this`\n * @throws {Error} If any reference cannot be resolved\n */\nField.prototype.resolve = function resolve() {\n\n    if (this.resolved)\n        return this;\n\n    if ((this.typeDefault = types.defaults[this.type]) === undefined) { // if not a basic type, resolve it\n        this.resolvedType = (this.declaringField ? this.declaringField.parent : this.parent).lookupTypeOrEnum(this.type);\n        if (this.resolvedType instanceof Type)\n            this.typeDefault = null;\n        else // instanceof Enum\n            this.typeDefault = this.resolvedType.values[Object.keys(this.resolvedType.values)[0]]; // first defined\n    }\n\n    // use explicitly set default value if present\n    if (this.options && this.options[\"default\"] != null) {\n        this.typeDefault = this.options[\"default\"];\n        if (this.resolvedType instanceof Enum && typeof this.typeDefault === \"string\")\n            this.typeDefault = this.resolvedType.values[this.typeDefault];\n    }\n\n    // remove unnecessary options\n    if (this.options) {\n        if (this.options.packed === true || this.options.packed !== undefined && this.resolvedType && !(this.resolvedType instanceof Enum))\n            delete this.options.packed;\n        if (!Object.keys(this.options).length)\n            this.options = undefined;\n    }\n\n    // convert to internal data type if necesssary\n    if (this.long) {\n        this.typeDefault = util.Long.fromNumber(this.typeDefault, this.type.charAt(0) === \"u\");\n\n        /* istanbul ignore else */\n        if (Object.freeze)\n            Object.freeze(this.typeDefault); // long instances are meant to be immutable anyway (i.e. use small int cache that even requires it)\n\n    } else if (this.bytes && typeof this.typeDefault === \"string\") {\n        var buf;\n        //if (util.base64.test(this.typeDefault))\n        //    util.base64.decode(this.typeDefault, buf = util.newBuffer(util.base64.length(this.typeDefault)), 0);\n        //else\n            util.utf8.write(this.typeDefault, buf = util.newBuffer(util.utf8.length(this.typeDefault)), 0);\n        this.typeDefault = buf;\n    }\n\n    // take special care of maps and repeated fields\n    if (this.map)\n        this.defaultValue = util.emptyObject;\n    else if (this.repeated)\n        this.defaultValue = util.emptyArray;\n    else\n        this.defaultValue = this.typeDefault;\n\n    // ensure proper value on prototype\n    if (this.parent instanceof Type) {\n        this.parent.ctor.prototype[this.name] = this.defaultValue;\n    }\n    return ReflectionObject.prototype.resolve.call(this);\n};\n\n/**\n * Decorator function as returned by {@link Field.d} and {@link MapField.d} (TypeScript).\n * @typedef FieldDecorator\n * @type {function}\n * @param {Object} prototype Target prototype\n * @param {string} fieldName Field name\n * @returns {undefined}\n */\n\n/**\n * Field decorator (TypeScript).\n * @name Field.d\n * @function\n * @param {number} fieldId Field id\n * @param {\"double\"|\"float\"|\"int32\"|\"uint32\"|\"sint32\"|\"fixed32\"|\"sfixed32\"|\"int64\"|\"uint64\"|\"sint64\"|\"fixed64\"|\"sfixed64\"|\"string\"|\"bool\"|\"bytes\"|Object} fieldType Field type\n * @param {\"optional\"|\"required\"|\"repeated\"} [fieldRule=\"optional\"] Field rule\n * @param {T} [defaultValue] Default value\n * @returns {FieldDecorator} Decorator function\n * @template T extends number | number[] | Long | Long[] | string | string[] | boolean | boolean[] | Uint8Array | Uint8Array[] | Buffer | Buffer[]\n */\nField.d = function decorateField(fieldId, fieldType, fieldRule, defaultValue) {\n\n    // submessage: decorate the submessage and use its name as the type\n    if (typeof fieldType === \"function\")\n        fieldType = util.decorateType(fieldType).name;\n\n    // enum reference: create a reflected copy of the enum and keep reuseing it\n    else if (fieldType && typeof fieldType === \"object\")\n        fieldType = util.decorateEnum(fieldType).name;\n\n    return function fieldDecorator(prototype, fieldName) {\n        util.decorateType(prototype.constructor)\n            .add(new Field(fieldName, fieldId, fieldType, fieldRule, { \"default\": defaultValue }));\n    };\n};\n\n/**\n * Field decorator (TypeScript).\n * @name Field.d\n * @function\n * @param {number} fieldId Field id\n * @param {Constructor<T>|string} fieldType Field type\n * @param {\"optional\"|\"required\"|\"repeated\"} [fieldRule=\"optional\"] Field rule\n * @returns {FieldDecorator} Decorator function\n * @template T extends Message<T>\n * @variation 2\n */\n// like Field.d but without a default value\n\nField._configure = function configure() {\n    Type = require('./type');\n\n    Enum  = require(\"./enum\");\n    types = require(\"./types\");\n    util  = require(\"./util\");\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/float.js",
    "content": "module.exports = factory(factory);\n\n/**\n * Reads / writes floats / doubles from / to buffers.\n * @name util.float\n * @namespace\n */\n\n/**\n * Writes a 32 bit float to a buffer using little endian byte order.\n * @name util.float.writeFloatLE\n * @function\n * @param {number} val Value to write\n * @param {Uint8Array} buf Target buffer\n * @param {number} pos Target buffer offset\n * @returns {undefined}\n */\n\n/**\n * Writes a 32 bit float to a buffer using big endian byte order.\n * @name util.float.writeFloatBE\n * @function\n * @param {number} val Value to write\n * @param {Uint8Array} buf Target buffer\n * @param {number} pos Target buffer offset\n * @returns {undefined}\n */\n\n/**\n * Reads a 32 bit float from a buffer using little endian byte order.\n * @name util.float.readFloatLE\n * @function\n * @param {Uint8Array} buf Source buffer\n * @param {number} pos Source buffer offset\n * @returns {number} Value read\n */\n\n/**\n * Reads a 32 bit float from a buffer using big endian byte order.\n * @name util.float.readFloatBE\n * @function\n * @param {Uint8Array} buf Source buffer\n * @param {number} pos Source buffer offset\n * @returns {number} Value read\n */\n\n/**\n * Writes a 64 bit double to a buffer using little endian byte order.\n * @name util.float.writeDoubleLE\n * @function\n * @param {number} val Value to write\n * @param {Uint8Array} buf Target buffer\n * @param {number} pos Target buffer offset\n * @returns {undefined}\n */\n\n/**\n * Writes a 64 bit double to a buffer using big endian byte order.\n * @name util.float.writeDoubleBE\n * @function\n * @param {number} val Value to write\n * @param {Uint8Array} buf Target buffer\n * @param {number} pos Target buffer offset\n * @returns {undefined}\n */\n\n/**\n * Reads a 64 bit double from a buffer using little endian byte order.\n * @name util.float.readDoubleLE\n * @function\n * @param {Uint8Array} buf Source buffer\n * @param {number} pos Source buffer offset\n * @returns {number} Value read\n */\n\n/**\n * Reads a 64 bit double from a buffer using big endian byte order.\n * @name util.float.readDoubleBE\n * @function\n * @param {Uint8Array} buf Source buffer\n * @param {number} pos Source buffer offset\n * @returns {number} Value read\n */\n\n// Factory function for the purpose of node-based testing in modified global environments\nfunction factory(exports) {\n\n    // float: typed array\n    if (typeof Float32Array !== \"undefined\") (function() {\n\n        var f32 = new Float32Array([ -0 ]),\n            f8b = new Uint8Array(f32.buffer),\n            le  = f8b[3] === 128;\n\n        function writeFloat_f32_cpy(val, buf, pos) {\n            f32[0] = val;\n            buf[pos    ] = f8b[0];\n            buf[pos + 1] = f8b[1];\n            buf[pos + 2] = f8b[2];\n            buf[pos + 3] = f8b[3];\n        }\n\n        function writeFloat_f32_rev(val, buf, pos) {\n            f32[0] = val;\n            buf[pos    ] = f8b[3];\n            buf[pos + 1] = f8b[2];\n            buf[pos + 2] = f8b[1];\n            buf[pos + 3] = f8b[0];\n        }\n\n        /* istanbul ignore next */\n        exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;\n        /* istanbul ignore next */\n        exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;\n\n        function readFloat_f32_cpy(buf, pos) {\n            f8b[0] = buf[pos    ];\n            f8b[1] = buf[pos + 1];\n            f8b[2] = buf[pos + 2];\n            f8b[3] = buf[pos + 3];\n            return f32[0];\n        }\n\n        function readFloat_f32_rev(buf, pos) {\n            f8b[3] = buf[pos    ];\n            f8b[2] = buf[pos + 1];\n            f8b[1] = buf[pos + 2];\n            f8b[0] = buf[pos + 3];\n            return f32[0];\n        }\n\n        /* istanbul ignore next */\n        exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;\n        /* istanbul ignore next */\n        exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;\n\n        // float: ieee754\n    })(); else (function() {\n\n        function writeFloat_ieee754(writeUint, val, buf, pos) {\n            var sign = val < 0 ? 1 : 0;\n            if (sign)\n                val = -val;\n            if (val === 0)\n                writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos);\n            else if (isNaN(val))\n                writeUint(2143289344, buf, pos);\n            else if (val > 3.4028234663852886e+38) // +-Infinity\n                writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);\n            else if (val < 1.1754943508222875e-38) // denormal\n                writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);\n            else {\n                var exponent = Math.floor(Math.log(val) / Math.LN2),\n                    mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;\n                writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);\n            }\n        }\n\n        exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);\n        exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);\n\n        function readFloat_ieee754(readUint, buf, pos) {\n            var uint = readUint(buf, pos),\n                sign = (uint >> 31) * 2 + 1,\n                exponent = uint >>> 23 & 255,\n                mantissa = uint & 8388607;\n            return exponent === 255\n                ? mantissa\n                ? NaN\n                : sign * Infinity\n                : exponent === 0 // denormal\n                ? sign * 1.401298464324817e-45 * mantissa\n                : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);\n        }\n\n        exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);\n        exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);\n\n    })();\n\n    // double: typed array\n    if (typeof Float64Array !== \"undefined\") (function() {\n\n        var f64 = new Float64Array([-0]),\n            f8b = new Uint8Array(f64.buffer),\n            le  = f8b[7] === 128;\n\n        function writeDouble_f64_cpy(val, buf, pos) {\n            f64[0] = val;\n            buf[pos    ] = f8b[0];\n            buf[pos + 1] = f8b[1];\n            buf[pos + 2] = f8b[2];\n            buf[pos + 3] = f8b[3];\n            buf[pos + 4] = f8b[4];\n            buf[pos + 5] = f8b[5];\n            buf[pos + 6] = f8b[6];\n            buf[pos + 7] = f8b[7];\n        }\n\n        function writeDouble_f64_rev(val, buf, pos) {\n            f64[0] = val;\n            buf[pos    ] = f8b[7];\n            buf[pos + 1] = f8b[6];\n            buf[pos + 2] = f8b[5];\n            buf[pos + 3] = f8b[4];\n            buf[pos + 4] = f8b[3];\n            buf[pos + 5] = f8b[2];\n            buf[pos + 6] = f8b[1];\n            buf[pos + 7] = f8b[0];\n        }\n\n        /* istanbul ignore next */\n        exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;\n        /* istanbul ignore next */\n        exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;\n\n        function readDouble_f64_cpy(buf, pos) {\n            f8b[0] = buf[pos    ];\n            f8b[1] = buf[pos + 1];\n            f8b[2] = buf[pos + 2];\n            f8b[3] = buf[pos + 3];\n            f8b[4] = buf[pos + 4];\n            f8b[5] = buf[pos + 5];\n            f8b[6] = buf[pos + 6];\n            f8b[7] = buf[pos + 7];\n            return f64[0];\n        }\n\n        function readDouble_f64_rev(buf, pos) {\n            f8b[7] = buf[pos    ];\n            f8b[6] = buf[pos + 1];\n            f8b[5] = buf[pos + 2];\n            f8b[4] = buf[pos + 3];\n            f8b[3] = buf[pos + 4];\n            f8b[2] = buf[pos + 5];\n            f8b[1] = buf[pos + 6];\n            f8b[0] = buf[pos + 7];\n            return f64[0];\n        }\n\n        /* istanbul ignore next */\n        exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;\n        /* istanbul ignore next */\n        exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;\n\n        // double: ieee754\n    })(); else (function() {\n\n        function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {\n            var sign = val < 0 ? 1 : 0;\n            if (sign)\n                val = -val;\n            if (val === 0) {\n                writeUint(0, buf, pos + off0);\n                writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1);\n            } else if (isNaN(val)) {\n                writeUint(0, buf, pos + off0);\n                writeUint(2146959360, buf, pos + off1);\n            } else if (val > 1.7976931348623157e+308) { // +-Infinity\n                writeUint(0, buf, pos + off0);\n                writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);\n            } else {\n                var mantissa;\n                if (val < 2.2250738585072014e-308) { // denormal\n                    mantissa = val / 5e-324;\n                    writeUint(mantissa >>> 0, buf, pos + off0);\n                    writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);\n                } else {\n                    var exponent = Math.floor(Math.log(val) / Math.LN2);\n                    if (exponent === 1024)\n                        exponent = 1023;\n                    mantissa = val * Math.pow(2, -exponent);\n                    writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);\n                    writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);\n                }\n            }\n        }\n\n        exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);\n        exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);\n\n        function readDouble_ieee754(readUint, off0, off1, buf, pos) {\n            var lo = readUint(buf, pos + off0),\n                hi = readUint(buf, pos + off1);\n            var sign = (hi >> 31) * 2 + 1,\n                exponent = hi >>> 20 & 2047,\n                mantissa = 4294967296 * (hi & 1048575) + lo;\n            return exponent === 2047\n                ? mantissa\n                ? NaN\n                : sign * Infinity\n                : exponent === 0 // denormal\n                ? sign * 5e-324 * mantissa\n                : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);\n        }\n\n        exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);\n        exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);\n\n    })();\n\n    return exports;\n}\n\n// uint helpers\n\nfunction writeUintLE(val, buf, pos) {\n    buf[pos    ] =  val        & 255;\n    buf[pos + 1] =  val >>> 8  & 255;\n    buf[pos + 2] =  val >>> 16 & 255;\n    buf[pos + 3] =  val >>> 24;\n}\n\nfunction writeUintBE(val, buf, pos) {\n    buf[pos    ] =  val >>> 24;\n    buf[pos + 1] =  val >>> 16 & 255;\n    buf[pos + 2] =  val >>> 8  & 255;\n    buf[pos + 3] =  val        & 255;\n}\n\nfunction readUintLE(buf, pos) {\n    return (buf[pos    ]\n        | buf[pos + 1] << 8\n        | buf[pos + 2] << 16\n        | buf[pos + 3] << 24) >>> 0;\n}\n\nfunction readUintBE(buf, pos) {\n    return (buf[pos    ] << 24\n        | buf[pos + 1] << 16\n        | buf[pos + 2] << 8\n        | buf[pos + 3]) >>> 0;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/inquire.js",
    "content": "/**\n * Created by zhangmiao on 2018/3/14.\n */\nmodule.exports = inquire;\n\n/**\n * Requires a module only if available.\n * @memberof util\n * @param {string} moduleName Module to require\n * @returns {?Object} Required module if available and not empty, otherwise `null`\n */\nconst app = getApp();\napp.globalData.pbModuleMap = app.globalData.pbModuleMap || {};\nfunction inquire(moduleName) {\n    var moduleMap = app.globalData.pbModuleMap;\n    var arr = moduleName.split('/');\n    var name = arr[arr.length -1];\n    if(typeof moduleMap[name] != 'undefined')\n    {\n        return moduleMap[name];\n    }\n\n    try {\n        var mod = require(moduleName);\n        if (mod) {\n            moduleMap[name] = mod;\n            return mod;\n        }\n        else {\n            console.log('没有加载到该模块')\n        }\n    } catch (e) {} // eslint-disable-line no-empty\n    return null;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/long.js",
    "content": "module.exports = Long;\n\n/**\n * wasm optimizations, to do native i64 multiplication and divide\n */\nvar wasm = null;\n\ntry {\n    wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\n        0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\n    ])), {}).exports;\n} catch (e) {\n    // no wasm support :(\n}\n\n/**\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\n *  See the from* functions below for more convenient ways of constructing Longs.\n * @exports Long\n * @class A Long class for representing a 64 bit two's-complement integer value.\n * @param {number} low The low (signed) 32 bits of the long\n * @param {number} high The high (signed) 32 bits of the long\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @constructor\n */\nfunction Long(low, high, unsigned) {\n\n    /**\n     * The low 32 bits as a signed value.\n     * @type {number}\n     */\n    this.low = low | 0;\n\n    /**\n     * The high 32 bits as a signed value.\n     * @type {number}\n     */\n    this.high = high | 0;\n\n    /**\n     * Whether unsigned or not.\n     * @type {boolean}\n     */\n    this.unsigned = !!unsigned;\n}\n\n// The internal representation of a long is the two given signed, 32-bit values.\n// We use 32-bit pieces because these are the size of integers on which\n// Javascript performs bit-operations.  For operations like addition and\n// multiplication, we split each number into 16 bit pieces, which can easily be\n// multiplied within Javascript's floating-point representation without overflow\n// or change in sign.\n//\n// In the algorithms below, we frequently reduce the negative case to the\n// positive case by negating the input(s) and then post-processing the result.\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\n// a positive number, it overflows back into a negative).  Not handling this\n// case would often result in infinite recursion.\n//\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\n// methods on which they depend.\n\n/**\n * An indicator used to reliably determine if an object is a Long or not.\n * @type {boolean}\n * @const\n * @private\n */\nLong.prototype.__isLong__;\n\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\n\n/**\n * @function\n * @param {*} obj Object\n * @returns {boolean}\n * @inner\n */\nfunction isLong(obj) {\n    return (obj && obj[\"__isLong__\"]) === true;\n}\n\n/**\n * Tests if the specified object is a Long.\n * @function\n * @param {*} obj Object\n * @returns {boolean}\n */\nLong.isLong = isLong;\n\n/**\n * A cache of the Long representations of small integer values.\n * @type {!Object}\n * @inner\n */\nvar INT_CACHE = {};\n\n/**\n * A cache of the Long representations of small unsigned integer values.\n * @type {!Object}\n * @inner\n */\nvar UINT_CACHE = {};\n\n/**\n * @param {number} value\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromInt(value, unsigned) {\n    var obj, cachedObj, cache;\n    if (unsigned) {\n        value >>>= 0;\n        if (cache = (0 <= value && value < 256)) {\n            cachedObj = UINT_CACHE[value];\n            if (cachedObj)\n                return cachedObj;\n        }\n        obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\n        if (cache)\n            UINT_CACHE[value] = obj;\n        return obj;\n    } else {\n        value |= 0;\n        if (cache = (-128 <= value && value < 128)) {\n            cachedObj = INT_CACHE[value];\n            if (cachedObj)\n                return cachedObj;\n        }\n        obj = fromBits(value, value < 0 ? -1 : 0, false);\n        if (cache)\n            INT_CACHE[value] = obj;\n        return obj;\n    }\n}\n\n/**\n * Returns a Long representing the given 32 bit integer value.\n * @function\n * @param {number} value The 32 bit integer in question\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\nLong.fromInt = fromInt;\n\n/**\n * @param {number} value\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromNumber(value, unsigned) {\n    if (isNaN(value))\n        return unsigned ? UZERO : ZERO;\n    if (unsigned) {\n        if (value < 0)\n            return UZERO;\n        if (value >= TWO_PWR_64_DBL)\n            return MAX_UNSIGNED_VALUE;\n    } else {\n        if (value <= -TWO_PWR_63_DBL)\n            return MIN_VALUE;\n        if (value + 1 >= TWO_PWR_63_DBL)\n            return MAX_VALUE;\n    }\n    if (value < 0)\n        return fromNumber(-value, unsigned).neg();\n    return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\n}\n\n/**\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\n * @function\n * @param {number} value The number in question\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\nLong.fromNumber = fromNumber;\n\n/**\n * @param {number} lowBits\n * @param {number} highBits\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromBits(lowBits, highBits, unsigned) {\n    return new Long(lowBits, highBits, unsigned);\n}\n\n/**\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\n *  assumed to use 32 bits.\n * @function\n * @param {number} lowBits The low 32 bits\n * @param {number} highBits The high 32 bits\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\nLong.fromBits = fromBits;\n\n/**\n * @function\n * @param {number} base\n * @param {number} exponent\n * @returns {number}\n * @inner\n */\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\n\n/**\n * @param {string} str\n * @param {(boolean|number)=} unsigned\n * @param {number=} radix\n * @returns {!Long}\n * @inner\n */\nfunction fromString(str, unsigned, radix) {\n    if (str.length === 0)\n        throw Error('empty string');\n    if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\n        return ZERO;\n    if (typeof unsigned === 'number') {\n        // For goog.math.long compatibility\n        radix = unsigned,\n            unsigned = false;\n    } else {\n        unsigned = !! unsigned;\n    }\n    radix = radix || 10;\n    if (radix < 2 || 36 < radix)\n        throw RangeError('radix');\n\n    var p;\n    if ((p = str.indexOf('-')) > 0)\n        throw Error('interior hyphen');\n    else if (p === 0) {\n        return fromString(str.substring(1), unsigned, radix).neg();\n    }\n\n    // Do several (8) digits each time through the loop, so as to\n    // minimize the calls to the very expensive emulated div.\n    var radixToPower = fromNumber(pow_dbl(radix, 8));\n\n    var result = ZERO;\n    for (var i = 0; i < str.length; i += 8) {\n        var size = Math.min(8, str.length - i),\n            value = parseInt(str.substring(i, i + size), radix);\n        if (size < 8) {\n            var power = fromNumber(pow_dbl(radix, size));\n            result = result.mul(power).add(fromNumber(value));\n        } else {\n            result = result.mul(radixToPower);\n            result = result.add(fromNumber(value));\n        }\n    }\n    result.unsigned = unsigned;\n    return result;\n}\n\n/**\n * Returns a Long representation of the given string, written using the specified radix.\n * @function\n * @param {string} str The textual representation of the Long\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\n * @returns {!Long} The corresponding Long value\n */\nLong.fromString = fromString;\n\n/**\n * @function\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromValue(val, unsigned) {\n    if (typeof val === 'number')\n        return fromNumber(val, unsigned);\n    if (typeof val === 'string')\n        return fromString(val, unsigned);\n    // Throws for non-objects, converts non-instanceof Long:\n    return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\n}\n\n/**\n * Converts the specified value to a Long using the appropriate from* function for its type.\n * @function\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long}\n */\nLong.fromValue = fromValue;\n\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\n// no runtime penalty for these.\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_16_DBL = 1 << 16;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_24_DBL = 1 << 24;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\n\n/**\n * @type {!Long}\n * @const\n * @inner\n */\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\n\n/**\n * @type {!Long}\n * @inner\n */\nvar ZERO = fromInt(0);\n\n/**\n * Signed zero.\n * @type {!Long}\n */\nLong.ZERO = ZERO;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar UZERO = fromInt(0, true);\n\n/**\n * Unsigned zero.\n * @type {!Long}\n */\nLong.UZERO = UZERO;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar ONE = fromInt(1);\n\n/**\n * Signed one.\n * @type {!Long}\n */\nLong.ONE = ONE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar UONE = fromInt(1, true);\n\n/**\n * Unsigned one.\n * @type {!Long}\n */\nLong.UONE = UONE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar NEG_ONE = fromInt(-1);\n\n/**\n * Signed negative one.\n * @type {!Long}\n */\nLong.NEG_ONE = NEG_ONE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\n\n/**\n * Maximum signed value.\n * @type {!Long}\n */\nLong.MAX_VALUE = MAX_VALUE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\n\n/**\n * Maximum unsigned value.\n * @type {!Long}\n */\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\n\n/**\n * Minimum signed value.\n * @type {!Long}\n */\nLong.MIN_VALUE = MIN_VALUE;\n\n/**\n * @alias Long.prototype\n * @inner\n */\nvar LongPrototype = Long.prototype;\n\n/**\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\n * @returns {number}\n */\nLongPrototype.toInt = function toInt() {\n    return this.unsigned ? this.low >>> 0 : this.low;\n};\n\n/**\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\n * @returns {number}\n */\nLongPrototype.toNumber = function toNumber() {\n    if (this.unsigned)\n        return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\n    return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\n};\n\n/**\n * Converts the Long to a string written in the specified radix.\n * @param {number=} radix Radix (2-36), defaults to 10\n * @returns {string}\n * @override\n * @throws {RangeError} If `radix` is out of range\n */\nLongPrototype.toString = function toString(radix) {\n    radix = radix || 10;\n    if (radix < 2 || 36 < radix)\n        throw RangeError('radix');\n    if (this.isZero())\n        return '0';\n    if (this.isNegative()) { // Unsigned Longs are never negative\n        if (this.eq(MIN_VALUE)) {\n            // We need to change the Long value before it can be negated, so we remove\n            // the bottom-most digit in this base and then recurse to do the rest.\n            var radixLong = fromNumber(radix),\n                div = this.div(radixLong),\n                rem1 = div.mul(radixLong).sub(this);\n            return div.toString(radix) + rem1.toInt().toString(radix);\n        } else\n            return '-' + this.neg().toString(radix);\n    }\n\n    // Do several (6) digits each time through the loop, so as to\n    // minimize the calls to the very expensive emulated div.\n    var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\n        rem = this;\n    var result = '';\n    while (true) {\n        var remDiv = rem.div(radixToPower),\n            intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\n            digits = intval.toString(radix);\n        rem = remDiv;\n        if (rem.isZero())\n            return digits + result;\n        else {\n            while (digits.length < 6)\n                digits = '0' + digits;\n            result = '' + digits + result;\n        }\n    }\n};\n\n/**\n * Gets the high 32 bits as a signed integer.\n * @returns {number} Signed high bits\n */\nLongPrototype.getHighBits = function getHighBits() {\n    return this.high;\n};\n\n/**\n * Gets the high 32 bits as an unsigned integer.\n * @returns {number} Unsigned high bits\n */\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\n    return this.high >>> 0;\n};\n\n/**\n * Gets the low 32 bits as a signed integer.\n * @returns {number} Signed low bits\n */\nLongPrototype.getLowBits = function getLowBits() {\n    return this.low;\n};\n\n/**\n * Gets the low 32 bits as an unsigned integer.\n * @returns {number} Unsigned low bits\n */\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\n    return this.low >>> 0;\n};\n\n/**\n * Gets the number of bits needed to represent the absolute value of this Long.\n * @returns {number}\n */\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\n    if (this.isNegative()) // Unsigned Longs are never negative\n        return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\n    var val = this.high != 0 ? this.high : this.low;\n    for (var bit = 31; bit > 0; bit--)\n        if ((val & (1 << bit)) != 0)\n            break;\n    return this.high != 0 ? bit + 33 : bit + 1;\n};\n\n/**\n * Tests if this Long's value equals zero.\n * @returns {boolean}\n */\nLongPrototype.isZero = function isZero() {\n    return this.high === 0 && this.low === 0;\n};\n\n/**\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\n * @returns {boolean}\n */\nLongPrototype.eqz = LongPrototype.isZero;\n\n/**\n * Tests if this Long's value is negative.\n * @returns {boolean}\n */\nLongPrototype.isNegative = function isNegative() {\n    return !this.unsigned && this.high < 0;\n};\n\n/**\n * Tests if this Long's value is positive.\n * @returns {boolean}\n */\nLongPrototype.isPositive = function isPositive() {\n    return this.unsigned || this.high >= 0;\n};\n\n/**\n * Tests if this Long's value is odd.\n * @returns {boolean}\n */\nLongPrototype.isOdd = function isOdd() {\n    return (this.low & 1) === 1;\n};\n\n/**\n * Tests if this Long's value is even.\n * @returns {boolean}\n */\nLongPrototype.isEven = function isEven() {\n    return (this.low & 1) === 0;\n};\n\n/**\n * Tests if this Long's value equals the specified's.\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.equals = function equals(other) {\n    if (!isLong(other))\n        other = fromValue(other);\n    if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\n        return false;\n    return this.high === other.high && this.low === other.low;\n};\n\n/**\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.eq = LongPrototype.equals;\n\n/**\n * Tests if this Long's value differs from the specified's.\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.notEquals = function notEquals(other) {\n    return !this.eq(/* validates */ other);\n};\n\n/**\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.neq = LongPrototype.notEquals;\n\n/**\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.ne = LongPrototype.notEquals;\n\n/**\n * Tests if this Long's value is less than the specified's.\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lessThan = function lessThan(other) {\n    return this.comp(/* validates */ other) < 0;\n};\n\n/**\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lt = LongPrototype.lessThan;\n\n/**\n * Tests if this Long's value is less than or equal the specified's.\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\n    return this.comp(/* validates */ other) <= 0;\n};\n\n/**\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\n\n/**\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.le = LongPrototype.lessThanOrEqual;\n\n/**\n * Tests if this Long's value is greater than the specified's.\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.greaterThan = function greaterThan(other) {\n    return this.comp(/* validates */ other) > 0;\n};\n\n/**\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.gt = LongPrototype.greaterThan;\n\n/**\n * Tests if this Long's value is greater than or equal the specified's.\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\n    return this.comp(/* validates */ other) >= 0;\n};\n\n/**\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\n\n/**\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\n\n/**\n * Compares this Long's value with the specified's.\n * @param {!Long|number|string} other Other value\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\n *  if the given one is greater\n */\nLongPrototype.compare = function compare(other) {\n    if (!isLong(other))\n        other = fromValue(other);\n    if (this.eq(other))\n        return 0;\n    var thisNeg = this.isNegative(),\n        otherNeg = other.isNegative();\n    if (thisNeg && !otherNeg)\n        return -1;\n    if (!thisNeg && otherNeg)\n        return 1;\n    // At this point the sign bits are the same\n    if (!this.unsigned)\n        return this.sub(other).isNegative() ? -1 : 1;\n    // Both are positive if at least one is unsigned\n    return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\n};\n\n/**\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\n *  if the given one is greater\n */\nLongPrototype.comp = LongPrototype.compare;\n\n/**\n * Negates this Long's value.\n * @returns {!Long} Negated Long\n */\nLongPrototype.negate = function negate() {\n    if (!this.unsigned && this.eq(MIN_VALUE))\n        return MIN_VALUE;\n    return this.not().add(ONE);\n};\n\n/**\n * Negates this Long's value. This is an alias of {@link Long#negate}.\n * @function\n * @returns {!Long} Negated Long\n */\nLongPrototype.neg = LongPrototype.negate;\n\n/**\n * Returns the sum of this and the specified Long.\n * @param {!Long|number|string} addend Addend\n * @returns {!Long} Sum\n */\nLongPrototype.add = function add(addend) {\n    if (!isLong(addend))\n        addend = fromValue(addend);\n\n    // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\n\n    var a48 = this.high >>> 16;\n    var a32 = this.high & 0xFFFF;\n    var a16 = this.low >>> 16;\n    var a00 = this.low & 0xFFFF;\n\n    var b48 = addend.high >>> 16;\n    var b32 = addend.high & 0xFFFF;\n    var b16 = addend.low >>> 16;\n    var b00 = addend.low & 0xFFFF;\n\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n    c00 += a00 + b00;\n    c16 += c00 >>> 16;\n    c00 &= 0xFFFF;\n    c16 += a16 + b16;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c32 += a32 + b32;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c48 += a48 + b48;\n    c48 &= 0xFFFF;\n    return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\n};\n\n/**\n * Returns the difference of this and the specified Long.\n * @param {!Long|number|string} subtrahend Subtrahend\n * @returns {!Long} Difference\n */\nLongPrototype.subtract = function subtract(subtrahend) {\n    if (!isLong(subtrahend))\n        subtrahend = fromValue(subtrahend);\n    return this.add(subtrahend.neg());\n};\n\n/**\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\n * @function\n * @param {!Long|number|string} subtrahend Subtrahend\n * @returns {!Long} Difference\n */\nLongPrototype.sub = LongPrototype.subtract;\n\n/**\n * Returns the product of this and the specified Long.\n * @param {!Long|number|string} multiplier Multiplier\n * @returns {!Long} Product\n */\nLongPrototype.multiply = function multiply(multiplier) {\n    if (this.isZero())\n        return ZERO;\n    if (!isLong(multiplier))\n        multiplier = fromValue(multiplier);\n\n    // use wasm support if present\n    if (wasm) {\n        var low = wasm.mul(this.low,\n            this.high,\n            multiplier.low,\n            multiplier.high);\n        return fromBits(low, wasm.get_high(), this.unsigned);\n    }\n\n    if (multiplier.isZero())\n        return ZERO;\n    if (this.eq(MIN_VALUE))\n        return multiplier.isOdd() ? MIN_VALUE : ZERO;\n    if (multiplier.eq(MIN_VALUE))\n        return this.isOdd() ? MIN_VALUE : ZERO;\n\n    if (this.isNegative()) {\n        if (multiplier.isNegative())\n            return this.neg().mul(multiplier.neg());\n        else\n            return this.neg().mul(multiplier).neg();\n    } else if (multiplier.isNegative())\n        return this.mul(multiplier.neg()).neg();\n\n    // If both longs are small, use float multiplication\n    if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\n        return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\n\n    // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\n    // We can skip products that would overflow.\n\n    var a48 = this.high >>> 16;\n    var a32 = this.high & 0xFFFF;\n    var a16 = this.low >>> 16;\n    var a00 = this.low & 0xFFFF;\n\n    var b48 = multiplier.high >>> 16;\n    var b32 = multiplier.high & 0xFFFF;\n    var b16 = multiplier.low >>> 16;\n    var b00 = multiplier.low & 0xFFFF;\n\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n    c00 += a00 * b00;\n    c16 += c00 >>> 16;\n    c00 &= 0xFFFF;\n    c16 += a16 * b00;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c16 += a00 * b16;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c32 += a32 * b00;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c32 += a16 * b16;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c32 += a00 * b32;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n    c48 &= 0xFFFF;\n    return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\n};\n\n/**\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\n * @function\n * @param {!Long|number|string} multiplier Multiplier\n * @returns {!Long} Product\n */\nLongPrototype.mul = LongPrototype.multiply;\n\n/**\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\n *  unsigned if this Long is unsigned.\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Quotient\n */\nLongPrototype.divide = function divide(divisor) {\n    if (!isLong(divisor))\n        divisor = fromValue(divisor);\n    if (divisor.isZero())\n        throw Error('division by zero');\n\n    // use wasm support if present\n    if (wasm) {\n        // guard against signed division overflow: the largest\n        // negative number / -1 would be 1 larger than the largest\n        // positive number, due to two's complement.\n        if (!this.unsigned &&\n            this.high === -0x80000000 &&\n            divisor.low === -1 && divisor.high === -1) {\n            // be consistent with non-wasm code path\n            return this;\n        }\n        var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\n            this.low,\n            this.high,\n            divisor.low,\n            divisor.high\n        );\n        return fromBits(low, wasm.get_high(), this.unsigned);\n    }\n\n    if (this.isZero())\n        return this.unsigned ? UZERO : ZERO;\n    var approx, rem, res;\n    if (!this.unsigned) {\n        // This section is only relevant for signed longs and is derived from the\n        // closure library as a whole.\n        if (this.eq(MIN_VALUE)) {\n            if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\n                return MIN_VALUE;  // recall that -MIN_VALUE == MIN_VALUE\n            else if (divisor.eq(MIN_VALUE))\n                return ONE;\n            else {\n                // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\n                var halfThis = this.shr(1);\n                approx = halfThis.div(divisor).shl(1);\n                if (approx.eq(ZERO)) {\n                    return divisor.isNegative() ? ONE : NEG_ONE;\n                } else {\n                    rem = this.sub(divisor.mul(approx));\n                    res = approx.add(rem.div(divisor));\n                    return res;\n                }\n            }\n        } else if (divisor.eq(MIN_VALUE))\n            return this.unsigned ? UZERO : ZERO;\n        if (this.isNegative()) {\n            if (divisor.isNegative())\n                return this.neg().div(divisor.neg());\n            return this.neg().div(divisor).neg();\n        } else if (divisor.isNegative())\n            return this.div(divisor.neg()).neg();\n        res = ZERO;\n    } else {\n        // The algorithm below has not been made for unsigned longs. It's therefore\n        // required to take special care of the MSB prior to running it.\n        if (!divisor.unsigned)\n            divisor = divisor.toUnsigned();\n        if (divisor.gt(this))\n            return UZERO;\n        if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\n            return UONE;\n        res = UZERO;\n    }\n\n    // Repeat the following until the remainder is less than other:  find a\n    // floating-point that approximates remainder / other *from below*, add this\n    // into the result, and subtract it from the remainder.  It is critical that\n    // the approximate value is less than or equal to the real value so that the\n    // remainder never becomes negative.\n    rem = this;\n    while (rem.gte(divisor)) {\n        // Approximate the result of division. This may be a little greater or\n        // smaller than the actual value.\n        approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\n\n        // We will tweak the approximate result by changing it in the 48-th digit or\n        // the smallest non-fractional digit, whichever is larger.\n        var log2 = Math.ceil(Math.log(approx) / Math.LN2),\n            delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\n\n        // Decrease the approximation until it is smaller than the remainder.  Note\n        // that if it is too large, the product overflows and is negative.\n            approxRes = fromNumber(approx),\n            approxRem = approxRes.mul(divisor);\n        while (approxRem.isNegative() || approxRem.gt(rem)) {\n            approx -= delta;\n            approxRes = fromNumber(approx, this.unsigned);\n            approxRem = approxRes.mul(divisor);\n        }\n\n        // We know the answer can't be zero... and actually, zero would cause\n        // infinite recursion since we would make no progress.\n        if (approxRes.isZero())\n            approxRes = ONE;\n\n        res = res.add(approxRes);\n        rem = rem.sub(approxRem);\n    }\n    return res;\n};\n\n/**\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Quotient\n */\nLongPrototype.div = LongPrototype.divide;\n\n/**\n * Returns this Long modulo the specified.\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nLongPrototype.modulo = function modulo(divisor) {\n    if (!isLong(divisor))\n        divisor = fromValue(divisor);\n\n    // use wasm support if present\n    if (wasm) {\n        var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\n            this.low,\n            this.high,\n            divisor.low,\n            divisor.high\n        );\n        return fromBits(low, wasm.get_high(), this.unsigned);\n    }\n\n    return this.sub(this.div(divisor).mul(divisor));\n};\n\n/**\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nLongPrototype.mod = LongPrototype.modulo;\n\n/**\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nLongPrototype.rem = LongPrototype.modulo;\n\n/**\n * Returns the bitwise NOT of this Long.\n * @returns {!Long}\n */\nLongPrototype.not = function not() {\n    return fromBits(~this.low, ~this.high, this.unsigned);\n};\n\n/**\n * Returns the bitwise AND of this Long and the specified.\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nLongPrototype.and = function and(other) {\n    if (!isLong(other))\n        other = fromValue(other);\n    return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\n};\n\n/**\n * Returns the bitwise OR of this Long and the specified.\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nLongPrototype.or = function or(other) {\n    if (!isLong(other))\n        other = fromValue(other);\n    return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\n};\n\n/**\n * Returns the bitwise XOR of this Long and the given one.\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nLongPrototype.xor = function xor(other) {\n    if (!isLong(other))\n        other = fromValue(other);\n    return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\n};\n\n/**\n * Returns this Long with bits shifted to the left by the given amount.\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\n    if (isLong(numBits))\n        numBits = numBits.toInt();\n    if ((numBits &= 63) === 0)\n        return this;\n    else if (numBits < 32)\n        return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\n    else\n        return fromBits(0, this.low << (numBits - 32), this.unsigned);\n};\n\n/**\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shl = LongPrototype.shiftLeft;\n\n/**\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shiftRight = function shiftRight(numBits) {\n    if (isLong(numBits))\n        numBits = numBits.toInt();\n    if ((numBits &= 63) === 0)\n        return this;\n    else if (numBits < 32)\n        return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\n    else\n        return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\n};\n\n/**\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shr = LongPrototype.shiftRight;\n\n/**\n * Returns this Long with bits logically shifted to the right by the given amount.\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\n    if (isLong(numBits))\n        numBits = numBits.toInt();\n    numBits &= 63;\n    if (numBits === 0)\n        return this;\n    else {\n        var high = this.high;\n        if (numBits < 32) {\n            var low = this.low;\n            return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\n        } else if (numBits === 32)\n            return fromBits(high, 0, this.unsigned);\n        else\n            return fromBits(high >>> (numBits - 32), 0, this.unsigned);\n    }\n};\n\n/**\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\n\n/**\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\n\n/**\n * Converts this Long to signed.\n * @returns {!Long} Signed long\n */\nLongPrototype.toSigned = function toSigned() {\n    if (!this.unsigned)\n        return this;\n    return fromBits(this.low, this.high, false);\n};\n\n/**\n * Converts this Long to unsigned.\n * @returns {!Long} Unsigned long\n */\nLongPrototype.toUnsigned = function toUnsigned() {\n    if (this.unsigned)\n        return this;\n    return fromBits(this.low, this.high, true);\n};\n\n/**\n * Converts this Long to its byte representation.\n * @param {boolean=} le Whether little or big endian, defaults to big endian\n * @returns {!Array.<number>} Byte representation\n */\nLongPrototype.toBytes = function toBytes(le) {\n    return le ? this.toBytesLE() : this.toBytesBE();\n};\n\n/**\n * Converts this Long to its little endian byte representation.\n * @returns {!Array.<number>} Little endian byte representation\n */\nLongPrototype.toBytesLE = function toBytesLE() {\n    var hi = this.high,\n        lo = this.low;\n    return [\n        lo        & 0xff,\n        lo >>>  8 & 0xff,\n        lo >>> 16 & 0xff,\n        lo >>> 24       ,\n        hi        & 0xff,\n        hi >>>  8 & 0xff,\n        hi >>> 16 & 0xff,\n        hi >>> 24\n    ];\n};\n\n/**\n * Converts this Long to its big endian byte representation.\n * @returns {!Array.<number>} Big endian byte representation\n */\nLongPrototype.toBytesBE = function toBytesBE() {\n    var hi = this.high,\n        lo = this.low;\n    return [\n        hi >>> 24       ,\n        hi >>> 16 & 0xff,\n        hi >>>  8 & 0xff,\n        hi        & 0xff,\n        lo >>> 24       ,\n        lo >>> 16 & 0xff,\n        lo >>>  8 & 0xff,\n        lo        & 0xff\n    ];\n};\n\n/**\n * Creates a Long from its byte representation.\n * @param {!Array.<number>} bytes Byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @param {boolean=} le Whether little or big endian, defaults to big endian\n * @returns {Long} The corresponding Long value\n */\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\n    return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\n};\n\n/**\n * Creates a Long from its little endian byte representation.\n * @param {!Array.<number>} bytes Little endian byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {Long} The corresponding Long value\n */\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\n    return new Long(\n        bytes[0]       |\n        bytes[1] <<  8 |\n        bytes[2] << 16 |\n        bytes[3] << 24,\n        bytes[4]       |\n        bytes[5] <<  8 |\n        bytes[6] << 16 |\n        bytes[7] << 24,\n        unsigned\n    );\n};\n\n/**\n * Creates a Long from its big endian byte representation.\n * @param {!Array.<number>} bytes Big endian byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {Long} The corresponding Long value\n */\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\n    return new Long(\n        bytes[4] << 24 |\n        bytes[5] << 16 |\n        bytes[6] <<  8 |\n        bytes[7],\n        bytes[0] << 24 |\n        bytes[1] << 16 |\n        bytes[2] <<  8 |\n        bytes[3],\n        unsigned\n    );\n};"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/longBits.js",
    "content": "module.exports = LongBits;\n\nfunction LongBits(lo, hi) {\n    this.lo = lo >>> 0;\n    this.hi = hi >>> 0;\n}\n\nvar zero = LongBits.zero = new LongBits(0, 0);\n\nzero.toNumber = function() { return 0; };\nzero.zzEncode = zero.zzDecode = function() { return this; };\nzero.length = function() { return 1; };\n\n\nvar zeroHash = LongBits.zeroHash = \"\\0\\0\\0\\0\\0\\0\\0\\0\";\n\nLongBits.fromNumber = function fromNumber(value) {\n    if (value === 0)\n        return zero;\n    var sign = value < 0;//如果sign为 1 ,表示为负数\n    if (sign)\n        value = -value;\n    var lo = value >>> 0,//取出底32位\n        hi = (value - lo) / 4294967296 >>> 0; //取出高32位\n    if (sign) { //负数\n        hi = ~hi >>> 0; //求取高32位的反码\n        lo = ~lo >>> 0; //求取低32位的反码\n        if (++lo > 4294967295) { //低32位大于Math.pow(2,31)-1\n            lo = 0;\n            if (++hi > 4294967295) //高32位大于Math.pow(2,31)-1\n                hi = 0;\n        }\n    }\n    return new LongBits(lo, hi);\n};\n\n\nLongBits.from = function from(value) {\n    if (typeof value === \"number\")\n        return LongBits.fromNumber(value);\n    if (typeof value === \"string\" || value instanceof String) {\n        return LongBits.fromNumber(parseInt(value, 10));\n    }\n    return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;\n};\n\nLongBits.prototype.toNumber = function toNumber(unsigned) {\n    if (!unsigned && this.hi >>> 31) {\n        var lo = ~this.lo + 1 >>> 0,\n            hi = ~this.hi     >>> 0;\n        if (!lo)\n            hi = hi + 1 >>> 0;\n        return -(lo + hi * 4294967296);\n    }\n    return this.lo + this.hi * 4294967296;\n};\nLongBits.prototype.toLong = function toLong(unsigned) {\n    //return util.Long\n    //    ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned))\n    //    /* istanbul ignore next */\n    //    : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };\n    return { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };\n};\n\nvar charCodeAt = String.prototype.charCodeAt;\n\nLongBits.fromHash = function fromHash(hash) {\n    if (hash === zeroHash)\n        return zero;\n    return new LongBits(\n        ( charCodeAt.call(hash, 0)\n        | charCodeAt.call(hash, 1) << 8\n        | charCodeAt.call(hash, 2) << 16\n        | charCodeAt.call(hash, 3) << 24) >>> 0\n        ,\n        ( charCodeAt.call(hash, 4)\n        | charCodeAt.call(hash, 5) << 8\n        | charCodeAt.call(hash, 6) << 16\n        | charCodeAt.call(hash, 7) << 24) >>> 0\n    );\n};\n\nLongBits.prototype.toHash = function toHash() {\n    return String.fromCharCode(\n        this.lo        & 255,\n        this.lo >>> 8  & 255,\n        this.lo >>> 16 & 255,\n        this.lo >>> 24      ,\n        this.hi        & 255,\n        this.hi >>> 8  & 255,\n        this.hi >>> 16 & 255,\n        this.hi >>> 24\n    );\n};\n\nLongBits.prototype.zzEncode = function zzEncode() {\n    var mask =   this.hi >> 31;\n    this.hi  = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;\n    this.lo  = ( this.lo << 1                   ^ mask) >>> 0;\n    return this;\n};\n\nLongBits.prototype.zzDecode = function zzDecode() {\n    var mask = -(this.lo & 1);\n    this.lo  = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;\n    this.hi  = ( this.hi >>> 1                  ^ mask) >>> 0;\n    return this;\n};\nLongBits.prototype.length = function length() {\n    var part0 =  this.lo,\n        part1 = (this.lo >>> 28 | this.hi << 4) >>> 0,\n        part2 =  this.hi >>> 24;\n    return part2 === 0\n        ? part1 === 0\n        ? part0 < 16384\n        ? part0 < 128 ? 1 : 2\n        : part0 < 2097152 ? 3 : 4\n        : part1 < 16384\n        ? part1 < 128 ? 5 : 6\n        : part1 < 2097152 ? 7 : 8\n        : part2 < 128 ? 9 : 10;\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/mapField.js",
    "content": "module.exports = MapField;\n\n// extends Field\nvar Field = require(\"./field\");\n((MapField.prototype = Object.create(Field.prototype)).constructor = MapField).className = \"MapField\";\n\nvar types,\n    util;\n\n/**\n * Constructs a new map field instance.\n * @classdesc Reflected map field.\n * @extends FieldBase\n * @constructor\n * @param {string} name Unique name within its namespace\n * @param {number} id Unique id within its namespace\n * @param {string} keyType Key type\n * @param {string} type Value type\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] Comment associated with this field\n */\nfunction MapField(name, id, keyType, type, options, comment) {\n    Field.call(this, name, id, type, undefined, undefined, options, comment);\n\n    /* istanbul ignore if */\n    if (!util.isString(keyType))\n        throw TypeError(\"keyType must be a string\");\n\n    /**\n     * Key type.\n     * @type {string}\n     */\n    this.keyType = keyType; // toJSON, marker\n\n    /**\n     * Resolved key type if not a basic type.\n     * @type {ReflectionObject|null}\n     */\n    this.resolvedKeyType = null;\n\n    // Overrides Field#map\n    this.map = true;\n}\n\n/**\n * Map field descriptor.\n * @interface IMapField\n * @extends {IField}\n * @property {string} keyType Key type\n */\n\n/**\n * Extension map field descriptor.\n * @interface IExtensionMapField\n * @extends IMapField\n * @property {string} extend Extended type\n */\n\n/**\n * Constructs a map field from a map field descriptor.\n * @param {string} name Field name\n * @param {IMapField} json Map field descriptor\n * @returns {MapField} Created map field\n * @throws {TypeError} If arguments are invalid\n */\nMapField.fromJSON = function fromJSON(name, json) {\n    return new MapField(name, json.id, json.keyType, json.type, json.options, json.comment);\n};\n\n/**\n * Converts this map field to a map field descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IMapField} Map field descriptor\n */\nMapField.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"keyType\" , this.keyType,\n        \"type\"    , this.type,\n        \"id\"      , this.id,\n        \"extend\"  , this.extend,\n        \"options\" , this.options,\n        \"comment\" , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * @override\n */\nMapField.prototype.resolve = function resolve() {\n    if (this.resolved)\n        return this;\n\n    // Besides a value type, map fields have a key type that may be \"any scalar type except for floating point types and bytes\"\n    if (types.mapKey[this.keyType] === undefined)\n        throw Error(\"invalid key type: \" + this.keyType);\n\n    return Field.prototype.resolve.call(this);\n};\n\n/**\n * Map field decorator (TypeScript).\n * @name MapField.d\n * @function\n * @param {number} fieldId Field id\n * @param {\"int32\"|\"uint32\"|\"sint32\"|\"fixed32\"|\"sfixed32\"|\"int64\"|\"uint64\"|\"sint64\"|\"fixed64\"|\"sfixed64\"|\"bool\"|\"string\"} fieldKeyType Field key type\n * @param {\"double\"|\"float\"|\"int32\"|\"uint32\"|\"sint32\"|\"fixed32\"|\"sfixed32\"|\"int64\"|\"uint64\"|\"sint64\"|\"fixed64\"|\"sfixed64\"|\"bool\"|\"string\"|\"bytes\"|Object|Constructor<{}>} fieldValueType Field value type\n * @returns {FieldDecorator} Decorator function\n * @template T extends { [key: string]: number | Long | string | boolean | Uint8Array | Buffer | number[] | Message<{}> }\n */\nMapField.d = function decorateMapField(fieldId, fieldKeyType, fieldValueType) {\n\n    // submessage value: decorate the submessage and use its name as the type\n    if (typeof fieldValueType === \"function\")\n        fieldValueType = util.decorateType(fieldValueType).name;\n\n    // enum reference value: create a reflected copy of the enum and keep reuseing it\n    else if (fieldValueType && typeof fieldValueType === \"object\")\n        fieldValueType = util.decorateEnum(fieldValueType).name;\n\n    return function mapFieldDecorator(prototype, fieldName) {\n        util.decorateType(prototype.constructor)\n            .add(new MapField(fieldName, fieldId, fieldKeyType, fieldValueType));\n    };\n};\n\nMapField._configure = function(){\n    types   = require(\"./types\");\n    util    = require(\"./util\");\n};"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/message.js",
    "content": "\"use strict\";\nmodule.exports = Message;\n\nvar util;\n\n/**\n * Constructs a new message instance.\n * @classdesc Abstract runtime message.\n * @constructor\n * @param {Properties<T>} [properties] Properties to set\n * @template T extends object\n */\nfunction Message(properties) {\n    // not used internally\n    if (properties)\n        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n            this[keys[i]] = properties[keys[i]];\n}\n\n/**\n * Reference to the reflected type.\n * @name Message.$type\n * @type {Type}\n * @readonly\n */\n\n/**\n * Reference to the reflected type.\n * @name Message#$type\n * @type {Type}\n * @readonly\n */\n\n/*eslint-disable valid-jsdoc*/\n\n/**\n * Creates a new message of this type using the specified properties.\n * @param {Object.<string,*>} [properties] Properties to set\n * @returns {Message<T>} Message instance\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.create = function create(properties) {\n    return this.$type.create(properties);\n};\n\n/**\n * Encodes a message of this type.\n * @param {T|Object.<string,*>} message Message to encode\n * @param {Writer} [writer] Writer to use\n * @returns {Writer} Writer\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.encode = function encode(message, writer) {\n    if(!arguments.length){\n        return this.$type.encode(this);\n    }else if (arguments.length == 1){\n        return this.$type.encode(arguments[0]);\n    }else{\n        return this.$type.encode(arguments[0], arguments[1]);\n    }\n    //return this.$type.encode(message, writer);\n};\n\n/**\n * Encodes a message of this type preceeded by its length as a varint.\n * @param {T|Object.<string,*>} message Message to encode\n * @param {Writer} [writer] Writer to use\n * @returns {Writer} Writer\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.encodeDelimited = function encodeDelimited(message, writer) {\n    return this.$type.encodeDelimited(message, writer);\n};\n\n/**\n * Decodes a message of this type.\n * @name Message.decode\n * @function\n * @param {Reader|Uint8Array} reader Reader or buffer to decode\n * @returns {T} Decoded message\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.decode = function decode(reader) {\n    return this.$type.decode(reader);\n};\n\n/**\n * Decodes a message of this type preceeded by its length as a varint.\n * @name Message.decodeDelimited\n * @function\n * @param {Reader|Uint8Array} reader Reader or buffer to decode\n * @returns {T} Decoded message\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.decodeDelimited = function decodeDelimited(reader) {\n    return this.$type.decodeDelimited(reader);\n};\n\n/**\n * Verifies a message of this type.\n * @name Message.verify\n * @function\n * @param {Object.<string,*>} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\nMessage.verify = function verify(message) {\n    return this.$type.verify(message);\n};\n\n/**\n * Creates a new message of this type from a plain object. Also converts values to their respective internal types.\n * @param {Object.<string,*>} object Plain object\n * @returns {T} Message instance\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.fromObject = function fromObject(object) {\n    return this.$type.fromObject(object);\n};\n\n/**\n * Creates a plain object from a message of this type. Also converts values to other types if specified.\n * @param {T} message Message instance\n * @param {IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n * @template T extends Message<T>\n * @this Constructor<T>\n */\nMessage.toObject = function toObject(message, options) {\n    message = message || this;\n    return this.$type.toObject(message, options);\n};\n\n/**\n * Converts this message to JSON.\n * @returns {Object.<string,*>} JSON object\n */\nMessage.prototype.toJSON = function toJSON() {\n    return this.$type.toObject(this, util.toJSONOptions);\n};\n\n\n\nMessage.set  = function(key,value){\n    Message[key] = value;\n};\n\nMessage.get = function (key){\n    return Message[key];\n};\n/*eslint-enable valid-jsdoc*/\n\nMessage._configure = function(){\n    util = require(\"./util\");\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/method.js",
    "content": "\"use strict\";\nmodule.exports = Method;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\n((Method.prototype = Object.create(ReflectionObject.prototype)).constructor = Method).className = \"Method\";\n\nvar util;\n\n/**\n * Constructs a new service method instance.\n * @classdesc Reflected service method.\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Method name\n * @param {string|undefined} type Method type, usually `\"rpc\"`\n * @param {string} requestType Request message type\n * @param {string} responseType Response message type\n * @param {boolean|Object.<string,*>} [requestStream] Whether the request is streamed\n * @param {boolean|Object.<string,*>} [responseStream] Whether the response is streamed\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] The comment for this method\n */\nfunction Method(name, type, requestType, responseType, requestStream, responseStream, options, comment) {\n\n    /* istanbul ignore next */\n    if (util.isObject(requestStream)) {\n        options = requestStream;\n        requestStream = responseStream = undefined;\n    } else if (util.isObject(responseStream)) {\n        options = responseStream;\n        responseStream = undefined;\n    }\n\n    /* istanbul ignore if */\n    if (!(type === undefined || util.isString(type)))\n        throw TypeError(\"type must be a string\");\n\n    /* istanbul ignore if */\n    if (!util.isString(requestType))\n        throw TypeError(\"requestType must be a string\");\n\n    /* istanbul ignore if */\n    if (!util.isString(responseType))\n        throw TypeError(\"responseType must be a string\");\n\n    ReflectionObject.call(this, name, options);\n\n    /**\n     * Method type.\n     * @type {string}\n     */\n    this.type = type || \"rpc\"; // toJSON\n\n    /**\n     * Request type.\n     * @type {string}\n     */\n    this.requestType = requestType; // toJSON, marker\n\n    /**\n     * Whether requests are streamed or not.\n     * @type {boolean|undefined}\n     */\n    this.requestStream = requestStream ? true : undefined; // toJSON\n\n    /**\n     * Response type.\n     * @type {string}\n     */\n    this.responseType = responseType; // toJSON\n\n    /**\n     * Whether responses are streamed or not.\n     * @type {boolean|undefined}\n     */\n    this.responseStream = responseStream ? true : undefined; // toJSON\n\n    /**\n     * Resolved request type.\n     * @type {Type|null}\n     */\n    this.resolvedRequestType = null;\n\n    /**\n     * Resolved response type.\n     * @type {Type|null}\n     */\n    this.resolvedResponseType = null;\n\n    /**\n     * Comment for this method\n     * @type {string|null}\n     */\n    this.comment = comment;\n}\n\n/**\n * Method descriptor.\n * @interface IMethod\n * @property {string} [type=\"rpc\"] Method type\n * @property {string} requestType Request type\n * @property {string} responseType Response type\n * @property {boolean} [requestStream=false] Whether requests are streamed\n * @property {boolean} [responseStream=false] Whether responses are streamed\n * @property {Object.<string,*>} [options] Method options\n */\n\n/**\n * Constructs a method from a method descriptor.\n * @param {string} name Method name\n * @param {IMethod} json Method descriptor\n * @returns {Method} Created method\n * @throws {TypeError} If arguments are invalid\n */\nMethod.fromJSON = function fromJSON(name, json) {\n    return new Method(name, json.type, json.requestType, json.responseType, json.requestStream, json.responseStream, json.options, json.comment);\n};\n\n/**\n * Converts this method to a method descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IMethod} Method descriptor\n */\nMethod.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"type\"           , this.type !== \"rpc\" && /* istanbul ignore next */ this.type || undefined,\n        \"requestType\"    , this.requestType,\n        \"requestStream\"  , this.requestStream,\n        \"responseType\"   , this.responseType,\n        \"responseStream\" , this.responseStream,\n        \"options\"        , this.options,\n        \"comment\"        , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * @override\n */\nMethod.prototype.resolve = function resolve() {\n\n    /* istanbul ignore if */\n    if (this.resolved)\n        return this;\n\n    this.resolvedRequestType = this.parent.lookupType(this.requestType);\n    this.resolvedResponseType = this.parent.lookupType(this.responseType);\n\n    return ReflectionObject.prototype.resolve.call(this);\n};\n\nMethod._configure = function (){\n    util = require(\"./util\");\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/namespace.js",
    "content": "\nmodule.exports = Namespace;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\n((Namespace.prototype = Object.create(ReflectionObject.prototype)).constructor = Namespace).className = \"Namespace\";\n\nvar Enum,\n    Field,\n    util;\n\nvar Type;    // cyclic\nvar Service;\n\n/**\n * Constructs a new namespace instance.\n * @name Namespace\n * @classdesc Reflected namespace.\n * @extends NamespaceBase\n * @constructor\n * @param {string} name Namespace name\n * @param {Object.<string,*>} [options] Declared options\n */\n\n/**\n * Constructs a namespace from JSON.\n * @memberof Namespace\n * @function\n * @param {string} name Namespace name\n * @param {Object.<string,*>} json JSON object\n * @returns {Namespace} Created namespace\n * @throws {TypeError} If arguments are invalid\n */\nNamespace.fromJSON = function fromJSON(name, json) {\n    return new Namespace(name, json.options).addJSON(json.nested);\n};\n\n/**\n * Converts an array of reflection objects to JSON.\n * @memberof Namespace\n * @param {ReflectionObject[]} array Object array\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {Object.<string,*>|undefined} JSON object or `undefined` when array is empty\n */\nfunction arrayToJSON(array, toJSONOptions) {\n    if (!(array && array.length))\n        return undefined;\n    var obj = {};\n    for (var i = 0; i < array.length; ++i)\n        obj[array[i].name] = array[i].toJSON(toJSONOptions);\n    return obj;\n}\n\nNamespace.arrayToJSON = arrayToJSON;\n\n/**\n * Tests if the specified id is reserved.\n * @param {Array.<number[]|string>|undefined} reserved Array of reserved ranges and names\n * @param {number} id Id to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nNamespace.isReservedId = function isReservedId(reserved, id) {\n    if (reserved)\n        for (var i = 0; i < reserved.length; ++i)\n            if (typeof reserved[i] !== \"string\" && reserved[i][0] <= id && reserved[i][1] >= id)\n                return true;\n    return false;\n};\n\n/**\n * Tests if the specified name is reserved.\n * @param {Array.<number[]|string>|undefined} reserved Array of reserved ranges and names\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nNamespace.isReservedName = function isReservedName(reserved, name) {\n    if (reserved)\n        for (var i = 0; i < reserved.length; ++i)\n            if (reserved[i] === name)\n                return true;\n    return false;\n};\n\n/**\n * Not an actual constructor. Use {@link Namespace} instead.\n * @classdesc Base class of all reflection objects containing nested objects. This is not an actual class but here for the sake of having consistent type definitions.\n * @exports NamespaceBase\n * @extends ReflectionObject\n * @abstract\n * @constructor\n * @param {string} name Namespace name\n * @param {Object.<string,*>} [options] Declared options\n * @see {@link Namespace}\n */\nfunction Namespace(name, options) {\n    ReflectionObject.call(this, name, options);\n\n    /**\n     * Nested objects by name.\n     * @type {Object.<string,ReflectionObject>|undefined}\n     */\n    this.nested = undefined; // toJSON\n\n    /**\n     * Cached nested objects as an array.\n     * @type {ReflectionObject[]|null}\n     * @private\n     */\n    this._nestedArray = null;\n}\n\nfunction clearCache(namespace) {\n    namespace._nestedArray = null;\n    return namespace;\n}\n\n/**\n * Nested objects of this namespace as an array for iteration.\n * @name NamespaceBase#nestedArray\n * @type {ReflectionObject[]}\n * @readonly\n */\nObject.defineProperty(Namespace.prototype, \"nestedArray\", {\n    get: function() {\n        return this._nestedArray || (this._nestedArray = util.toArray(this.nested));\n    }\n});\n\n/**\n * Namespace descriptor.\n * @interface INamespace\n * @property {Object.<string,*>} [options] Namespace options\n * @property {Object.<string,AnyNestedObject>} [nested] Nested object descriptors\n */\n\n/**\n * Any extension field descriptor.\n * @typedef AnyExtensionField\n * @type {IExtensionField|IExtensionMapField}\n */\n\n/**\n * Any nested object descriptor.\n * @typedef AnyNestedObject\n * @type {IEnum|IType|IService|AnyExtensionField|INamespace}\n */\n// ^ BEWARE: VSCode hangs forever when using more than 5 types (that's why AnyExtensionField exists in the first place)\n\n/**\n * Converts this namespace to a namespace descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {INamespace} Namespace descriptor\n */\nNamespace.prototype.toJSON = function toJSON(toJSONOptions) {\n    return util.toObject([\n        \"options\" , this.options,\n        \"nested\"  , arrayToJSON(this.nestedArray, toJSONOptions)\n    ]);\n};\n\n/**\n * Adds nested objects to this namespace from nested object descriptors.\n * @param {Object.<string,AnyNestedObject>} nestedJson Any nested object descriptors\n * @returns {Namespace} `this`\n */\nNamespace.prototype.addJSON = function addJSON(nestedJson) {\n    var ns = this;\n    /* istanbul ignore else */\n    if (nestedJson) {\n        for (var names = Object.keys(nestedJson), i = 0, nested; i < names.length; ++i) {\n            nested = nestedJson[names[i]];\n            ns.add( // most to least likely\n                ( nested.fields !== undefined\n                    ? Type.fromJSON\n                    : nested.values !== undefined\n                    ? Enum.fromJSON\n                    : nested.methods !== undefined\n                    ? Service.fromJSON\n                    : nested.id !== undefined\n                    ? Field.fromJSON\n                    : Namespace.fromJSON )(names[i], nested)\n            );\n        }\n    }\n    return this;\n};\n\n/**\n * Gets the nested object of the specified name.\n * @param {string} name Nested object name\n * @returns {ReflectionObject|null} The reflection object or `null` if it doesn't exist\n */\nNamespace.prototype.get = function get(name) {\n    return this.nested && this.nested[name]\n        || null;\n};\n\n/**\n * Gets the values of the nested {@link Enum|enum} of the specified name.\n * This methods differs from {@link Namespace#get|get} in that it returns an enum's values directly and throws instead of returning `null`.\n * @param {string} name Nested enum name\n * @returns {Object.<string,number>} Enum values\n * @throws {Error} If there is no such enum\n */\nNamespace.prototype.getEnum = function getEnum(name) {\n    if (this.nested && this.nested[name] instanceof Enum)\n        return this.nested[name].values;\n    throw Error(\"no such enum: \" + name);\n};\n\n/**\n * Adds a nested object to this namespace.\n * @param {ReflectionObject} object Nested object to add\n * @returns {Namespace} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If there is already a nested object with this name\n */\nNamespace.prototype.add = function add(object) {\n\n    if (!(object instanceof Field && object.extend !== undefined || object instanceof Type || object instanceof Enum || object instanceof Service || object instanceof Namespace))\n        throw TypeError(\"object must be a valid nested object\");\n\n    if (!this.nested)\n        this.nested = {};\n    else {\n        var prev = this.get(object.name);\n        if (prev) {\n            if (prev instanceof Namespace && object instanceof Namespace && !(prev instanceof Type || prev instanceof Service)) {\n                // replace plain namespace but keep existing nested elements and options\n                var nested = prev.nestedArray;\n                for (var i = 0; i < nested.length; ++i)\n                    object.add(nested[i]);\n                this.remove(prev);\n                if (!this.nested)\n                    this.nested = {};\n                object.setOptions(prev.options, true);\n\n            } else\n                throw Error(\"duplicate name '\" + object.name + \"' in \" + this);\n        }\n    }\n    this.nested[object.name] = object;\n    object.onAdd(this);\n    return clearCache(this);\n};\n\n/**\n * Removes a nested object from this namespace.\n * @param {ReflectionObject} object Nested object to remove\n * @returns {Namespace} `this`\n * @throws {TypeError} If arguments are invalid\n * @throws {Error} If `object` is not a member of this namespace\n */\nNamespace.prototype.remove = function remove(object) {\n\n    if (!(object instanceof ReflectionObject))\n        throw TypeError(\"object must be a ReflectionObject\");\n    if (object.parent !== this)\n        throw Error(object + \" is not a member of \" + this);\n\n    delete this.nested[object.name];\n    if (!Object.keys(this.nested).length)\n        this.nested = undefined;\n\n    object.onRemove(this);\n    return clearCache(this);\n};\n\n/**\n * Defines additial namespaces within this one if not yet existing.\n * @param {string|string[]} path Path to create\n * @param {*} [json] Nested types to create from JSON\n * @returns {Namespace} Pointer to the last namespace created or `this` if path is empty\n */\nNamespace.prototype.define = function define(path, json) {\n\n    if (util.isString(path))\n        path = path.split(\".\");\n    else if (!Array.isArray(path))\n        throw TypeError(\"illegal path\");\n    if (path && path.length && path[0] === \"\")\n        throw Error(\"path must be relative\");\n\n    var ptr = this;\n    while (path.length > 0) {\n        var part = path.shift();\n        if (ptr.nested && ptr.nested[part]) {\n            ptr = ptr.nested[part];\n            if (!(ptr instanceof Namespace))\n                throw Error(\"path conflicts with non-namespace objects\");\n        } else\n            ptr.add(ptr = new Namespace(part));\n    }\n    if (json)\n        ptr.addJSON(json);\n    return ptr;\n};\n\n/**\n * Resolves this namespace's and all its nested objects' type references. Useful to validate a reflection tree, but comes at a cost.\n * @returns {Namespace} `this`\n */\nNamespace.prototype.resolveAll = function resolveAll() {\n    var nested = this.nestedArray, i = 0;\n    while (i < nested.length)\n        if (nested[i] instanceof Namespace)\n            nested[i++].resolveAll();\n        else\n            nested[i++].resolve();\n    return this.resolve();\n};\n\n/**\n * Recursively looks up the reflection object matching the specified path in the scope of this namespace.\n * @param {string|string[]} path Path to look up\n * @param {*|Array.<*>} filterTypes Filter types, any combination of the constructors of `protobuf.Type`, `protobuf.Enum`, `protobuf.Service` etc.\n * @param {boolean} [parentAlreadyChecked=false] If known, whether the parent has already been checked\n * @returns {ReflectionObject|null} Looked up object or `null` if none could be found\n */\nNamespace.prototype.lookup = function lookup(path, filterTypes, parentAlreadyChecked) {\n\n    /* istanbul ignore next */\n    if (typeof filterTypes === \"boolean\") {\n        parentAlreadyChecked = filterTypes;\n        filterTypes = undefined;\n    } else if (filterTypes && !Array.isArray(filterTypes))\n        filterTypes = [ filterTypes ];\n\n    if (util.isString(path) && path.length) {\n        if (path === \".\")\n            return this.root;\n        path = path.split(\".\");\n    } else if (!path.length)\n        return this;\n\n    // Start at root if path is absolute\n    if (path[0] === \"\")\n        return this.root.lookup(path.slice(1), filterTypes);\n\n    // Test if the first part matches any nested object, and if so, traverse if path contains more\n    var found = this.get(path[0]);\n    if (found) {\n        if (path.length === 1) {\n            if (!filterTypes || filterTypes.indexOf(found.constructor) > -1)\n                return found;\n        } else if (found instanceof Namespace && (found = found.lookup(path.slice(1), filterTypes, true)))\n            return found;\n\n        // Otherwise try each nested namespace\n    } else\n        for (var i = 0; i < this.nestedArray.length; ++i)\n            if (this._nestedArray[i] instanceof Namespace && (found = this._nestedArray[i].lookup(path, filterTypes, true)))\n                return found;\n\n    // If there hasn't been a match, try again at the parent\n    if (this.parent === null || parentAlreadyChecked)\n        return null;\n    return this.parent.lookup(path, filterTypes);\n};\n\n/**\n * Looks up the reflection object at the specified path, relative to this namespace.\n * @name NamespaceBase#lookup\n * @function\n * @param {string|string[]} path Path to look up\n * @param {boolean} [parentAlreadyChecked=false] Whether the parent has already been checked\n * @returns {ReflectionObject|null} Looked up object or `null` if none could be found\n * @variation 2\n */\n// lookup(path: string, [parentAlreadyChecked: boolean])\n\n/**\n * Looks up the {@link Type|type} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Type} Looked up type\n * @throws {Error} If `path` does not point to a type\n */\nNamespace.prototype.lookupType = function lookupType(path) {\n    var found = this.lookup(path, [ Type ]);\n    if (!found)\n        throw Error(\"no such type: \" + path);\n    return found;\n};\n\n/**\n * Looks up the values of the {@link Enum|enum} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Enum} Looked up enum\n * @throws {Error} If `path` does not point to an enum\n */\nNamespace.prototype.lookupEnum = function lookupEnum(path) {\n    var found = this.lookup(path, [ Enum ]);\n    if (!found)\n        throw Error(\"no such Enum '\" + path + \"' in \" + this);\n    return found;\n};\n\n/**\n * Looks up the {@link Type|type} or {@link Enum|enum} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Type} Looked up type or enum\n * @throws {Error} If `path` does not point to a type or enum\n */\nNamespace.prototype.lookupTypeOrEnum = function lookupTypeOrEnum(path) {\n    var found = this.lookup(path, [ Type, Enum ]);\n    if (!found)\n        throw Error(\"no such Type or Enum '\" + path + \"' in \" + this);\n    return found;\n};\n\n/**\n * Looks up the {@link Service|service} at the specified path, relative to this namespace.\n * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.\n * @param {string|string[]} path Path to look up\n * @returns {Service} Looked up service\n * @throws {Error} If `path` does not point to a service\n */\nNamespace.prototype.lookupService = function lookupService(path) {\n    var found = this.lookup(path, [ Service ]);\n    if (!found)\n        throw Error(\"no such Service '\" + path + \"' in \" + this);\n    return found;\n};\n\nNamespace._configure = function() {\n    Enum     = require(\"./enum\");\n    Field    = require(\"./field\");\n    util     = require(\"./util\");\n\n    Type     = require(\"./type\");    // cyclic\n    Service  = require(\"./service\");\n};"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/object.js",
    "content": "\"use strict\";\nmodule.exports = ReflectionObject;\n\nReflectionObject.className = \"ReflectionObject\";\nvar util;\n\nvar Root; // cyclic\n\n/**\n * Constructs a new reflection object instance.\n * @classdesc Base class of all reflection objects.\n * @constructor\n * @param {string} name Object name\n * @param {Object.<string,*>} [options] Declared options\n * @abstract\n */\nfunction ReflectionObject(name, options) {\n\n    if (!util.isString(name))\n        throw TypeError(\"name must be a string\");\n\n    if (options && !util.isObject(options))\n        throw TypeError(\"options must be an object\");\n\n    /**\n     * Options.\n     * @type {Object.<string,*>|undefined}\n     */\n    this.options = options; // toJSON\n\n    /**\n     * Unique name within its namespace.\n     * @type {string}\n     */\n    this.name = name;\n\n    /**\n     * Parent namespace.\n     * @type {Namespace|null}\n     */\n    this.parent = null;\n\n    /**\n     * Whether already resolved or not.\n     * @type {boolean}\n     */\n    this.resolved = false;\n\n    /**\n     * Comment text, if any.\n     * @type {string|null}\n     */\n    this.comment = null;\n\n    /**\n     * Defining file name.\n     * @type {string|null}\n     */\n    this.filename = null;\n}\n\nObject.defineProperties(ReflectionObject.prototype, {\n\n    /**\n     * Reference to the root namespace.\n     * @name ReflectionObject#root\n     * @type {Root}\n     * @readonly\n     */\n    root: {\n        get: function() {\n            var ptr = this;\n            while (ptr.parent !== null)\n                ptr = ptr.parent;\n            return ptr;\n        }\n    },\n\n    /**\n     * Full name including leading dot.\n     * @name ReflectionObject#fullName\n     * @type {string}\n     * @readonly\n     */\n    fullName: {\n        get: function() {\n            var path = [ this.name ],\n                ptr = this.parent;\n            while (ptr) {\n                path.unshift(ptr.name);\n                ptr = ptr.parent;\n            }\n            return path.join(\".\");\n        }\n    }\n});\n\n/**\n * Converts this reflection object to its descriptor representation.\n * @returns {Object.<string,*>} Descriptor\n * @abstract\n */\nReflectionObject.prototype.toJSON = /* istanbul ignore next */ function toJSON() {\n    throw Error(); // not implemented, shouldn't happen\n};\n\n/**\n * Called when this object is added to a parent.\n * @param {ReflectionObject} parent Parent added to\n * @returns {undefined}\n */\nReflectionObject.prototype.onAdd = function onAdd(parent) {\n    if (this.parent && this.parent !== parent)\n        this.parent.remove(this);\n    this.parent = parent;\n    this.resolved = false;\n    var root = parent.root;\n    if (root instanceof Root)\n        root._handleAdd(this);\n};\n\n/**\n * Called when this object is removed from a parent.\n * @param {ReflectionObject} parent Parent removed from\n * @returns {undefined}\n */\nReflectionObject.prototype.onRemove = function onRemove(parent) {\n    var root = parent.root;\n    if (root instanceof Root)\n        root._handleRemove(this);\n    this.parent = null;\n    this.resolved = false;\n};\n\n/**\n * Resolves this objects type references.\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.resolve = function resolve() {\n    if (this.resolved)\n        return this;\n    if (this.root instanceof Root)\n        this.resolved = true; // only if part of a root\n    return this;\n};\n\n/**\n * Gets an option value.\n * @param {string} name Option name\n * @returns {*} Option value or `undefined` if not set\n */\nReflectionObject.prototype.getOption = function getOption(name) {\n    if (this.options)\n        return this.options[name];\n    return undefined;\n};\n\n/**\n * Sets an option.\n * @param {string} name Option name\n * @param {*} value Option value\n * @param {boolean} [ifNotSet] Sets the option only if it isn't currently set\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.setOption = function setOption(name, value, ifNotSet) {\n    if (!ifNotSet || !this.options || this.options[name] === undefined)\n        (this.options || (this.options = {}))[name] = value;\n    return this;\n};\n\n/**\n * Sets multiple options.\n * @param {Object.<string,*>} options Options to set\n * @param {boolean} [ifNotSet] Sets an option only if it isn't currently set\n * @returns {ReflectionObject} `this`\n */\nReflectionObject.prototype.setOptions = function setOptions(options, ifNotSet) {\n    if (options)\n        for (var keys = Object.keys(options), i = 0; i < keys.length; ++i)\n            this.setOption(keys[i], options[keys[i]], ifNotSet);\n    return this;\n};\n\n/**\n * Converts this instance to its string representation.\n * @returns {string} Class name[, space, full name]\n */\nReflectionObject.prototype.toString = function toString() {\n    var className = this.constructor.className,\n        fullName  = this.fullName;\n    if (fullName.length)\n        return className + \" \" + fullName;\n    return className;\n};\n\nReflectionObject._configure = function(Root_) {\n    Root = require('./root');\n    util = require('./util');\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/oneof.js",
    "content": "module.exports = OneOf;\n\n// extends ReflectionObject\nvar ReflectionObject = require(\"./object\");\n((OneOf.prototype = Object.create(ReflectionObject.prototype)).constructor = OneOf).className = \"OneOf\";\n\nvar Field;\nvar util;\n\n/**\n * Constructs a new oneof instance.\n * @classdesc Reflected oneof.\n * @extends ReflectionObject\n * @constructor\n * @param {string} name Oneof name\n * @param {string[]|Object.<string,*>} [fieldNames] Field names\n * @param {Object.<string,*>} [options] Declared options\n * @param {string} [comment] Comment associated with this field\n */\nfunction OneOf(name, fieldNames, options, comment) {\n    if (!Array.isArray(fieldNames)) {\n        options = fieldNames;\n        fieldNames = undefined;\n    }\n    ReflectionObject.call(this, name, options);\n\n    /* istanbul ignore if */\n    if (!(fieldNames === undefined || Array.isArray(fieldNames)))\n        throw TypeError(\"fieldNames must be an Array\");\n\n    /**\n     * Field names that belong to this oneof.\n     * @type {string[]}\n     */\n    this.oneof = fieldNames || []; // toJSON, marker\n\n    /**\n     * Fields that belong to this oneof as an array for iteration.\n     * @type {Field[]}\n     * @readonly\n     */\n    this.fieldsArray = []; // declared readonly for conformance, possibly not yet added to parent\n\n    /**\n     * Comment for this field.\n     * @type {string|null}\n     */\n    this.comment = comment;\n}\n\n/**\n * Oneof descriptor.\n * @interface IOneOf\n * @property {Array.<string>} oneof Oneof field names\n * @property {Object.<string,*>} [options] Oneof options\n */\n\n/**\n * Constructs a oneof from a oneof descriptor.\n * @param {string} name Oneof name\n * @param {IOneOf} json Oneof descriptor\n * @returns {OneOf} Created oneof\n * @throws {TypeError} If arguments are invalid\n */\nOneOf.fromJSON = function fromJSON(name, json) {\n    return new OneOf(name, json.oneof, json.options, json.comment);\n};\n\n/**\n * Converts this oneof to a oneof descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IOneOf} Oneof descriptor\n */\nOneOf.prototype.toJSON = function toJSON(toJSONOptions) {\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"options\" , this.options,\n        \"oneof\"   , this.oneof,\n        \"comment\" , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * Adds the fields of the specified oneof to the parent if not already done so.\n * @param {OneOf} oneof The oneof\n * @returns {undefined}\n * @inner\n * @ignore\n */\nfunction addFieldsToParent(oneof) {\n    if (oneof.parent)\n        for (var i = 0; i < oneof.fieldsArray.length; ++i)\n            if (!oneof.fieldsArray[i].parent)\n                oneof.parent.add(oneof.fieldsArray[i]);\n}\n\n/**\n * Adds a field to this oneof and removes it from its current parent, if any.\n * @param {Field} field Field to add\n * @returns {OneOf} `this`\n */\nOneOf.prototype.add = function add(field) {\n\n    /* istanbul ignore if */\n    if (!(field instanceof Field))\n        throw TypeError(\"field must be a Field\");\n\n    if (field.parent && field.parent !== this.parent)\n        field.parent.remove(field);\n    this.oneof.push(field.name);\n    this.fieldsArray.push(field);\n    field.partOf = this; // field.parent remains null\n    addFieldsToParent(this);\n    return this;\n};\n\n/**\n * Removes a field from this oneof and puts it back to the oneof's parent.\n * @param {Field} field Field to remove\n * @returns {OneOf} `this`\n */\nOneOf.prototype.remove = function remove(field) {\n\n    /* istanbul ignore if */\n    if (!(field instanceof Field))\n        throw TypeError(\"field must be a Field\");\n\n    var index = this.fieldsArray.indexOf(field);\n\n    /* istanbul ignore if */\n    if (index < 0)\n        throw Error(field + \" is not a member of \" + this);\n\n    this.fieldsArray.splice(index, 1);\n    index = this.oneof.indexOf(field.name);\n\n    /* istanbul ignore else */\n    if (index > -1) // theoretical\n        this.oneof.splice(index, 1);\n\n    field.partOf = null;\n    return this;\n};\n\n/**\n * @override\n */\nOneOf.prototype.onAdd = function onAdd(parent) {\n    ReflectionObject.prototype.onAdd.call(this, parent);\n    var self = this;\n    // Collect present fields\n    for (var i = 0; i < this.oneof.length; ++i) {\n        var field = parent.get(this.oneof[i]);\n        if (field && !field.partOf) {\n            field.partOf = self;\n            self.fieldsArray.push(field);\n        }\n    }\n    // Add not yet present fields\n    addFieldsToParent(this);\n};\n\n/**\n * @override\n */\nOneOf.prototype.onRemove = function onRemove(parent) {\n    for (var i = 0, field; i < this.fieldsArray.length; ++i)\n        if ((field = this.fieldsArray[i]).parent)\n            field.parent.remove(field);\n    ReflectionObject.prototype.onRemove.call(this, parent);\n};\n\n/**\n * Decorator function as returned by {@link OneOf.d} (TypeScript).\n * @typedef OneOfDecorator\n * @type {function}\n * @param {Object} prototype Target prototype\n * @param {string} oneofName OneOf name\n * @returns {undefined}\n */\n\n/**\n * OneOf decorator (TypeScript).\n * @function\n * @param {...string} fieldNames Field names\n * @returns {OneOfDecorator} Decorator function\n * @template T extends string\n */\nOneOf.d = function decorateOneOf() {\n    var fieldNames = new Array(arguments.length),\n        index = 0;\n    while (index < arguments.length)\n        fieldNames[index] = arguments[index++];\n    return function oneOfDecorator(prototype, oneofName) {\n        util.decorateType(prototype.constructor)\n            .add(new OneOf(oneofName, fieldNames));\n        Object.defineProperty(prototype, oneofName, {\n            get: util.oneOfGetter(fieldNames),\n            set: util.oneOfSetter(fieldNames)\n        });\n    };\n};\n\nOneOf._configure = function (){\n    Field = require('./field');\n    util = require('./util');\n};"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/parse.js",
    "content": "\"use strict\";\nmodule.exports = parse;\n\nparse.filename = null;\nparse.defaults = { keepCase: false };\n\nvar tokenize,\n    Root,\n    Type,\n    Field,\n    MapField,\n    OneOf,\n    Enum,\n    Service,\n    Method,\n    types,\n    util;\n\nvar base10Re    = /^[1-9][0-9]*$/,\n    base10NegRe = /^-?[1-9][0-9]*$/,\n    base16Re    = /^0[x][0-9a-fA-F]+$/,\n    base16NegRe = /^-?0[x][0-9a-fA-F]+$/,\n    base8Re     = /^0[0-7]+$/,\n    base8NegRe  = /^-?0[0-7]+$/,\n    numberRe    = /^(?![eE])[0-9]*(?:\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/,\n    nameRe      = /^[a-zA-Z_][a-zA-Z_0-9]*$/,\n    typeRefRe   = /^(?:\\.?[a-zA-Z_][a-zA-Z_0-9]*)+$/,\n    fqTypeRefRe = /^(?:\\.[a-zA-Z][a-zA-Z_0-9]*)+$/;\n\n/**\n * Result object returned from {@link parse}.\n * @interface IParserResult\n * @property {string|undefined} package Package name, if declared\n * @property {string[]|undefined} imports Imports, if any\n * @property {string[]|undefined} weakImports Weak imports, if any\n * @property {string|undefined} syntax Syntax, if specified (either `\"proto2\"` or `\"proto3\"`)\n * @property {Root} root Populated root instance\n */\n\n/**\n * Options modifying the behavior of {@link parse}.\n * @interface IParseOptions\n * @property {boolean} [keepCase=false] Keeps field casing instead of converting to camel case\n * @property {boolean} [alternateCommentMode=false] Recognize double-slash comments in addition to doc-block comments.\n */\n\n/**\n * Options modifying the behavior of JSON serialization.\n * @interface IToJSONOptions\n * @property {boolean} [keepComments=false] Serializes comments.\n */\n\n/**\n * Parses the given .proto source and returns an object with the parsed contents.\n * @param {string} source Source contents\n * @param {Root} root Root to populate\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {IParserResult} Parser result\n * @property {string} filename=null Currently processing file name for error reporting, if known\n * @property {IParseOptions} defaults Default {@link IParseOptions}\n */\nfunction parse(source, root, options) {\n    /* eslint-disable callback-return */\n    if (!(root instanceof Root)) {\n        options = root;\n        root = new Root();\n    }\n    if (!options)\n        options = parse.defaults;\n\n    var tn = tokenize(source, options.alternateCommentMode || false),\n        next = tn.next,\n        push = tn.push,\n        peek = tn.peek,\n        skip = tn.skip,\n        cmnt = tn.cmnt;\n\n    var head = true,\n        pkg,\n        imports,\n        weakImports,\n        syntax,\n        isProto3 = false;\n\n    var ptr = root;\n\n    var applyCase = options.keepCase ? function(name) { return name; } : util.camelCase;\n\n    /* istanbul ignore next */\n    function illegal(token, name, insideTryCatch) {\n        var filename = parse.filename;\n        if (!insideTryCatch)\n            parse.filename = null;\n        return Error(\"illegal \" + (name || \"token\") + \" '\" + token + \"' (\" + (filename ? filename + \", \" : \"\") + \"line \" + tn.line + \")\");\n    }\n\n    function readString() {\n        var values = [],\n            token;\n        do {\n            /* istanbul ignore if */\n            if ((token = next()) !== \"\\\"\" && token !== \"'\")\n                throw illegal(token);\n\n            values.push(next());\n            skip(token);\n            token = peek();\n        } while (token === \"\\\"\" || token === \"'\");\n        return values.join(\"\");\n    }\n\n    function readValue(acceptTypeRef) {\n        var token = next();\n        switch (token) {\n            case \"'\":\n            case \"\\\"\":\n                push(token);\n                return readString();\n            case \"true\": case \"TRUE\":\n            return true;\n            case \"false\": case \"FALSE\":\n            return false;\n        }\n        try {\n            return parseNumber(token, /* insideTryCatch */ true);\n        } catch (e) {\n\n            /* istanbul ignore else */\n            if (acceptTypeRef && typeRefRe.test(token))\n                return token;\n\n            /* istanbul ignore next */\n            throw illegal(token, \"value\");\n        }\n    }\n\n    function readRanges(target, acceptStrings) {\n        var token, start;\n        do {\n            if (acceptStrings && ((token = peek()) === \"\\\"\" || token === \"'\"))\n                target.push(readString());\n            else\n                target.push([ start = parseId(next()), skip(\"to\", true) ? parseId(next()) : start ]);\n        } while (skip(\",\", true));\n        skip(\";\");\n    }\n\n    function parseNumber(token, insideTryCatch) {\n        var sign = 1;\n        if (token.charAt(0) === \"-\") {\n            sign = -1;\n            token = token.substring(1);\n        }\n        switch (token) {\n            case \"inf\": case \"INF\": case \"Inf\":\n            return sign * Infinity;\n            case \"nan\": case \"NAN\": case \"Nan\": case \"NaN\":\n            return NaN;\n            case \"0\":\n                return 0;\n        }\n        if (base10Re.test(token))\n            return sign * parseInt(token, 10);\n        if (base16Re.test(token))\n            return sign * parseInt(token, 16);\n        if (base8Re.test(token))\n            return sign * parseInt(token, 8);\n\n        /* istanbul ignore else */\n        if (numberRe.test(token))\n            return sign * parseFloat(token);\n\n        /* istanbul ignore next */\n        throw illegal(token, \"number\", insideTryCatch);\n    }\n\n    function parseId(token, acceptNegative) {\n        switch (token) {\n            case \"max\": case \"MAX\": case \"Max\":\n            return 536870911;\n            case \"0\":\n                return 0;\n        }\n\n        /* istanbul ignore if */\n        if (!acceptNegative && token.charAt(0) === \"-\")\n            throw illegal(token, \"id\");\n\n        if (base10NegRe.test(token))\n            return parseInt(token, 10);\n        if (base16NegRe.test(token))\n            return parseInt(token, 16);\n\n        /* istanbul ignore else */\n        if (base8NegRe.test(token))\n            return parseInt(token, 8);\n\n        /* istanbul ignore next */\n        throw illegal(token, \"id\");\n    }\n\n    function parsePackage() {\n\n        /* istanbul ignore if */\n        if (pkg !== undefined)\n            throw illegal(\"package\");\n\n        pkg = next();\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(pkg))\n            throw illegal(pkg, \"name\");\n\n        ptr = ptr.define(pkg);\n        skip(\";\");\n    }\n\n    function parseImport() {\n        var token = peek();\n        var whichImports;\n        switch (token) {\n            case \"weak\":\n                whichImports = weakImports || (weakImports = []);\n                next();\n                break;\n            case \"public\":\n                next();\n            // eslint-disable-line no-fallthrough\n            default:\n                whichImports = imports || (imports = []);\n                break;\n        }\n        token = readString();\n        skip(\";\");\n        whichImports.push(token);\n    }\n\n    function parseSyntax() {\n        skip(\"=\");\n        syntax = readString();\n        isProto3 = syntax === \"proto3\";\n\n        /* istanbul ignore if */\n        if (!isProto3 && syntax !== \"proto2\")\n            throw illegal(syntax, \"syntax\");\n\n        skip(\";\");\n    }\n\n    function parseCommon(parent, token) {\n        switch (token) {\n\n            case \"option\":\n                parseOption(parent, token);\n                skip(\";\");\n                return true;\n\n            case \"message\":\n                parseType(parent, token);\n                return true;\n\n            case \"enum\":\n                parseEnum(parent, token);\n                return true;\n\n            case \"service\":\n                parseService(parent, token);\n                return true;\n\n            case \"extend\":\n                parseExtension(parent, token);\n                return true;\n        }\n        return false;\n    }\n\n    function ifBlock(obj, fnIf, fnElse) {\n        var trailingLine = tn.line;\n        if (obj) {\n            obj.comment = cmnt(); // try block-type comment\n            obj.filename = parse.filename;\n        }\n        if (skip(\"{\", true)) {\n            var token;\n            while ((token = next()) !== \"}\")\n                fnIf(token);\n            skip(\";\", true);\n        } else {\n            if (fnElse)\n                fnElse();\n            skip(\";\");\n            if (obj && typeof obj.comment !== \"string\")\n                obj.comment = cmnt(trailingLine); // try line-type comment if no block\n        }\n    }\n\n    function parseType(parent, token) {\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token = next()))\n            throw illegal(token, \"type name\");\n\n        var type = new Type(token);\n        ifBlock(type, function parseType_block(token) {\n            if (parseCommon(type, token))\n                return;\n\n            switch (token) {\n\n                case \"map\":\n                    parseMapField(type, token);\n                    break;\n\n                case \"required\":\n                case \"optional\":\n                case \"repeated\":\n                    parseField(type, token);\n                    break;\n\n                case \"oneof\":\n                    parseOneOf(type, token);\n                    break;\n\n                case \"extensions\":\n                    readRanges(type.extensions || (type.extensions = []));\n                    break;\n\n                case \"reserved\":\n                    readRanges(type.reserved || (type.reserved = []), true);\n                    break;\n\n                default:\n                    /* istanbul ignore if */\n                    if (!isProto3 || !typeRefRe.test(token))\n                        throw illegal(token);\n\n                    push(token);\n                    parseField(type, \"optional\");\n                    break;\n            }\n        });\n        parent.add(type);\n    }\n\n    function parseField(parent, rule, extend) {\n        var type = next();\n        if (type === \"group\") {\n            parseGroup(parent, rule);\n            return;\n        }\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(type))\n            throw illegal(type, \"type\");\n\n        var name = next();\n\n        /* istanbul ignore if */\n        if (!nameRe.test(name))\n            throw illegal(name, \"name\");\n\n        name = applyCase(name);\n        skip(\"=\");\n\n        var field = new Field(name, parseId(next()), type, rule, extend);\n        ifBlock(field, function parseField_block(token) {\n\n            /* istanbul ignore else */\n            if (token === \"option\") {\n                parseOption(field, token);\n                skip(\";\");\n            } else\n                throw illegal(token);\n\n        }, function parseField_line() {\n            parseInlineOptions(field);\n        });\n        parent.add(field);\n\n        // JSON defaults to packed=true if not set so we have to set packed=false explicity when\n        // parsing proto2 descriptors without the option, where applicable. This must be done for\n        // all known packable types and anything that could be an enum (= is not a basic type).\n        if (!isProto3 && field.repeated && (types.packed[type] !== undefined || types.basic[type] === undefined))\n            field.setOption(\"packed\", false, /* ifNotSet */ true);\n    }\n\n    function parseGroup(parent, rule) {\n        var name = next();\n\n        /* istanbul ignore if */\n        if (!nameRe.test(name))\n            throw illegal(name, \"name\");\n\n        var fieldName = util.lcFirst(name);\n        if (name === fieldName)\n            name = util.ucFirst(name);\n        skip(\"=\");\n        var id = parseId(next());\n        var type = new Type(name);\n        type.group = true;\n        var field = new Field(fieldName, id, name, rule);\n        field.filename = parse.filename;\n        ifBlock(type, function parseGroup_block(token) {\n            switch (token) {\n\n                case \"option\":\n                    parseOption(type, token);\n                    skip(\";\");\n                    break;\n\n                case \"required\":\n                case \"optional\":\n                case \"repeated\":\n                    parseField(type, token);\n                    break;\n\n                /* istanbul ignore next */\n                default:\n                    throw illegal(token); // there are no groups with proto3 semantics\n            }\n        });\n        parent.add(type)\n            .add(field);\n    }\n\n    function parseMapField(parent) {\n        skip(\"<\");\n        var keyType = next();\n\n        /* istanbul ignore if */\n        if (types.mapKey[keyType] === undefined)\n            throw illegal(keyType, \"type\");\n\n        skip(\",\");\n        var valueType = next();\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(valueType))\n            throw illegal(valueType, \"type\");\n\n        skip(\">\");\n        var name = next();\n\n        /* istanbul ignore if */\n        if (!nameRe.test(name))\n            throw illegal(name, \"name\");\n\n        skip(\"=\");\n        var field = new MapField(applyCase(name), parseId(next()), keyType, valueType);\n        ifBlock(field, function parseMapField_block(token) {\n\n            /* istanbul ignore else */\n            if (token === \"option\") {\n                parseOption(field, token);\n                skip(\";\");\n            } else\n                throw illegal(token);\n\n        }, function parseMapField_line() {\n            parseInlineOptions(field);\n        });\n        parent.add(field);\n    }\n\n    function parseOneOf(parent, token) {\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token = next()))\n            throw illegal(token, \"name\");\n\n        var oneof = new OneOf(applyCase(token));\n        ifBlock(oneof, function parseOneOf_block(token) {\n            if (token === \"option\") {\n                parseOption(oneof, token);\n                skip(\";\");\n            } else {\n                push(token);\n                parseField(oneof, \"optional\");\n            }\n        });\n        parent.add(oneof);\n    }\n\n    function parseEnum(parent, token) {\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token = next()))\n            throw illegal(token, \"name\");\n\n        var enm = new Enum(token);\n        ifBlock(enm, function parseEnum_block(token) {\n            switch(token) {\n                case \"option\":\n                    parseOption(enm, token);\n                    skip(\";\");\n                    break;\n\n                case \"reserved\":\n                    readRanges(enm.reserved || (enm.reserved = []), true);\n                    break;\n\n                default:\n                    parseEnumValue(enm, token);\n            }\n        });\n        parent.add(enm);\n    }\n\n    function parseEnumValue(parent, token) {\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token))\n            throw illegal(token, \"name\");\n\n        skip(\"=\");\n        var value = parseId(next(), true),\n            dummy = {};\n        ifBlock(dummy, function parseEnumValue_block(token) {\n\n            /* istanbul ignore else */\n            if (token === \"option\") {\n                parseOption(dummy, token); // skip\n                skip(\";\");\n            } else\n                throw illegal(token);\n\n        }, function parseEnumValue_line() {\n            parseInlineOptions(dummy); // skip\n        });\n        parent.add(token, value, dummy.comment);\n    }\n\n    function parseOption(parent, token) {\n        var isCustom = skip(\"(\", true);\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(token = next()))\n            throw illegal(token, \"name\");\n\n        var name = token;\n        if (isCustom) {\n            skip(\")\");\n            name = \"(\" + name + \")\";\n            token = peek();\n            if (fqTypeRefRe.test(token)) {\n                name += token;\n                next();\n            }\n        }\n        skip(\"=\");\n        parseOptionValue(parent, name);\n    }\n\n    function parseOptionValue(parent, name) {\n        if (skip(\"{\", true)) { // { a: \"foo\" b { c: \"bar\" } }\n            do {\n                /* istanbul ignore if */\n                if (!nameRe.test(token = next()))\n                    throw illegal(token, \"name\");\n\n                if (peek() === \"{\")\n                    parseOptionValue(parent, name + \".\" + token);\n                else {\n                    skip(\":\");\n                    if (peek() === \"{\")\n                        parseOptionValue(parent, name + \".\" + token);\n                    else\n                        setOption(parent, name + \".\" + token, readValue(true));\n                }\n            } while (!skip(\"}\", true));\n        } else\n            setOption(parent, name, readValue(true));\n        // Does not enforce a delimiter to be universal\n    }\n\n    function setOption(parent, name, value) {\n        if (parent.setOption)\n            parent.setOption(name, value);\n    }\n\n    function parseInlineOptions(parent) {\n        if (skip(\"[\", true)) {\n            do {\n                parseOption(parent, \"option\");\n            } while (skip(\",\", true));\n            skip(\"]\");\n        }\n        return parent;\n    }\n\n    function parseService(parent, token) {\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token = next()))\n            throw illegal(token, \"service name\");\n\n        var service = new Service(token);\n        ifBlock(service, function parseService_block(token) {\n            if (parseCommon(service, token))\n                return;\n\n            /* istanbul ignore else */\n            if (token === \"rpc\")\n                parseMethod(service, token);\n            else\n                throw illegal(token);\n        });\n        parent.add(service);\n    }\n\n    function parseMethod(parent, token) {\n        var type = token;\n\n        /* istanbul ignore if */\n        if (!nameRe.test(token = next()))\n            throw illegal(token, \"name\");\n\n        var name = token,\n            requestType, requestStream,\n            responseType, responseStream;\n\n        skip(\"(\");\n        if (skip(\"stream\", true))\n            requestStream = true;\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(token = next()))\n            throw illegal(token);\n\n        requestType = token;\n        skip(\")\"); skip(\"returns\"); skip(\"(\");\n        if (skip(\"stream\", true))\n            responseStream = true;\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(token = next()))\n            throw illegal(token);\n\n        responseType = token;\n        skip(\")\");\n\n        var method = new Method(name, type, requestType, responseType, requestStream, responseStream);\n        ifBlock(method, function parseMethod_block(token) {\n\n            /* istanbul ignore else */\n            if (token === \"option\") {\n                parseOption(method, token);\n                skip(\";\");\n            } else\n                throw illegal(token);\n\n        });\n        parent.add(method);\n    }\n\n    function parseExtension(parent, token) {\n\n        /* istanbul ignore if */\n        if (!typeRefRe.test(token = next()))\n            throw illegal(token, \"reference\");\n\n        var reference = token;\n        ifBlock(null, function parseExtension_block(token) {\n            switch (token) {\n\n                case \"required\":\n                case \"repeated\":\n                case \"optional\":\n                    parseField(parent, token, reference);\n                    break;\n\n                default:\n                    /* istanbul ignore if */\n                    if (!isProto3 || !typeRefRe.test(token))\n                        throw illegal(token);\n                    push(token);\n                    parseField(parent, \"optional\", reference);\n                    break;\n            }\n        });\n    }\n\n    var token;\n    while ((token = next()) !== null) {\n        switch (token) {\n\n            case \"package\":\n\n                /* istanbul ignore if */\n                if (!head)\n                    throw illegal(token);\n\n                parsePackage();\n                break;\n\n            case \"import\":\n\n                /* istanbul ignore if */\n                if (!head)\n                    throw illegal(token);\n\n                parseImport();\n                break;\n\n            case \"syntax\":\n\n                /* istanbul ignore if */\n                if (!head)\n                    throw illegal(token);\n\n                parseSyntax();\n                break;\n\n            case \"option\":\n\n                /* istanbul ignore if */\n                if (!head)\n                    throw illegal(token);\n\n                parseOption(ptr, token);\n                skip(\";\");\n                break;\n\n            default:\n\n                /* istanbul ignore else */\n                if (parseCommon(ptr, token)) {\n                    head = false;\n                    continue;\n                }\n\n                /* istanbul ignore next */\n                throw illegal(token);\n        }\n    }\n\n    parse.filename = null;\n    return {\n        \"package\"     : pkg,\n        \"imports\"     : imports,\n        weakImports  : weakImports,\n        syntax       : syntax,\n        root         : root\n    };\n}\n\n/**\n * Parses the given .proto source and returns an object with the parsed contents.\n * @name parse\n * @function\n * @param {string} source Source contents\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {IParserResult} Parser result\n * @property {string} filename=null Currently processing file name for error reporting, if known\n * @property {IParseOptions} defaults Default {@link IParseOptions}\n * @variation 2\n */\nparse._configure = function (){\n    tokenize  = require(\"./tokenize\"),\n        Root      = require(\"./root\"),\n        Type      = require(\"./type\"),\n        Field     = require(\"./field\"),\n        MapField  = require(\"./mapField\"),\n        OneOf     = require(\"./oneof\"),\n        Enum      = require(\"./enum\"),\n        Service   = require(\"./service\"),\n        Method    = require(\"./method\"),\n        types     = require(\"./types\"),\n        util      = require(\"./util\");\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/path.js",
    "content": "var path = module.exports;\n\nvar isAbsolute =\n/**\n * Tests if the specified path is absolute.\n * @param {string} path Path to test\n * @returns {boolean} `true` if path is absolute\n */\n    path.isAbsolute = function isAbsolute(path) {\n        return /^(?:\\/|\\w+:)/.test(path);\n    };\n\nvar normalize =\n/**\n * Normalizes the specified path.\n * @param {string} path Path to normalize\n * @returns {string} Normalized path\n */\n    path.normalize = function normalize(path) {\n        path = path.replace(/\\\\/g, \"/\")\n            .replace(/\\/{2,}/g, \"/\");\n        var parts    = path.split(\"/\"),\n            absolute = isAbsolute(path),\n            prefix   = \"\";\n        if (absolute)\n            prefix = parts.shift() + \"/\";\n        for (var i = 0; i < parts.length;) {\n            if (parts[i] === \"..\") {\n                if (i > 0 && parts[i - 1] !== \"..\")\n                    parts.splice(--i, 2);\n                else if (absolute)\n                    parts.splice(i, 1);\n                else\n                    ++i;\n            } else if (parts[i] === \".\")\n                parts.splice(i, 1);\n            else\n                ++i;\n        }\n        return prefix + parts.join(\"/\");\n    };\n\n/**\n * Resolves the specified include path against the specified origin path.\n * @param {string} originPath Path to the origin file\n * @param {string} includePath Include path relative to origin path\n * @param {boolean} [alreadyNormalized=false] `true` if both paths are already known to be normalized\n * @returns {string} Path to the include file\n */\npath.resolve = function resolve(originPath, includePath, alreadyNormalized) {\n    if (!alreadyNormalized)\n        includePath = normalize(includePath);\n    if (isAbsolute(includePath))\n        return includePath;\n    if (!alreadyNormalized)\n        originPath = normalize(originPath);\n    return (originPath = originPath.replace(/(?:\\/|^)[^/]+$/, \"\")).length ? normalize(originPath + \"/\" + includePath) : includePath;\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/pool.js",
    "content": "module.exports = pool;\n\n/**\n * An allocator as used by {@link util.pool}.\n * @typedef PoolAllocator\n * @type {function}\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\n\n/**\n * A slicer as used by {@link util.pool}.\n * @typedef PoolSlicer\n * @type {function}\n * @param {number} start Start offset\n * @param {number} end End offset\n * @returns {Uint8Array} Buffer slice\n * @this {Uint8Array}\n */\n\n/**\n * A general purpose buffer pool.\n * @memberof util\n * @function\n * @param {PoolAllocator} alloc Allocator\n * @param {PoolSlicer} slice Slicer\n * @param {number} [size=8192] Slab size\n * @returns {PoolAllocator} Pooled allocator\n */\nfunction pool(alloc, slice, size) {\n    var SIZE   = size || 8192;\n    var MAX    = SIZE >>> 1;\n    var slab   = null;\n    var offset = SIZE;\n    return function pool_alloc(size) {\n        if (size < 1 || size > MAX)\n            return alloc(size);\n        if (offset + size > SIZE) {\n            slab = alloc(SIZE);\n            offset = 0;\n        }\n        var buf = slice.call(slab, offset, offset += size);\n        if (offset & 7) // align to 32 bit\n            offset = (offset | 7) + 1;\n        return buf;\n    };\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/reader.js",
    "content": "/**\n * Created by zhangmiao on 2018/3/13.\n */\n\nmodule.exports = Reader;\n\nvar  util = require('./util');\n\nvar LongBits;\nvar utf8;\n\nvar  BufferReader;\n\nfunction indexOutOfRange(reader, writeLength) {\n    return RangeError(\"index out of range: \" + reader.pos + \" + \" + (writeLength || 1) + \" > \" + reader.len);\n}\n\n\nfunction Reader(buffer) {\n\n    /**\n     * Read buffer.\n     * @type {Uint8Array}\n     */\n    this.buf = buffer;\n\n    /**\n     * Read buffer position.\n     * @type {number}\n     */\n    this.pos = 0;\n\n    /**\n     * Read buffer length.\n     * @type {number}\n     */\n    this.len = buffer.length;\n}\n\nvar create_array = typeof Uint8Array !== \"undefined\"\n    ? function create_typed_array(buffer) {\n    if (buffer instanceof Uint8Array || Array.isArray(buffer))\n        return new Reader(buffer);\n    if (typeof ArrayBuffer !== \"undefined\" && buffer instanceof ArrayBuffer) //增加ArrayBuffer构建\n        return new Reader(new Uint8Array(buffer));\n    throw Error(\"illegal buffer\");\n}\n    /* istanbul ignore next */\n    : function create_array(buffer) {\n    if (Array.isArray(buffer))\n        return new Reader(buffer);\n    throw Error(\"illegal buffer\");\n};\n\nReader.create = util.Buffer\n    ? function create_buffer_setup(buffer) {\n    return (Reader.create = function create_buffer(buffer) {\n        return util.Buffer.isBuffer(buffer)\n            ? new BufferReader(buffer)\n            /* istanbul ignore next */\n            : create_array(buffer);\n    })(buffer);\n}\n    /* istanbul ignore next */\n    : create_array;\n\nReader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice;\n\n\nReader.prototype.uint32 = (function read_uint32_setup() {\n    var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!)\n    return function read_uint32() {\n        value = (         this.buf[this.pos] & 127       ) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] & 127) <<  7) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value;\n        value = (value | (this.buf[this.pos] &  15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value;\n\n        /* istanbul ignore if */\n        if ((this.pos += 5) > this.len) {\n            this.pos = this.len;\n            throw indexOutOfRange(this, 10);\n        }\n        return value;\n    };\n})();\n\nReader.prototype.int32 = function read_int32() {\n    return this.uint32() | 0;\n};\n\nReader.prototype.sint32 = function read_sint32() {\n    var value = this.uint32();\n    return value >>> 1 ^ -(value & 1) | 0;\n};\n\nfunction readLongVarint() {\n    // tends to deopt with local vars for octet etc.\n    var bits = new LongBits(0, 0);\n    var i = 0;\n    if (this.len - this.pos > 4) { // fast route (lo)\n        for (; i < 4; ++i) {\n            // 1st..4th\n            bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n        // 5th\n        bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;\n        bits.hi = (bits.hi | (this.buf[this.pos] & 127) >>  4) >>> 0;\n        if (this.buf[this.pos++] < 128)\n            return bits;\n        i = 0;\n    } else {\n        for (; i < 3; ++i) {\n            /* istanbul ignore if */\n            if (this.pos >= this.len)\n                throw indexOutOfRange(this);\n            // 1st..3th\n            bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n        // 4th\n        bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0;\n        return bits;\n    }\n    if (this.len - this.pos > 4) { // fast route (hi)\n        for (; i < 5; ++i) {\n            // 6th..10th\n            bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n    } else {\n        for (; i < 5; ++i) {\n            /* istanbul ignore if */\n            if (this.pos >= this.len)\n                throw indexOutOfRange(this);\n            // 6th..10th\n            bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n            if (this.buf[this.pos++] < 128)\n                return bits;\n        }\n    }\n    /* istanbul ignore next */\n    throw Error(\"invalid varint encoding\");\n}\n\nReader.prototype.bool = function read_bool() {\n    return this.uint32() !== 0;\n};\n\n\nfunction readFixed32_end(buf, end) { // note that this uses `end`, not `pos`\n    return (buf[end - 4]\n        | buf[end - 3] << 8\n        | buf[end - 2] << 16\n        | buf[end - 1] << 24) >>> 0;\n}\n\nReader.prototype.fixed32 = function read_fixed32() {\n\n    /* istanbul ignore if */\n    if (this.pos + 4 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    return readFixed32_end(this.buf, this.pos += 4);\n};\n\nReader.prototype.sfixed32 = function read_sfixed32() {\n\n    /* istanbul ignore if */\n    if (this.pos + 4 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    return readFixed32_end(this.buf, this.pos += 4) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readFixed64(/* this: Reader */) {\n\n    /* istanbul ignore if */\n    if (this.pos + 8 > this.len)\n        throw indexOutOfRange(this, 8);\n\n    return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));\n}\n\n\nReader.prototype.float = function read_float() {\n\n    /* istanbul ignore if */\n    if (this.pos + 4 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    var value = util.float.readFloatLE(this.buf, this.pos);\n    this.pos += 4;\n    return value;\n};\n\nReader.prototype.double = function read_double() {\n\n    /* istanbul ignore if */\n    if (this.pos + 8 > this.len)\n        throw indexOutOfRange(this, 4);\n\n    var value = util.float.readDoubleLE(this.buf, this.pos);\n    this.pos += 8;\n    return value;\n};\n\nReader.prototype.bytes = function read_bytes() {\n    var length = this.uint32(),\n        start  = this.pos,\n        end    = this.pos + length;\n\n    /* istanbul ignore if */\n    if (end > this.len)\n        throw indexOutOfRange(this, length);\n    this.pos += length;\n    if (Array.isArray(this.buf)) // plain array\n        return this.buf.slice(start, end);\n    return start === end // fix for IE 10/Win8 and others' subarray returning array of size 1\n        ? new this.buf.constructor(0)\n        : this._slice.call(this.buf, start, end);\n};\n\nReader.prototype.string = function read_string() {\n    var bytes = this.bytes();\n    return utf8.read(bytes, 0, bytes.length);\n};\n\nReader.prototype.skip = function skip(length) {\n    if (typeof length === \"number\") {\n        /* istanbul ignore if */\n        if (this.pos + length > this.len)\n            throw indexOutOfRange(this, length);\n        this.pos += length;\n    } else {\n        do {\n            /* istanbul ignore if */\n            if (this.pos >= this.len)\n                throw indexOutOfRange(this);\n        } while (this.buf[this.pos++] & 128);\n    }\n    return this;\n};\n\nReader.prototype.skipType = function(wireType) {\n    switch (wireType) {\n        case 0:\n            this.skip();\n            break;\n        case 1:\n            this.skip(8);\n            break;\n        case 2:\n            this.skip(this.uint32());\n            break;\n        case 3:\n            do { // eslint-disable-line no-constant-condition\n                if ((wireType = this.uint32() & 7) === 4)\n                    break;\n                this.skipType(wireType);\n            } while (true);\n            break;\n        case 5:\n            this.skip(4);\n            break;\n\n        /* istanbul ignore next */\n        default:\n            throw Error(\"invalid wire type \" + wireType + \" at offset \" + this.pos);\n    }\n    return this;\n};\n\n\n\n//这部分可能用不到\nReader._configure = function() {\n\n    //util       = require('./util');\n    LongBits = require(\"./longBits\");\n    utf8     = require(\"./utf8\");\n\n    var fn = util.Long ? \"toLong\" : /* istanbul ignore next */ \"toNumber\";\n    util.merge(Reader.prototype, {\n\n        int64: function read_int64() {\n            return readLongVarint.call(this)[fn](false);\n        },\n\n        uint64: function read_uint64() {\n            return readLongVarint.call(this)[fn](true);\n        },\n\n        sint64: function read_sint64() {\n            return readLongVarint.call(this).zzDecode()[fn](false);\n        },\n\n        fixed64: function read_fixed64() {\n            return readFixed64.call(this)[fn](true);\n        },\n\n        sfixed64: function read_sfixed64() {\n            return readFixed64.call(this)[fn](false);\n        }\n\n    });\n};\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/root.js",
    "content": "module.exports = Root;\n\n// extends Namespace\nvar Namespace = require(\"./namespace\");\n((Root.prototype = Object.create(Namespace.prototype)).constructor = Root).className = \"Root\";\n\nvar Field   = require(\"./field\"),\n    Enum    = require(\"./enum\"),\n    OneOf   = require(\"./oneof\"),\n    util    = require(\"./util\");\n\nvar Type,   // cyclic\n    parse,  // might be excluded\n    common; // \"\n\n/**\n * Constructs a new root namespace instance.\n * @classdesc Root namespace wrapping all types, enums, services, sub-namespaces etc. that belong together.\n * @extends NamespaceBase\n * @constructor\n * @param {Object.<string,*>} [options] Top level options\n */\nfunction Root(options) {\n    Namespace.call(this, \"\", options);\n\n    /**\n     * Deferred extension fields.\n     * @type {Field[]}\n     */\n    this.deferred = [];\n\n    /**\n     * Resolved file names of loaded files.\n     * @type {string[]}\n     */\n    this.files = [];\n\n    /**\n     * Resolved name of parsered pbString.\n     * @type {string[]}\n     */\n    this.names = [];\n}\n\n/**\n * Loads a namespace descriptor into a root namespace.\n * @param {INamespace} json Nameespace descriptor\n * @param {Root} [root] Root namespace, defaults to create a new one if omitted\n * @returns {Root} Root namespace\n */\nRoot.fromJSON = function fromJSON(json, root) {\n    json = typeof json === 'string' ? JSON.parse(json) : json;\n    if (!root)\n        root = new Root();\n    if (json.options)\n        root.setOptions(json.options);\n    return root.addJSON(json.nested);\n};\n\n/**\n * Resolves the path of an imported file, relative to the importing origin.\n * This method exists so you can override it with your own logic in case your imports are scattered over multiple directories.\n * @function\n * @param {string} origin The file name of the importing file\n * @param {string} target The file name being imported\n * @returns {string|null} Resolved path to `target` or `null` to skip the file\n */\nRoot.prototype.resolvePath = util.path.resolve;\n\n// A symbol-like function to safely signal synchronous loading\n/* istanbul ignore next */\nfunction SYNC() {} // eslint-disable-line no-empty-function\n\nfunction parseFromPbString(pbString, options, callback){\n\n    if (typeof options === \"function\") {\n        callback = options;\n        options = undefined;\n    }\n    var self = this;\n    if (!callback){\n        return util.asPromise(parseFromPbString, self, pbString, options);\n    }\n\n    var pbObj = null;\n    if(typeof pbString === 'string'){\n        pbObj = JSON.parse(pbString);\n    }else if(typeof pbString === 'object'){\n        pbObj = pbString;\n    }else {\n        //throw Error(\"pb格式转化失败\");\n        console.log(\"pb格式转化失败\");\n        return undefined;\n    }\n\n    var name      = pbObj['name'];\n    var pbJsonStr = pbObj['pbJsonStr'];\n\n    function finish(err, root){\n        if(!callback)\n            return;\n        var cb = callback;\n        callback = null;\n        cb(err, root);\n    }\n\n    function process(name, source){\n        try {\n            if (util.isString(source) && source.charAt(0) === \"{\")\n                source = JSON.parse(source);\n            if (!util.isString(source))\n                self.setOptions(source.options).addJSON(source.nested);\n            else {\n                parse.filename = name;\n                var parsed = parse(source, self, options),\n                    resolved;\n                var i = 0;\n                if(parsed.imports){\n                    for (; i < parsed.imports.length; ++i){\n                        resolved = parsed.imports[i];\n                        fetch(resolved);\n                    }\n                }\n                if (parsed.weakImports){\n                    for (i = 0; i < parsed.weakImports.length; ++i)\n                         resolved = parsed.weakImports[i];\n                            fetch(resolved, true);\n                }\n            }\n        } catch (err) {\n            finish(err);\n        }\n\n        finish(null, self); // only once anyway\n    }\n\n    function  fetch(name){\n        if(self.names.indexOf(name)>-1)\n            return;\n        self.names.push(name);\n        if (name in common){\n            process(name, common[name]);\n        }\n    }\n\n    process(name, pbJsonStr);\n    return undefined;\n}\n\nRoot.prototype.parseFromPbString = parseFromPbString;\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {IParseOptions} options Parse options\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n */\nRoot.prototype.load = function load(filename, options, callback) {\n    if (typeof options === \"function\") {\n        callback = options;\n        options = undefined;\n    }\n    var self = this;\n    if (!callback)\n        return util.asPromise(load, self, filename, options);\n\n    var sync = callback === SYNC; // undocumented\n\n    // Finishes loading by calling the callback (exactly once)\n    function finish(err, root) {\n        /* istanbul ignore if */\n        if (!callback)\n            return;\n        var cb = callback;\n        callback = null;\n        if (sync)\n            throw err;\n        cb(err, root);\n    }\n\n    // Processes a single file\n    function process(filename, source) {\n        try {\n            if (util.isString(source) && source.charAt(0) === \"{\")\n                source = JSON.parse(source);\n            if (!util.isString(source))\n                self.setOptions(source.options).addJSON(source.nested);\n            else {\n                parse.filename = filename;\n                var parsed = parse(source, self, options),\n                    resolved,\n                    i = 0;\n                if (parsed.imports)\n                    for (; i < parsed.imports.length; ++i)\n                        if (resolved = self.resolvePath(filename, parsed.imports[i]))\n                            fetch(resolved);\n                if (parsed.weakImports)\n                    for (i = 0; i < parsed.weakImports.length; ++i)\n                        if (resolved = self.resolvePath(filename, parsed.weakImports[i]))\n                            fetch(resolved, true);\n            }\n        } catch (err) {\n            finish(err);\n        }\n        if (!sync && !queued)\n            finish(null, self); // only once anyway\n    }\n\n    // Fetches a single file\n    function fetch(filename, weak) {\n\n        // Strip path if this file references a bundled definition\n        var idx = filename.lastIndexOf(\"google/protobuf/\");\n        if (idx > -1) {\n            var altname = filename.substring(idx);\n            if (altname in common)\n                filename = altname;\n        }\n\n        // Skip if already loaded / attempted\n        if (self.files.indexOf(filename) > -1)\n            return;\n        self.files.push(filename);\n\n        // Shortcut bundled definitions\n        if (filename in common) {\n            if (sync)\n                process(filename, common[filename]);\n            else {\n                ++queued;\n                setTimeout(function() {\n                    --queued;\n                    process(filename, common[filename]);\n                });\n            }\n            return;\n        }\n\n        // Otherwise fetch from disk or network\n        if (sync) {\n            var source;\n            try {\n                source = util.fs.readFileSync(filename).toString(\"utf8\");\n            } catch (err) {\n                if (!weak)\n                    finish(err);\n                return;\n            }\n            process(filename, source);\n        } else {\n            ++queued;\n            util.fetch(filename, function(err, source) {\n                --queued;\n                /* istanbul ignore if */\n                if (!callback)\n                    return; // terminated meanwhile\n                if (err) {\n                    /* istanbul ignore else */\n                    if (!weak)\n                        finish(err);\n                    else if (!queued) // can't be covered reliably\n                        finish(null, self);\n                    return;\n                }\n                process(filename, source);\n            });\n        }\n    }\n    var queued = 0;\n\n    // Assembling the root namespace doesn't require working type\n    // references anymore, so we can load everything in parallel\n    if (util.isString(filename))\n        filename = [ filename ];\n    for (var i = 0, resolved; i < filename.length; ++i)\n        if (resolved = self.resolvePath(\"\", filename[i]))\n            fetch(resolved);\n\n    if (sync)\n        return self;\n    if (!queued)\n        finish(null, self);\n    return undefined;\n};\n// function load(filename:string, options:IParseOptions, callback:LoadCallback):undefined\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.\n * @function Root#load\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {LoadCallback} callback Callback function\n * @returns {undefined}\n * @variation 2\n */\n// function load(filename:string, callback:LoadCallback):undefined\n\n/**\n * Loads one or multiple .proto or preprocessed .json files into this root namespace and returns a promise.\n * @function Root#load\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {Promise<Root>} Promise\n * @variation 3\n */\n// function load(filename:string, [options:IParseOptions]):Promise<Root>\n\n/**\n * Synchronously loads one or multiple .proto or preprocessed .json files into this root namespace (node only).\n * @function Root#loadSync\n * @param {string|string[]} filename Names of one or multiple files to load\n * @param {IParseOptions} [options] Parse options. Defaults to {@link parse.defaults} when omitted.\n * @returns {Root} Root namespace\n * @throws {Error} If synchronous fetching is not supported (i.e. in browsers) or if a file's syntax is invalid\n */\nRoot.prototype.loadSync = function loadSync(filename, options) {\n    if (!util.isNode)\n        throw Error(\"not supported\");\n    return this.load(filename, options, SYNC);\n};\n\n/**\n * @override\n */\nRoot.prototype.resolveAll = function resolveAll() {\n    if (this.deferred.length)\n        throw Error(\"unresolvable extensions: \" + this.deferred.map(function(field) {\n                return \"'extend \" + field.extend + \"' in \" + field.parent.fullName;\n            }).join(\", \"));\n    return Namespace.prototype.resolveAll.call(this);\n};\n\n// only uppercased (and thus conflict-free) children are exposed, see below\nvar exposeRe = /^[A-Z]/;\n\n/**\n * Handles a deferred declaring extension field by creating a sister field to represent it within its extended type.\n * @param {Root} root Root instance\n * @param {Field} field Declaring extension field witin the declaring type\n * @returns {boolean} `true` if successfully added to the extended type, `false` otherwise\n * @inner\n * @ignore\n */\nfunction tryHandleExtension(root, field) {\n    var extendedType = field.parent.lookup(field.extend);\n    if (extendedType) {\n        var sisterField = new Field(field.fullName, field.id, field.type, field.rule, undefined, field.options);\n        sisterField.declaringField = field;\n        field.extensionField = sisterField;\n        extendedType.add(sisterField);\n        return true;\n    }\n    return false;\n}\n\n/**\n * Called when any object is added to this root or its sub-namespaces.\n * @param {ReflectionObject} object Object added\n * @returns {undefined}\n * @private\n */\nRoot.prototype._handleAdd = function _handleAdd(object) {\n    if (object instanceof Field) {\n\n        if (/* an extension field (implies not part of a oneof) */ object.extend !== undefined && /* not already handled */ !object.extensionField)\n            if (!tryHandleExtension(this, object))\n                this.deferred.push(object);\n\n    } else if (object instanceof Enum) {\n\n        if (exposeRe.test(object.name))\n            object.parent[object.name] = object.values; // expose enum values as property of its parent\n\n    } else if (!(object instanceof OneOf)) /* everything else is a namespace */ {\n\n        if (object instanceof Type) // Try to handle any deferred extensions\n            for (var i = 0; i < this.deferred.length;)\n                if (tryHandleExtension(this, this.deferred[i]))\n                    this.deferred.splice(i, 1);\n                else\n                    ++i;\n        for (var j = 0; j < /* initializes */ object.nestedArray.length; ++j) // recurse into the namespace\n            this._handleAdd(object._nestedArray[j]);\n        if (exposeRe.test(object.name))\n            object.parent[object.name] = object; // expose namespace as property of its parent\n    }\n\n    // The above also adds uppercased (and thus conflict-free) nested types, services and enums as\n    // properties of namespaces just like static code does. This allows using a .d.ts generated for\n    // a static module with reflection-based solutions where the condition is met.\n};\n\n/**\n * Called when any object is removed from this root or its sub-namespaces.\n * @param {ReflectionObject} object Object removed\n * @returns {undefined}\n * @private\n */\nRoot.prototype._handleRemove = function _handleRemove(object) {\n    if (object instanceof Field) {\n\n        if (/* an extension field */ object.extend !== undefined) {\n            if (/* already handled */ object.extensionField) { // remove its sister field\n                object.extensionField.parent.remove(object.extensionField);\n                object.extensionField = null;\n            } else { // cancel the extension\n                var index = this.deferred.indexOf(object);\n                /* istanbul ignore else */\n                if (index > -1)\n                    this.deferred.splice(index, 1);\n            }\n        }\n\n    } else if (object instanceof Enum) {\n\n        if (exposeRe.test(object.name))\n            delete object.parent[object.name]; // unexpose enum values\n\n    } else if (object instanceof Namespace) {\n\n        for (var i = 0; i < /* initializes */ object.nestedArray.length; ++i) // recurse into the namespace\n            this._handleRemove(object._nestedArray[i]);\n\n        if (exposeRe.test(object.name))\n            delete object.parent[object.name]; // unexpose namespaces\n\n    }\n};\n\nRoot._configure = function() {\n    Type = require('./type');\n    parse = require('./parse');\n    common = require('./common');\n\n    Field   = require(\"./field\");\n    Enum    = require(\"./enum\");\n    OneOf   = require(\"./oneof\");\n    util    = require(\"./util\");\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/roots.js",
    "content": "/**\n * Created by zhangmiao on 2018/3/13.\n */\n\n\nmodule.exports = {};"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/rpc/service.js",
    "content": "\"use strict\";\nmodule.exports = Service;\nvar util = require(\"../util\");\n\n// Extends EventEmitter\n(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service;\n\n/**\n * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.\n *\n * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.\n * @typedef rpc.ServiceMethodCallback\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {TRes} [response] Response message\n * @returns {undefined}\n */\n\n/**\n * A service method part of a {@link rpc.Service} as created by {@link Service.create}.\n * @typedef rpc.ServiceMethod\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} [callback] Node-style callback called with the error, if any, and the response message\n * @returns {Promise<Message<TRes>>} Promise if `callback` has been omitted, otherwise `undefined`\n */\n\n/**\n * Constructs a new RPC service instance.\n * @classdesc An RPC service as returned by {@link Service#create}.\n * @exports rpc.Service\n * @extends util.EventEmitter\n * @constructor\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n */\nfunction Service(rpcImpl, requestDelimited, responseDelimited) {\n\n    if (typeof rpcImpl !== \"function\")\n        throw TypeError(\"rpcImpl must be a function\");\n\n    util.EventEmitter.call(this);\n\n    /**\n     * RPC implementation. Becomes `null` once the service is ended.\n     * @type {RPCImpl|null}\n     */\n    this.rpcImpl = rpcImpl;\n\n    /**\n     * Whether requests are length-delimited.\n     * @type {boolean}\n     */\n    this.requestDelimited = Boolean(requestDelimited);\n\n    /**\n     * Whether responses are length-delimited.\n     * @type {boolean}\n     */\n    this.responseDelimited = Boolean(responseDelimited);\n}\n\n/**\n * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.\n * @param {Method|rpc.ServiceMethod<TReq,TRes>} method Reflected or static method\n * @param {Constructor<TReq>} requestCtor Request constructor\n * @param {Constructor<TRes>} responseCtor Response constructor\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} callback Service callback\n * @returns {undefined}\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n */\nService.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {\n\n    if (!request)\n        throw TypeError(\"request must be specified\");\n\n    var self = this;\n    if (!callback)\n        return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request);\n\n    if (!self.rpcImpl) {\n        setTimeout(function() { callback(Error(\"already ended\")); }, 0);\n        return undefined;\n    }\n\n    try {\n        return self.rpcImpl(\n            method,\n            requestCtor[self.requestDelimited ? \"encodeDelimited\" : \"encode\"](request).finish(),\n            function rpcCallback(err, response) {\n\n                if (err) {\n                    self.emit(\"error\", err, method);\n                    return callback(err);\n                }\n\n                if (response === null) {\n                    self.end(/* endedByRPC */ true);\n                    return undefined;\n                }\n\n                if (!(response instanceof responseCtor)) {\n                    try {\n                        response = responseCtor[self.responseDelimited ? \"decodeDelimited\" : \"decode\"](response);\n                    } catch (err) {\n                        self.emit(\"error\", err, method);\n                        return callback(err);\n                    }\n                }\n\n                self.emit(\"data\", response, method);\n                return callback(null, response);\n            }\n        );\n    } catch (err) {\n        self.emit(\"error\", err, method);\n        setTimeout(function() { callback(err); }, 0);\n        return undefined;\n    }\n};\n\n/**\n * Ends this service and emits the `end` event.\n * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation.\n * @returns {rpc.Service} `this`\n */\nService.prototype.end = function end(endedByRPC) {\n    if (this.rpcImpl) {\n        if (!endedByRPC) // signal end to rpcImpl\n            this.rpcImpl(null, null, null);\n        this.rpcImpl = null;\n        this.emit(\"end\").off();\n    }\n    return this;\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/service.js",
    "content": "\"use strict\";\nmodule.exports = Service;\n\n// extends Namespace\nvar Namespace = require(\"./namespace\");\n((Service.prototype = Object.create(Namespace.prototype)).constructor = Service).className = \"Service\";\n\nvar Method,\n    util,\n    rpc;\n\n/**\n * Constructs a new service instance.\n * @classdesc Reflected service.\n * @extends NamespaceBase\n * @constructor\n * @param {string} name Service name\n * @param {Object.<string,*>} [options] Service options\n * @throws {TypeError} If arguments are invalid\n */\nfunction Service(name, options) {\n    Namespace.call(this, name, options);\n\n    /**\n     * Service methods.\n     * @type {Object.<string,Method>}\n     */\n    this.methods = {}; // toJSON, marker\n\n    /**\n     * Cached methods as an array.\n     * @type {Method[]|null}\n     * @private\n     */\n    this._methodsArray = null;\n}\n\n/**\n * Service descriptor.\n * @interface IService\n * @extends INamespace\n * @property {Object.<string,IMethod>} methods Method descriptors\n */\n\n/**\n * Constructs a service from a service descriptor.\n * @param {string} name Service name\n * @param {IService} json Service descriptor\n * @returns {Service} Created service\n * @throws {TypeError} If arguments are invalid\n */\nService.fromJSON = function fromJSON(name, json) {\n    var service = new Service(name, json.options);\n    /* istanbul ignore else */\n    if (json.methods)\n        for (var names = Object.keys(json.methods), i = 0; i < names.length; ++i)\n            service.add(Method.fromJSON(names[i], json.methods[names[i]]));\n    if (json.nested)\n        service.addJSON(json.nested);\n    service.comment = json.comment;\n    return service;\n};\n\n/**\n * Converts this service to a service descriptor.\n * @param {IToJSONOptions} [toJSONOptions] JSON conversion options\n * @returns {IService} Service descriptor\n */\nService.prototype.toJSON = function toJSON(toJSONOptions) {\n    var inherited = Namespace.prototype.toJSON.call(this, toJSONOptions);\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n    return util.toObject([\n        \"options\" , inherited && inherited.options || undefined,\n        \"methods\" , Namespace.arrayToJSON(this.methodsArray, toJSONOptions) || /* istanbul ignore next */ {},\n        \"nested\"  , inherited && inherited.nested || undefined,\n        \"comment\" , keepComments ? this.comment : undefined\n    ]);\n};\n\n/**\n * Methods of this service as an array for iteration.\n * @name Service#methodsArray\n * @type {Method[]}\n * @readonly\n */\nObject.defineProperty(Service.prototype, \"methodsArray\", {\n    get: function() {\n        return this._methodsArray || (this._methodsArray = util.toArray(this.methods));\n    }\n});\n\nfunction clearCache(service) {\n    service._methodsArray = null;\n    return service;\n}\n\n/**\n * @override\n */\nService.prototype.get = function get(name) {\n    return this.methods[name]\n        || Namespace.prototype.get.call(this, name);\n};\n\n/**\n * @override\n */\nService.prototype.resolveAll = function resolveAll() {\n    var methods = this.methodsArray;\n    for (var i = 0; i < methods.length; ++i)\n        methods[i].resolve();\n    return Namespace.prototype.resolve.call(this);\n};\n\n/**\n * @override\n */\nService.prototype.add = function add(object) {\n\n    /* istanbul ignore if */\n    if (this.get(object.name))\n        throw Error(\"duplicate name '\" + object.name + \"' in \" + this);\n\n    if (object instanceof Method) {\n        this.methods[object.name] = object;\n        object.parent = this;\n        return clearCache(this);\n    }\n    return Namespace.prototype.add.call(this, object);\n};\n\n/**\n * @override\n */\nService.prototype.remove = function remove(object) {\n    if (object instanceof Method) {\n\n        /* istanbul ignore if */\n        if (this.methods[object.name] !== object)\n            throw Error(object + \" is not a member of \" + this);\n\n        delete this.methods[object.name];\n        object.parent = null;\n        return clearCache(this);\n    }\n    return Namespace.prototype.remove.call(this, object);\n};\n\n/**\n * Creates a runtime service using the specified rpc implementation.\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n * @returns {rpc.Service} RPC service. Useful where requests and/or responses are streamed.\n */\nService.prototype.create = function create(rpcImpl, requestDelimited, responseDelimited) {\n    var rpcService = new rpc.Service(rpcImpl, requestDelimited, responseDelimited);\n    for (var i = 0, method; i < /* initializes */ this.methodsArray.length; ++i) {\n        var methodName = util.lcFirst((method = this._methodsArray[i]).resolve().name).replace(/[^$\\w_]/g, \"\");\n        rpcService[methodName] = util.codegen([\"r\",\"c\"], util.isReserved(methodName) ? methodName + \"_\" : methodName)(\"return this.rpcCall(m,q,s,r,c)\")({\n            m: method,\n            q: method.resolvedRequestType.ctor,\n            s: method.resolvedResponseType.ctor\n        });\n    }\n    return rpcService;\n};\n\nService._configure = function (){\n    Method = require(\"./method\");\n    util   = require(\"./util\");\n    rpc    = require(\"./rpc/service\");\n};"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/tokenize.js",
    "content": "module.exports = tokenize;\n\nvar delimRe        = /[\\s{}=;:[\\],'\"()<>]/g,\n    stringDoubleRe = /(?:\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\")/g,\n    stringSingleRe = /(?:'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)')/g;\n\nvar setCommentRe = /^ *[*/]+ */,\n    setCommentAltRe = /^\\s*\\*?\\/*/,\n    setCommentSplitRe = /\\n/g,\n    whitespaceRe = /\\s/,\n    unescapeRe = /\\\\(.?)/g;\n\nvar unescapeMap = {\n    \"0\": \"\\0\",\n    \"r\": \"\\r\",\n    \"n\": \"\\n\",\n    \"t\": \"\\t\"\n};\n\n/**\n * Unescapes a string.\n * @param {string} str String to unescape\n * @returns {string} Unescaped string\n * @property {Object.<string,string>} map Special characters map\n * @memberof tokenize\n */\nfunction unescape(str) {\n    return str.replace(unescapeRe, function($0, $1) {\n        switch ($1) {\n            case \"\\\\\":\n            case \"\":\n                return $1;\n            default:\n                return unescapeMap[$1] || \"\";\n        }\n    });\n}\n\ntokenize.unescape = unescape;\n\n/**\n * Gets the next token and advances.\n * @typedef TokenizerHandleNext\n * @type {function}\n * @returns {string|null} Next token or `null` on eof\n */\n\n/**\n * Peeks for the next token.\n * @typedef TokenizerHandlePeek\n * @type {function}\n * @returns {string|null} Next token or `null` on eof\n */\n\n/**\n * Pushes a token back to the stack.\n * @typedef TokenizerHandlePush\n * @type {function}\n * @param {string} token Token\n * @returns {undefined}\n */\n\n/**\n * Skips the next token.\n * @typedef TokenizerHandleSkip\n * @type {function}\n * @param {string} expected Expected token\n * @param {boolean} [optional=false] If optional\n * @returns {boolean} Whether the token matched\n * @throws {Error} If the token didn't match and is not optional\n */\n\n/**\n * Gets the comment on the previous line or, alternatively, the line comment on the specified line.\n * @typedef TokenizerHandleCmnt\n * @type {function}\n * @param {number} [line] Line number\n * @returns {string|null} Comment text or `null` if none\n */\n\n/**\n * Handle object returned from {@link tokenize}.\n * @interface ITokenizerHandle\n * @property {TokenizerHandleNext} next Gets the next token and advances (`null` on eof)\n * @property {TokenizerHandlePeek} peek Peeks for the next token (`null` on eof)\n * @property {TokenizerHandlePush} push Pushes a token back to the stack\n * @property {TokenizerHandleSkip} skip Skips a token, returns its presence and advances or, if non-optional and not present, throws\n * @property {TokenizerHandleCmnt} cmnt Gets the comment on the previous line or the line comment on the specified line, if any\n * @property {number} line Current line number\n */\n\n/**\n * Tokenizes the given .proto source and returns an object with useful utility functions.\n * @param {string} source Source contents\n * @param {boolean} alternateCommentMode Whether we should activate alternate comment parsing mode.\n * @returns {ITokenizerHandle} Tokenizer handle\n */\nfunction tokenize(source, alternateCommentMode) {\n    /* eslint-disable callback-return */\n    source = source.toString();\n\n    var offset = 0,\n        length = source.length,\n        line = 1,\n        commentType = null,\n        commentText = null,\n        commentLine = 0,\n        commentLineEmpty = false;\n\n    var stack = [];\n\n    var stringDelim = null;\n\n    /* istanbul ignore next */\n    /**\n     * Creates an error for illegal syntax.\n     * @param {string} subject Subject\n     * @returns {Error} Error created\n     * @inner\n     */\n    function illegal(subject) {\n        return Error(\"illegal \" + subject + \" (line \" + line + \")\");\n    }\n\n    /**\n     * Reads a string till its end.\n     * @returns {string} String read\n     * @inner\n     */\n    function readString() {\n        var re = stringDelim === \"'\" ? stringSingleRe : stringDoubleRe;\n        re.lastIndex = offset - 1;\n        var match = re.exec(source);\n        if (!match)\n            throw illegal(\"string\");\n        offset = re.lastIndex;\n        push(stringDelim);\n        stringDelim = null;\n        return unescape(match[1]);\n    }\n\n    /**\n     * Gets the character at `pos` within the source.\n     * @param {number} pos Position\n     * @returns {string} Character\n     * @inner\n     */\n    function charAt(pos) {\n        return source.charAt(pos);\n    }\n\n    /**\n     * Sets the current comment text.\n     * @param {number} start Start offset\n     * @param {number} end End offset\n     * @returns {undefined}\n     * @inner\n     */\n    function setComment(start, end) {\n        commentType = source.charAt(start++);\n        commentLine = line;\n        commentLineEmpty = false;\n        var lookback;\n        if (alternateCommentMode) {\n            lookback = 2;  // alternate comment parsing: \"//\" or \"/*\"\n        } else {\n            lookback = 3;  // \"///\" or \"/**\"\n        }\n        var commentOffset = start - lookback,\n            c;\n        do {\n            if (--commentOffset < 0 ||\n                (c = source.charAt(commentOffset)) === \"\\n\") {\n                commentLineEmpty = true;\n                break;\n            }\n        } while (c === \" \" || c === \"\\t\");\n        var lines = source\n            .substring(start, end)\n            .split(setCommentSplitRe);\n        for (var i = 0; i < lines.length; ++i)\n            lines[i] = lines[i]\n                .replace(alternateCommentMode ? setCommentAltRe : setCommentRe, \"\")\n                .trim();\n        commentText = lines\n            .join(\"\\n\")\n            .trim();\n    }\n\n    function isDoubleSlashCommentLine(startOffset) {\n        var endOffset = findEndOfLine(startOffset);\n\n        // see if remaining line matches comment pattern\n        var lineText = source.substring(startOffset, endOffset);\n        // look for 1 or 2 slashes since startOffset would already point past\n        // the first slash that started the comment.\n        var isComment = /^\\s*\\/{1,2}/.test(lineText);\n        return isComment;\n    }\n\n    function findEndOfLine(cursor) {\n        // find end of cursor's line\n        var endOffset = cursor;\n        while (endOffset < length && charAt(endOffset) !== \"\\n\") {\n            endOffset++;\n        }\n        return endOffset;\n    }\n\n    /**\n     * Obtains the next token.\n     * @returns {string|null} Next token or `null` on eof\n     * @inner\n     */\n    function next() {\n        if (stack.length > 0)\n            return stack.shift();\n        if (stringDelim)\n            return readString();\n        var repeat,\n            prev,\n            curr,\n            start,\n            isDoc;\n        do {\n            if (offset === length)\n                return null;\n            repeat = false;\n            while (whitespaceRe.test(curr = charAt(offset))) {\n                if (curr === \"\\n\")\n                    ++line;\n                if (++offset === length)\n                    return null;\n            }\n\n            if (charAt(offset) === \"/\") {\n                if (++offset === length) {\n                    throw illegal(\"comment\");\n                }\n                if (charAt(offset) === \"/\") { // Line\n                    if (!alternateCommentMode) {\n                        // check for triple-slash comment\n                        isDoc = charAt(start = offset + 1) === \"/\";\n\n                        while (charAt(++offset) !== \"\\n\") {\n                            if (offset === length) {\n                                return null;\n                            }\n                        }\n                        ++offset;\n                        if (isDoc) {\n                            setComment(start, offset - 1);\n                        }\n                        ++line;\n                        repeat = true;\n                    } else {\n                        // check for double-slash comments, consolidating consecutive lines\n                        start = offset;\n                        isDoc = false;\n                        if (isDoubleSlashCommentLine(offset)) {\n                            isDoc = true;\n                            do {\n                                offset = findEndOfLine(offset);\n                                if (offset === length) {\n                                    break;\n                                }\n                                offset++;\n                            } while (isDoubleSlashCommentLine(offset));\n                        } else {\n                            offset = Math.min(length, findEndOfLine(offset) + 1);\n                        }\n                        if (isDoc) {\n                            setComment(start, offset);\n                        }\n                        line++;\n                        repeat = true;\n                    }\n                } else if ((curr = charAt(offset)) === \"*\") { /* Block */\n                    // check for /** (regular comment mode) or /* (alternate comment mode)\n                    start = offset + 1;\n                    isDoc = alternateCommentMode || charAt(start) === \"*\";\n                    do {\n                        if (curr === \"\\n\") {\n                            ++line;\n                        }\n                        if (++offset === length) {\n                            throw illegal(\"comment\");\n                        }\n                        prev = curr;\n                        curr = charAt(offset);\n                    } while (prev !== \"*\" || curr !== \"/\");\n                    ++offset;\n                    if (isDoc) {\n                        setComment(start, offset - 2);\n                    }\n                    repeat = true;\n                } else {\n                    return \"/\";\n                }\n            }\n        } while (repeat);\n\n        // offset !== length if we got here\n\n        var end = offset;\n        delimRe.lastIndex = 0;\n        var delim = delimRe.test(charAt(end++));\n        if (!delim)\n            while (end < length && !delimRe.test(charAt(end)))\n                ++end;\n        var token = source.substring(offset, offset = end);\n        if (token === \"\\\"\" || token === \"'\")\n            stringDelim = token;\n        return token;\n    }\n\n    /**\n     * Pushes a token back to the stack.\n     * @param {string} token Token\n     * @returns {undefined}\n     * @inner\n     */\n    function push(token) {\n        stack.push(token);\n    }\n\n    /**\n     * Peeks for the next token.\n     * @returns {string|null} Token or `null` on eof\n     * @inner\n     */\n    function peek() {\n        if (!stack.length) {\n            var token = next();\n            if (token === null)\n                return null;\n            push(token);\n        }\n        return stack[0];\n    }\n\n    /**\n     * Skips a token.\n     * @param {string} expected Expected token\n     * @param {boolean} [optional=false] Whether the token is optional\n     * @returns {boolean} `true` when skipped, `false` if not\n     * @throws {Error} When a required token is not present\n     * @inner\n     */\n    function skip(expected, optional) {\n        var actual = peek(),\n            equals = actual === expected;\n        if (equals) {\n            next();\n            return true;\n        }\n        if (!optional)\n            throw illegal(\"token '\" + actual + \"', '\" + expected + \"' expected\");\n        return false;\n    }\n\n    /**\n     * Gets a comment.\n     * @param {number} [trailingLine] Line number if looking for a trailing comment\n     * @returns {string|null} Comment text\n     * @inner\n     */\n    function cmnt(trailingLine) {\n        var ret = null;\n        if (trailingLine === undefined) {\n            if (commentLine === line - 1 && (alternateCommentMode || commentType === \"*\" || commentLineEmpty)) {\n                ret = commentText;\n            }\n        } else {\n            /* istanbul ignore else */\n            if (commentLine < trailingLine) {\n                peek();\n            }\n            if (commentLine === trailingLine && !commentLineEmpty && (alternateCommentMode || commentType === \"/\")) {\n                ret = commentText;\n            }\n        }\n        return ret;\n    }\n\n    return Object.defineProperty({\n        next: next,\n        peek: peek,\n        push: push,\n        skip: skip,\n        cmnt: cmnt\n    }, \"line\", {\n        get: function() { return line; }\n    });\n    /* eslint-enable callback-return */\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/type.js",
    "content": "/**\n * Created by zhangmiao on 2018/3/13.\n */\n\n\nmodule.exports = Type;\n\nvar Namespace = require(\"./namespace\");\n((Type.prototype = Object.create(Namespace.prototype)).constructor = Type).className = \"Type\";\n\n\nvar Enum,\n    Field,\n    Message,\n    OneOf,\n    Writer,\n    Reader,\n    util,\n    verifier,\n    encoder,\n    decoder,\n    Service,\n    wrappers,\n    converter,\n    MapField;\n\n\n\nfunction Type(name, options) {\n    Namespace.call(this, name, options);\n\n    /**\n     * Message fields.\n     * @type {Object.<string,Field>}\n     */\n    this.fields = {};  // toJSON, marker\n\n    /**\n     * Oneofs declared within this namespace, if any.\n     * @type {Object.<string,OneOf>}\n     */\n    this.oneofs = undefined; // toJSON\n\n    /**\n     * Extension ranges, if any.\n     * @type {number[][]}\n     */\n    this.extensions = undefined; // toJSON\n\n    /**\n     * Reserved ranges, if any.\n     * @type {Array.<number[]|string>}\n     */\n    this.reserved = undefined; // toJSON\n\n    /*?\n     * Whether this type is a legacy group.\n     * @type {boolean|undefined}\n     */\n    this.group = undefined; // toJSON 这个可能不需要,因为不支持\n\n    /**\n     * Cached fields by id.\n     * @type {Object.<number,Field>|null}\n     * @private\n     */\n    this._fieldsById = null;\n\n    /**\n     * Cached fields as an array.\n     * @type {Field[]|null}\n     * @private\n     */\n    this._fieldsArray = null;\n\n    /**\n     * Cached oneofs as an array.\n     * @type {OneOf[]|null}\n     * @private\n     */\n    this._oneofsArray = null;\n\n    /**\n     * Cached constructor.\n     * @type {Constructor<{}>}\n     * @private\n     */\n    this._ctor = null;\n}\n\n\nObject.defineProperties(Type.prototype, {\n\n    /**\n     * Message fields by id.\n     * @name Type#fieldsById\n     * @type {Object.<number,Field>}\n     * @readonly\n     */\n    fieldsById: {\n        get: function() {\n\n            /* istanbul ignore if */\n            if (this._fieldsById)\n                return this._fieldsById;\n\n            this._fieldsById = {};\n            for (var names = Object.keys(this.fields), i = 0; i < names.length; ++i) {\n                var field = this.fields[names[i]],\n                    id = field.id;\n\n                /* istanbul ignore if */\n                if (this._fieldsById[id])\n                    throw Error(\"duplicate id \" + id + \" in \" + this);\n\n                this._fieldsById[id] = field;\n            }\n            return this._fieldsById;\n        }\n    },\n\n    /**\n     * Fields of this message as an array for iteration.\n     * @name Type#fieldsArray\n     * @type {Field[]}\n     * @readonly\n     */\n    fieldsArray: {\n        get: function() {\n            return this._fieldsArray || (this._fieldsArray = util.toArray(this.fields));\n        }\n    },\n\n    /**\n     * Oneofs of this message as an array for iteration.\n     * @name Type#oneofsArray\n     * @type {OneOf[]}\n     * @readonly\n     */\n    oneofsArray: {\n        get: function() {\n            return this._oneofsArray || (this._oneofsArray = util.toArray(this.oneofs));\n        }\n    },\n\n    /**\n     * The registered constructor, if any registered, otherwise a generic constructor.\n     * Assigning a function replaces the internal constructor. If the function does not extend {@link Message} yet, its prototype will be setup accordingly and static methods will be populated. If it already extends {@link Message}, it will just replace the internal constructor.\n     * @name Type#ctor\n     * @type {Constructor<{}>}\n     */\n    ctor: {\n        get: function() {\n            return this._ctor || (this.ctor = Type.generateConstructor(this));\n        },\n        set: function(ctor) {\n\n            // Ensure proper prototype\n            var prototype = ctor.prototype;\n            if (!(prototype instanceof Message)) {\n                (ctor.prototype = new Message()).constructor = ctor;\n                util.merge(ctor.prototype, prototype);\n            }\n\n            // Classes and messages reference their reflected type\n            ctor.$type = ctor.prototype.$type = this;\n\n            // Mix in static methods\n            util.merge(ctor, Message, true);\n            util.merge(ctor.prototype, Message, true);\n\n\n            this._ctor = ctor;\n\n            // Messages have non-enumerable default values on their prototype\n            var i = 0;\n            for (; i < /* initializes */ this.fieldsArray.length; ++i)\n                this._fieldsArray[i].resolve(); // ensures a proper value\n\n            // Messages have non-enumerable getters and setters for each virtual oneof field\n            var ctorProperties = {};\n            for (i = 0; i < /* initializes */ this.oneofsArray.length; ++i) {\n                var oneofName = this._oneofsArray[i].resolve().name;\n\n                var oneOfGetAndSet = (function(fieldNames){\n                    var fieldMap = {};\n                    for (var i = 0; i < fieldNames.length; ++i)\n                        fieldMap[fieldNames[i]] = 0;\n\n                    return {\n                        setter : function (name){\n                            if(fieldNames.indexOf(name) < 0) return;\n                            fieldMap[name] = 1;\n                            for (var i = 0; i < fieldNames.length; ++i)\n                                if (fieldNames[i] !== name)\n                                    delete this[/*\"_\"+*/fieldNames[i]];\n                        },\n\n                        getter : function (){\n                            for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)\n                                if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)\n                                    return keys[i];\n                        }\n\n                    }\n                })(this._oneofsArray[i].oneof);\n\n                ctorProperties[oneofName] = {\n                    get: oneOfGetAndSet.getter,\n                    set: oneOfGetAndSet.setter\n                };\n                //var fieldNames = this._oneofsArray[i].oneof;\n                //for (var  j = 0 ; j < fieldNames.length; j++){\n                //    var fieldName = fieldNames[j];\n                //    ctorProperties[fieldName] = {\n                //        set : (function(oneofName, fieldName){\n                //            return function (value){\n                //                this[oneofName] = fieldName;\n                //                this[\"_\"+fieldName] = value;\n                //            }\n                //        })(oneofName , fieldName),\n                //        get : (function(fieldName){\n                //            return function (){\n                //                return this[\"_\"+fieldName];\n                //            }\n                //        })(fieldName)\n                //    }\n                //}\n            }\n\n            if (i) {\n                //util.merge(ctor.prototype, ctorProperties, true);\n                Object.defineProperties(ctor.prototype, ctorProperties);\n            }\n        }\n    }\n});\n\n\n//生成一个构造函数\nType.generateConstructor = function generateConstructor(mtype) {\n    return function (p){\n        for (var i = 0, field; i < mtype.fieldsArray.length; i++){\n            if((field = mtype._fieldsArray[i]).map){\n                this[field.name] = {};\n            }else if(field.repeated){\n                this[field.name] = [];\n            }\n        }\n\n        if(p){\n            for (var  ks = Object.keys(p), j = 0; j < ks.length; ++j) {\n                if (p[ks[j]] != null) {\n                    this[ks[j]] = p[ks[j]]\n                }\n            }\n        }\n    };\n};\n\n\nfunction clearCache(type) {\n    type._fieldsById = type._fieldsArray = type._oneofsArray = null;\n    delete type.encode;\n    delete type.decode;\n    delete type.verify;\n    return type;\n}\n\n\n\nType.fromJSON = function fromJSON(name, json) {\n    var type = new Type(name, json.options);\n    type.extensions = json.extensions;\n    type.reserved = json.reserved;\n    var names = Object.keys(json.fields),\n        i = 0;\n    for (; i < names.length; ++i)\n        type.add(\n            ( typeof json.fields[names[i]].keyType !== \"undefined\"\n                ? MapField.fromJSON\n                : Field.fromJSON )(names[i], json.fields[names[i]])\n        );\n    if (json.oneofs)\n        for (names = Object.keys(json.oneofs), i = 0; i < names.length; ++i)\n            type.add(OneOf.fromJSON(names[i], json.oneofs[names[i]]));\n    if (json.nested)\n        for (names = Object.keys(json.nested), i = 0; i < names.length; ++i) {\n            var nested = json.nested[names[i]];\n            type.add( // most to least likely\n                ( nested.id !== undefined\n                    ? Field.fromJSON\n                    : nested.fields !== undefined\n                    ? Type.fromJSON\n                    : nested.values !== undefined\n                    ? Enum.fromJSON\n                    : nested.methods !== undefined\n                    ? Service.fromJSON\n                    : Namespace.fromJSON )(names[i], nested)\n            );\n        }\n    if (json.extensions && json.extensions.length)\n        type.extensions = json.extensions;\n    if (json.reserved && json.reserved.length)\n        type.reserved = json.reserved;\n    if (json.group)\n        type.group = true;\n    if (json.comment)\n        type.comment = json.comment;\n    return type;\n};\n\nType.prototype.toJSON = function toJSON(toJSONOptions) {\n    var inherited = Namespace.prototype.toJSON.call(this, toJSONOptions);\n    var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false;\n\n    return {\n        \"options\"       : inherited && inherited.options || undefined,\n        \"oneofs\"        : Namespace.arrayToJSON(this.oneofsArray, toJSONOptions),\n        \"fields\"        : Namespace.arrayToJSON(this.fieldsArray.filter(function(obj) { return !obj.declaringField; }), toJSONOptions) || {},\n        \"extensions\"    : this.extensions && this.extensions.length ? this.extensions : undefined,\n        \"reserved\"      : this.reserved && this.reserved.length ? this.reserved : undefined,\n        \"group\"         : this.group || undefined,\n        \"nested\"        : inherited && inherited.nested || undefined,\n        \"comment\"       : keepComments ? this.comment : undefined\n    };\n};\n\nType.prototype.resolveAll = function resolveAll() {\n    var fields = this.fieldsArray, i = 0;\n    while (i < fields.length)\n        fields[i++].resolve();\n    var oneofs = this.oneofsArray; i = 0;\n    while (i < oneofs.length)\n        oneofs[i++].resolve();\n    return Namespace.prototype.resolveAll.call(this);\n};\n\nType.prototype.get = function get(name) {\n    return this.fields[name]\n        || this.oneofs && this.oneofs[name]\n        || this.nested && this.nested[name]\n        || null;\n};\n\nType.prototype.add = function add(object) {\n\n    if (this.get(object.name))\n        throw Error(\"duplicate name '\" + object.name + \"' in \" + this);\n\n    if (object instanceof Field && object.extend === undefined) {\n        if (this._fieldsById && this._fieldsById[object.id])\n            throw Error(\"duplicate id \" + object.id + \" in \" + this);\n        if (this.isReservedId(object.id))\n            throw Error(\"id \" + object.id + \" is reserved in \" + this);\n        if (this.isReservedName(object.name))\n            throw Error(\"name '\" + object.name + \"' is reserved in \" + this);\n\n        if (object.parent)\n            object.parent.remove(object);\n        this.fields[object.name] = object;\n        object.message = this;\n        object.onAdd(this);\n        return clearCache(this);\n    }\n    if (object instanceof OneOf) {\n        if (!this.oneofs)\n            this.oneofs = {};\n        this.oneofs[object.name] = object;\n        object.onAdd(this);\n        return clearCache(this);\n    }\n    return Namespace.prototype.add.call(this, object);\n};\n\nType.prototype.remove = function remove(object) {\n    if (object instanceof Field && object.extend === undefined) {\n        // See Type#add for the reason why extension fields are excluded here.\n\n        /* istanbul ignore if */\n        if (!this.fields || this.fields[object.name] !== object)\n            throw Error(object + \" is not a member of \" + this);\n\n        delete this.fields[object.name];\n        object.parent = null;\n        object.onRemove(this);\n        return clearCache(this);\n    }\n    if (object instanceof OneOf) {\n\n        /* istanbul ignore if */\n        if (!this.oneofs || this.oneofs[object.name] !== object)\n            throw Error(object + \" is not a member of \" + this);\n\n        delete this.oneofs[object.name];\n        object.parent = null;\n        object.onRemove(this);\n        return clearCache(this);\n    }\n    return Namespace.prototype.remove.call(this, object);\n};\n\nType.prototype.isReservedId = function isReservedId(id) {\n    return Namespace.isReservedId(this.reserved, id);\n};\n\nType.prototype.isReservedName = function isReservedName(name) {\n    return Namespace.isReservedName(this.reserved, name);\n};\n\nType.prototype.create = function create(properties) {\n    return new this.ctor(properties);\n};\n\n\nType.prototype.setup = function setup() {\n    // Sets up everything at once so that the prototype chain does not have to be re-evaluated\n    // multiple times (V8, soft-deopt prototype-check).\n\n    var fullName = this.fullName,\n        types    = [];\n    for (var i = 0; i < /* initializes */ this.fieldsArray.length; ++i)\n        types.push(this._fieldsArray[i].resolve().resolvedType);\n\n    // Replace setup methods with type-specific generated functions\n    this.encode = encoder(this)({\n        Writer : Writer,\n        types  : types,\n        util   : util\n    });\n\n\n    this.decode = decoder(this)({\n        Reader : Reader,\n        types  : types,\n        util   : util\n    });\n    this.verify = verifier(this)({\n        types : types,\n        util  : util\n    });\n\n    this.fromObject = converter.fromObject(this)({\n        types : types,\n        util  : util\n    });\n    this.toObject = converter.toObject(this)({\n        types : types,\n        util  : util\n    });\n\n    // Inject custom wrappers for common types\n    var wrapper = wrappers[fullName];\n    if (wrapper) {\n        var originalThis = Object.create(this);\n        // if (wrapper.fromObject) {\n        originalThis.fromObject = this.fromObject;\n        this.fromObject = wrapper.fromObject.bind(originalThis);\n        // }\n        // if (wrapper.toObject) {\n        originalThis.toObject = this.toObject;\n        this.toObject = wrapper.toObject.bind(originalThis);\n        // }\n    }\n\n    return this;\n};\n\n/**\n * Encodes a message of this type. Does not implicitly {@link Type#verify|verify} messages.\n * @param {Message<{}>|Object.<string,*>} message Message instance or plain object\n * @param {Writer} [writer] Writer to encode to\n * @returns {Writer} writer\n */\n\nType.prototype.encode = function encode_setup(message, writer) {\n    return this.setup().encode(message, writer); // overrides this method\n};\n\n/**\n * Encodes a message of this type preceeded by its byte length as a varint. Does not implicitly {@link Type#verify|verify} messages.\n * @param {Message<{}>|Object.<string,*>} message Message instance or plain object\n * @param {Writer} [writer] Writer to encode to\n * @returns {Writer} writer\n */\nType.prototype.encodeDelimited = function encodeDelimited(message, writer) {\n    return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();\n};\n\n/**\n * Decodes a message of this type.\n * @param {Reader|Uint8Array|ArrayBuffer} reader Reader or buffer to decode from\n * @param {number} [length] Length of the message, if known beforehand\n * @returns {Message<{}>} Decoded message\n * @throws {Error} If the payload is not a reader or valid buffer\n */\n\nType.prototype.decode = function decode_setup(reader, length) {\n    return this.setup().decode(reader, length); // overrides this method\n};\n/**\n * Decodes a message of this type preceeded by its byte length as a varint.\n * @param {Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {Message<{}>} Decoded message\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {util.ProtocolError} If required fields are missing\n */\nType.prototype.decodeDelimited = function decodeDelimited(reader) {\n    if (!(reader instanceof Reader))\n        reader = Reader.create(reader);\n    return this.decode(reader, reader.uint32());\n};\n\n/**\n * Verifies that field values are valid and that required fields are present.\n * @param {Object.<string,*>} message Plain object to verify\n * @returns {null|string} `null` if valid, otherwise the reason why it is not\n */\n\nType.prototype.verify = function verify_setup(message) {\n    return this.setup().verify(message); // overrides this method\n};\n\n/**\n * Creates a new message of this type from a plain object. Also converts values to their respective internal types.\n * @param {Object.<string,*>} object Plain object to convert\n * @returns {Message<{}>} Message instance\n */\nType.prototype.fromObject = function fromObject(object) {\n    return this.setup().fromObject(object);\n};\n\n/**\n * Conversion options as used by {@link Type#toObject} and {@link Message.toObject}.\n * @interface IConversionOptions\n * @property {Function} [longs] Long conversion type.\n * Valid values are `String` and `Number` (the global types).\n * Defaults to copy the present value, which is a possibly unsafe number without and a {@link Long} with a long library.\n * @property {Function} [enums] Enum value conversion type.\n * Only valid value is `String` (the global type).\n * Defaults to copy the present value, which is the numeric id.\n * @property {Function} [bytes] Bytes value conversion type.\n * Valid values are `Array` and (a base64 encoded) `String` (the global types).\n * Defaults to copy the present value, which usually is a Buffer under node and an Uint8Array in the browser.\n * @property {boolean} [defaults=false] Also sets default values on the resulting object\n * @property {boolean} [arrays=false] Sets empty arrays for missing repeated fields even if `defaults=false`\n * @property {boolean} [objects=false] Sets empty objects for missing map fields even if `defaults=false`\n * @property {boolean} [oneofs=false] Includes virtual oneof properties set to the present field's name, if any\n * @property {boolean} [json=false] Performs additional JSON compatibility conversions, i.e. NaN and Infinity to strings\n */\n\n/**\n * Creates a plain object from a message of this type. Also converts values to other types if specified.\n * @param {Message<{}>} message Message instance\n * @param {IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n */\nType.prototype.toObject = function toObject(message, options) {\n    return this.setup().toObject(message, options);\n};\n\nType.d = function decorateType(typeName) {\n    return function typeDecorator(target) {\n        util.decorateType(target, typeName);\n    };\n};\n\nType._configure = function (){\n    Enum      = require(\"./enum\");\n    Field     = require(\"./field\");\n    Message   = require(\"./message\");\n    OneOf     = require(\"./oneof\");\n    Writer    = require(\"./writer\");\n    Reader    = require(\"./reader\");\n    util      = require(\"./util\");\n    verifier  = require(\"./verifier\");\n    encoder   = require(\"./encoder\");\n    decoder   = require(\"./decoder\");\n    Service   = require(\"./service\");\n    wrappers  = require(\"./wrappers\");\n    converter = require(\"./converter\");\n    MapField  = require(\"./mapField\");\n\n};"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/types.js",
    "content": "\"use strict\";\n\n/**\n * Common type constants.\n * @namespace\n */\nvar types = module.exports;\nvar util = require(\"./util\");\n\nvar s = [\n    \"double\",   // 0\n    \"float\",    // 1\n    \"int32\",    // 2\n    \"uint32\",   // 3\n    \"sint32\",   // 4\n    \"fixed32\",  // 5\n    \"sfixed32\", // 6\n    \"int64\",    // 7\n    \"uint64\",   // 8\n    \"sint64\",   // 9\n    \"fixed64\",  // 10\n    \"sfixed64\", // 11\n    \"bool\",     // 12\n    \"string\",   // 13\n    \"bytes\"     // 14\n];\n\nfunction bake(values, offset) {\n    var i = 0, o = {};\n    offset |= 0;\n    while (i < values.length) o[s[i + offset]] = values[i++];\n    return o;\n}\n\n/**\n * Basic type wire types.\n * @type {Object.<string,number>}\n * @const\n * @property {number} double=1 Fixed64 wire type\n * @property {number} float=5 Fixed32 wire type\n * @property {number} int32=0 Varint wire type\n * @property {number} uint32=0 Varint wire type\n * @property {number} sint32=0 Varint wire type\n * @property {number} fixed32=5 Fixed32 wire type\n * @property {number} sfixed32=5 Fixed32 wire type\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n * @property {number} bool=0 Varint wire type\n * @property {number} string=2 Ldelim wire type\n * @property {number} bytes=2 Ldelim wire type\n */\ntypes.basic = bake([\n    /* double   */ 1,\n    /* float    */ 5,\n    /* int32    */ 0,\n    /* uint32   */ 0,\n    /* sint32   */ 0,\n    /* fixed32  */ 5,\n    /* sfixed32 */ 5,\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 1,\n    /* sfixed64 */ 1,\n    /* bool     */ 0,\n    /* string   */ 2,\n    /* bytes    */ 2\n]);\n\n/**\n * Basic type defaults.\n * @type {Object.<string,*>}\n * @const\n * @property {number} double=0 Double default\n * @property {number} float=0 Float default\n * @property {number} int32=0 Int32 default\n * @property {number} uint32=0 Uint32 default\n * @property {number} sint32=0 Sint32 default\n * @property {number} fixed32=0 Fixed32 default\n * @property {number} sfixed32=0 Sfixed32 default\n * @property {number} int64=0 Int64 default\n * @property {number} uint64=0 Uint64 default\n * @property {number} sint64=0 Sint32 default\n * @property {number} fixed64=0 Fixed64 default\n * @property {number} sfixed64=0 Sfixed64 default\n * @property {boolean} bool=false Bool default\n * @property {string} string=\"\" String default\n * @property {Array.<number>} bytes=Array(0) Bytes default\n * @property {null} message=null Message default\n */\ntypes.defaults = bake([\n    /* double   */ 0,\n    /* float    */ 0,\n    /* int32    */ 0,\n    /* uint32   */ 0,\n    /* sint32   */ 0,\n    /* fixed32  */ 0,\n    /* sfixed32 */ 0,\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 0,\n    /* sfixed64 */ 0,\n    /* bool     */ false,\n    /* string   */ \"\",\n    /* bytes    */ util.emptyArray,\n    /* message  */ null\n]);\n\n/**\n * Basic long type wire types.\n * @type {Object.<string,number>}\n * @const\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n */\ntypes.long = bake([\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 1,\n    /* sfixed64 */ 1\n], 7);\n\n/**\n * Allowed types for map keys with their associated wire type.\n * @type {Object.<string,number>}\n * @const\n * @property {number} int32=0 Varint wire type\n * @property {number} uint32=0 Varint wire type\n * @property {number} sint32=0 Varint wire type\n * @property {number} fixed32=5 Fixed32 wire type\n * @property {number} sfixed32=5 Fixed32 wire type\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n * @property {number} bool=0 Varint wire type\n * @property {number} string=2 Ldelim wire type\n */\ntypes.mapKey = bake([\n    /* int32    */ 0,\n    /* uint32   */ 0,\n    /* sint32   */ 0,\n    /* fixed32  */ 5,\n    /* sfixed32 */ 5,\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 1,\n    /* sfixed64 */ 1,\n    /* bool     */ 0,\n    /* string   */ 2\n], 2);\n\n/**\n * Allowed types for packed repeated fields with their associated wire type.\n * @type {Object.<string,number>}\n * @const\n * @property {number} double=1 Fixed64 wire type\n * @property {number} float=5 Fixed32 wire type\n * @property {number} int32=0 Varint wire type\n * @property {number} uint32=0 Varint wire type\n * @property {number} sint32=0 Varint wire type\n * @property {number} fixed32=5 Fixed32 wire type\n * @property {number} sfixed32=5 Fixed32 wire type\n * @property {number} int64=0 Varint wire type\n * @property {number} uint64=0 Varint wire type\n * @property {number} sint64=0 Varint wire type\n * @property {number} fixed64=1 Fixed64 wire type\n * @property {number} sfixed64=1 Fixed64 wire type\n * @property {number} bool=0 Varint wire type\n */\ntypes.packed = bake([\n    /* double   */ 1,\n    /* float    */ 5,\n    /* int32    */ 0,\n    /* uint32   */ 0,\n    /* sint32   */ 0,\n    /* fixed32  */ 5,\n    /* sfixed32 */ 5,\n    /* int64    */ 0,\n    /* uint64   */ 0,\n    /* sint64   */ 0,\n    /* fixed64  */ 1,\n    /* sfixed64 */ 1,\n    /* bool     */ 0\n]);\n\ntypes._configure = function (){\n    util = require('./util');\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/utf8.js",
    "content": "\"use strict\";\n\n/**\n * A minimal UTF8 implementation for number arrays.\n * @memberof util\n * @namespace\n */\nvar utf8 = module.exports;\n\n/**\n * Calculates the UTF8 byte length of a string.\n * @param {string} string String\n * @returns {number} Byte length\n */\nutf8.length = function utf8_length(string) {\n    var len = 0,\n        c = 0;\n    for (var i = 0; i < string.length; ++i) {\n        c = string.charCodeAt(i);\n        if (c < 128)\n            len += 1;\n        else if (c < 2048)\n            len += 2;\n        else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\n            ++i;\n            len += 4;\n        } else\n            len += 3;\n    }\n    return len;\n};\n\n/**\n * Reads UTF8 bytes as a string.\n * @param {Uint8Array} buffer Source buffer\n * @param {number} start Source start\n * @param {number} end Source end\n * @returns {string} String read\n */\nutf8.read = function utf8_read(buffer, start, end) {\n    var len = end - start;\n    if (len < 1)\n        return \"\";\n    var parts = null,\n        chunk = [],\n        i = 0, // char offset\n        t;     // temporary\n    while (start < end) {\n        t = buffer[start++];\n        if (t < 128)\n            chunk[i++] = t;\n        else if (t > 191 && t < 224)\n            chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\n        else if (t > 239 && t < 365) {\n            t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\n            chunk[i++] = 0xD800 + (t >> 10);\n            chunk[i++] = 0xDC00 + (t & 1023);\n        } else\n            chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\n        if (i > 8191) {\n            (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\n            i = 0;\n        }\n    }\n    if (parts) {\n        if (i)\n            parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\n        return parts.join(\"\");\n    }\n    return String.fromCharCode.apply(String, chunk.slice(0, i));\n};\n\n/**\n * Writes a string as UTF8 bytes.\n * @param {string} string Source string\n * @param {Uint8Array} buffer Destination buffer\n * @param {number} offset Destination offset\n * @returns {number} Bytes written\n */\nutf8.write = function utf8_write(string, buffer, offset) {\n    var start = offset,\n        c1, // character 1\n        c2; // character 2\n    for (var i = 0; i < string.length; ++i) {\n        c1 = string.charCodeAt(i);\n        if (c1 < 128) {\n            buffer[offset++] = c1;\n        } else if (c1 < 2048) {\n            buffer[offset++] = c1 >> 6       | 192;\n            buffer[offset++] = c1       & 63 | 128;\n        } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\n            c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\n            ++i;\n            buffer[offset++] = c1 >> 18      | 240;\n            buffer[offset++] = c1 >> 12 & 63 | 128;\n            buffer[offset++] = c1 >> 6  & 63 | 128;\n            buffer[offset++] = c1       & 63 | 128;\n        } else {\n            buffer[offset++] = c1 >> 12      | 224;\n            buffer[offset++] = c1 >> 6  & 63 | 128;\n            buffer[offset++] = c1       & 63 | 128;\n        }\n    }\n    return offset - start;\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/util.js",
    "content": "/**\n * Created by zhangmiao on 2018/3/12.\n */\nvar util = module.exports;\n\nvar roots = require(\"./roots\");\nutil.LongBits = require(\"./longBits\");\nutil.Long  = require(\"./long\");\nutil.pool = require('./pool');\nutil.float = require('./float');\nutil.asPromise = require('./asPromise');\nutil.EventEmitter = require('./EventEmitter');\nutil.path = require('./path');\nutil.base64 =require('./base64');\nutil.utf8 = require('./utf8');\n\nutil.compareFieldsById = function compareFieldsById(a, b){\n    return a.id - b.id;\n};\n\nutil.toArray = function toArray(object) {\n    if (object) {\n        var keys  = Object.keys(object),\n            array = new Array(keys.length),\n            index = 0;\n        while (index < keys.length)\n            array[index] = object[keys[index++]];\n        return array;\n    }\n    return [];\n};\n\nutil.toObject = function toObject(array) {\n    var object = {},\n        index  = 0;\n    while (index < array.length) {\n        var key = array[index++],\n            val = array[index++];\n        if (val !== undefined)\n            object[key] = val;\n    }\n    return object;\n};\n\nutil.isString = function isString(value) {\n    return typeof value === \"string\" || value instanceof String;\n};\n\nvar safePropBackslashRe = /\\\\/g,\n    safePropQuoteRe     = /\"/g;\n\n/**\n * Tests whether the specified name is a reserved word in JS.\n * @param {string} name Name to test\n * @returns {boolean} `true` if reserved, otherwise `false`\n */\nutil.isReserved = function isReserved(name) {\n    return /^(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)$/.test(name);\n};\n\nutil.isObject = function isObject(value) {\n    return value && typeof value === \"object\";\n};\n\nutil.Array = typeof Uint8Array !== \"undefined\" ? Uint8Array /* istanbul ignore next */ : Array;\n\nutil.oneOfGetter = function getOneOf(fieldNames) {\n    var fieldMap = {};\n    for (var i = 0; i < fieldNames.length; ++i)\n        fieldMap[fieldNames[i]] = 1;\n\n    /**\n     * @returns {string|undefined} Set field name, if any\n     * @this Object\n     * @ignore\n     */\n    return function() { // eslint-disable-line consistent-return\n        for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)\n            if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)\n                return keys[i];\n    };\n};\n\nutil.oneOfSetter = function setOneOf(fieldNames) {\n\n    /**\n     * @param {string} name Field name\n     * @returns {undefined}\n     * @this Object\n     * @ignore\n     */\n    return function(name) {\n        for (var i = 0; i < fieldNames.length; ++i)\n            if (fieldNames[i] !== name)\n                delete this[/*\"_\"+*/fieldNames[i]];//设置为私有属性\n    };\n};\n\n\nutil.merge = function merge(dst, src, ifNotSet) { // used by converters\n    for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)\n        if (dst[keys[i]] === undefined || !ifNotSet)\n            dst[keys[i]] = src[keys[i]];\n    return dst;\n};\n\nutil.decorateType = function decorateType(ctor, typeName) {\n\n    /* istanbul ignore if */\n    if (ctor.$type) {\n        if (typeName && ctor.$type.name !== typeName) {\n            util.decorateRoot.remove(ctor.$type);\n            ctor.$type.name = typeName;\n            util.decorateRoot.add(ctor.$type);\n        }\n        return ctor.$type;\n    }\n\n    /* istanbul ignore next */\n    if (!Type)\n        Type = require(\"./type\");\n\n    var type = new Type(typeName || ctor.name);\n    util.decorateRoot.add(type);\n    type.ctor = ctor; // sets up .encode, .decode etc.\n    Object.defineProperty(ctor, \"$type\", { value: type, enumerable: false });\n    Object.defineProperty(ctor.prototype, \"$type\", { value: type, enumerable: false });\n    return type;\n};\n\nutil.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes\n\nutil.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes\n\nutil.longToHash = function longToHash(value) {\n    return value\n        ? util.LongBits.from(value).toHash()\n        : util.LongBits.zeroHash;\n};\n\nutil.copy = function(obj){\n    if(typeof obj != 'object'){\n        return obj;\n    }\n    var  newObj = {};\n    for (var  attr in obj) {\n        newObj[attr] = obj[attr];\n    }\n    return newObj;\n};\n\nfunction deepCopy(obj){\n    if(typeof obj != 'object'){\n        return obj;\n    }\n    var newobj = {};\n    for ( var attr in obj) {\n        newobj[attr] = deepCopy(obj[attr]);\n    }\n    return newobj;\n}\n\nutil.deepCopy = deepCopy;\n\nutil.ProtocolError =function newError(name) {\n\n    function CustomError(message, properties) {\n\n        if (!(this instanceof CustomError))\n            return new CustomError(message, properties);\n\n        // Error.call(this, message);\n        // ^ just returns a new error instance because the ctor can be called as a function\n\n        Object.defineProperty(this, \"message\", { get: function() { return message; } });\n\n        /* istanbul ignore next */\n        if (Error.captureStackTrace) // node\n            Error.captureStackTrace(this, CustomError);\n        else\n            Object.defineProperty(this, \"stack\", { value: (new Error()).stack || \"\" });\n\n        if (properties)\n            merge(this, properties);\n    }\n\n    (CustomError.prototype = Object.create(Error.prototype)).constructor = CustomError;\n\n    Object.defineProperty(CustomError.prototype, \"name\", { get: function() { return name; } });\n\n    CustomError.prototype.toString = function toString() {\n        return this.name + \": \" + this.message;\n    };\n\n    return CustomError;\n}\n\nutil.toJSONOptions = {\n    longs: String,\n    enums: String,\n    bytes: String,\n    json: true\n};\n\nutil.Buffer = (function() {\n    return null;\n})();\n\n\nutil.newBuffer = function newBuffer(sizeOrArray) {\n    /* istanbul ignore next */\n    return typeof sizeOrArray === \"number\"\n        ? new util.Array(sizeOrArray)\n        : typeof Uint8Array === \"undefined\"\n        ? sizeOrArray\n        : new Uint8Array(sizeOrArray);\n};\n\nutil.stringToBytes =function stringToBytes( str ) {\n    var bytes = [];\n    var len, c;\n    len = str.length;\n    for(var i = 0; i < len; i++) {\n        c = str.charCodeAt(i);\n        if(c >= 0x010000 && c <= 0x10FFFF) {\n            bytes.push(((c >> 18) & 0x07) | 0xF0);\n            bytes.push(((c >> 12) & 0x3F) | 0x80);\n            bytes.push(((c >> 6) & 0x3F) | 0x80);\n            bytes.push((c & 0x3F) | 0x80);\n        } else if(c >= 0x000800 && c <= 0x00FFFF) {\n            bytes.push(((c >> 12) & 0x0F) | 0xE0);\n            bytes.push(((c >> 6) & 0x3F) | 0x80);\n            bytes.push((c & 0x3F) | 0x80);\n        } else if(c >= 0x000080 && c <= 0x0007FF) {\n            bytes.push(((c >> 6) & 0x1F) | 0xC0);\n            bytes.push((c & 0x3F) | 0x80);\n        } else {\n            bytes.push(c & 0xFF);\n        }\n    }\n    return bytes;\n\n};\n\nutil.byteToString = function byteToString(arr) {\n    if(typeof arr === 'string') {\n        return arr;\n    }\n    var str = '',\n        _arr = arr;\n    for(var i = 0; i < _arr.length; i++) {\n        var one = _arr[i].toString(2),\n            v = one.match(/^1+?(?=0)/);\n        if(v && one.length == 8) {\n            var bytesLength = v[0].length;\n            var store = _arr[i].toString(2).slice(7 - bytesLength);\n            for(var st = 1; st < bytesLength; st++) {\n                store += _arr[st + i].toString(2).slice(2);\n            }\n            str += String.fromCharCode(parseInt(store, 2));\n            i += bytesLength - 1;\n        } else {\n            str += String.fromCharCode(_arr[i]);\n        }\n    }\n    return str;\n}\n\n\nutil.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) {\n        return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n    };\n\nObject.defineProperty(util, \"decorateRoot\", {\n    get: function() {\n        return roots[\"decorated\"] || (roots[\"decorated\"] = new (require(\"./root\"))());\n    }\n});\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/verifier.js",
    "content": "/**\n * Created by zhangmiao on 2018/3/14.\n */\nmodule.exports = verifier;\n\nvar Enum;\nvar util;\n\nfunction invalid(field, expected) {\n    return field.name + \": \" + expected + (field.repeated && expected !== \"array\" ? \"[]\" : field.map && expected !== \"object\" ? \"{k:\"+field.keyType+\"}\" : \"\") + \" expected\";\n}\n\nfunction verifyValue(field, fieldIndex, ref, options){\n    var _types = options.types;\n    if(field.resolvedType){\n        if(field.resolvedType instanceof Enum){\n            var keys = Object.keys(field.resolvedType.values);\n            if (keys.indexOf(ref)<0){\n                //没有找到时候\n                return invalid(field, \"enum value\");\n            }\n        }else {\n            var e = _types[fieldIndex].verify(ref);\n            if(e)\n                return field.name + \".\"+ e;\n        }\n    } else {\n        switch (field.type) {\n            case \"int32\":\n            case \"uint32\":\n            case \"sint32\":\n            case \"fixed32\":\n            case \"sfixed32\":\n                if (!util.isInteger(ref))\n                    return invalid(field, \"integer\");\n                break;\n            case \"int64\":\n            case \"uint64\":\n            case \"sint64\":\n            case \"fixed64\":\n            case \"sfixed64\":\n                if(!util.isInteger(ref)&&!(ref&&util.isInteger(ref.low)&&util.isInteger(ref.high)))\n                    return invalid(field, \"integer|Long\");\n                break;\n            case \"float\":\n            case \"double\":\n                if(typeof ref!==\"number\")\n                    return invalid(field, \"number\");\n                break;\n            case \"bool\":\n                if(typeof ref!==\"boolean\")\n                    return invalid(field, \"boolean\");\n                break;\n            case \"string\":\n                if(!util.isString(ref))\n                    return invalid(field, \"string\");\n                break;\n            case \"bytes\":\n                if(!(ref&&typeof ref.length===\"number\"||util.isString(ref)))\n                    return invalid(field, \"buffer\");\n                break;\n        }\n    }\n}\n\nfunction verifyKey(field, ref){\n    switch(field.keyType){\n        case \"int32\":\n        case \"uint32\":\n        case \"sint32\":\n        case \"fixed32\":\n        case \"sfixed32\":\n            if(!util.key32Re.test(ref))\n                return invalid(field, \"integer key\");\n            break;\n        case \"int64\":\n        case \"uint64\":\n        case \"sint64\":\n        case \"fixed64\":\n        case \"sfixed64\":\n            if(!util.key64Re.test(ref))\n                return invalid(field, \"integer|Long key\");\n            break;\n        case \"bool\":\n            if(!util.key2Re.test(ref))\n                return invalid(field, \"boolean key\");\n            break;\n    }\n}\n\nfunction verifier(mtype){\n    return function (options){\n        return function (m){\n            var invalidDes;\n            if(typeof m !== 'object' || m === null)\n                return \"object expected\";\n\n            var oneofs = mtype.oneofsArray,\n                seenFirstField = {};\n            var p;\n            if(oneofs.length)\n                p = {};\n            for (var i = 0; i < mtype.fieldsArray.length; ++i){\n                var field = mtype._fieldsArray[i].resolve(),\n                    ref   = m[field.name];\n                if(!field.optional || (ref!=null&& m.hasOwnProperty(field.name))){\n                    var  _i;\n                    if (field.map){\n                        if(!util.isObject(ref))\n                            return invalid(field, \"object\");\n                        var k=Object.keys(ref);\n                        for (_i = 0; _i < k.length; ++_i){\n                            //检查key值的合法性\n                            invalidDes = verifyKey(field, k[_i]);\n                            if(invalidDes){\n                                return invalidDes;\n                            }\n                            //检查value值的合法性\n                            invalidDes = verifyValue(field, i, ref[k[_i]], options);\n                            if(invalidDes){\n                                return invalidDes;\n                            }\n                        }\n                    } else if(field.repeated){\n                        if(!Array.isArray(ref)){\n                            return invalid(field, \"array\");\n                        }\n\n                        for (_i = 0; _i < ref.length; ++_i) {\n                            invalidDes = verifyValue(field, i, ref[_i], options);\n                            if(invalidDes){\n                                return invalidDes;\n                            }\n                        }\n                    } else {\n                        if(field.partOf) {\n                            var  oneofPropName = field.partOf.name;\n                            if (seenFirstField[field.partOf.name] === 1)\n                                if(p[oneofPropName] === 1)\n                                    return field.partOf.name + \": multiple values\";\n                            p[oneofPropName] = 1\n                        }\n                        invalidDes = verifyValue(field, i, ref, options);\n                        if(invalidDes){\n                            return invalidDes;\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\nverifier._configure = function(){\n    Enum      = require(\"./enum\");\n    util      = require(\"./util\");\n};"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/wrappers.js",
    "content": "var wrappers = exports;\n\n\nvar Message;\n\n/**\n * From object converter part of an {@link IWrapper}.\n * @typedef WrapperFromObjectConverter\n * @type {function}\n * @param {Object.<string,*>} object Plain object\n * @returns {Message<{}>} Message instance\n * @this Type\n */\n\n/**\n * To object converter part of an {@link IWrapper}.\n * @typedef WrapperToObjectConverter\n * @type {function}\n * @param {Message<{}>} message Message instance\n * @param {IConversionOptions} [options] Conversion options\n * @returns {Object.<string,*>} Plain object\n * @this Type\n */\n\n/**\n * Common type wrapper part of {@link wrappers}.\n * @interface IWrapper\n * @property {WrapperFromObjectConverter} [fromObject] From object converter\n * @property {WrapperToObjectConverter} [toObject] To object converter\n */\n\n// Custom wrapper for Any\nwrappers[\".google.protobuf.Any\"] = {\n\n    fromObject: function(object) {\n\n        // unwrap value type if mapped\n        if (object && object[\"@type\"]) {\n            var type = this.lookup(object[\"@type\"]);\n            /* istanbul ignore else */\n            if (type) {\n                // type_url does not accept leading \".\"\n                var type_url = object[\"@type\"].charAt(0) === \".\" ?\n                    object[\"@type\"].substr(1) : object[\"@type\"];\n                // type_url prefix is optional, but path seperator is required\n                return this.create({\n                    type_url: \"/\" + type_url,\n                    value: type.encode(type.fromObject(object)).finish()\n                });\n            }\n        }\n\n        return this.fromObject(object);\n    },\n\n    toObject: function(message, options) {\n\n        // decode value if requested and unmapped\n        if (options && options.json && message.type_url && message.value) {\n            // Only use fully qualified type name after the last '/'\n            var name = message.type_url.substring(message.type_url.lastIndexOf(\"/\") + 1);\n            var type = this.lookup(name);\n            /* istanbul ignore else */\n            if (type)\n                message = type.decode(message.value);\n        }\n\n        // wrap value if unmapped\n        if (!(message instanceof this.ctor) && message instanceof Message) {\n            var object = message.$type.toObject(message, options);\n            object[\"@type\"] = message.$type.fullName;\n            return object;\n        }\n\n        return this.toObject(message, options);\n    }\n};\n\nwrappers._configure = function () {\n    Message = require(\"./message\");\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/3dmarker-ar/protobuf/src/writer.js",
    "content": "module.exports = Writer;\n\n\nvar util = require('./util');\nvar LongBits;\n\nvar BufferWriter; // cyclic\n\nvar base64;\nvar utf8 = require('./utf8');\n\n/**\n * Constructs a new writer operation instance.\n * @classdesc Scheduled writer operation.\n * @constructor\n * @param {function(*, Uint8Array, number)} fn Function to call\n * @param {number} len Value byte length\n * @param {*} val Value to write\n * @ignore\n */\nfunction Op(fn, len, val) {\n\n    /**\n     * Function to call.\n     * @type {function(Uint8Array, number, *)}\n     */\n    this.fn = fn;\n\n    /**\n     * Value byte length.\n     * @type {number}\n     */\n    this.len = len;\n\n    /**\n     * Next operation.\n     * @type {Writer.Op|undefined}\n     */\n    this.next = undefined;\n\n    /**\n     * Value to write.\n     * @type {*}\n     */\n    this.val = val; // type varies\n}\n\n/* istanbul ignore next */\nfunction noop() {} // eslint-disable-line no-empty-function\n\n/**\n * Constructs a new writer state instance.\n * @classdesc Copied writer state.\n * @memberof Writer\n * @constructor\n * @param {Writer} writer Writer to copy state from\n * @ignore\n */\nfunction State(writer) {\n\n    /**\n     * Current head.\n     * @type {Writer.Op}\n     */\n    this.head = writer.head;\n\n    /**\n     * Current tail.\n     * @type {Writer.Op}\n     */\n    this.tail = writer.tail;\n\n    /**\n     * Current buffer length.\n     * @type {number}\n     */\n    this.len = writer.len;\n\n    /**\n     * Next state.\n     * @type {State|null}\n     */\n    this.next = writer.states;\n}\n\n/**\n * Constructs a new writer instance.\n * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n */\nfunction Writer() {\n\n    /**\n     * Current length.\n     * @type {number}\n     */\n    this.len = 0;\n\n    /**\n     * Operations head.\n     * @type {Object}\n     */\n    this.head = new Op(noop, 0, 0);\n\n    /**\n     * Operations tail\n     * @type {Object}\n     */\n    this.tail = this.head;\n\n    /**\n     * Linked forked states.\n     * @type {Object|null}\n     */\n    this.states = null;\n\n    // When a value is written, the writer calculates its byte length and puts it into a linked\n    // list of operations to perform when finish() is called. This both allows us to allocate\n    // buffers of the exact required size and reduces the amount of work we have to do compared\n    // to first calculating over objects and then encoding over objects. In our case, the encoding\n    // part is just a linked list walk calling operations with already prepared values.\n}\n\n/**\n * Creates a new writer.\n * @function\n * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}\n */\nWriter.create = util.Buffer\n    ? function create_buffer_setup() {\n    return (Writer.create = function create_buffer() {\n        return new BufferWriter();\n    })();\n}\n    /* istanbul ignore next */\n    : function create_array() {\n    return new Writer();\n};\n\n/**\n * Allocates a buffer of the specified size.\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\nWriter.alloc = function alloc(size) {\n    return new util.Array(size);\n};\n\n// Use Uint8Array buffer pool in the browser, just like node does with buffers\n/* istanbul ignore else */\nif (util.Array !== Array)\n    Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);\n\n/**\n * Pushes a new operation to the queue.\n * @param {function(Uint8Array, number, *)} fn Function to call\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @returns {Writer} `this`\n * @private\n */\nWriter.prototype._push = function push(fn, len, val) {\n    this.tail = this.tail.next = new Op(fn, len, val);\n    this.len += len;\n    return this;\n};\n\nfunction writeByte(val, buf, pos) {\n    buf[pos] = val & 255;\n}\n\nfunction writeVarint32(val, buf, pos) {\n    while (val > 127) {\n        buf[pos++] = val & 127 | 128;\n        val >>>= 7;\n    }\n    buf[pos] = val;\n}\n\n/**\n * Constructs a new varint writer operation instance.\n * @classdesc Scheduled varint writer operation.\n * @extends Op\n * @constructor\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @ignore\n */\nfunction VarintOp(len, val) {\n    this.len = len;\n    this.next = undefined;\n    this.val = val;\n}\n\nVarintOp.prototype = Object.create(Op.prototype);\nVarintOp.prototype.fn = writeVarint32;\n\n/**\n * Writes an unsigned 32 bit value as a varint.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint32 = function write_uint32(value) {\n    // here, the call to this.push has been inlined and a varint specific Op subclass is used.\n    // uint32 is by far the most frequently used operation and benefits significantly from this.\n    this.len += (this.tail = this.tail.next = new VarintOp(\n        (value = value >>> 0) //将有符号的数变为无符号的数\n        < 128       ? 1 //2的7次方\n            : value < 16384     ? 2 //2的14次方\n            : value < 2097152   ? 3 //2的21次方\n            : value < 268435456 ? 4 //2的28次方\n            :                     5, //2的35次方 最多32次方,所以最多是5\n        value)).len;\n    return this;\n};\n\n/**\n * Writes a signed 32 bit value as a varint.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int32 = function write_int32(value) {\n    return value < 0\n        ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec\n        : this.uint32(value);\n};\n\n/**\n * Writes a 32 bit value as a varint, zig-zag encoded.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint32 = function write_sint32(value) {\n    return this.uint32((value << 1 ^ value >> 31) >>> 0);\n};\n\nfunction writeVarint64(val, buf, pos) {\n    while (val.hi) {\n        buf[pos++] = val.lo & 127 | 128;\n        val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;\n        val.hi >>>= 7;\n    }\n    while (val.lo > 127) {\n        buf[pos++] = val.lo & 127 | 128;\n        val.lo = val.lo >>> 7;\n    }\n    buf[pos++] = val.lo;\n}\n\n/**\n * Writes an unsigned 64 bit value as a varint.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.uint64 = function write_uint64(value) {\n    var bits = LongBits.from(value);\n    return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a signed 64 bit value as a varint.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.int64 = Writer.prototype.uint64;\n\n/**\n * Writes a signed 64 bit value as a varint, zig-zag encoded.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sint64 = function write_sint64(value) {\n    var bits = LongBits.from(value).zzEncode();\n    return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a boolish value as a varint.\n * @param {boolean} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bool = function write_bool(value) {\n    return this._push(writeByte, 1, value ? 1 : 0);\n};\n\nfunction writeFixed32(val, buf, pos) {\n    buf[pos    ] =  val         & 255;\n    buf[pos + 1] =  val >>> 8   & 255;\n    buf[pos + 2] =  val >>> 16  & 255;\n    buf[pos + 3] =  val >>> 24;\n}\n\n/**\n * Writes an unsigned 32 bit value as fixed 32 bits.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed32 = function write_fixed32(value) {\n    return this._push(writeFixed32, 4, value >>> 0);\n};\n\n/**\n * Writes a signed 32 bit value as fixed 32 bits.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed32 = Writer.prototype.fixed32;\n\n/**\n * Writes an unsigned 64 bit value as fixed 64 bits.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.fixed64 = function write_fixed64(value) {\n    var bits = LongBits.from(value);\n    return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);\n};\n\n/**\n * Writes a signed 64 bit value as fixed 64 bits.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sfixed64 = Writer.prototype.fixed64;\n\n/**\n * Writes a float (32 bit).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.float = function write_float(value) {\n    return this._push(util.float.writeFloatLE, 4, value);\n};\n\n/**\n * Writes a double (64 bit float).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.double = function write_double(value) {\n    return this._push(util.float.writeDoubleLE, 8, value);\n};\n\nvar writeBytes = util.Array.prototype.set\n    ? function writeBytes_set(val, buf, pos) {\n    buf.set(val, pos); // also works for plain array values\n}\n    /* istanbul ignore next */\n    : function writeBytes_for(val, buf, pos) {\n    for (var i = 0; i < val.length; ++i)\n        buf[pos + i] = val[i];\n};\n\n/**\n * Writes a sequence of bytes.\n * @param {Uint8Array|string} value Buffer or string to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bytes = function write_bytes(value) {\n    var len = value.length >>> 0;\n    if (!len)\n        return this._push(writeByte, 1, 0);\n\n    if (util.isString(value)) {\n        //len = (value = util.stringToBytes(value)).length;\n        //var buf = Writer.alloc(len = base64.length(value));\n        //base64.decode(value, buf, 0);\n        //value = buf;\n        var buf = Writer.alloc(len = utf8.length(value));\n        utf8.write(value, buf, 0);\n        value = buf;\n    }\n    return this.uint32(len)._push(writeBytes, len, value);\n};\n\n/**\n * Writes a string.\n * @param {string} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.string = function write_string(value) {\n    var len = utf8.length(value);\n    return len\n        ? this.uint32(len)._push(utf8.write, len, value)\n        : this._push(writeByte, 1, 0);\n};\n\n/**\n * Forks this writer's state by pushing it to a stack.\n * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.\n * @returns {Writer} `this`\n */\nWriter.prototype.fork = function fork() {\n    this.states = new State(this);\n    this.head = this.tail = new Op(noop, 0, 0);\n    this.len = 0;\n    return this;\n};\n\n/**\n * Resets this instance to the last state.\n * @returns {Writer} `this`\n */\nWriter.prototype.reset = function reset() {\n    if (this.states) {\n        this.head   = this.states.head;\n        this.tail   = this.states.tail;\n        this.len    = this.states.len;\n        this.states = this.states.next;\n    } else {\n        this.head = this.tail = new Op(noop, 0, 0);\n        this.len  = 0;\n    }\n    return this;\n};\n\n/**\n * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.\n * @returns {Writer} `this`\n */\nWriter.prototype.ldelim = function ldelim() {\n    var head = this.head,\n        tail = this.tail,\n        len  = this.len;\n    this.reset().uint32(len);\n    if (len) {\n        this.tail.next = head.next; // skip noop\n        this.tail = tail;\n        this.len += len;\n    }\n    return this;\n};\n\n/**\n * Finishes the write operation.\n * @returns {Uint8Array} Finished buffer\n */\nWriter.prototype.finish = function finish() {\n    var head = this.head.next, // skip noop\n        buf  = this.constructor.alloc(this.len),\n        pos  = 0;\n    while (head) {\n        head.fn(head.val, buf, pos);\n        pos += head.len;\n        head = head.next;\n    }\n    // this.head = this.tail = null;\n    return buf;\n};\n\nWriter._configure = function() {\n\n    //util      = require(\"./util\");\n    LongBits  = require(\"./longBits\");\n    base64    = require('./base64');\n    utf8      = require('./utf8');\n};\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/behavior/behavior-ar.js",
    "content": "module.exports = Behavior({\n  // 全局变量\n  session: undefined, // 全局的VKsession对象\n  canvas: undefined, // canvas\n  // XRFrame相关变量\n  xrScene: undefined, // xr-frame 的场景\n  xrCamera: undefined, // xr-frame 的相机\n  xrFrameReady: undefined, // xr-frame初始化完毕\n  // WebGL相关\n  camera: undefined, // 主要相机\n  // ThreeJs 相关变量\n  gl: undefined, // 全局gl对象\n  THREE: undefined, // THREE 对象\n  // 全局 data\n  data: {\n    domWidth: 0,\n    domHeight: 0,\n    width: 0, // canvas大小\n    height: 0, // canvas大小\n    widthScale: 1, // canvas宽度缩放值\n    heightScale: 0.8, // canvas高度缩放值\n    cameraPosition: 0, // 相机朝向，默认后置摄像头\n  },\n  methods: {\n    onReady() {\n      // 获取canvas\n      wx.createSelectorQuery()\n        .select('#canvas')\n        .node()\n        .exec(res => {\n          this.canvas = res[0].node\n\n          // 运算画布大小\n          this.calcCanvasSize()\n\n          // 页面自定义初始化\n          if (this.init) this.init()\n        })\n    },\n    calcCanvasSize() {\n      const info = wx.getSystemInfoSync()\n      const pixelRatio = info.pixelRatio\n      const width = info.windowWidth * this.data.widthScale * pixelRatio\n      const height = info.windowHeight * this.data.heightScale * pixelRatio\n      // 存在 webgl Canvas的情况下，写入大小\n      if (this.canvas) {\n        this.canvas.width = width\n        this.canvas.height = height\n      }\n      console.log(`canvas size: width = ${width} , height = ${height}`)\n      this.setData({\n        width,\n        height,\n        domWidth: info.windowWidth * this.data.widthScale,\n        domHeight: info.windowHeight * this.data.heightScale,\n      })\n    },\n    // 前后摄像头\n    switchCamera() {\n      if (this.session.config) {\n        const config = this.session.config\n        let cameraPosNext\n        if (this.data.cameraPosition === 0) {\n          cameraPosNext = 1\n        } else {\n          cameraPosNext = 0\n        }\n        config.cameraPosition = cameraPosNext\n        this.session.config = config\n        this.setData({\n          cameraPosition: cameraPosNext\n        })\n      }\n    },\n    // 限帧逻辑\n    initLoop() {\n      // 限制调用帧率,暂时去掉\n      const fps = 30\n      const fpsInterval = 1000 / fps\n      let last = Date.now()\n\n      const session = this.session\n\n      // 逐帧渲染\n      const onFrame = timestamp => {\n        try {\n          const now = Date.now()\n          const mill = now - last\n          // 经过了足够的时间\n          if (mill > fpsInterval) {\n            last = now - (mill % fpsInterval) // 校正当前时间\n            this.loop()\n          }\n        } catch (e) {\n          console.error(e)\n        }\n        session.requestAnimationFrame(onFrame)\n      }\n      session.requestAnimationFrame(onFrame)\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/behavior/behavior-three-shoe.js",
    "content": "const threeBehavior = Behavior({\n  methods: {\n    updateThreeMatrix() {\n      // 同步 VKCamera 矩阵信息到 Three Camera\n      if (VKCamera) {\n        // VK接管相机矩阵\n        this.camera.matrixAutoUpdate = false\n\n        // VK ViewMatrix 返回列主序\n        this.camera.matrixWorldInverse.fromArray(VKCamera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = VKCamera.getProjectionMatrix(NEAR, FAR)\n\n        // projectionMatrix[0] = projectionMatrix[0] / 2;\n        // projectionMatrix[5] = projectionMatrix[5] / 2;\n\n        // VK 返回列主序\n        // 设置 投影矩阵\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      // 存在model，更新矩阵\n      if (this.modelWrap && this.points3d && this.shoeTransform) {\n        // console.log('toUpdate')\n        const THREE = this.THREE\n\n        // 顶点偏移矩阵\n        const positionMat = new THREE.Matrix4()\n        // 认为点 0 0 0\n        positionMat.setPosition(0, 0, 0)\n\n        // Anchor返回矩阵，实际上就是完整的 modelView matrix\n        const anchorMatrix = new THREE.Matrix4()\n        // 目前返回的是行主序矩阵\n        anchorMatrix.set(\n          this.shoeTransform[0],\n          this.shoeTransform[1],\n          this.shoeTransform[2],\n          this.shoeTransform[3],\n          this.shoeTransform[4],\n          this.shoeTransform[5],\n          this.shoeTransform[6],\n          this.shoeTransform[7],\n          this.shoeTransform[8],\n          this.shoeTransform[9],\n          this.shoeTransform[10],\n          this.shoeTransform[11],\n          this.shoeTransform[12],\n          this.shoeTransform[13],\n          this.shoeTransform[14],\n          this.shoeTransform[15],\n        )\n        // 两者叠加\n        // const modelWorld = positionMat.multiply(anchorMatrix);\n\n        const modelWorld = anchorMatrix\n\n        const pos = new THREE.Vector3()\n        const quaternion = new THREE.Quaternion()\n        const scale = new THREE.Vector3()\n\n        // 解析出 实际的 信息\n        modelWorld.decompose(pos, quaternion, scale)\n        console.log(pos, quaternion, scale)\n\n        // 设置到容器节点上\n        this.modelWrap.position.set(pos.x, pos.y, pos.z)\n        this.modelWrap.quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w)\n        this.modelWrap.scale.set(scale.x, scale.y, scale.z)\n\n        if (this.model) {\n          // 先把模型放置在脚踝\n          // this.model.position.set(this.points3d[0].x, this.points3d[0].y, this.points3d[0].z);\n        }\n\n        if (this.hintBoxList && this.hintBoxList.length > 0) {\n          // console.log('ready to set', this.hintBoxList);\n          // 存在提示列表，则更新点信息\n          for (let i = 0; i < this.hintBoxList.length; i++) {\n            const hintBox = this.hintBoxList[i]\n            hintBox.position.set(this.points3d[i].x, this.points3d[i].y, this.points3d[i].z)\n          }\n          // console.log('seted', this.hintBoxList);\n        }\n\n        // debug 用信息\n        if (!loggerOnce) {\n          // console.log('positionMat', positionMat);\n          // console.log('anchorMat', anchorMat);\n          // console.log('modelWorld', modelWorld);\n\n          // console.log('projectionMatrix', this.camera.projectionMatrix);\n\n          // console.log('this.modelWrap.position', this.modelWrap.position);\n          // console.log('this.modelWrap.quaternion', this.modelWrap.quaternion);\n          // console.log('this.modelWrap.scale', this.modelWrap.scale);\n\n          // console.log('domSize', this.data.domWidth, this.data.domHeight)\n          // VK 直接数值\n          console.log('joints', Array.from(this.points3d))\n          console.log('viewMatrix', Array.from(VKCamera.viewMatrix))\n          console.log('projectionMatrix', Array.from(VKCamera.getProjectionMatrix(NEAR, FAR)))\n          console.log('anchorTransform', Array.from(this.shoeTransform))\n\n          loggerOnce = true\n        }\n      }\n\n      // 渲染 Three 场景\n      this.renderer.autoClearColor = false\n      this.renderer.state.setCullFace(this.THREE.CullFaceBack)\n      this.renderer.render(this.scene, this.camera)\n      // 为什么去掉这句话会画不出来，我感觉大概率是YUV的面朝向错了\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n    },\n    addShoeHintBox() {\n      const THREE = this.THREE\n\n      const wrap = this.modelWrap\n\n      const geometry = new THREE.BoxGeometry(1, 1, 1)\n      const boxScale = 0.3\n\n      const hintBoxList = []\n      for (let i = 0; i < 8; i++) {\n        const colorHex = (i * 2).toString(16)\n        const material = new THREE.MeshPhysicalMaterial({\n          metalness: 0.0,\n          roughness: 0.5,\n          color: parseInt(`${colorHex}${colorHex}${colorHex}${colorHex}${colorHex}${colorHex}`, 16),\n        })\n        const mesh = new THREE.Mesh(geometry, material)\n        mesh.position.set(0, 0, 0)\n        mesh.scale.set(boxScale, boxScale, boxScale)\n        wrap.add(mesh)\n        hintBoxList.push(mesh)\n      }\n\n      this.hintBoxList = hintBoxList\n    },\n  },\n})\n\nexport default threeBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/behavior/behavior-three.js",
    "content": "import { createScopedThreejs } from 'threejs-miniprogram'\nimport { registerGLTFLoader } from '../loaders/gltf-loader'\n\nconst threeBehavior = Behavior({\n  methods: {\n    // 针对 threejs 的初始化逻辑\n    initTHREE() {\n      const THREE = this.THREE = createScopedThreejs(this.canvas)\n      registerGLTFLoader(THREE)\n\n      // glTF loader\n      this.loader = new this.THREE.GLTFLoader()\n\n      // 相机\n      this.camera = new THREE.PerspectiveCamera(50, 0.7, 0.1, 1000)\n\n      // 场景\n      const scene = this.scene = new THREE.Scene()\n      const sceneCull = this.sceneCull = new THREE.Scene()\n\n      // 光源\n      const ambientLight = new THREE.AmbientLight(0x555555) // 氛围光\n      scene.add(ambientLight)\n      const dirLight = new THREE.DirectionalLight(0xffffff, 1) // 平行光\n      dirLight.position.set(1, 1, 1)\n      scene.add(dirLight)\n\n      const ambientLightCull = new THREE.AmbientLight(0x555555) // 氛围光\n      sceneCull.add(ambientLightCull)\n      const dirLightCull = new THREE.DirectionalLight(0xffffff, 1) // 平行光\n      dirLightCull.position.set(1, 1, 1)\n      sceneCull.add(dirLightCull)\n\n      // 渲染层\n      const renderer = this.renderer = new THREE.WebGLRenderer({\n        antialias: true,\n        alpha: true\n      })\n      renderer.gammaOutput = true\n      renderer.gammaFactor = 2.2\n    },\n    initYUVShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n                attribute vec2 a_position;\n                attribute vec2 a_texCoord;\n                uniform mat3 displayTransform;\n                varying vec2 v_texCoord;\n                void main() {\n                vec3 p = displayTransform * vec3(a_position, 0);\n                gl_Position = vec4(p, 1);\n                v_texCoord = a_texCoord;\n                }\n            `\n      const fs = `\n                precision highp float;\n\n                uniform sampler2D y_texture;\n                uniform sampler2D uv_texture;\n                varying vec2 v_texCoord;\n                void main() {\n                vec4 y_color = texture2D(y_texture, v_texCoord);\n                vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n                float Y, U, V;\n                float R ,G, B;\n                Y = y_color.r;\n                U = uv_color.r - 0.5;\n                V = uv_color.a - 0.5;\n                \n                R = Y + 1.402 * V;\n                G = Y - 0.344 * U - 0.714 * V;\n                B = Y + 1.772 * U;\n                \n                gl_FragColor = vec4(R, G, B, 1.0);\n                }\n            `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO(program) {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      return vao\n    },\n    initYUV() {\n      this.initYUVShader()\n      this._vao = this.initVAO(this._program)\n    },\n    renderYUV(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n    initDepthShaderHint() {\n      const gl = this.gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_texture_float')\n      if (!ext) console.warn('OES_texture_float not support')\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n              precision highp float;\n              attribute vec2 a_position;\n              attribute vec2 a_texCoord;\n              uniform mat3 displayTransform;\n              varying vec2 v_texCoord;\n              void main() {\n                vec3 p = displayTransform * vec3(a_position, 0);\n                gl_Position = vec4(p, 1);\n                v_texCoord = a_texCoord;\n              }\n            `\n      const fs = `\n              precision highp float;\n              uniform sampler2D depth_texture;\n              varying vec2 v_texCoord;\n              void main() {\n                vec4 depth_color = texture2D(depth_texture, v_texCoord);\n                gl_FragColor = vec4(depth_color.rgb, 1.0);\n              }\n            `\n\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._depthProgram = gl.createProgram()\n      this._depthProgram.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformTexture = gl.getUniformLocation(program, 'depth_texture')\n      gl.uniform1i(uniformTexture, 5)\n\n      this._depthDt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initDepthVAOHint() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._depthProgram, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.3, 0.3, 1, 0.3, 0.3, 1, 1, 1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._depthProgram, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._depthVao = vao\n    },\n    initDepthShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n\n      const dvs = `#version 300 es\n                precision highp float;\n                in vec2 a_position;\n                in vec2 a_texCoord;\n                uniform mat3 displayTransform;\n                uniform sampler2D depth_texture;     \n                out vec2 v_texCoord;\n        \n                void main() {\n                vec3 p = displayTransform * vec3(a_position, 1);\n                v_texCoord = a_texCoord;\n                vec4 depth_color = texture(depth_texture, v_texCoord);\n                gl_Position = vec4(p.x, p.y, p.z, 1);\n                }\n            `\n\n      const dfs = `#version 300 es\n                precision highp float;\n                uniform sampler2D depth_texture;      \n                out vec4 FragColor;\n                in vec2 v_texCoord;\n        \n                void main() {\n                vec4 depth_color = texture(depth_texture, v_texCoord);\n                gl_FragDepth = depth_color.r;\n            //   FragColor = vec4(depth_color.rgb, 1.0);\n                }\n            `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, dvs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, dfs)\n      gl.compileShader(fragShader)\n\n      const program = this._depthOutputProgram = gl.createProgram()\n      this._depthOutputProgram.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformDepthTexture = gl.getUniformLocation(this._depthOutputProgram, 'depth_texture')\n      gl.uniform1i(uniformDepthTexture, 5)\n      gl.getUniformLocation(this._depthOutputProgram, 'displayTransform')\n\n      gl.useProgram(currentProgram)\n    },\n    initDepthGL() {\n      // 初始化提示\n      this.initDepthShaderHint()\n      this.initDepthVAOHint()\n      // 初始化深度纹理相关\n      this.initDepthShader()\n      this._vaoDepth = this.initVAO(this._depthOutputProgram)\n    },\n    renderDepthGLHint(frame) {\n      const gl = this.renderer.getContext()\n      const displayTransform = frame.getDisplayTransform()\n\n      // DepthBuffer\n      const depthBufferRes = frame.getDepthBuffer()\n      const depthBuffer = new Float32Array(depthBufferRes.DepthAddress)\n\n      // console.log('depthBuffer', depthBuffer[0], depthBuffer[16], depthBuffer[16 * 16], depthBuffer[56 * 56]);\n\n      const texture = gl.createTexture()\n      gl.bindTexture(gl.TEXTURE_2D, texture)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n\n      const width = depthBufferRes.width\n      const height = depthBufferRes.height\n\n      // 先直接采用 uint8 写入深度纹理，使用浮点写入的方法会存在锯齿\n      const data = new Uint8Array(width * height * 4)\n      for (let i = 0; i < depthBuffer.length; i++) {\n        const num = parseInt(depthBuffer[i] * 255)\n        data[i] = num\n      }\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data)\n\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n      gl.useProgram(this._depthProgram)\n      this.ext.bindVertexArrayOES(this._depthVao)\n\n      gl.uniformMatrix3fv(this._depthDt, false, displayTransform)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n      gl.bindTexture(gl.TEXTURE_2D, texture)\n\n      gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n      gl.useProgram(currentProgram)\n      gl.activeTexture(currentActiveTexture)\n      this.ext.bindVertexArrayOES(currentVAO)\n    },\n    renderDepthGL(frame) {\n      const gl = this.renderer.getContext()\n      const displayTransform = frame.getDisplayTransform()\n\n      // DepthBuffer\n      const depthBufferRes = frame.getDepthBuffer()\n      const depthBuffer = new Float32Array(depthBufferRes.DepthAddress)\n\n      const texture = gl.createTexture()\n      gl.bindTexture(gl.TEXTURE_2D, texture)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n\n      const width = depthBufferRes.width\n      const height = depthBufferRes.height\n\n      // 先直接采用 uint8 写入深度纹理，使用浮点写入的方法会存在锯齿\n      const data = new Uint8Array(width * height * 4)\n      for (let i = 0; i < depthBuffer.length; i++) {\n        const num = parseInt(depthBuffer[i] * 255)\n        data[i] = num\n      }\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data)\n\n      // console.log('gl depth texture end')\n\n      // 绘制左下角提示\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const bindingTexture = gl.getParameter(gl.TEXTURE_BINDING_2D)\n\n      gl.useProgram(this._depthProgram)\n      this.ext.bindVertexArrayOES(this._depthVao)\n\n      gl.uniformMatrix3fv(this._depthDt, false, displayTransform)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n      gl.bindTexture(gl.TEXTURE_2D, texture)\n\n      gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n      gl.useProgram(currentProgram)\n      gl.activeTexture(currentActiveTexture)\n      this.ext.bindVertexArrayOES(currentVAO)\n\n      // console.log('gl hint end')\n\n      // 写入深度遮挡纹理到深度值\n\n      gl.enable(gl.DEPTH_TEST)\n      gl.depthMask(true)\n      gl.depthFunc(gl.ALWAYS)\n\n      this.ext.bindVertexArrayOES(this._vaoDepth)\n      gl.useProgram(this._depthOutputProgram)\n\n      gl.uniformMatrix3fv(this._depthDt, false, displayTransform)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      const bindingTexture5Depth = gl.getParameter(gl.TEXTURE_BINDING_2D)\n\n      gl.bindTexture(gl.TEXTURE_2D, texture)\n\n      gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n\n      gl.bindTexture(gl.TEXTURE_2D, bindingTexture5Depth)\n\n      gl.useProgram(currentProgram)\n      gl.activeTexture(currentActiveTexture)\n      gl.bindTexture(gl.TEXTURE_2D, bindingTexture)\n\n      this.ext.bindVertexArrayOES(currentVAO)\n\n      gl.depthMask(false)\n\n      gl.depthFunc(gl.LESS)\n\n      // console.log('gl depth draw end')\n    },\n  },\n})\n\nexport default threeBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/behavior/behavior-xrframe.js",
    "content": "const xrFrameBehavior = Behavior({\n  yuvMat: undefined, // yuv纹理\n  yuvMatInit: undefined, // yuv纹理是否已经初始化\n  DT: undefined, // 缓存displayMatrix\n  methods: {\n    // xrScene Ready 事件回调\n    handleXRSceneReady(detail) {\n      console.log('handleXRSceneReady', detail)\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      this.xrCamera = detail.detail.camera\n      this.xrCameraTrs = this.xrCamera.el.getComponent(xrFrameSystem.Transform)\n      this.xrScene = detail.detail.scene\n      this.xrFrameReady = true\n      if (this.initXRFrame) {\n        this.initXRFrame()\n      }\n    },\n    // 绑定自定义 YUV effect\n    registerYUVEffect() {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      xrFrameSystem.registerEffect('ar-yuv-self', scene => scene.createEffect({\n        properties: [\n          {\n            key: 'u_displayMatrix',\n            type: 6,\n            default: [\n              1, 0, 0, 0,\n              0, 1, 0, 0,\n              0, 0, 1, 0,\n              0, 0, 0, 1\n            ]\n          }\n        ],\n        images: [\n          {\n            key: 'u_yTexture',\n            default: 'black',\n            macro: 'WX_AR_CAMERA_READY'\n          },\n          {\n            key: 'u_uvTexture',\n            default: 'white'\n          },\n          {\n            key: 'u_depthTexture',\n            default: 'white',\n            macro: 'WX_AR_CAMERA_DEPTH'\n          }\n        ],\n        defaultRenderQueue: 2000,\n        passes: [{\n          renderStates: {\n            cullOn: false,\n            blendOn: false,\n            depthWrite: false\n          },\n          lightMode: 'ForwardBase',\n          useMaterialRenderStates: true,\n          shaders: [0, 1]\n        }],\n        shaders:\n[\n  `#version 100\nattribute vec3 a_position;\nattribute vec2 a_texCoord;\n\nprecision highp float;\n\nuniform highp mat4 u_view;\nuniform highp mat4 u_viewInverse;\nuniform highp mat4 u_vp;\nuniform highp mat4 u_projection;\n\nuniform highp mat4 u_world;\n\n\nuniform highp mat4 u_displayMatrix;\nvarying highp vec2 v_texCoord;\n\nvoid main() {\n    v_texCoord = a_texCoord;\n    vec4 pos = u_displayMatrix * vec4(a_position.xy, 1., 1.);\n\n    gl_Position =  pos;\n}\n`,\n  `#version 100\nprecision mediump float;\nprecision highp int;\n\nuniform sampler2D u_yTexture;\nuniform sampler2D u_uvTexture;\nvarying highp vec2 v_texCoord;\n\nfloat unpack(float h, float l) {\n    return h * 0.94117647 + l * 0.0588235;\n}\n\nvoid main()\n{\n    vec4 yColor = texture2D(u_yTexture, v_texCoord);\n    vec4 uvColor = texture2D(u_uvTexture, v_texCoord);\n\n#ifdef WX_AR_CAMERA_READY\n\n    float Y, U, V;\n    float R, G, B;\n    Y = yColor.r;\n    U = unpack(uvColor.r, uvColor.g) - 0.5;\n    V = unpack(uvColor.b, uvColor.a) - 0.5;\n    \n    R = Y + 1.402 * V;\n    G = Y - 0.344 * U - 0.714 * V;\n    B = Y + 1.772 * U;\n\n    gl_FragData[0] = vec4(B, G, R, 1.0);\n#else\n    gl_FragData[0] = vec4(0.0, 0.0, 0.0, 1.0);\n\n#endif\n}\n`\n]\n      }))\n    },\n    // 初始化 xr-frame 相机 YUV 数据绘制流程节点\n    initXRYUVCamera() {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const scene = this.xrScene\n      const { assets, rootShadow } = scene\n\n      const el = scene.createElement(xrFrameSystem.XRNode, {\n        layer: 1\n      })\n\n      const yuvGeometry = assets.getAsset('geometry', 'ar-camera-plane')\n      let yuvEffect = assets.getAsset('effect', 'ar-yuv-self')\n\n      if (!yuvEffect) {\n        this.registerYUVEffect()\n        yuvEffect = assets.getAsset('effect', 'ar-yuv-self')\n      }\n\n      const yuvMat = scene.createMaterial(yuvEffect)\n      yuvMat.renderQueue = 1 // 第一个绘制\n      const mesh = el.addComponent(xrFrameSystem.Mesh, {\n        geometry: yuvGeometry,\n        material: yuvMat\n      })\n\n      // 相机yuv纹理\n      this.yuvMat = yuvMat\n      this.yuvMatInit = false\n\n      // 不进入正常的剔除\n      rootShadow.addChild(el)\n\n      console.log('initXRYUVCamera end')\n    },\n    updataXRYUV(frame) {\n      // console.log('update yuv')\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const scene = this.xrScene\n      const yuv = frame.getCameraRawTextureData()\n      // 未创建相机贴图缓存，先创建\n      if (!this.cameraTexures) {\n        this.cameraTexures = {\n          y: scene.createTexture({\n            width: yuv.width,\n            height: yuv.height,\n            source: [yuv.yAddress],\n            pixelFormat: xrFrameSystem.ETextureFormat.R8\n          }),\n          uv: scene.createTexture({\n            width: yuv.width / 2,\n            height: yuv.height / 2,\n            source: [yuv.uvAddress],\n            pixelFormat: xrFrameSystem.ETextureFormat.RGBA4\n          })\n        }\n      }\n      const { y, uv, depth } = this.cameraTexures\n\n      const cameraYUVMat = this.yuvMat\n      // 未绑定贴图的情况下，绑定贴图\n      if (!this.yuvMatInit) {\n        cameraYUVMat.setTexture('u_yTexture', y)\n        cameraYUVMat.setTexture('u_uvTexture', uv)\n        // depth && cameraYUVMat.setTexture('u_depthTexture', depth);\n        this.yuvMatInit = true\n      }\n\n      // 更新displayMat\n      const dt = frame.getDisplayTransform()\n      if (!this.DT) { this.DT = new xrFrameSystem.Matrix4() }\n      this.DT.setArray([\n        dt[0], dt[1], dt[2], 0,\n        dt[3], dt[4], dt[5], 0,\n        dt[6], dt[7], dt[8], 0,\n        0, 0, 0, 1\n      ])\n      cameraYUVMat.setMatrix('u_displayMatrix', this.DT)\n\n      // YUV纹理更新\n      y.update({ buffer: yuv.yAddress })\n      uv.update({ buffer: yuv.uvAddress })\n\n      // console.log('update yuv end')\n    },\n    updataXRCameraMatrix(VKCamera, near, far) {\n      // 同步 VKCamera 矩阵信息到 xrFrame Camera\n      if (VKCamera) {\n        const viewMat = VKCamera.viewMatrix\n        const projMat = VKCamera.getProjectionMatrix(near, far)\n\n        // 更新 viewMatrix\n        this.xrCamera.changeViewMatrix(true, viewMat)\n\n        // 更新 projectMatrix\n        const halfFov = Math.atan(1 / projMat[5]) * 180 / Math.PI\n        this.xrCamera.setData({ near, far, fov: 2 * halfFov })\n        this.xrCamera.changeProjectMatrix(true, projMat)\n      }\n    },\n  },\n})\n\nexport default xrFrameBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/body-detect/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n      cameraPosition: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            plane: {\n              mode: 1\n            },\n            body: {\n              mode: 1\n            }\n          },\n          gl: this.gl,\n          version: 'v1',\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          session.on('addAnchors', anchors => {\n            this.data.anchor2DList = anchors.map(anchor => ({\n              points: anchor.points,\n              origin: anchor.origin,\n              size: anchor.size\n            }))\n          })\n          session.on('updateAnchors', anchors => {\n            this.data.anchor2DList = []\n            this.data.anchor2DList = this.data.anchor2DList.concat(anchors.map(anchor => ({\n              points: anchor.points,\n              origin: anchor.origin,\n              size: anchor.size\n            })))\n\n            console.log('显示data')\n            console.log(this.data)\n          })\n          session.on('removeAnchors', anchors => {\n            this.data.anchor2DList = []\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/body-detect/body-detect.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\n// 顶点着色器\nconst VSHADER_SOURCE = '' +\n  'attribute vec4 a_Position;\\n' + // 声明attribute变量a_Position，用来存放顶点位置信息\n  'void main(){\\n' +\n  '  gl_Position = a_Position;\\n' + // 将顶点坐标赋值给顶点着色器内置变量gl_Position\n  '  gl_PointSize = 4.0;\\n' + // 设置顶点大小\n  '}\\n'\n\n// 片元着色器\nconst FSHADER_SOURCE = '' +\n  '#ifdef GL_ES\\n' +\n  ' precision mediump float;\\n' + // 设置精度\n  '#endif\\n' +\n  'varying vec4 v_Color;\\n' + // 声明varying变量v_Color，用来接收顶点着色器传送的片元颜色信息\n  'void main(){\\n' +\n  '  float d = distance(gl_PointCoord, vec2(0.5, 0.5));\\n' + // 计算像素距离中心点的距离\n  '  if(d < 0.5) {\\n' + // 距离大于0.5放弃片元，小于0.5保留片元\n  '    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\\n' +\n  '  } else { discard; }\\n' +\n  '}\\n'\n\n// 初始化着色器函数\nlet initShadersDone = false\n\nfunction initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE) {\n  // 创建顶点着色器对象\n  const vertexShader = loadShader(gl, gl.VERTEX_SHADER, VSHADER_SOURCE)\n  // 创建片元着色器对象\n  const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, FSHADER_SOURCE)\n\n  if (!vertexShader || !fragmentShader) {\n    return null\n  }\n\n  // 创建程序对象program\n  const program = gl.createProgram()\n  if (!gl.createProgram()) {\n    return null\n  }\n  // 分配顶点着色器和片元着色器到program\n  gl.attachShader(program, vertexShader)\n  gl.attachShader(program, fragmentShader)\n  // 链接program\n  gl.linkProgram(program)\n\n  // 检查程序对象是否连接成功\n  const linked = gl.getProgramParameter(program, gl.LINK_STATUS)\n  if (!linked) {\n    const error = gl.getProgramInfoLog(program)\n    console.log('程序对象连接失败: ' + error)\n    gl.deleteProgram(program)\n    gl.deleteShader(fragmentShader)\n    gl.deleteShader(vertexShader)\n    return null\n  }\n  // 返回程序program对象\n  initShadersDone = true\n  return program\n}\n\nfunction loadShader(gl, type, source) {\n  // 创建顶点着色器对象\n  const shader = gl.createShader(type)\n  if (shader == null) {\n    console.log('创建着色器失败')\n    return null\n  }\n\n  // 引入着色器源代码\n  gl.shaderSource(shader, source)\n\n  // 编译着色器\n  gl.compileShader(shader)\n\n  // 检查顶是否编译成功\n  const compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS)\n  if (!compiled) {\n    const error = gl.getShaderInfoLog(shader)\n    console.log('编译着色器失败: ' + error)\n    gl.deleteShader(shader)\n    return null\n  }\n\n  return shader\n}\n\n// 初始化顶点坐标和顶点颜色\nfunction initVertexBuffers(gl, anchor2DList) {\n  const flattenPoints = []\n  anchor2DList.forEach(anchor => {\n    anchor.points.forEach(point => {\n      const {\n        x,\n        y\n      } = point\n      flattenPoints.push(x * 2 - 1, 1 - y * 2)\n    })\n  })\n\n  const vertices = new Float32Array(flattenPoints)\n  const n = flattenPoints.length / 2\n\n  // 创建缓冲区对象\n  const buffer = gl.createBuffer()\n  // 将顶点坐标和顶点颜色信息写入缓冲区对象\n  gl.bindBuffer(gl.ARRAY_BUFFER, buffer)\n  gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)\n\n  // 获取顶点着色器attribute变量a_Position存储地址, 分配缓存并开启\n  const a_Position = gl.getAttribLocation(gl.program, 'a_Position')\n  gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)\n  gl.enableVertexAttribArray(a_Position)\n  return n\n}\n\nconst EDGE_VSHADER_SOURCE =\n  `\n  attribute vec2 aPosition; \n  varying vec2 posJudge;\n\n  void main(void) {\n    gl_Position = vec4(aPosition.x, aPosition.y, 1.0, 1.0);\n    posJudge = aPosition;\n  }\n`\n\nconst EDGE_FSHADER_SOURCE =\n  `\n  precision highp float;\n  uniform vec2 rightTopPoint;\n  uniform vec2 centerPoint;\n  varying vec2 posJudge;\n\n  float box(float x, float y){\n    float xc = x - centerPoint.x;\n    float yc = y - centerPoint.y;\n    vec2 point = vec2(xc, yc);\n    float right = rightTopPoint.x;\n    float top =  rightTopPoint.y;\n    float line_width = 0.01;\n    vec2 b1 = 1.0 - step(vec2(right,top), abs(point));\n    float outer = b1.x * b1.y;\n    vec2 b2 = 1.0 - step(vec2(right-line_width,top-line_width), abs(point));\n    float inner = b2.x * b2.y;\n    return outer - inner;\n  }\n\n  void main(void) {\n      if(box(posJudge.x, posJudge.y) == 0.0 ) discard;\n\n      gl_FragColor = vec4(box(posJudge.x, posJudge.y), 0.0, 0.0, 1.0);\n\n  }\n`\n\nfunction initRectEdgeBuffer(gl, x, y, width, height) {\n  const shaderProgram = gl.program\n  const centerX = x * 2 - 1 + width\n  const centerY = -1 * (y * 2 - 1) - height\n  const right = width\n  const top = height\n  const vertices = [\n    -1.0, 1.0,\n    -1.0, -1.0,\n    1.0, 1.0,\n    1.0, -1.0\n  ]\n\n  const vertexBuffer = gl.createBuffer()\n  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)\n  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW)\n  const aPosition = gl.getAttribLocation(shaderProgram, 'aPosition')\n  gl.enableVertexAttribArray(aPosition)\n  gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, 0, 0)\n\n  const rightTop = [\n    right, top\n  ]\n  const rightTopLoc = gl.getUniformLocation(shaderProgram, 'rightTopPoint')\n  gl.uniform2fv(rightTopLoc, rightTop)\n\n  const centerPoint = [\n    centerX, centerY\n  ]\n  const centerPointLoc = gl.getUniformLocation(shaderProgram, 'centerPoint')\n  gl.uniform2fv(centerPointLoc, centerPoint)\n\n  const length = vertices.length / 2\n\n  return length\n}\n\nfunction onDrawRectEdge(gl, x, y, width, height) {\n  width = Math.round(width * 100) / 100\n  height = Math.round(height * 100) / 100\n  const n = initRectEdgeBuffer(gl, x, y, width, height)\n  gl.drawArrays(gl.TRIANGLE_STRIP, 0, n)\n}\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n     * 生命周期函数--监听页面加载\n     */\n    detached() {\n      initShadersDone = false\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({\n          theme\n        }) => {\n          this.setData({\n            theme\n          })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n    },\n    switchCamera(event) {\n      if (this.session.config) {\n        const config = this.session.config\n        const pos = Number(event.currentTarget.dataset.value)\n        config.cameraPosition = pos\n        this.session.config = config\n        this.setData({\n          cameraPosition: event.currentTarget.dataset.value\n        })\n      }\n    },\n    render(frame) {\n      const gl = this.gl\n\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n\n      const anchor2DList = this.data.anchor2DList\n\n      if (!anchor2DList || anchor2DList.length <= 0) {\n\n      } else {\n        if (!initShadersDone) {\n          this.vertexProgram = initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)\n          this.rectEdgeProgram = initShaders(gl, EDGE_VSHADER_SOURCE, EDGE_FSHADER_SOURCE)\n          if (!this.vertexProgram || !this.rectEdgeProgram) {\n            console.log('初始化着色器失败')\n            return\n          }\n          console.log('初始化着色器成功')\n        }\n\n        gl.useProgram(this.vertexProgram)\n        gl.program = this.vertexProgram\n        // 初始化顶点坐标和顶点颜色\n        const n = initVertexBuffers(gl, anchor2DList)\n\n        // 绘制点\n        gl.drawArrays(gl.POINTS, 0, n)\n\n        gl.useProgram(this.rectEdgeProgram)\n        gl.program = this.rectEdgeProgram\n\n        for (let i = 0; i < anchor2DList.length; i++) {\n          onDrawRectEdge(gl, anchor2DList[i].origin.x, anchor2DList[i].origin.y, anchor2DList[i].size.width, anchor2DList[i].size.height)\n        }\n      }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/body-detect/body-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"实时人体检测\",\n  \"pageOrientation\": \"auto\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/body-detect/body-detect.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <view><canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n    </canvas></view>\n  <view class=\"page-body-text tc\" style=\"height:20%\">提示：将摄像头对准人体, 检测到的人体将会被标记出识别框和人体部位标记点（需保证设备没有开启竖屏锁定）\n    <view wx:if=\"{{cameraPosition == 0}}\">\n        <button type=\"primary\" bindtap=\"switchCamera\" data-value=\"1\" disabled=\"{{buttonDisable}}\">切换为前置摄像头</button>\n    </view>\n    <view wx:else>\n        <button type=\"primary\" bindtap=\"switchCamera\" data-value=\"0\" disabled=\"{{buttonDisable}}\">切换为后置摄像头</button>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/body-detect/body-detect.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/body-detect/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/body-detect-3d/body-detect-3d.js",
    "content": "import arBehavior from '../behavior/behavior-ar'\nimport xrFrameBehavior from '../behavior/behavior-xrframe'\n\n// VK 投影矩阵参数定义\nconst NEAR = 0.01\nconst FAR = 1000\n\nconst loggerOnce = false\n\nComponent({\n  behaviors: [arBehavior, xrFrameBehavior],\n  data: {\n    theme: 'light',\n    widthScale: 1, // canvas宽度缩放值\n    heightScale: 0.85, // canvas高度缩放值\n    hintBoxList: [], // 显示提示盒子列表\n  },\n  markerIndex: 0, // 使用的 marker 索引\n  hintInfo: undefined, // 提示框信息\n  lifetimes: {\n    /**\n      * 生命周期函数--监听页面加载\n      */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n\n  methods: {\n    // 对应案例的初始化逻辑，由统一的 behavior 触发\n    init() {\n      // 初始化VK\n      // start完毕后，进行更新渲染循环\n      this.initVK()\n    },\n    initVK() {\n      // VKSession 配置\n      const session = this.session = wx.createVKSession({\n        track: {\n          body: {\n            mode: 1\n          }\n        },\n        version: 'v1',\n        gl: this.gl\n      })\n\n      try {\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          //  VKSession EVENT resize\n          session.on('resize', () => {\n            this.calcCanvasSize()\n          })\n\n          // 开启躯体三维识别\n          session.update3DMode({ open3d: true })\n\n          // VKSession EVENT addAnchors\n          session.on('addAnchors', anchors => {\n            console.log('addAnchor', anchors)\n          })\n\n          // VKSession EVENT updateAnchors\n          session.on('updateAnchors', anchors => {\n            // console.log(\"updateAnchors\", anchors);\n\n            const anchor = anchors[0]\n            // 目前只处理一个返回的躯体\n            if (anchor) {\n              // console.log('id', anchor.id);\n              // console.log('type', anchor.type);\n              // console.log('transform', anchor.transform);\n              // console.log('mesh', anchor.mesh);\n              // console.log('origin', anchor.origin);\n              // console.log('size', anchor.size);\n              // console.log('detectId', anchor.detectId);\n              // console.log('confidence', anchor.confidence);\n              // console.log('points3d', anchor.points3d);\n\n              this.bodyTransform = anchor.transform\n              this.bodyPosition3D = anchor.points3d\n\n              this.updateHintBoxVisble(this.hintBoxList, true)\n            }\n          })\n\n          // VKSession removeAnchors\n          // 识别目标丢失时不断触发\n          session.on('removeAnchors', anchors => {\n            // console.log(\"removeAnchors\");\n\n            this.updateHintBoxVisble(this.hintBoxList, false)\n          })\n\n          console.log('ready to initloop')\n          // start 初始化完毕后，进行更新渲染循环\n          this.initLoop()\n        })\n      } catch (e) {\n        console.error(e)\n      }\n    },\n    // 针对 xr-frame 的初始化逻辑\n    async initXRFrame() {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const scene = this.xrScene\n      const { rootShadow } = scene\n\n      // 缓存主相机\n      this.xrCameraMain = this.xrCamera\n      this.xrCameraMainTrs = this.xrCameraTrs\n\n      // 初始化YUV相机配置\n      this.initXRYUVCamera()\n\n      // === 初始躯体挂载点 ===\n      this.bodyWrap = scene.createElement(xrFrameSystem.XRNode)\n      this.bodyWrapTrs = this.bodyWrap.getComponent(xrFrameSystem.Transform)\n      rootShadow.addChild(this.bodyWrap)\n\n      // 加载提示点\n      this.hintBoxList = this.getHintBox(xrFrameSystem, scene, this.bodyWrap)\n    },\n    loop() {\n      // console.log('loop')\n\n      // 获取 VKFrame\n      const frame = this.session.getVKFrame(this.data.width, this.data.height)\n\n      // 成功获取 VKFrame 才进行\n      if (!frame) { return }\n\n      // 更新相机 YUV 数据\n      this.updataXRYUV(frame)\n\n      // 获取 VKCamera\n      const VKCamera = frame.camera\n\n      // 更新 xrFrame 相机矩阵\n      this.updataXRCameraMatrix(VKCamera, NEAR, FAR)\n\n      // 存在bodyWrao，执行信息同步逻辑\n      if (this.bodyWrap && this.bodyTransform) {\n        const xrFrameSystem = wx.getXrFrameSystem()\n\n        if (!this.DT) { this.DT = new xrFrameSystem.Matrix4() }\n        if (!this.DT2) { this.DT2 = new xrFrameSystem.Matrix4() }\n\n        // 目前VK返回的是行主序矩阵\n        // xrframe 矩阵存储为列主序\n        this.DT.setArray(this.bodyTransform)\n        this.DT.transpose(this.DT2)\n        this.bodyWrapTrs.setLocalMatrix(this.DT2)\n\n        // 更新提示点位置\n        this.updateHintBoxPosition(this.hintBoxList, this.bodyPosition3D)\n      }\n    },\n    getHintBox(xrFrameSystem, scene, wrap) {\n      // 初始化提示点\n      const geometryHint = scene.assets.getAsset('geometry', 'sphere')\n      const effectCube = scene.assets.getAsset('effect', 'standard')\n      const boxScale = 0.03\n      const hintBoxList = []\n      for (let i = 0; i < 24; i++) {\n        const colorFloat = i / 24\n        const el = scene.createElement(xrFrameSystem.XRNode, {\n          position: '0 0 0',\n          scale: `${boxScale} ${boxScale} ${boxScale}`,\n        })\n        const elTrs = el.getComponent(xrFrameSystem.Transform)\n        const mat = scene.createMaterial(effectCube)\n\n        const colorR = 1.0 - colorFloat\n        mat.setVector('u_baseColorFactor', xrFrameSystem.Vector4.createFromNumber(1.0, colorR, colorR, 1.0))\n\n        const mesh = el.addComponent(xrFrameSystem.Mesh, {\n          geometry: geometryHint,\n          material: mat,\n        })\n\n        wrap.addChild(el)\n        // elTrs.visible = false;\n\n        hintBoxList.push(elTrs)\n      }\n\n      return hintBoxList\n    },\n    updateHintBoxPosition(hintBoxList, points3d) {\n      if (hintBoxList && hintBoxList.length > 0) {\n        // console.log('ready to set', hintBoxList);\n        // 存在提示列表，则更新点信息\n        for (let i = 0; i < hintBoxList.length; i++) {\n          const hintBox = hintBoxList[i]\n          hintBox.position.x = points3d[i].x\n          hintBox.position.y = points3d[i].y\n          hintBox.position.z = points3d[i].z\n        }\n      }\n    },\n    updateHintBoxVisble(hintBoxList, visible) {\n      if (hintBoxList && hintBoxList.length > 0) {\n        // console.log('ready to set', hintBoxList);\n        // 存在提示列表，则更新点信息\n        for (let i = 0; i < hintBoxList.length; i++) {\n          const hintBox = hintBoxList[i]\n          if (hintBox.visible !== visible) {\n            hintBox.visible = visible\n          }\n        }\n      }\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/body-detect-3d/body-detect-3d.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-frame-canvas\": \"../components/xr-frame/index\"\n  },\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"躯体三维识别\",\n  \"pageOrientation\": \"auto\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/body-detect-3d/body-detect-3d.wxml",
    "content": "\n<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view\n    class=\"canvas-wrap\" style=\"width: {{widthScale * 100}}%; height: {{heightScale * 100}}%\"\n  >\n    <xr-frame-canvas\n      disable-scroll\n      id=\"canvas\"\n      width=\"{{width}}\"\n      height=\"{{height}}\"\n      style=\"width:{{domWidth}}px;height:{{domHeight}}px;\"\n      bind:sceneReady=\"handleXRSceneReady\"\n    ></xr-frame-canvas>\n\n  </view>\n\n  <view class=\"hint-bottom page-body-text tc\">\n    <view class=\"btn-wrap\">\n      <button class=\"btn\" type=\"primary\" bindtap=\"switchCamera\">切换前后置摄像头</button>\n    </view>\n    <text>提示：摄像头对准人体，然后会显示24个关键点的三维坐标提示小球；横屏情况，会自动切换横屏小程序（需保证设备没有开启竖屏锁定）</text>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/body-detect-3d/body-detect-3d.wxss",
    "content": ".canvas-wrap {\n  position: relative;\n  width: 100%;\n  background-color: #000;\n}\n\n.canvas-wrap canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.canvas-wrap #canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n\n.hint-bottom {\n  position: absolute;\n  left: 20px;\n  right: 20px;\n  bottom: 20px;\n  padding: 5px 10px;\n  font-size: 14px;\n  color: #fff;\n  background-color: rgba(0, 0, 0, 0.4);\n  border-radius: 6px;\n}\n\n.hint-bottom .btn-wrap {\n  display: flex;\n}\n\n.hint-bottom .btn{\n  margin: 10px 5px;\n  font-size: 14px;\n  line-height: 18px;\n}\n.wrap-option {\n  position: absolute;\n  left: 20rpx;\n  right: 0;\n  bottom: 20rpx;\n  height: 10%;\n  display: flex;\n}\n\n.wrap-option button {\n  flex: 1;\n  margin: 20rpx 20rpx 20rpx 0;\n  font-size: 30rpx;\n  line-height: 1.2;\n}\n.hint-bottom .btn-wrap {\n  display: flex;\n}\n\n.hint-bottom .btn{\n  flex: 1;\n  margin: 10px 5px;\n  font-size: 18px;\n  line-height: 24px;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/cameraBuffer-detect/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          cameraPosition: 0,\n          gl: this.gl,\n          version: 'v1'\n        })\n\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          this.setData({\n            buttonDisable: false\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/cameraBuffer-detect/cameraBuffer-detect.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\nimport cameraBufferBehavior from './cameraBufferBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\n// 初始化着色器函数\nlet initShadersDone = false\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior, cameraBufferBehavior],\n  data: {\n    theme: 'light',\n    cameraPosition: 0,\n    buttonDisable: true,\n  },\n  lifetimes: {\n    /**\n     * 生命周期函数--监听页面加载\n     */\n    detached() {\n      initShadersDone = false\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({\n          theme\n        }) => {\n          this.setData({\n            theme\n          })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n      this.initCameraBufferGL()\n\n      initShadersDone = true\n    },\n    render(frame) {\n      if (!initShadersDone) return\n      const gl = this.gl\n\n      this.renderGL(frame)\n      this.renderCameraBufferGL(frame)\n\n      const camera = frame.camera\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/cameraBuffer-detect/cameraBuffer-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"相机帧测试\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/cameraBuffer-detect/cameraBuffer-detect.less",
    "content": "/* packageAPI/pages/ar/cameraBuffer-detect/cameraBuffer-detect.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/cameraBuffer-detect/cameraBuffer-detect.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <view><canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n    </canvas>\n    </view>\n  <view class=\"page-body-text tc\" style=\"height:20%\">提示：将摄像头对准场景, 检测到的场景会标记出相机缓冲图信息</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/cameraBuffer-detect/cameraBuffer-detect.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/cameraBuffer-detect/cameraBufferBehavior.js",
    "content": "const cameraBufferBehavior = Behavior({\n  methods: {\n    initCameraBufferShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_texture_float')\n      if (!ext) console.warn('OES_texture_float not support')\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        precision highp float;\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n        uniform sampler2D cameraBuffer_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 cameraBuffer_color = texture2D(cameraBuffer_texture, v_texCoord);\n          gl_FragColor = vec4(cameraBuffer_color.rgb, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._cameraBufferProgram = gl.createProgram()\n      this._cameraBufferProgram.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformTexture = gl.getUniformLocation(program, 'cameraBuffer_texture')\n      gl.uniform1i(uniformTexture, 5)\n\n      this._cameraBufferDt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initCameraBufferVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const width = Math.floor(this.canvas.width / 16) * 16\n      const height = this.canvas.height\n\n      const posAttr = gl.getAttribLocation(this._cameraBufferProgram, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.3, 0.3, 1, 0.3, 0.3, 1, 1, 1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._cameraBufferProgram, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._cameraBufferVao = vao\n    },\n    initCameraBufferGL() {\n      this.initCameraBufferShader()\n      this.initCameraBufferVAO()\n      this.once = 1\n    },\n\n    renderCameraBufferGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const displayTransform = frame.getDisplayTransform()\n\n      const width = Math.floor(this.canvas.width / 16) * 16\n      const height = this.canvas.height\n\n      const cameraBufferRes = frame.getCameraBuffer(width, height)\n\n      const texture = gl.createTexture()\n      if (cameraBufferRes) {\n        const cameraBuffer = new Uint8Array(cameraBufferRes)\n\n        const data = new Uint8Array(width * height * 4)\n        for (let i = 0; i < cameraBuffer.length; i++) {\n          const num = parseInt(cameraBuffer[i] * 255)\n          data[i] = num\n        }\n\n        gl.bindTexture(gl.TEXTURE_2D, texture)\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data)\n      }\n\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n      gl.useProgram(this._cameraBufferProgram)\n      this.ext.bindVertexArrayOES(this._cameraBufferVao)\n\n      gl.uniformMatrix3fv(this._cameraBufferDt, false, displayTransform)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n      gl.bindTexture(gl.TEXTURE_2D, texture)\n\n      gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n      gl.useProgram(currentProgram)\n      gl.activeTexture(currentActiveTexture)\n      this.ext.bindVertexArrayOES(currentVAO)\n    },\n  },\n})\n\nexport default cameraBufferBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/cameraBuffer-detect/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/cameraBuffer-jpg/cameraBuffer-jpg.js",
    "content": "import arBehavior from '../behavior/behavior-ar'\nimport threeBehavior from '../behavior/behavior-three'\n\n// VK 投影矩阵参数定义\nconst NEAR = 0.01\nconst FAR = 1000\n\nComponent({\n  behaviors: [arBehavior, threeBehavior],\n  data: {\n    theme: 'light',\n    widthScale: 1, // canvas宽度缩放值\n    heightScale: 0.57, // canvas高度缩放值\n    jpgUrl: '',\n  },\n  useLoopLog: false, // 是否开启循环log\n  imgIndex: 0,\n  lifetimes: {\n    /**\n      * 生命周期函数--监听页面加载\n      */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n\n  methods: {\n    // 对应案例的初始化逻辑，由统一的 behavior 触发\n    init() {\n      // 初始化 Three.js，用于模型相关的渲染\n      this.initTHREE()\n\n      // 初始化 GL，基于 Three.js 的 Context，用于相机YUV渲染\n      this.initYUV()\n\n      // 初始化VK\n      // start完毕后，进行更新渲染循环\n      this.initVK()\n\n      this.useLoopLog = false\n      this.imgIndex = 0\n    },\n    initVK() {\n      // VKSession 配置\n      const session = this.session = wx.createVKSession({\n        track: {\n          plane: {\n            mode: 1\n          },\n        },\n        version: 'v2',\n        gl: this.gl\n      })\n\n      session.start(err => {\n        if (err) return console.error('VK error: ', err)\n\n        console.log('@@@@@@@@ VKSession.version', session.version)\n\n        //  VKSession EVENT resize\n        session.on('resize', () => {\n          this.calcCanvasSize()\n        })\n\n        // VKSession EVENT addAnchors\n        session.on('addAnchors', anchors => {\n        })\n\n        // VKSession EVENT updateAnchors\n        session.on('updateAnchors', anchors => {\n\n        })\n\n        // VKSession removeAnchors\n        // 识别目标丢失时，会触发一次\n        session.on('removeAnchors', anchors => {\n          // console.log('removeAnchors', anchors)\n        })\n\n        console.log('ready to initloop')\n        // start 初始化完毕后，进行更新渲染循环\n        this.initLoop()\n\n        // 绘制双面，以及去掉清屏，用于显示yuv\n        this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n      })\n    },\n    loop() {\n      // 获取 VKFrame\n      const frame = this.session.getVKFrame(this.canvas.width, this.canvas.height)\n\n      // 成功获取 VKFrame 才进行\n      if (!frame) { return }\n\n      // 更新相机 YUV 数据\n      this.renderYUV(frame)\n\n      // 获取 VKCamera\n      const VKCamera = frame.camera\n\n      if (this.useLoopLog) {\n        // let transformStr = '';\n        // for (let i = 0; i < 16; i++)\n        // transformStr += VKCamera.transform[i] + ' ';\n        // console.log('VKCamera.transform', transformStr);\n\n        console.log('timeStamp', frame.timestamp)\n\n        let viewMatrixStr = ''\n        for (let i = 0; i < 16; i++) viewMatrixStr += VKCamera.viewMatrix[i] + ' '\n        // console.log('VKCamera.viewMatrix', viewMatrixStr);\n        if (this.preTimestamp && this.preTimestamp === frame.timestamp) {\n          if (this.preViewMatrixStr && this.preViewMatrixStr !== viewMatrixStr) {\n            console.log('preViewMatrixStr', this.preViewMatrixStr)\n            console.log('viewMatrixStr', viewMatrixStr)\n            console.log('Timestamp is same. But viewMatrix is not same')\n          }\n        }\n        this.preTimestamp = frame.timestamp\n        this.preViewMatrixStr = viewMatrixStr\n      }\n    },\n    getJpgImg() {\n      console.log('Function getJpgImg')\n\n      // 按需写入获取 jpg 的 大小 和质量\n      const width = 640\n      const height = 480\n      const quality = 90\n\n      // 获取 VKFrame\n      const frame = this.session.getVKFrame(width, height)\n\n      // 成功获取 VKFrame 才进行\n      if (!frame) { return }\n\n      console.log('getCameraJpgBuffer: ', width, height, quality)\n\n      const t1 = new Date().getTime()\n      const jpgBuffer = frame.getCameraJpgBuffer(width, height, quality)\n      const t2 = new Date().getTime()\n\n      console.log(`getCameraJpgBuffer cost ${t2 - t1}ms`)\n\n      // console.log('jpgBuffer', jpgBuffer);\n\n      const jpgUrl = this.saveLocalJPG(jpgBuffer, 'cameraJPG')\n\n      console.log('jpgUrl', jpgUrl)\n\n      this.setData({\n        jpgUrl\n      })\n    },\n    saveLocalJPG(bufferContent, name) {\n      const url = `${wx.env.USER_DATA_PATH}/${name + this.imgIndex + '.jpg'}`\n\n      const fs = wx.getFileSystemManager()\n      try {\n        // 存在即删除\n        const unlinkRes = fs.unlinkSync(url)\n        // console.log('unlinkSync', unlinkRes)\n\n        this.imgIndex++\n        const newUrl = `${wx.env.USER_DATA_PATH}/${name + this.imgIndex + '.jpg'}`\n\n        // console.log('write newUrl', newUrl)\n        // 写入，新图片\n        const writeRes = fs.writeFileSync(\n          newUrl,\n          bufferContent,\n          'utf8'\n        )\n\n        return newUrl\n      } catch (e) {\n        // 利用catch实现，此时，为新写入\n        try {\n          // console.log('write url', url)\n\n          // 写入\n          const writeRes = fs.writeFileSync(\n            url,\n            bufferContent,\n            'utf8'\n          )\n        } catch (e) {\n          console.error(e)\n        }\n      }\n\n      return url\n    },\n    getLog() {\n      console.log('Function getLog')\n\n      this.useLoopLog = !this.useLoopLog\n    },\n\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/cameraBuffer-jpg/cameraBuffer-jpg.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"相机帧获取jpg图片\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/cameraBuffer-jpg/cameraBuffer-jpg.wxml",
    "content": "\n<view class=\"page wrap-fix\" data-weui-theme=\"{{theme}}\">\n  <view class=\"canvas-wrap\" style=\"width: {{widthScale * 100}}%; height: {{heightScale * 100}}%\">\n    <canvas type=\"webgl\" id=\"canvas\"></canvas>\n  </view>\n\n  <view class=\"hint-words\">提示：点击获取，会将摄像头资源转成贴图(需基础库3.4.4)</view>\n\n  <view class=\"wrap-option\">\n    <view class=\"row\">\n      <button type=\"primary\" bindtap=\"getJpgImg\">获取jpg图像</button>\n      <button type=\"primary\" bindtap=\"getLog\">开关调试log(时间戳)</button>\n    </view>\n\n  </view>\n\n  <view class=\"hint-img-wrap\">\n    <view class=\"hint-img-box\">\n      <image class=\"hint-img\" wx:if=\"{{jpgUrl !== ''}}\" src=\"{{jpgUrl}}\" mode=\"aspectFit\" />\n    </view>\n  </view>\n\n\n</view>\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/cameraBuffer-jpg/cameraBuffer-jpg.wxss",
    "content": ".canvas-wrap {\n  position: relative;\n  width: 100%;\n  background-color: #000;\n}\n\n.canvas-wrap #canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.hint-box {\n  position: absolute;\n  left: 0%;\n  top: 0%;\n  width: 0;\n  height: 0;\n}\n.hint-id {\n  position: absolute;\n  left: -6rpx;\n  right: -6rpx;\n  bottom: 100%;\n  color: #fff;\n  font-size: 20rpx;\n  line-height: 40rpx;\n  text-align: center;\n  text-overflow: ellipsis;\n  background-color: #07c160;\n  border-radius: 8rpx;\n\n}\n\n.wrap-fix {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.hint-words {\n  position: absolute;\n  left: 20rpx;\n  top: 20rpx;\n  right: 20rpx;\n  padding: 10rpx 20rpx;\n  line-height: 40rpx;\n  text-align: center;\n  border-radius: 6rpx;\n  background-color: rgba(0, 0, 0, .3);\n  font-size: 26rpx;\n  color: #fff;\n}\n\n\n.hint-img-wrap {\n  position: absolute;\n  left: 25%;\n  bottom: 0%;\n  width: 50%;\n  height: 30%;\n}\n\n.hint-img-box {\n  position: absolute;\n  left: 5%;\n  top: 5%;\n  right: 5%;\n  bottom: 5%;\n  background-color: #fafafa;\n  border: 4rpx solid;\n}\n\n.hint-img {\n  position: absolute;\n  left: 4%;\n  top: 4%;\n  width: 92%;\n  height: 92%;\n}\n\n.wrap-option {\n  position: absolute;\n  left: 20rpx;\n  right: 0;\n  bottom: 30%;\n  height: 10%;\n  flex-direction: column;\n  display: flex;\n}\n\n.wrap-option .row {\n  flex: 1;\n  display: flex;\n  flex-direction: row;\n  text-align: center;\n}\n.wrap-option button {\n  flex: 1;\n  margin: 5rpx 20rpx 20rpx 0;\n  font-size: 30rpx;\n  line-height: 1.2;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/components/xr-frame/index.js",
    "content": "Component({\n  behaviors: [],\n  properties: {\n  },\n  data: {\n    renderTargetWidth: 0,\n    renderTargetHeight: 0,\n    pixelRatioReady: false,\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n\n      // 获取屏幕比例，用作后处理rt比例\n      const info = wx.getSystemInfoSync()\n      const pixelRatio = info.pixelRatio\n      this.setData({\n        pixelRatioReady: true,\n        renderTargetWidth: info.windowWidth * pixelRatio,\n        renderTargetHeight: info.windowHeight * pixelRatio,\n      })\n\n      const camera = this.scene.getElementById('camera').getComponent('camera')\n\n      // 暴露scene对象到外部进行定制\n      this.triggerEvent('sceneReady', { scene: xrScene, camera })\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/components/xr-frame/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/components/xr-frame/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets wx:if=\"{{pixelRatioReady}}\">\n    <xr-asset-render-texture asset-id=\"rt\" width=\"1024\" height=\"2048\" />\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\" />\n  <xr-node>\n    <xr-node node-id=\"center\" position=\"0 0 0\"></xr-node>\n    <!-- rt相机 cull-mask=\"0b101\" 只绘制 layer 为 0 (默认值) 以及 layer为 2 的元素，用于后处理逻辑，比如shoeMasks -->\n    <xr-camera wx:if=\"{{pixelRatioReady}}\"\n      id=\"rtCamera\" node-id=\"rtCamera\" position=\"0 0 0\" clear-color=\"0.0 0.0 0.0 0.0\"\n      near=\"0.01\" far=\"1000\"\n      render-target=\"rt\"\n      target=\"center\" cull-mask=\"0b101\"\n    ></xr-camera>\n    <!-- 主相机 cull-mask=\"0b11\" 只绘制 layer 为 0 (默认值) 以及 layer为 1 的元素 -->\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 0 2\" clear-color=\"1 1 1 1\"\n      target=\"center\"\n      near=\"0.01\" far=\"1000\"\n      cull-mask=\"0b11\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"80 20 0\" color=\"1 1 1\" intensity=\"2\"/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/components/xr-frame/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/components/xr-frame-render/index.js",
    "content": "Component({\n  behaviors: [],\n  properties: {\n  },\n  data: {\n    renderTargetWidth: 0,\n    renderTargetHeight: 0,\n    pixelRatioReady: false,\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n\n      const camera = this.scene.getElementById('camera').getComponent('camera')\n\n      // 暴露scene对象到外部进行定制\n      this.triggerEvent('sceneReady', { scene: xrScene, camera })\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/components/xr-frame-render/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/components/xr-frame-render/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets>\n  </xr-assets>\n  <!-- <xr-env env-data=\"xr-frame-team-workspace-day\" /> -->\n  <xr-node>\n    <xr-node node-id=\"center\" position=\"0 0 0\"></xr-node>\n    <xr-shadow id=\"geometryRoot\" node-id=\"geometryRoot\"></xr-shadow>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"2 0.1 2\" geometry=\"cube\" uniforms=\"u_baseColorFactor:1 1 1 1\" ></xr-mesh>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"-0.242 1.442 0.079\" clear-color=\"0.8 0.8 0.8 1\"\n      target=\"center\"\n      near=\"0.01\" far=\"1000\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"80 20 0\" color=\"1 1 1\" intensity=\"2\"/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/components/xr-frame-render/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/depth-detect/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            depth: {\n              mode: 1\n            }\n          },\n          cameraPosition: 0,\n          gl: this.gl,\n          version: 'v1'\n        })\n\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          this.setData({\n            buttonDisable: false\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/depth-detect/depth-detect.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\nimport depthBehavior from './depthBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\n// 初始化着色器函数\nlet initShadersDone = false\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior, depthBehavior],\n  data: {\n    theme: 'light',\n    cameraPosition: 0,\n    buttonDisable: true,\n  },\n  lifetimes: {\n    /**\n     * 生命周期函数--监听页面加载\n     */\n    detached() {\n      initShadersDone = false\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({\n          theme\n        }) => {\n          this.setData({\n            theme\n          })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n      this.initDepthGL()\n      initShadersDone = true\n    },\n    render(frame) {\n      if (!initShadersDone) return\n      const gl = this.gl\n\n      this.renderGL(frame)\n      this.renderDepthGL(frame)\n\n      const camera = frame.camera\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/depth-detect/depth-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"实时深度图检测\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/depth-detect/depth-detect.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <view><canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n    </canvas>\n    </view>\n  <view class=\"page-body-text tc\" style=\"height:20%\">提示：将摄像头对准场景, 检测到的场景会标记出深度图信息</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/depth-detect/depth-detect.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/depth-detect/depthBehavior.js",
    "content": "const depthBehavior = Behavior({\n  methods: {\n    initDepthShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_texture_float')\n      if (!ext) console.warn('OES_texture_float not support')\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        precision highp float;\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n        uniform sampler2D depth_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 depth_color = texture2D(depth_texture, v_texCoord);\n          gl_FragColor = vec4(depth_color.rgb, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._depthProgram = gl.createProgram()\n      this._depthProgram.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformTexture = gl.getUniformLocation(program, 'depth_texture')\n      gl.uniform1i(uniformTexture, 5)\n\n      this._depthDt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initDepthVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._depthProgram, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.3, 0.3, 1, 0.3, 0.3, 1, 1, 1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._depthProgram, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._depthVao = vao\n    },\n    initDepthGL() {\n      this.initDepthShader()\n      this.initDepthVAO()\n    },\n    renderDepthGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      // const depthTexture = frame.getDepthTexture(gl)\n      const displayTransform = frame.getDisplayTransform()\n      // if (depthTexture) {\n      //     const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      //     const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n      //     const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n      //     gl.useProgram(this._depthProgram)\n      //     this.ext.bindVertexArrayOES(this._depthVao)\n\n      //     gl.uniformMatrix3fv(this._dt, false, displayTransform)\n\n      //     const ext = gl.getExtension(\"OES_texture_float\");\n      //     if (!ext) console.warn('OES_texture_float not support');\n\n      //     gl.activeTexture(gl.TEXTURE0 + 5)\n      //     const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n      //     gl.bindTexture(gl.TEXTURE_2D, depthTexture)\n\n      //     gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n      //     gl.activeTexture(gl.TEXTURE0 + 5)\n      //     gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n      //     gl.useProgram(currentProgram)\n      //     gl.activeTexture(currentActiveTexture)\n      //     this.ext.bindVertexArrayOES(currentVAO)\n      // }\n\n      // DepthBuffer\n      const depthBufferRes = frame.getDepthBuffer()\n      const depthBuffer = new Float32Array(depthBufferRes.DepthAddress)\n\n      const texture = gl.createTexture()\n      gl.bindTexture(gl.TEXTURE_2D, texture)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n\n      const width = depthBufferRes.width\n      const height = depthBufferRes.height\n\n      const ext = gl.getExtension('OES_texture_float')\n      if (ext) {\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.FLOAT, depthBuffer)\n      } else {\n        const data = new Uint8Array(width * height * 4)\n        for (let i = 0; i < depthBuffer.length; i++) {\n          const num = parseInt(depthBuffer[i] * 255)\n          data[i] = num\n        }\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data)\n      }\n\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n      gl.useProgram(this._depthProgram)\n      this.ext.bindVertexArrayOES(this._depthVao)\n\n      gl.uniformMatrix3fv(this._depthDt, false, displayTransform)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n      gl.bindTexture(gl.TEXTURE_2D, texture)\n\n      gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n      gl.useProgram(currentProgram)\n      gl.activeTexture(currentActiveTexture)\n      this.ext.bindVertexArrayOES(currentVAO)\n    },\n  },\n})\n\nexport default depthBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/depth-detect/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n      cameraPosition: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            face: {\n              mode: 1\n            }\n          },\n          cameraPosition: 1,\n          version: 'v1',\n          gl: this.gl\n        })\n\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          session.on('addAnchors', anchors => {\n            this.data.anchor2DList = anchors.map(anchor => ({\n              points: anchor.points,\n              origin: anchor.origin,\n              size: anchor.size\n            }))\n          })\n          session.on('updateAnchors', anchors => {\n            this.data.anchor2DList = []\n            // 摄像头实时检测人脸的时候 updateAnchors 会在每帧触发，所以性能要求更高，用 gl 画\n            this.data.anchor2DList = this.data.anchor2DList.concat(anchors.map(anchor => ({\n              points: anchor.points,\n              origin: anchor.origin,\n              size: anchor.size\n            })))\n          })\n          session.on('removeAnchors', anchors => {\n            this.data.anchor2DList = []\n          })\n\n          this.setData({\n            buttonDisable: false\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect/face-detect.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\n// 顶点着色器\nconst VSHADER_SOURCE = '' +\n  'attribute vec4 a_Position;\\n' + // 声明attribute变量a_Position，用来存放顶点位置信息\n  'void main(){\\n' +\n  '  gl_Position = a_Position;\\n' + // 将顶点坐标赋值给顶点着色器内置变量gl_Position\n  '  gl_PointSize = 4.0;\\n' + // 设置顶点大小\n  '}\\n'\n\n// 片元着色器\nconst FSHADER_SOURCE = '' +\n  '#ifdef GL_ES\\n' +\n  ' precision mediump float;\\n' + // 设置精度\n  '#endif\\n' +\n  'varying vec4 v_Color;\\n' + // 声明varying变量v_Color，用来接收顶点着色器传送的片元颜色信息\n  'void main(){\\n' +\n  '  float d = distance(gl_PointCoord, vec2(0.5, 0.5));\\n' + // 计算像素距离中心点的距离\n  '  if(d < 0.5) {\\n' + // 距离大于0.5放弃片元，小于0.5保留片元\n  '    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\\n' +\n  '  } else { discard; }\\n' +\n  '}\\n'\n\n// 初始化着色器函数\nlet initShadersDone = false\n\nfunction initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE) {\n  // 创建顶点着色器对象\n  const vertexShader = loadShader(gl, gl.VERTEX_SHADER, VSHADER_SOURCE)\n  // 创建片元着色器对象\n  const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, FSHADER_SOURCE)\n\n  if (!vertexShader || !fragmentShader) {\n    return null\n  }\n\n  // 创建程序对象program\n  const program = gl.createProgram()\n  if (!gl.createProgram()) {\n    return null\n  }\n  // 分配顶点着色器和片元着色器到program\n  gl.attachShader(program, vertexShader)\n  gl.attachShader(program, fragmentShader)\n  // 链接program\n  gl.linkProgram(program)\n\n  // 检查程序对象是否连接成功\n  const linked = gl.getProgramParameter(program, gl.LINK_STATUS)\n  if (!linked) {\n    const error = gl.getProgramInfoLog(program)\n    console.log('程序对象连接失败: ' + error)\n    gl.deleteProgram(program)\n    gl.deleteShader(fragmentShader)\n    gl.deleteShader(vertexShader)\n    return null\n  }\n  // 返回程序program对象\n  initShadersDone = true\n  return program\n}\n\nfunction loadShader(gl, type, source) {\n  // 创建顶点着色器对象\n  const shader = gl.createShader(type)\n  if (shader == null) {\n    console.log('创建着色器失败')\n    return null\n  }\n\n  // 引入着色器源代码\n  gl.shaderSource(shader, source)\n\n  // 编译着色器\n  gl.compileShader(shader)\n\n  // 检查顶是否编译成功\n  const compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS)\n  if (!compiled) {\n    const error = gl.getShaderInfoLog(shader)\n    console.log('编译着色器失败: ' + error)\n    gl.deleteShader(shader)\n    return null\n  }\n\n  return shader\n}\n\n// 初始化顶点坐标和顶点颜色\nfunction initVertexBuffers(gl, anchor2DList) {\n  const flattenPoints = []\n  anchor2DList.forEach(anchor => {\n    anchor.points.forEach(point => {\n      const {\n        x,\n        y\n      } = point\n      flattenPoints.push(x * 2 - 1, 1 - y * 2)\n    })\n  })\n\n  const vertices = new Float32Array(flattenPoints)\n  const n = flattenPoints.length / 2\n\n  // 创建缓冲区对象\n  const buffer = gl.createBuffer()\n  // 将顶点坐标和顶点颜色信息写入缓冲区对象\n  gl.bindBuffer(gl.ARRAY_BUFFER, buffer)\n  gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)\n\n  // 获取顶点着色器attribute变量a_Position存储地址, 分配缓存并开启\n  const a_Position = gl.getAttribLocation(gl.program, 'a_Position')\n  gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)\n  gl.enableVertexAttribArray(a_Position)\n  return n\n}\n\nconst EDGE_VSHADER_SOURCE =\n  `\n  attribute vec2 aPosition; \n  varying vec2 posJudge;\n\n  void main(void) {\n    gl_Position = vec4(aPosition.x, aPosition.y, 1.0, 1.0);\n    posJudge = aPosition;\n  }\n`\n\nconst EDGE_FSHADER_SOURCE =\n  `\n  precision highp float;\n  uniform vec2 rightTopPoint;\n  uniform vec2 centerPoint;\n  varying vec2 posJudge;\n\n  float box(float x, float y){\n    float xc = x - centerPoint.x;\n    float yc = y - centerPoint.y;\n    vec2 point = vec2(xc, yc);\n    float right = rightTopPoint.x;\n    float top =  rightTopPoint.y;\n    float line_width = 0.01;\n    vec2 b1 = 1.0 - step(vec2(right,top), abs(point));\n    float outer = b1.x * b1.y;\n    vec2 b2 = 1.0 - step(vec2(right-line_width,top-line_width), abs(point));\n    float inner = b2.x * b2.y;\n    return outer - inner;\n  }\n\n  void main(void) {\n      if(box(posJudge.x, posJudge.y) == 0.0 ) discard;\n\n      gl_FragColor = vec4(box(posJudge.x, posJudge.y), 0.0, 0.0, 1.0);\n\n  }\n`\n\nfunction initRectEdgeBuffer(gl, x, y, width, height) {\n  const shaderProgram = gl.program\n  const centerX = x * 2 - 1 + width\n  const centerY = -1 * (y * 2 - 1) - height\n  const right = width\n  const top = height\n  const vertices = [\n    -1.0, 1.0,\n    -1.0, -1.0,\n    1.0, 1.0,\n    1.0, -1.0\n  ]\n\n  const vertexBuffer = gl.createBuffer()\n  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)\n  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW)\n  const aPosition = gl.getAttribLocation(shaderProgram, 'aPosition')\n  gl.enableVertexAttribArray(aPosition)\n  gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, 0, 0)\n\n  const rightTop = [\n    right, top\n  ]\n  const rightTopLoc = gl.getUniformLocation(shaderProgram, 'rightTopPoint')\n  gl.uniform2fv(rightTopLoc, rightTop)\n\n  const centerPoint = [\n    centerX, centerY\n  ]\n  const centerPointLoc = gl.getUniformLocation(shaderProgram, 'centerPoint')\n  gl.uniform2fv(centerPointLoc, centerPoint)\n\n  const length = vertices.length / 2\n\n  return length\n}\n\nfunction onDrawRectEdge(gl, x, y, width, height) {\n  width = Math.round(width * 100) / 100\n  height = Math.round(height * 100) / 100\n  const n = initRectEdgeBuffer(gl, x, y, width, height)\n  gl.drawArrays(gl.TRIANGLE_STRIP, 0, n)\n}\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    theme: 'light',\n    cameraPosition: 1,\n    buttonDisable: true,\n  },\n  lifetimes: {\n    /**\n     * 生命周期函数--监听页面加载\n     */\n    detached() {\n      initShadersDone = false\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({\n          theme\n        }) => {\n          this.setData({\n            theme\n          })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n    },\n    switchCamera(event) {\n      if (this.session.config) {\n        const config = this.session.config\n        const pos = Number(event.currentTarget.dataset.value)\n        config.cameraPosition = pos\n        this.session.config = config\n        this.setData({\n          cameraPosition: event.currentTarget.dataset.value\n        })\n      }\n    },\n    render(frame) {\n      const gl = this.gl\n\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n\n      const anchor2DList = this.data.anchor2DList\n\n      if (!anchor2DList || anchor2DList.length <= 0) {\n\n      } else {\n        if (!initShadersDone) {\n          this.vertexProgram = initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)\n          this.rectEdgeProgram = initShaders(gl, EDGE_VSHADER_SOURCE, EDGE_FSHADER_SOURCE)\n          if (!this.vertexProgram || !this.rectEdgeProgram) {\n            console.log('初始化着色器失败')\n            return\n          }\n          console.log('初始化着色器成功')\n        }\n\n        gl.useProgram(this.vertexProgram)\n        gl.program = this.vertexProgram\n        // 初始化顶点坐标和顶点颜色\n        const n = initVertexBuffers(gl, anchor2DList)\n\n        // 绘制点\n        gl.drawArrays(gl.POINTS, 0, n)\n\n        gl.useProgram(this.rectEdgeProgram)\n        gl.program = this.rectEdgeProgram\n\n        for (let i = 0; i < anchor2DList.length; i++) {\n          onDrawRectEdge(gl, anchor2DList[i].origin.x, anchor2DList[i].origin.y, anchor2DList[i].size.width, anchor2DList[i].size.height)\n        }\n      }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect/face-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"实时人脸检测\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect/face-detect.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <view><canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n    </canvas></view>\n  <view class=\"page-body-text tc\" style=\"height:20%\">提示：将摄像头对准人脸, 检测到的人脸将会被标记出识别框和面部标记点\n    <view wx:if=\"{{cameraPosition == 0}}\">\n        <button type=\"primary\" bindtap=\"switchCamera\" data-value=\"1\" disabled=\"{{buttonDisable}}\">切换为前置摄像头</button>\n    </view>\n    <view wx:else>\n        <button type=\"primary\" bindtap=\"switchCamera\" data-value=\"0\" disabled=\"{{buttonDisable}}\">切换为后置摄像头</button>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect/face-detect.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect-3d/face-detect-3d.js",
    "content": "import arBehavior from '../behavior/behavior-ar'\nimport xrFrameBehavior from '../behavior/behavior-xrframe'\n\n// VK 投影矩阵参数定义\nconst NEAR = 0.01\nconst FAR = 1000\n\nconst loggerOnce = false\n\nComponent({\n  behaviors: [arBehavior, xrFrameBehavior],\n  data: {\n    theme: 'light',\n    widthScale: 1, // canvas宽度缩放值\n    heightScale: 0.8, // canvas高度缩放值\n    hintBoxList: [], // 显示提示盒子列表,\n  },\n  markerIndex: 0, // 使用的 marker 索引\n  hintInfo: undefined, // 提示框信息\n  lifetimes: {\n    /**\n      * 生命周期函数--监听页面加载\n      */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n\n  methods: {\n    // 对应案例的初始化逻辑，由统一的 behavior 触发\n    init() {\n      // 初始化VK\n      // start完毕后，进行更新渲染循环\n      this.initVK()\n    },\n    initVK() {\n      // VKSession 配置\n      const session = this.session = wx.createVKSession({\n        track: {\n          face: {\n            mode: 1\n          }\n        },\n        version: 'v1',\n        gl: this.gl\n      })\n\n      try {\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          //  VKSession EVENT resize\n          session.on('resize', () => {\n            this.calcCanvasSize()\n          })\n\n          // 开启三维识别\n          session.update3DMode({ open3d: true })\n\n          // VKSession EVENT addAnchors\n          session.on('addAnchors', anchors => {\n            console.log('addAnchor', anchors)\n          })\n\n          let preAnchorNumber = 0\n          // VKSession EVENT updateAnchors\n          session.on('updateAnchors', anchors => {\n            // console.log(\"updateAnchors\", anchors);\n\n            // 遍历不同的识别目标\n            for (let i = 0; i < anchors.length; i++) {\n              const anchor = anchors[i]\n\n              let faceWrap = this.faceWrapMap[i]\n              if (!faceWrap) {\n                this.initBindingNode(i)\n\n                faceWrap = this.faceWrapMap[i]\n              }\n\n              const xrFrameSystem = wx.getXrFrameSystem()\n\n              // 更新显示状态\n              this.updateHintBoxVisble(faceWrap.hintBoxList, true)\n              if (faceWrap.faceGLTFTrs.visible !== true) {\n                faceWrap.faceGLTFTrs.visible = true\n              }\n\n              // 执行信息同步逻辑\n\n              if (!this.DT) { this.DT = new xrFrameSystem.Matrix4() }\n              if (!this.DT2) { this.DT2 = new xrFrameSystem.Matrix4() }\n\n              // 目前VK返回的是行主序矩阵\n              // xrframe 矩阵存储为列主序\n              this.DT.setArray(anchor.transform)\n              this.DT.transpose(this.DT2)\n              faceWrap.wrapTrs.setLocalMatrix(this.DT2)\n\n              // 更新提示点位置\n              this.updateHintBoxPosition(faceWrap.hintBoxList, anchor.points3d)\n            }\n\n            // 由于目前，减少识别目标不会触发remove事件，所以先通过数量判断处理隐藏\n            if (preAnchorNumber > anchors.length) {\n              // 遍历被隐藏的目标\n              for (let i = preAnchorNumber - 1; i >= anchors.length; i--) {\n                const faceWrap = this.faceWrapMap[i]\n                if (faceWrap) {\n                  this.updateHintBoxVisble(faceWrap.hintBoxList, false)\n                  if (faceWrap.faceGLTFTrs.visible !== false) {\n                    faceWrap.faceGLTFTrs.visible = false\n                  }\n                }\n              }\n            }\n\n            preAnchorNumber = anchors.length\n          })\n\n          // VKSession removeAnchors\n          // 识别目标丢失时不断触发\n          session.on('removeAnchors', anchors => {\n            // console.log(\"removeAnchors\");\n\n            if (preAnchorNumber !== 0) {\n              for (let i = 0; i < preAnchorNumber; i++) {\n                const faceWrap = this.faceWrapMap[i]\n                if (faceWrap) {\n                  this.updateHintBoxVisble(faceWrap.hintBoxList, false)\n                  if (faceWrap.faceGLTFTrs.visible !== false) {\n                    faceWrap.faceGLTFTrs.visible = false\n                  }\n                }\n              }\n            }\n            preAnchorNumber = 0\n          })\n\n          console.log('ready to initloop')\n          // start 初始化完毕后，进行更新渲染循环\n          this.initLoop()\n        })\n      } catch (e) {\n        console.error(e)\n      }\n    },\n    // 针对 xr-frame 的初始化逻辑\n    async initXRFrame() {\n      const scene = this.xrScene\n\n      // 缓存主相机\n      this.xrCameraMain = this.xrCamera\n      this.xrCameraMainTrs = this.xrCameraTrs\n\n      // 初始化YUV相机配置\n      this.initXRYUVCamera()\n\n      // 加载脸模\n      this.faceGLTF = await scene.assets.loadAsset({\n        type: 'gltf',\n        assetId: 'gltf-face',\n        src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/face.glb',\n      })\n\n      // 初始化识别挂载点容器\n      this.faceWrapMap = {}\n    },\n    initBindingNode(index) {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const scene = this.xrScene\n      const { rootShadow } = scene\n\n      // 用于管理每一个挂载元素\n      const wrapInfo = {}\n\n      // === 初始挂载点 ===\n      const faceWrap = scene.createElement(xrFrameSystem.XRNode)\n      const faceWrapTrs = faceWrap.getComponent(xrFrameSystem.Transform)\n      rootShadow.addChild(faceWrap)\n\n      wrapInfo.wrapElem = faceWrap\n      wrapInfo.wrapTrs = faceWrapTrs\n\n      const faceElem = scene.createElement(xrFrameSystem.XRGLTF, {\n        model: 'gltf-face',\n        position: '0 0 0',\n        scale: '1 1 1',\n      })\n      const faceGLTF = faceElem.getComponent(xrFrameSystem.GLTF)\n      const faceGLTFTrs = faceElem.getComponent(xrFrameSystem.Transform)\n      faceWrap.addChild(faceElem)\n\n      wrapInfo.faceGLTFTrs = faceGLTFTrs\n\n      for (const mesh of faceGLTF.meshes) {\n        // 通过alphaMode 的 Setter 设置，或者写入renderState，但需要手动控制宏\n        mesh.material.alphaMode = 'BLEND'\n        mesh.material.setVector('u_baseColorFactor', xrFrameSystem.Vector4.createFromNumber(1, 1, 1, 0.4))\n      }\n\n      // 加载提示点\n      wrapInfo.hintBoxList = this.getHintBox(xrFrameSystem, scene, faceWrap)\n\n      this.faceWrapMap[index] = wrapInfo\n    },\n    loop() {\n      // console.log('loop')\n\n      // 获取 VKFrame\n      const frame = this.session.getVKFrame(this.data.width, this.data.height)\n\n      // 成功获取 VKFrame 才进行\n      if (!frame) { return }\n\n      // 更新相机 YUV 数据\n      this.updataXRYUV(frame)\n\n      // 获取 VKCamera\n      const VKCamera = frame.camera\n\n      // 更新 xrFrame 相机矩阵\n      this.updataXRCameraMatrix(VKCamera, NEAR, FAR)\n    },\n    getHintBox(xrFrameSystem, scene, wrap) {\n      // 初始化提示点\n      const geometryHint = scene.assets.getAsset('geometry', 'sphere')\n      const effectCube = scene.assets.getAsset('effect', 'standard')\n      const boxScale = 0.03\n      const hintBoxList = []\n      for (let i = 0; i < 106; i++) {\n        const colorFloat = i / 106\n        const el = scene.createElement(xrFrameSystem.XRNode, {\n          position: '0 0 0',\n          scale: `${boxScale} ${boxScale} ${boxScale}`,\n        })\n        const elTrs = el.getComponent(xrFrameSystem.Transform)\n        const mat = scene.createMaterial(effectCube)\n\n        const colorR = 1.0 - colorFloat\n        mat.setVector('u_baseColorFactor', xrFrameSystem.Vector4.createFromNumber(1.0, colorR, colorR, 1.0))\n\n        const mesh = el.addComponent(xrFrameSystem.Mesh, {\n          geometry: geometryHint,\n          material: mat,\n        })\n\n        wrap.addChild(el)\n        // elTrs.visible = false;\n\n        hintBoxList.push(elTrs)\n      }\n\n      return hintBoxList\n    },\n    updateHintBoxPosition(hintBoxList, points3d) {\n      if (hintBoxList && hintBoxList.length > 0) {\n        // console.log('ready to set', hintBoxList);\n        // 存在提示列表，则更新点信息\n        for (let i = 0; i < hintBoxList.length; i++) {\n          const hintBox = hintBoxList[i]\n          hintBox.position.x = points3d[i].x\n          hintBox.position.y = points3d[i].y\n          hintBox.position.z = points3d[i].z\n        }\n      }\n    },\n    updateHintBoxVisble(hintBoxList, visible) {\n      if (hintBoxList && hintBoxList.length > 0) {\n        // console.log('ready to set', hintBoxList);\n        // 存在提示列表，则更新点信息\n        for (let i = 0; i < hintBoxList.length; i++) {\n          const hintBox = hintBoxList[i]\n          if (hintBox.visible !== visible) {\n            hintBox.visible = visible\n          }\n        }\n      }\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect-3d/face-detect-3d.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-frame-canvas\": \"../components/xr-frame/index\"\n  },\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"人脸三维识别\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect-3d/face-detect-3d.wxml",
    "content": "\n<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view\n    class=\"canvas-wrap\" style=\"width: {{widthScale * 100}}%; height: {{heightScale * 100}}%\"\n  >\n    <xr-frame-canvas\n      disable-scroll\n      id=\"canvas\"\n      width=\"{{width}}\"\n      height=\"{{height}}\"\n      style=\"width:{{domWidth}}px;height:{{domHeight}}px;\"\n      bind:sceneReady=\"handleXRSceneReady\"\n    ></xr-frame-canvas>\n\n  </view>\n\n  <view class=\"hint-bottom page-body-text tc\">\n    <view class=\"btn-wrap\">\n      <button class=\"btn\" type=\"primary\" bindtap=\"switchCamera\">切换前后置摄像头</button>\n    </view>\n    <text>提示：摄像头对准人脸，然后会显示106个关键点的三维坐标提示小球，以及通用的半透明脸模模型（支持多个人脸识别）</text>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect-3d/face-detect-3d.wxss",
    "content": ".canvas-wrap {\n  position: relative;\n  width: 100%;\n  background-color: #000;\n}\n\n.canvas-wrap canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.canvas-wrap #canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n\n.hint-bottom {\n  position: absolute;\n  left: 20px;\n  right: 20px;\n  bottom: 20px;\n  padding: 5px 10px;\n  font-size: 14px;\n  color: #fff;\n  background-color: rgba(0, 0, 0, 0.4);\n  border-radius: 6px;\n}\n\n.hint-bottom .btn-wrap {\n  display: flex;\n}\n\n.hint-bottom .btn{\n  flex: 1;\n  margin: 10px 5px;\n  font-size: 18px;\n  line-height: 24px;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect-3d-glasses/face-detect-3d-glasses.js",
    "content": "import arBehavior from '../behavior/behavior-ar'\nimport xrFrameBehavior from '../behavior/behavior-xrframe'\n\n// VK 投影矩阵参数定义\nconst NEAR = 0.01\nconst FAR = 1000\n\nconst loggerOnce = false\n\nComponent({\n  behaviors: [arBehavior, xrFrameBehavior],\n  data: {\n    theme: 'light',\n    widthScale: 1, // canvas宽度缩放值\n    heightScale: 0.8, // canvas高度缩放值\n    hintBoxList: [], // 显示提示盒子列表,\n    cameraPosition: 1 // 默认前置\n  },\n  markerIndex: 0, // 使用的 marker 索引\n  hintInfo: undefined, // 提示框信息\n  lifetimes: {\n    /**\n      * 生命周期函数--监听页面加载\n      */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n\n  methods: {\n    // 对应案例的初始化逻辑，由统一的 behavior 触发\n    init() {\n      // 初始化VK\n      // start完毕后，进行更新渲染循环\n      this.initVK()\n    },\n    initVK() {\n      // VKSession 配置\n      const session = this.session = wx.createVKSession({\n        track: {\n          face: {\n            mode: 1\n          }\n        },\n        cameraPosition: 1,\n        version: 'v1',\n        gl: this.gl\n      })\n\n      try {\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          //  VKSession EVENT resize\n          session.on('resize', () => {\n            this.calcCanvasSize()\n          })\n\n          // 开启三维识别\n          session.update3DMode({ open3d: true })\n\n          // VKSession EVENT addAnchors\n          session.on('addAnchors', anchors => {\n            console.log('addAnchor', anchors)\n          })\n\n          // VKSession EVENT updateAnchors\n          session.on('updateAnchors', anchors => {\n            // console.log(\"updateAnchors\", anchors);\n\n            const anchor = anchors[0]\n            // 目前只处理一个返回的结果\n            if (anchor) {\n              this.wrapTransform = anchor.transform\n              this.position3D = anchor.points3d\n\n              if (this.faceGLTFTrs && this.faceGLTFTrs.visible !== true) {\n                this.faceGLTFTrs.visible = true\n              }\n              if (this.glassesGLTFTrs && this.glassesGLTFTrs.visible !== true) {\n                this.glassesGLTFTrs.visible = true\n              }\n            }\n          })\n\n          // VKSession removeAnchors\n          // 识别目标丢失时不断触发\n          session.on('removeAnchors', anchors => {\n            // console.log(\"removeAnchors\");\n\n            if (this.faceGLTFTrs && this.faceGLTFTrs.visible !== false) {\n              this.faceGLTFTrs.visible = false\n            }\n\n            if (this.glassesGLTFTrs && this.glassesGLTFTrs.visible !== false) {\n              this.glassesGLTFTrs.visible = false\n            }\n          })\n\n          console.log('ready to initloop')\n          // start 初始化完毕后，进行更新渲染循环\n          this.initLoop()\n        })\n      } catch (e) {\n        console.error(e)\n      }\n    },\n    // 针对 xr-frame 的初始化逻辑\n    async initXRFrame() {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const scene = this.xrScene\n      const { rootShadow } = scene\n\n      // 缓存主相机\n      this.xrCameraMain = this.xrCamera\n      this.xrCameraMainTrs = this.xrCameraTrs\n\n      // 初始化YUV相机配置\n      this.initXRYUVCamera()\n\n      // === 初始挂载点 ===\n      this.faceWrap = scene.createElement(xrFrameSystem.XRNode)\n      this.faceWrapTrs = this.faceWrap.getComponent(xrFrameSystem.Transform)\n      rootShadow.addChild(this.faceWrap)\n\n      // 加载脸模\n      const face = await scene.assets.loadAsset({\n        type: 'gltf',\n        assetId: 'gltf-face',\n        src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/face.glb',\n      })\n      const faceElem = scene.createElement(xrFrameSystem.XRGLTF, {\n        model: 'gltf-face',\n        position: '0 0 0',\n        scale: '1 1 1',\n      })\n      const faceGLTF = faceElem.getComponent(xrFrameSystem.GLTF)\n      this.faceElem = faceElem\n      this.faceGLTFTrs = faceElem.getComponent(xrFrameSystem.Transform)\n      this.faceWrap.addChild(faceElem)\n\n      for (const mesh of faceGLTF.meshes) {\n        // 通过alphaMode 的 Setter 设置，或者写入renderState，但需要手动控制宏\n        mesh.material.alphaMode = 'BLEND'\n        mesh.material.setVector('u_baseColorFactor', xrFrameSystem.Vector4.createFromNumber(1, 1, 1, 0.0))\n      }\n\n      // 加载眼镜\n      const glasses = await scene.assets.loadAsset({\n        type: 'gltf',\n        assetId: 'gltf-glasses',\n        src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/glasses.glb',\n      })\n      const glassesElem = scene.createElement(xrFrameSystem.XRGLTF, {\n        model: 'gltf-glasses',\n        position: '0 0 0',\n        scale: '1 1 1',\n      })\n      const glassesGLTF = glassesElem.getComponent(xrFrameSystem.GLTF)\n      this.glassesElem = glassesElem\n      this.glassesGLTFTrs = glassesElem.getComponent(xrFrameSystem.Transform)\n      this.faceWrap.addChild(glassesElem)\n    },\n    loop() {\n      // console.log('loop')\n\n      // 获取 VKFrame\n      const frame = this.session.getVKFrame(this.data.width, this.data.height)\n\n      // 成功获取 VKFrame 才进行\n      if (!frame) { return }\n\n      // 更新相机 YUV 数据\n      this.updataXRYUV(frame)\n\n      // 获取 VKCamera\n      const VKCamera = frame.camera\n\n      // 更新 xrFrame 相机矩阵\n      this.updataXRCameraMatrix(VKCamera, NEAR, FAR)\n\n      // 存在faceWrap，执行信息同步逻辑\n      if (this.faceWrap && this.wrapTransform) {\n        const xrFrameSystem = wx.getXrFrameSystem()\n\n        if (!this.DT) { this.DT = new xrFrameSystem.Matrix4() }\n        if (!this.DT2) { this.DT2 = new xrFrameSystem.Matrix4() }\n\n        // 目前VK返回的是行主序矩阵\n        // xrframe 矩阵存储为列主序\n        this.DT.setArray(this.wrapTransform)\n        this.DT.transpose(this.DT2)\n        this.faceWrapTrs.setLocalMatrix(this.DT2)\n      }\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect-3d-glasses/face-detect-3d-glasses.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-frame-canvas\": \"../components/xr-frame/index\"\n  },\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"人脸三维识别-眼镜试戴\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect-3d-glasses/face-detect-3d-glasses.wxml",
    "content": "\n<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view\n    class=\"canvas-wrap\" style=\"width: {{widthScale * 100}}%; height: {{heightScale * 100}}%\"\n  >\n    <xr-frame-canvas\n      disable-scroll\n      id=\"canvas\"\n      width=\"{{width}}\"\n      height=\"{{height}}\"\n      style=\"width:{{domWidth}}px;height:{{domHeight}}px;\"\n      bind:sceneReady=\"handleXRSceneReady\"\n    ></xr-frame-canvas>\n\n  </view>\n\n  <view class=\"hint-bottom page-body-text tc\">\n    <view class=\"btn-wrap\">\n      <button class=\"btn\" type=\"primary\" bindtap=\"switchCamera\">切换前后置摄像头</button>\n    </view>\n    <text>提示：摄像头对准人脸，会显示眼镜以及用于深度遮挡的透明的头模</text>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/face-detect-3d-glasses/face-detect-3d-glasses.wxss",
    "content": ".canvas-wrap {\n  position: relative;\n  width: 100%;\n  background-color: #000;\n}\n\n.canvas-wrap canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.canvas-wrap #canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n\n.hint-bottom {\n  position: absolute;\n  left: 20px;\n  right: 20px;\n  bottom: 20px;\n  padding: 5px 10px;\n  font-size: 14px;\n  color: #fff;\n  background-color: rgba(0, 0, 0, 0.4);\n  border-radius: 6px;\n}\n\n.hint-bottom .btn-wrap {\n  display: flex;\n}\n\n.hint-bottom .btn{\n  flex: 1;\n  margin: 10px 5px;\n  font-size: 18px;\n  line-height: 24px;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/gaussian-splatting-ar.js",
    "content": "import { loadPly } from './loaders/ply/ply-loader'\nimport { loadSplat } from './loaders/splat/splat-loader'\nimport CameraWebGL from './webgl2/camera-webGL'\nimport CubeInstanceWebGL from './webgl2/cubeInstance-webGL'\nimport SplatWebGL, { SplatRenderTexture } from './webgl2/splat-webGL'\nimport YUVRenderWebGL from './webgl2/yuv-webGL'\n\nimport * as glMatrix from './util/gl-matrix-min'\n\nconst { mat4 } = glMatrix\n\n// VK 投影矩阵参数定义\nconst NEAR = 0.01\nconst FAR = 1000\n\nconst renderScale = 1\n\nComponent({\n  behaviors: [],\n  data: {\n    theme: 'light',\n    widthScale: 1, // canvas宽度缩放值\n    heightScale: 1, // canvas高度缩放值\n    renderByXRFrame: false, // 是否使用 xr-frame渲染\n    renderByWebGL2: true, // 是否使用WebGL2渲染\n    workerOn: true,\n    maxGaussians: 50000,\n  },\n  lifetimes: {\n    /**\n    * 生命周期函数--监听页面加载\n    */\n    attached() {\n      console.log('页面attached')\n\n      console.log('[worker] 排序 worker 的创建')\n      this.worker = wx.createWorker('workers/gaussianSplatting/index.js')\n      console.log('[worker] 具体 worker', this.worker)\n    },\n    detached() {\n      console.log('页面detached')\n\n      if (this.worker) this.worker.terminate()\n    },\n    ready() {\n      console.log('页面准备完全')\n    },\n  },\n  methods: {\n    onReady() {\n      // 获取canvas\n      wx.createSelectorQuery()\n        .select('#canvas')\n        .node()\n        .exec(res => {\n          this.canvas = res[0].node\n\n          const info = wx.getSystemInfoSync()\n          const pixelRatio = info.pixelRatio\n          const width = info.windowWidth * this.data.widthScale * pixelRatio * renderScale\n          const height = info.windowHeight * this.data.heightScale * pixelRatio * renderScale\n          // 存在 webgl Canvas的情况下，写入大小\n          if (this.canvas) {\n            this.canvas.width = width\n            this.canvas.height = height\n          }\n          console.log(`canvas size: width = ${width} , height = ${height}`)\n          console.log(`window size: width = ${info.windowWidth} , height = ${info.windowHeight}`)\n\n          this.setData({\n            width,\n            height,\n          })\n\n          // 页面自定义初始化\n          if (this.init) this.init()\n        })\n    },\n    // 对应案例的初始化逻辑，由统一的 arBehavior 触发\n    init() {\n      console.log('== Page Init start ==')\n\n      // 注册 各类渲染器\n      if (this.data.renderByWebGL2) {\n        this.initWebGL2()\n      } else if (this.data.renderByXRFrame) {\n        this.initXRFrame()\n      }\n\n      this.initVK()\n    },\n    initVK() {\n      // VKSession 配置\n      const session = this.session = wx.createVKSession({\n        track: {\n          plane: {\n            mode: 1\n          },\n        },\n        version: 'v2',\n        gl: this.gl\n      })\n\n      session.start(err => {\n        if (err) return console.error('VK error: ', err)\n\n        //  VKSession EVENT resize\n        session.on('resize', () => {\n        })\n\n        // VKSession EVENT addAnchors\n        session.on('addAnchors', anchors => {\n          // console.log(\"addAnchor\", anchors);\n        })\n\n        // VKSession EVENT updateAnchors\n        session.on('updateAnchors', anchors => {\n        })\n\n        // VKSession removeAnchors\n        session.on('removeAnchors', anchors => {\n          // console.log('removeAnchors', anchors)\n        })\n\n        console.log('ready to initloop')\n        // start 初始化完毕后，进行更新渲染循环\n        this.initLoop()\n      })\n    },\n    initLoop() {\n      // 限制调用帧率,暂时去掉\n      const fps = 30\n      const fpsInterval = 1000 / fps\n      let last = Date.now()\n\n      const session = this.session\n\n      // 逐帧渲染\n      const onFrame = timestamp => {\n        try {\n          const now = Date.now()\n          const mill = now - last\n          // 经过了足够的时间\n          if (mill > fpsInterval) {\n            last = now - (mill % fpsInterval) // 校正当前时间\n            this.requestRender()\n          }\n        } catch (e) {\n          console.error(e)\n        }\n        session.requestAnimationFrame(onFrame)\n      }\n      session.requestAnimationFrame(onFrame)\n    },\n    initPLY(id) {\n      console.log('== PLY Init start ==')\n\n      const host = 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo'\n      // const host = 'http://127.0.0.1:8030'\n      // const host = 'http://10.9.169.133:8030'\n\n      let type\n\n      // 加载 splat\n      type = 'splat'\n      const pcSrc = `${host}/splat/${id}.splat`\n\n      console.log('splat src', pcSrc)\n\n      wx.downloadFile({\n        url: pcSrc,\n        timeout: 200000,\n        success: (res) => {\n          console.log('downloadFile 下载回调', res)\n\n          const filePath = res.tempFilePath\n\n          const fs = wx.getFileSystemManager()\n\n          /**\n           * 因为微信读文件，最大只能读100MB的，所以需要分块读取。\n           */\n          const fd = fs.openSync({ filePath })\n          const stats = fs.fstatSync({ fd })\n          console.log('fd stats', stats)\n          let size = stats.size\n          if (size > 0) {\n            const buffer = new ArrayBuffer(size)\n            const viewU8 = new Uint8Array(buffer)\n            let offset = 0\n            let uindex = 0\n            while (size > 0) {\n              const chunkSize = Math.min(size, 100 * 1024 * 1024/* 100MB */)\n\n              const res = fs.readFileSync(\n                filePath,\n                undefined,\n                offset,\n                chunkSize,\n              )\n              const resU8 = new Uint8Array(res)\n              viewU8.set(new Uint8Array(res), uindex)\n              uindex += resU8.length\n\n              // console.log('res', res)\n              // console.log('uindex', uindex);\n              // console.log('offset', offset);\n              // console.log('chunkSize', chunkSize)\n\n              offset += chunkSize\n              size -= chunkSize\n            }\n            fs.close({ fd })\n\n            // console.log('buffer', buffer)\n\n            let info\n\n            const maxGaussians = this.data.maxGaussians\n\n            switch (type) {\n              case 'ply':\n                info = loadPly(buffer, maxGaussians)\n                console.log('plyLoader return', info)\n                break\n              case 'splat':\n                info = loadSplat(buffer, maxGaussians)\n                console.log('splatLoader return', info)\n                break\n            }\n\n            // 提供渲染的高斯球数\n            const renderCount = this.renderCount = info.count\n\n            // 全部用 f32 存储\n            // this.sabPositions = wx.createSharedArrayBuffer(renderCount * 4 * 3)\n            // this.sabOpacities= wx.createSharedArrayBuffer(renderCount * 4)\n            // this.sabCov3Da = wx.createSharedArrayBuffer(renderCount * 4 * 3)\n            // this.sabCov3Db = wx.createSharedArrayBuffer(renderCount * 4 * 3)\n            // this.sabcolors = wx.createSharedArrayBuffer(renderCount * 4 * 3)\n\n            // console.log('创建 worker 共享内存', this.sabPositions, this.sabOpacities, this.sabCov3Da, this.sabCov3Db, this.sabcolors)\n\n            // 初始化 worker 相关\n            this.initWorker(info, {\n              // sabPositions: this.sabPositions,\n              // sabOpacities: this.sabOpacities,\n              // sabCov3Da: this.sabCov3Da,\n              // sabCov3Db: this.sabCov3Db,\n              // sabcolors: this.sabcolors,\n            })\n          } else {\n            wx.hideLoading()\n            wx.showToast({\n              title: res.errMsg,\n              icon: 'none',\n              duration: 2000\n            })\n            console.error('file size is 0')\n          }\n        },\n        fail(res) {\n          wx.hideLoading()\n          wx.showToast({\n            title: res.errMsg,\n            icon: 'none',\n            duration: 2000\n          })\n          console.error(res)\n        }\n      })\n    },\n    initWorker(plyInfo, config) {\n      console.log('== Worker Init start ==')\n\n      // 监听worker回调\n      this.worker.onMessage((res) => {\n        if (res.type === 'execFunc_init') {\n          // worker 初始化 回调\n          console.log('[Worker callback] gaussianSplatting init callBack', res)\n\n          this.camera.isWorkerInit = true\n          this.camera.updateByVK()\n        } else if (res.type === 'execFunc_sort') {\n          // worker 排序 回调\n          // console.log(res)\n\n          this.camera.isWorkerSorting = false\n\n          const data = res.result.data\n\n          const start = new Date().getTime()\n\n          const gl = this.gl\n\n          const updateBuffer = (buffer, data) => {\n            gl.bindBuffer(gl.ARRAY_BUFFER, buffer)\n            gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW)\n          }\n\n          // const positions = new Float32Array(this.sabPositions.buffer);\n          // const opacities = new Float32Array(this.sabOpacities.buffer);\n          // const cov3Da = new Float32Array(this.sabCov3Da.buffer);\n          // const cov3Db = new Float32Array(this.sabCov3Db.buffer);\n          // const colors = new Float32Array(this.sabcolors.buffer);\n\n          const positions = new Float32Array(data.positions)\n          const opacities = new Float32Array(data.opacities)\n          const cov3Da = new Float32Array(data.cov3Da)\n          const cov3Db = new Float32Array(data.cov3Db)\n          const colors = new Float32Array(data.colors)\n\n          updateBuffer(this.splat.buffers.center, positions)\n          updateBuffer(this.splat.buffers.opacity, opacities)\n          updateBuffer(this.splat.buffers.covA, cov3Da)\n          updateBuffer(this.splat.buffers.covB, cov3Db)\n          updateBuffer(this.splat.buffers.color, colors)\n\n          // 设定绘制的高斯球数量\n          this.gaussiansCount = data.gaussiansCount\n\n          const end = new Date().getTime()\n          // const sortTime = `${((end - start)/1000).toFixed(3)}s`\n          // console.log(`updateBuffer ${sortTime}`)\n\n          // this.canvas.requestAnimationFrame(this.requestRender.bind(this));\n\n          // console.log('execFunc_sort end')\n        }\n      })\n\n      // 提交初始数据到 worker 侧\n      this.worker.postMessage({\n        type: 'execFunc_init',\n        params: [plyInfo, config]\n      })\n    },\n    // 后续为 webGL2 相关，为了方便开发，先放在一起\n    initWebGL2() {\n      console.log('== InitWebGL2 start ==')\n      const gl = this.gl = this.canvas.getContext('webgl2')\n      console.log('webgl2 context', gl)\n\n      // Setup Camera\n      const cameraParameters = {\n        up: [0, 1.0, 0.0],\n        target: [0, 0, 0],\n        camera: [Math.PI / 2, Math.PI / 2, 10], // theta phi radius\n      }\n      this.camera = new CameraWebGL(gl, this.worker, cameraParameters)\n\n      // Setup Instance Mesh\n      this.cubeInstance = new CubeInstanceWebGL(gl)\n\n      // Setup Splat\n      this.initSplat(gl)\n\n      // Setup YUV\n      this.initYUV(gl)\n    },\n    // Gaussian Splat数据\n    initSplat(gl) {\n      // 初始化 splat 绘制到的 renderTexture\n      this.splatRT = new SplatRenderTexture(gl)\n\n      // 初始化 splat 渲染器\n      this.splat = new SplatWebGL(gl)\n    },\n    // VK 摄像机数据渲染\n    initYUV(gl) {\n      this.YUVRender = new YUVRenderWebGL(gl)\n    },\n    requestRender() {\n      // console.log('request render')\n      // 限帧\n      const now = Date.now()\n      const last = this.lastRenderTime || 0\n      const mill = now - last\n      if (mill < 30) {\n        return\n      }\n      this.lastRenderTime = now\n\n      const gl = this.gl\n\n      // Clear State\n      gl.viewport(0, 0, gl.canvas.width, gl.canvas.height)\n      gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n      gl.clearColor(0.8, 0.8, 0.8, 1.0)\n\n      // Clear\n      gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)\n\n      // 先关掉深度测试\n      gl.disable(gl.DEPTH_TEST)\n\n      // 获取 VKFrame\n      const frame = this.session.getVKFrame(this.canvas.width, this.canvas.height)\n\n      // 成功获取 VKFrame 才进行\n      if (!frame) { return }\n\n      // 获取 VKCamera\n      const VKCamera = frame.camera\n\n      // 相机\n      if (VKCamera) {\n        const viewMatrix = VKCamera.viewMatrix\n        const projectionMatrix = VKCamera.getProjectionMatrix(NEAR, FAR)\n        // 视图矩阵\n        this.camera.viewMatrix = viewMatrix\n        // 投影矩阵\n        this.camera.projMatrix = projectionMatrix\n        this.camera.updateByVK()\n      }\n\n      // Draw YUV\n      this.drawYUV(gl, frame)\n\n      // Draw Splat\n      this.drawSplat(gl)\n\n      // 恢复渲染状态\n      // cullFace\n      // gl.enable(gl.CULL_FACE);\n      // gl.cullFace(gl.BACK);\n      gl.disable(gl.CULL_FACE)\n      // gl.cullFace(gl.BACK);\n      // 深度测试\n      gl.enable(gl.DEPTH_TEST)\n\n      // drawCubeMesh\n      const projMatrix = this.camera.projMatrix\n      const viewMatrix = this.camera.viewMatrix\n      let modelMatrix = mat4.create()\n      // hintTest Info\n      if (!this.isPlaced) {\n        const hitTestRes = this.session.hitTest(0.5, 0.5)\n        if (hitTestRes.length) {\n          // hitTestRes 返回 transform 为列主序矩阵\n          const hintScale = 0.01\n          mat4.scale(modelMatrix, hitTestRes[0].transform, [hintScale * 3, hintScale, hintScale * 3])\n        } else {\n          // 放在很远，相当于移除屏幕\n          modelMatrix = [\n            1, 0, 0, 0,\n            0, 1, 0, 0,\n            0, 0, 1, 0,\n            0, 0, 1000, 1\n          ]\n        }\n      } else {\n        modelMatrix = this.hintModelMatrix\n      }\n\n      this.drawCubeMesh(gl, projMatrix, viewMatrix, modelMatrix)\n    },\n    drawYUV(gl, frame) {\n      // 获取 VKFrame 信息\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n\n      if (!yTexture || !uvTexture) {\n        return\n      }\n\n      // 进行 YUV 准备\n      const yuvRender = this.YUVRender\n\n      // YUV 需要绘制背面\n      gl.disable(gl.CULL_FACE)\n\n      // 先将YUV绘制到主屏\n      gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n\n      gl.useProgram(yuvRender.programInfo.program)\n      // VAO\n      gl.bindVertexArray(yuvRender.vao)\n      // position\n      gl.bindBuffer(gl.ARRAY_BUFFER, yuvRender.buffers.position)\n      gl.vertexAttribPointer(yuvRender.programInfo.attribLocations.vertexPosition, 3, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(yuvRender.programInfo.attribLocations.vertexPosition)\n      // texCoord\n      gl.bindBuffer(gl.ARRAY_BUFFER, yuvRender.buffers.texCoord)\n      gl.vertexAttribPointer(yuvRender.programInfo.attribLocations.vertexTexcoord, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(yuvRender.programInfo.attribLocations.vertexTexcoord)\n      // indices\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, yuvRender.buffers.indices)\n\n      // displayTransform\n      gl.uniformMatrix3fv(yuvRender.programInfo.uniformLocations.displayTransform, false, displayTransform)\n\n      // 设置使用的纹理单元\n      gl.uniform1i(yuvRender.programInfo.uniformLocations.yTexture, 1) // 纹理单元 1\n      gl.uniform1i(yuvRender.programInfo.uniformLocations.uvTexture, 2) // 纹理单元 2\n\n      // UNPACK_FLIP_Y_WEBGL\n      gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true)\n\n      // 设定 Y、UV 纹理到纹理单元\n      gl.activeTexture(gl.TEXTURE1)\n      gl.bindTexture(gl.TEXTURE_2D, yTexture)\n      gl.activeTexture(gl.TEXTURE2)\n      gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n      // draw RenderTexture\n      gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0)\n\n      // 恢复 Cull_face\n      gl.enable(gl.CULL_FACE)\n    },\n    drawCubeMesh(gl, projMatrix, viewMatrix, modelMatrix) {\n      // mesh\n      const meshCube = this.cubeInstance\n      // Tell WebGL to use our program when drawing\n      gl.useProgram(meshCube.programInfo.program)\n      // VAO\n      gl.bindVertexArray(meshCube.vao)\n      // mesh position\n      gl.bindBuffer(gl.ARRAY_BUFFER, meshCube.positionBuffer)\n      gl.vertexAttribPointer(meshCube.programInfo.attribLocations.vertexPosition, 3, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(meshCube.programInfo.attribLocations.vertexPosition)\n      // mesh color\n      gl.bindBuffer(gl.ARRAY_BUFFER, meshCube.colorBuffer)\n      gl.vertexAttribPointer(meshCube.programInfo.attribLocations.vertexColor, 4, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(meshCube.programInfo.attribLocations.vertexColor)\n\n      // Tell WebGL which indices to use to index the vertices\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, meshCube.indices)\n\n      // Set the shader uniforms\n      gl.uniformMatrix4fv(\n        meshCube.programInfo.uniformLocations.projectionMatrix,\n        false,\n        projMatrix\n      )\n      gl.uniformMatrix4fv(\n        meshCube.programInfo.uniformLocations.viewMatrix,\n        false,\n        viewMatrix\n      )\n      gl.uniformMatrix4fv(\n        meshCube.programInfo.uniformLocations.modelMatrix,\n        false,\n        modelMatrix\n      )\n\n      // draw\n      const vertexCount = 36\n      const type = gl.UNSIGNED_SHORT\n      const offset = 0\n      gl.drawElements(gl.TRIANGLES, vertexCount, type, offset)\n    },\n    drawSplat(gl) {\n      // 通用准备\n      const cam = this.camera\n\n      // 进行 Splat renderTexture 准备\n      const splatRT = this.splatRT\n\n      const splatRTFrameBuffer = this.splatRT.frameBuffer\n\n      gl.bindFramebuffer(gl.FRAMEBUFFER, splatRTFrameBuffer)\n\n      gl.clearColor(0, 0, 0, 0.0)\n      gl.clear(gl.COLOR_BUFFER_BIT)\n\n      // Set Splat state\n      gl.disable(gl.DEPTH_TEST)\n      gl.enable(gl.BLEND)\n      gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE)\n\n      // console.log('drawSplat')\n\n      // 开启 Splat 绘制流程\n      const splat = this.splat\n      const program = splat.program\n      // Use Program\n      gl.useProgram(program)\n      // VAO\n      gl.bindVertexArray(splat.vao)\n\n      // Original implementation parameters\n      const canvasWidth = gl.canvas.width\n      const canvasHeight = gl.canvas.height\n      const tan_fovy = Math.tan(cam.fov_y * 0.5)\n      const tan_fovx = tan_fovy * canvasWidth / canvasHeight\n      const focal_y = canvasHeight / (2 * tan_fovy)\n      const focal_x = canvasWidth / (2 * tan_fovx)\n\n      gl.uniform1f(gl.getUniformLocation(program, 'canvas_width'), canvasWidth)\n      gl.uniform1f(gl.getUniformLocation(program, 'canvas_height'), canvasHeight)\n      gl.uniform1f(gl.getUniformLocation(program, 'focal_x'), focal_x)\n      gl.uniform1f(gl.getUniformLocation(program, 'focal_y'), focal_y)\n      gl.uniform1f(gl.getUniformLocation(program, 'tan_fovx'), tan_fovx)\n      gl.uniform1f(gl.getUniformLocation(program, 'tan_fovy'), tan_fovy)\n      gl.uniform1f(gl.getUniformLocation(program, 'scale_modifier'), 1.0)\n      gl.uniformMatrix4fv(gl.getUniformLocation(program, 'modelViewMatrix'), false, cam.mvm)\n      gl.uniformMatrix4fv(gl.getUniformLocation(program, 'modelViewProjectMatrix'), false, cam.mvpm)\n\n      // Draw Splat\n      gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, this.gaussiansCount)\n\n      // 最后将RT绘制 到 主屏\n      gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n\n      gl.useProgram(splatRT.programInfo.program)\n      // VAO\n      gl.bindVertexArray(splatRT.vao)\n      // position\n      gl.bindBuffer(gl.ARRAY_BUFFER, splatRT.buffers.position)\n      gl.vertexAttribPointer(splatRT.programInfo.attribLocations.vertexPosition, 3, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(splatRT.programInfo.attribLocations.vertexPosition)\n      // texCoord\n      gl.bindBuffer(gl.ARRAY_BUFFER, splatRT.buffers.texCoord)\n      gl.vertexAttribPointer(splatRT.programInfo.attribLocations.vertexTexcoord, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(splatRT.programInfo.attribLocations.vertexTexcoord)\n      // indices\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, splatRT.buffers.indices)\n\n      gl.uniform1i(splatRT.programInfo.attribLocations.uSplat, 0) // 纹理单元0\n\n      // 设定 RT 纹理到纹理单元\n      gl.activeTexture(gl.TEXTURE0)\n      gl.bindTexture(gl.TEXTURE_2D, splatRT.rt)\n\n      // set Blend\n      gl.enable(gl.BLEND)\n      gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)\n\n      // draw RenderTexture\n      gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0)\n    },\n    onTapControl(e) {\n      const dataSet = e.target.dataset\n\n      const id = dataSet.id\n\n      // hintTest Info\n      const hitTestRes = this.session.hitTest(0.5, 0.5)\n      if (hitTestRes.length) {\n        // 命中才进行后续的具体加载\n        // hitTestRes 返回 transform 为列主序矩阵\n\n        const splatModelMatrix = mat4.create()\n        const modelMatrixLocal = mat4.create()\n        const modelMatrixT = mat4.create()\n        const modelMatrixR = mat4.create()\n        const modelMatrixS = mat4.create()\n        let splatScale = 0.2\n        let splatRotationAngle = 0\n        let splatRotationFlag = [0, 1, 0]\n        let splatTranslate = [0, 0, 0]\n\n        // 针对不同场景设置不同的 世界矩阵\n        switch (id) {\n          case 'room':\n            splatScale = 0.6\n            splatTranslate = [0, -1, 0]\n            splatRotationAngle = -Math.PI / 180 * 26\n            splatRotationFlag = [1, 0, 0]\n            break\n          case 'garden':\n            splatScale = 0.6\n            splatTranslate = [0, -2, 0]\n            splatRotationAngle = -Math.PI / 180 * 20\n            splatRotationFlag = [1, 0, 0]\n            break\n          case 'stump':\n            splatScale = 0.6\n            splatTranslate = [0, 0, 0]\n            break\n          case 'oneflower':\n            splatScale = 0.2\n            splatTranslate = [-0.5, -2, -4]\n            splatRotationAngle = -Math.PI / 180 * 40\n            splatRotationFlag = [1, 0, 0]\n            break\n          case 'usj':\n            splatTranslate = [0, 1, 0]\n            break\n          case 'sakura':\n            splatTranslate = [-1.6, 0, -1]\n            break\n          case '0517cruch':\n            splatScale = 0.5\n            splatTranslate = [0, 0, 0]\n            break\n          default:\n            break\n        }\n\n        mat4.scale(modelMatrixS, mat4.create(), [splatScale, splatScale, splatScale])\n        mat4.rotate(modelMatrixR, modelMatrixS, splatRotationAngle, splatRotationFlag)\n        mat4.translate(modelMatrixT, modelMatrixR, splatTranslate)\n        mat4.copy(modelMatrixLocal, modelMatrixT)\n\n        // Y轴反转矩阵\n        const fixMatrix = mat4.create()\n        mat4.rotate(fixMatrix, mat4.create(), Math.PI, [0, 0, 1])\n\n        // 本地矩阵\n        const modelMatrixLocalFix = mat4.create()\n        mat4.multiply(modelMatrixLocalFix, fixMatrix, modelMatrixLocal)\n\n        // 世界矩阵\n        mat4.multiply(splatModelMatrix, hitTestRes[0].transform, modelMatrixLocalFix)\n\n        this.camera.modelMatrix = splatModelMatrix\n\n        // locak Hint\n        const hintModelMatrix = mat4.create()\n        const hintScale = 0.01\n        mat4.scale(hintModelMatrix, hitTestRes[0].transform, [hintScale * 3, hintScale, hintScale * 3])\n        this.hintModelMatrix = hintModelMatrix\n        this.isPlaced = true\n\n        // 开始处理 ply 资源\n        this.initPLY(id)\n      }\n    },\n    changeMaxGaussianCount(e) {\n      this.setData({\n        maxGaussians: e.detail.value\n      })\n\n      console.log('slider maxGaussians:', this.data.maxGaussians)\n    },\n    switchWorker(e) {\n      this.setData({\n        workerOn: e.detail.value\n      })\n\n      this.camera.setWorkerOn(this.data.workerOn)\n\n      console.log('switch WorkerOn:', this.data.workerOn)\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/gaussian-splatting-ar.json",
    "content": "{\n  \"usingComponents\": {\n  },\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n  \"navigationBarTitleText\": \"Gaussian Splatting AR预览\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/gaussian-splatting-ar.wxml",
    "content": "\n<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view\n    class=\"canvas-wrap\" style=\"width: {{widthScale * 100}}%; height: {{heightScale * 100}}%\"\n  > \n    <view wx:if=\"{{renderByXRFrame}}\">\n      <xr-frame-render-canvas\n        disable-scroll\n        id=\"canvas\"\n        width=\"{{width}}\"\n        height=\"{{height}}\"\n        style=\"width:{{domWidth}}px;height:{{domHeight}}px;\"\n        bind:sceneReady=\"handleXRSceneReady\"\n      ></xr-frame-render-canvas>\n    </view>\n    <view wx:if=\"{{renderByWebGL2}}\">\n      <canvas type=\"webgl2\" id=\"canvas\"></canvas>\n    </view>\n  </view>\n  <view class=\"control-wrap\">\n    <view class=\"title\">经典 Splat</view>\n    <view class=\"block\">\n      <button class=\"btn\" type=\"primary\" data-id=\"room\" bindtap=\"onTapControl\">房间</button>\n      <button class=\"btn\" type=\"primary\" data-id=\"garden\"  bindtap=\"onTapControl\">花园</button>\n      <button class=\"btn\" type=\"primary\" data-id=\"stump\"  bindtap=\"onTapControl\">树桩</button>\n    </view>\n    <view class=\"title\">自制 Splat</view>\n    <view class=\"block\">\n      <button class=\"btn\" type=\"primary\" data-id=\"oneflower\"  bindtap=\"onTapControl\">盆栽</button>\n      <button class=\"btn\" type=\"primary\" data-id=\"usj\"  bindtap=\"onTapControl\">USJ马里奥</button>\n      <button class=\"btn\" type=\"primary\" data-id=\"sakura\"  bindtap=\"onTapControl\">樱花小道</button>\n      <!-- <button class=\"btn\" type=\"primary\" data-id=\"0517cruch\"  bindtap=\"onTapControl\">教堂花园</button> -->\n    </view>\n  </view>\n  <view class=\"input-wrap\">\n    <view class=\"title\">最大高斯球数</view>\n    <slider class=\"slider\" bindchange=\"changeMaxGaussianCount\" min=\"0\" max=\"1200000\" value=\"{{maxGaussians}}\" show-value/>\n    <view class=\"checkbox-wrap\"><p class=\"words\">是否开启 worker 排序</p><switch class=\"checkbox\" type=\"checkbox\" checked=\"{{workerOn}}\" bindchange=\"switchWorker\"/></view>\n    \n\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/gaussian-splatting-ar.wxss",
    "content": ".canvas-wrap {\n  position: relative;\n  width: 100%;\n  background-color: #000;\n}\n\n.canvas-wrap canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.canvas-wrap #canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.control-wrap {\n  position: absolute;\n  right: 20rpx;\n  top: 20rpx;\n  padding: 10rpx 20rpx;\n  width: 180rpx;\n  height: 510rpx;\n  background-color: rgba(50, 50, 50, 0.6);\n  border-radius: 10rpx;\n}\n\n.control-wrap .block {\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n}\n\n.control-wrap .btn {\n  width: 100%;\n  flex: 1;\n  font-size: 20rpx;\n  margin-bottom: 14rpx;\n  padding-left: 10rpx;\n  padding-right: 10rpx;\n}\n\n.input-wrap {\n  position: absolute;\n  left: 20rpx;\n  right: 260rpx;\n  top: 20rpx;\n  padding: 10rpx 20rpx;\n  height: 200rpx;\n  background-color: rgba(50, 50, 50, 0.6);\n  border-radius: 10rpx;\n}\n.input-wrap .slider {\n  margin-bottom: 30rpx;\n}\n\n.input-wrap .checkbox-wrap {\n  width: 100%;\n  text-align: center;\n}\n\n.checkbox-wrap .words {\n  vertical-align: middle;\n  color: #fff;\n  font-size: 30rpx;\n  font-weight: bold;\n}\n.checkbox-wrap .checkbox {\n  vertical-align: middle;\n  margin-left: 20rpx;\n}\n\n.control-wrap .title, .input-wrap .title {\n  color: #fff;\n  width: 100%;\n  text-align: center;\n  font-size: 24rpx;\n  font-weight: bold;\n  margin-bottom: 10rpx;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/gaussian-splatting.js",
    "content": "import { loadPly } from './loaders/ply/ply-loader'\nimport { loadSplat } from './loaders/splat/splat-loader'\nimport CameraWebGL from './webgl2/camera-webGL'\nimport CubeInstanceWebGL from './webgl2/cubeInstance-webGL'\nimport SplatWebGL, { SplatRenderTexture } from './webgl2/splat-webGL'\n\nimport * as glMatrix from './util/gl-matrix-min'\n\nconst { mat4 } = glMatrix\n\nconst renderScale = 1\n\nconst baseMatrix = mat4.create()\n\nComponent({\n  behaviors: [],\n  data: {\n    theme: 'light',\n    widthScale: 1, // canvas宽度缩放值\n    heightScale: 1, // canvas高度缩放值\n    renderByXRFrame: false, // 是否使用 xr-frame渲染\n    renderByWebGL2: true, // 是否使用WebGL2渲染\n    workerOn: true,\n    maxGaussians: 50000,\n  },\n  lifetimes: {\n    /**\n    * 生命周期函数--监听页面加载\n    */\n    attached() {\n      console.log('页面attached')\n\n      console.log('[worker] 排序 worker 的创建')\n      this.worker = wx.createWorker('workers/gaussianSplatting/index.js')\n      console.log('[worker] 具体 worker', this.worker)\n    },\n    detached() {\n      console.log('页面detached')\n\n      if (this.worker) this.worker.terminate()\n    },\n    ready() {\n      console.log('页面准备完全')\n    },\n  },\n  methods: {\n    onReady() {\n      // 获取canvas\n      wx.createSelectorQuery()\n        .select('#canvas')\n        .node()\n        .exec(res => {\n          this.canvas = res[0].node\n\n          const info = wx.getSystemInfoSync()\n          const pixelRatio = info.pixelRatio\n          const width = info.windowWidth * this.data.widthScale * pixelRatio * renderScale\n          const height = info.windowHeight * this.data.heightScale * pixelRatio * renderScale\n          // 存在 webgl Canvas的情况下，写入大小\n          if (this.canvas) {\n            this.canvas.width = width\n            this.canvas.height = height\n          }\n          console.log(`canvas size: width = ${width} , height = ${height}`)\n          console.log(`window size: width = ${info.windowWidth} , height = ${info.windowHeight}`)\n\n          this.setData({\n            width,\n            height,\n          })\n\n          // 页面自定义初始化\n          if (this.init) this.init()\n        })\n    },\n    // 对应案例的初始化逻辑，由统一的 arBehavior 触发\n    init() {\n      console.log('== Page Init start ==')\n\n      // 注册 各类渲染器\n      if (this.data.renderByWebGL2) {\n        this.initWebGL2()\n      } else if (this.data.renderByXRFrame) {\n        this.initXRFrame()\n      }\n    },\n    initPLY(id) {\n      console.log('== PLY Init start ==')\n\n      const host = 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo'\n      // const host = 'http://127.0.0.1:8030'\n      // const host = 'http://10.9.169.149:8030'\n\n      let type\n\n      // 加载 ply\n      // type = 'ply';\n      // const pcSrc = `${host}/ply/oneflower.cleaned.ply`;\n      // const pcSrc = `${host}/ply/point_cloud.ply`;\n      // const pcSrc = `${host}/ply/room.ply`;\n      // const pcSrc = `${host}/ply/gs_USJ_Mario_enter.cleaned.ply`;\n      // const pcSrc = `${host}/ply/oneflower.ply`;\n      // const pcSrc = `${host}/ply/sakura.ply`;\n      // const pcSrc = `${host}/ply/sakura.cleaned.ply`;\n      // const pcSrc = `${host}/ply/sakura.compressed.ply`;\n\n      // 加载 splat\n      type = 'splat'\n      const pcSrc = `${host}/splat/${id}.splat`\n\n      const splatModelMatrix = mat4.create()\n      const modelMatrixLocal = mat4.create()\n      const modelMatrixT = mat4.create()\n      const modelMatrixR = mat4.create()\n      const modelMatrixS = mat4.create()\n      let splatScale = 1\n      let splatRotationAngle = 0\n      let splatRotationFlag = [0, 1, 0]\n      let splatTranslate = [0, 0, 0]\n\n      // 针对不同场景设置不同的 本地矩阵\n      // Setup Camera\n      switch (id) {\n        case 'room':\n          splatScale = 0.6\n          splatTranslate = [0, -3, 0]\n          splatRotationAngle = -Math.PI / 180 * 26\n          splatRotationFlag = [1, 0, 0]\n          this.camera.updateCameraInfo(\n            // target\n            [0, 0, 0],\n            // theta\n            -Math.PI / 2,\n            // phi\n            Math.PI / 2,\n            // raidus\n            1\n          )\n          break\n        case 'garden':\n          splatScale = 0.6\n          splatTranslate = [0, -2, 0]\n          splatRotationAngle = -Math.PI / 180 * 20\n          splatRotationFlag = [1, 0, 0]\n          this.camera.updateCameraInfo(\n            // target\n            [0, 0, 0],\n            // theta\n            -Math.PI / 2,\n            // phi\n            Math.PI / 2,\n            // raidus\n            2\n          )\n          break\n        case 'stump':\n          splatScale = 0.5\n          splatTranslate = [0, 0, 0]\n          this.camera.updateCameraInfo(\n            // target\n            [0, 0, 0],\n            // theta\n            -Math.PI * 2 / 3,\n            // phi\n            Math.PI / 4,\n            // raidus\n            2\n          )\n          break\n        case 'oneflower':\n          splatScale = 0.1\n          splatTranslate = [-0.5, -2, -4]\n          splatRotationAngle = -Math.PI / 180 * 40\n          splatRotationFlag = [1, 0, 0]\n          this.camera.updateCameraInfo(\n            // target\n            [0, 0, 0],\n            // theta\n            0,\n            // phi\n            Math.PI / 2,\n            // raidus\n            1\n          )\n          break\n        case 'usj':\n          splatTranslate = [0, 1, 0]\n          this.camera.updateCameraInfo(\n            // target\n            [0, 0, 0],\n            // theta\n            -Math.PI * 7 / 6,\n            // phi\n            Math.PI / 2,\n            // raidus\n            1\n          )\n          break\n        case 'sakura':\n          splatTranslate = [-1.6, 0, -1]\n          this.camera.updateCameraInfo(\n            // target\n            [0, 0, 0],\n            // theta\n            Math.PI * 3 / 11,\n            // phi\n            Math.PI * 3 / 5,\n            // raidus\n            1\n          )\n          break\n        case '0517cruch':\n          splatTranslate = [0, 0, 0]\n          this.camera.updateCameraInfo(\n            // target\n            [0, 0, 0],\n            // theta\n            -Math.PI / 2,\n            // phi\n            Math.PI / 2,\n            // raidus\n            1\n          )\n          break\n      }\n\n      mat4.scale(modelMatrixS, mat4.create(), [splatScale, splatScale, splatScale])\n      mat4.rotate(modelMatrixR, modelMatrixS, splatRotationAngle, splatRotationFlag)\n      mat4.translate(modelMatrixT, modelMatrixR, splatTranslate)\n      mat4.copy(modelMatrixLocal, modelMatrixT)\n\n      // Y轴反转矩阵\n      const fixMatrix = mat4.create()\n      mat4.rotate(fixMatrix, mat4.create(), Math.PI, [0, 0, 1])\n\n      // 本地矩阵\n      const modelMatrixLocalFix = mat4.create()\n      mat4.multiply(modelMatrixLocalFix, fixMatrix, modelMatrixLocal)\n\n      // 世界矩阵\n      const modelWorld = mat4.create()\n      // mat4.translate(modelWorld, mat4.create(), [0, 1, 0])\n      mat4.multiply(splatModelMatrix, modelWorld, modelMatrixLocalFix)\n      this.camera.modelMatrix = splatModelMatrix\n\n      console.log('splat src', pcSrc)\n\n      wx.downloadFile({\n        url: pcSrc,\n        timeout: 200000,\n        success: (res) => {\n          console.log('downloadFile 下载回调', res)\n\n          const filePath = res.tempFilePath\n\n          const fs = wx.getFileSystemManager()\n\n          /**\n           * 因为微信读文件，最大只能读100MB的，所以需要分块读取。\n           */\n          const fd = fs.openSync({ filePath })\n          const stats = fs.fstatSync({ fd })\n          console.log('fd stats', stats)\n          let size = stats.size\n          if (size > 0) {\n            const buffer = new ArrayBuffer(size)\n            const viewU8 = new Uint8Array(buffer)\n            let offset = 0\n            let uindex = 0\n            while (size > 0) {\n              const chunkSize = Math.min(size, 100 * 1024 * 1024 /* 100MB */)\n\n              const res = fs.readFileSync(\n                filePath,\n                undefined,\n                offset,\n                chunkSize,\n              )\n              const resU8 = new Uint8Array(res)\n              viewU8.set(new Uint8Array(res), uindex)\n              uindex += resU8.length\n\n              // console.log('res', res)\n              // console.log('uindex', uindex);\n              // console.log('offset', offset);\n              // console.log('chunkSize', chunkSize)\n\n              offset += chunkSize\n              size -= chunkSize\n            }\n            fs.close({ fd })\n\n            // console.log('buffer', buffer)\n\n            let info\n\n            const maxGaussians = this.data.maxGaussians\n\n            switch (type) {\n              case 'ply':\n                info = loadPly(buffer, maxGaussians)\n                console.log('plyLoader return', info)\n                break\n              case 'splat':\n                info = loadSplat(buffer, maxGaussians)\n                console.log('splatLoader return', info)\n                break\n            }\n\n            // 提供渲染的高斯球数\n            const renderCount = this.renderCount = info.count\n\n            // 全部用 f32 存储\n            // this.sabPositions = wx.createSharedArrayBuffer(renderCount * 4 * 3)\n            // this.sabOpacities= wx.createSharedArrayBuffer(renderCount * 4)\n            // this.sabCov3Da = wx.createSharedArrayBuffer(renderCount * 4 * 3)\n            // this.sabCov3Db = wx.createSharedArrayBuffer(renderCount * 4 * 3)\n            // this.sabcolors = wx.createSharedArrayBuffer(renderCount * 4 * 3)\n\n            // console.log('创建 worker 共享内存', this.sabPositions, this.sabOpacities, this.sabCov3Da, this.sabCov3Db, this.sabcolors)\n\n            // 初始化 worker 相关\n            this.initWorker(info, {\n              // sabPositions: this.sabPositions,\n              // sabOpacities: this.sabOpacities,\n              // sabCov3Da: this.sabCov3Da,\n              // sabCov3Db: this.sabCov3Db,\n              // sabcolors: this.sabcolors,\n            })\n          } else {\n            wx.hideLoading()\n            wx.showToast({\n              title: res.errMsg,\n              icon: 'none',\n              duration: 2000\n            })\n            console.error('file size is 0')\n          }\n        },\n        fail(res) {\n          wx.hideLoading()\n          wx.showToast({\n            title: res.errMsg,\n            icon: 'none',\n            duration: 2000\n          })\n          console.error(res)\n        }\n      })\n    },\n\n    initWorker(plyInfo, config) {\n      console.log('== Worker Init start ==')\n\n      // 监听worker回调\n      this.worker.onMessage((res) => {\n        if (res.type === 'execFunc_init') {\n          // worker 初始化 回调\n          console.log('[Worker callback] gaussianSplatting init callBack', res)\n\n          this.camera.isWorkerInit = true\n          this.camera.update()\n        } else if (res.type === 'execFunc_sort') {\n          // worker 排序 回调\n          // console.log(res)\n\n          this.camera.isWorkerSorting = false\n\n          const data = res.result.data\n\n          const start = new Date().getTime()\n\n          const gl = this.gl\n\n          const updateBuffer = (buffer, data) => {\n            gl.bindBuffer(gl.ARRAY_BUFFER, buffer)\n            gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW)\n          }\n\n          const positions = new Float32Array(data.positions)\n          const opacities = new Float32Array(data.opacities)\n          const cov3Da = new Float32Array(data.cov3Da)\n          const cov3Db = new Float32Array(data.cov3Db)\n          const colors = new Float32Array(data.colors)\n\n          // const positions = new Float32Array(this.sabPositions.buffer);\n          // const opacities = new Float32Array(this.sabOpacities.buffer);\n          // const cov3Da = new Float32Array(this.sabCov3Da.buffer);\n          // const cov3Db = new Float32Array(this.sabCov3Db.buffer);\n          // const colors = new Float32Array(this.sabcolors.buffer);\n\n          updateBuffer(this.splat.buffers.center, positions)\n          updateBuffer(this.splat.buffers.opacity, opacities)\n          updateBuffer(this.splat.buffers.covA, cov3Da)\n          updateBuffer(this.splat.buffers.covB, cov3Db)\n          updateBuffer(this.splat.buffers.color, colors)\n\n          // 设定绘制的高斯球数量\n          this.gaussiansCount = data.gaussiansCount\n\n          const end = new Date().getTime()\n          // const sortTime = `${((end - start)/1000).toFixed(3)}s`\n          // console.log(`updateBuffer ${sortTime}`)\n\n          this.canvas.requestAnimationFrame(this.requestRender.bind(this))\n\n          // console.log('execFunc_sort end')\n        }\n      })\n\n      // 提交初始数据到 worker 侧\n      this.worker.postMessage({\n        type: 'execFunc_init',\n        params: [plyInfo, config]\n      })\n    },\n    // 后续为 webGL2 相关，为了方便开发，先放在一起\n    initWebGL2() {\n      console.log('== InitWebGL2 start ==')\n      const gl = this.gl = this.canvas.getContext('webgl2')\n      console.log('webgl2 context', gl)\n\n      // Setup Camera\n      const cameraParameters = {\n        up: [0, 1.0, 0.0],\n        target: [0, 0, 0],\n        camera: [Math.PI / 2, Math.PI / 2, 1], // theta phi radius\n      }\n      this.camera = new CameraWebGL(gl, this.worker, cameraParameters)\n\n      // Setup Instance Mesh\n      this.cubeInstance = new CubeInstanceWebGL(gl)\n\n      // Setup Splat\n      this.initSplat(gl)\n    },\n    initSplat(gl) {\n      // 初始化 splat 绘制到的 renderTexture\n      this.splatRT = new SplatRenderTexture(gl)\n\n      // 初始化 splat 渲染器\n      this.splat = new SplatWebGL(gl)\n    },\n    requestRender() {\n      // console.log('requestRender')\n\n      // 限帧\n      const now = Date.now()\n      const last = this.lastRenderTime || 0\n      const mill = now - last\n      if (mill < 30) {\n        return\n      }\n      this.lastRenderTime = now\n\n      const gl = this.gl\n\n      // Clear State\n      gl.viewport(0, 0, gl.canvas.width, gl.canvas.height)\n      gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n      gl.clearColor(0.8, 0.8, 0.8, 1.0)\n\n      // clear\n      gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)\n\n      // 先关掉深度测试\n      gl.disable(gl.DEPTH_TEST)\n\n      this.drawSplat(gl)\n\n      // resetState\n      gl.disable(gl.CULL_FACE)\n      // 深度测试\n      gl.enable(gl.DEPTH_TEST)\n\n      // drawCubeMesh\n      const projMatrix = this.camera.projMatrix\n      const viewMatrix = this.camera.viewMatrix\n      const modelMatrix = mat4.create()\n      const cubeScale = 0.02\n      mat4.scale(modelMatrix, mat4.create(), [cubeScale, cubeScale, cubeScale])\n      this.drawCubeMesh(gl, projMatrix, viewMatrix, modelMatrix)\n    },\n    drawCubeMesh(gl, projMatrix, viewMatrix, modelMatrix) {\n      // mesh\n      const meshCube = this.cubeInstance\n      // Tell WebGL to use our program when drawing\n      gl.useProgram(meshCube.programInfo.program)\n      // VAO\n      gl.bindVertexArray(meshCube.vao)\n      // mesh position\n      gl.bindBuffer(gl.ARRAY_BUFFER, meshCube.positionBuffer)\n      gl.vertexAttribPointer(meshCube.programInfo.attribLocations.vertexPosition, 3, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(meshCube.programInfo.attribLocations.vertexPosition)\n      // mesh color\n      gl.bindBuffer(gl.ARRAY_BUFFER, meshCube.colorBuffer)\n      gl.vertexAttribPointer(meshCube.programInfo.attribLocations.vertexColor, 4, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(meshCube.programInfo.attribLocations.vertexColor)\n\n      // Tell WebGL which indices to use to index the vertices\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, meshCube.indices)\n\n      // Set the shader uniforms\n      gl.uniformMatrix4fv(\n        meshCube.programInfo.uniformLocations.projectionMatrix,\n        false,\n        projMatrix\n      )\n      gl.uniformMatrix4fv(\n        meshCube.programInfo.uniformLocations.viewMatrix,\n        false,\n        viewMatrix\n      )\n      gl.uniformMatrix4fv(\n        meshCube.programInfo.uniformLocations.modelMatrix,\n        false,\n        modelMatrix\n      )\n\n      // draw\n      const vertexCount = 36\n      const type = gl.UNSIGNED_SHORT\n      const offset = 0\n      gl.drawElements(gl.TRIANGLES, vertexCount, type, offset)\n    },\n    drawSplat(gl) {\n      // 通用准备\n      const cam = this.camera\n\n      // 进行 Splat renderTexture 准备\n      const splatRT = this.splatRT\n\n      const splatRTFrameBuffer = this.splatRT.frameBuffer\n\n      gl.viewport(0, 0, gl.canvas.width, gl.canvas.height)\n      gl.bindFramebuffer(gl.FRAMEBUFFER, splatRTFrameBuffer)\n\n      gl.clearColor(0, 0, 0, 0.0)\n      gl.clear(gl.COLOR_BUFFER_BIT)\n\n      // Set Splat state\n      gl.disable(gl.DEPTH_TEST)\n      gl.enable(gl.BLEND)\n      gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE)\n      // gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)\n\n      // console.log('drawSplat')\n\n      // 开启 Splat 绘制流程\n      const splat = this.splat\n      const program = splat.program\n      // Use Program\n      gl.useProgram(program)\n      // VAO\n      gl.bindVertexArray(splat.vao)\n\n      // Original implementation parameters\n      const canvasWidth = gl.canvas.width\n      const canvasHeight = gl.canvas.height\n      const tan_fovy = Math.tan(cam.fov_y * 0.5)\n      const tan_fovx = tan_fovy * canvasWidth / canvasHeight\n      const focal_y = canvasHeight / (2 * tan_fovy)\n      const focal_x = canvasWidth / (2 * tan_fovx)\n\n      gl.uniform1f(gl.getUniformLocation(program, 'canvas_width'), canvasWidth)\n      gl.uniform1f(gl.getUniformLocation(program, 'canvas_height'), canvasHeight)\n      gl.uniform1f(gl.getUniformLocation(program, 'focal_x'), focal_x)\n      gl.uniform1f(gl.getUniformLocation(program, 'focal_y'), focal_y)\n      gl.uniform1f(gl.getUniformLocation(program, 'tan_fovx'), tan_fovx)\n      gl.uniform1f(gl.getUniformLocation(program, 'tan_fovy'), tan_fovy)\n      gl.uniform1f(gl.getUniformLocation(program, 'scale_modifier'), 1.0)\n      gl.uniformMatrix4fv(gl.getUniformLocation(program, 'modelViewMatrix'), false, cam.mvm)\n      gl.uniformMatrix4fv(gl.getUniformLocation(program, 'modelViewProjectMatrix'), false, cam.mvpm)\n      // gl.uniformMatrix4fv(gl.getUniformLocation(program, 'modelmatrix'), false, baseMatrix)\n      // gl.uniformMatrix4fv(gl.getUniformLocation(program, 'viewmatrix'), false, cam.vm)\n\n      // Draw Splat\n      gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, this.gaussiansCount)\n\n      // resetState\n      gl.enable(gl.BLEND)\n      gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)\n\n      // 最后将RT绘制 到 主屏\n      gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n\n      gl.useProgram(splatRT.programInfo.program)\n      // VAO\n      gl.bindVertexArray(splatRT.vao)\n      // position\n      gl.bindBuffer(gl.ARRAY_BUFFER, splatRT.buffers.position)\n      gl.vertexAttribPointer(splatRT.programInfo.attribLocations.vertexPosition, 3, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(splatRT.programInfo.attribLocations.vertexPosition)\n      // texCoord\n      gl.bindBuffer(gl.ARRAY_BUFFER, splatRT.buffers.texCoord)\n      gl.vertexAttribPointer(splatRT.programInfo.attribLocations.vertexTexcoord, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(splatRT.programInfo.attribLocations.vertexTexcoord)\n      // indices\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, splatRT.buffers.indices)\n\n      // draw RenderTexture\n      gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0)\n    },\n    // webGL触摸相关逻辑\n    onTouchStartWebGL(e) {\n      // console.log(e);\n\n      if (e.touches.length === 1) {\n        this.camera.lastTouch.x1 = e.touches[0].clientX\n        this.camera.lastTouch.y1 = e.touches[0].clientY\n        this.camera.lastTouch.x2 = null\n        this.camera.lastTouch.y2 = null\n        this.camera.lastTouch.distance = 0\n      } else if (e.touches.length === 2) {\n        const touch1 = e.touches[0]\n        const touch2 = e.touches[1]\n\n        this.camera.lastTouch.x1 = touch1.clientX\n        this.camera.lastTouch.y1 = touch1.clientY\n        this.camera.lastTouch.x2 = touch2.clientX\n        this.camera.lastTouch.y2 = touch2.clientY\n\n        const distanceX = touch1.clientX - touch2.clientX\n        const distanceY = touch1.clientY - touch2.clientY\n        this.camera.lastTouch.distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY)\n      }\n    },\n    onTouchMoveWebGL(e) {\n      // console.log(e);\n\n      const moveScale = 1\n\n      if (e.touches.length === 1) {\n        const touch = e.touches[0]\n        // 单指移动镜头\n        const movementX = touch.clientX - this.camera.lastTouch.x1\n        const movementY = touch.clientY - this.camera.lastTouch.y1\n        this.camera.lastTouch.x1 = touch.clientX\n        this.camera.lastTouch.y1 = touch.clientY\n\n        if (Math.abs(movementX) < 50 && Math.abs(movementY) < 50) {\n          // 只处理小移动\n          this.camera.theta += movementX * 0.01 * 0.3 * moveScale\n          this.camera.phi = Math.max(1e-6, Math.min(Math.PI - 1e-6, this.camera.phi - movementY * 0.01 * moveScale))\n        }\n      } else if (e.touches.length === 2) {\n        // 支持单指变双指，兼容双指操作但是两根手指触屏时间不一致的情况\n        const touch1 = e.touches[0]\n        const touch2 = e.touches[1]\n\n        const distanceX = touch1.clientX - touch2.clientX\n        const distanceY = touch1.clientY - touch2.clientY\n        const distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY)\n\n        if (this.camera.lastTouch.x2 === null && this.camera.lastTouch.y2 === null) {\n          this.camera.lastTouch.x1 = touch1.clientX\n          this.camera.lastTouch.y1 = touch1.clientY\n          this.camera.lastTouch.x2 = touch2.clientX\n          this.camera.lastTouch.y2 = touch2.clientY\n\n          this.camera.lastTouch.distance = distance\n        } else {\n          // 双指开始滑动\n          let deltaScale = distance - this.camera.lastTouch.distance\n          this.camera.lastTouch.distance = distance\n\n          if (deltaScale < -2) {\n            deltaScale = -2\n          } else if (deltaScale > 2) {\n            deltaScale = 2\n          }\n\n          const newRaidus = this.camera.radius - deltaScale * 0.2\n          this.camera.radius = newRaidus > 0 ? newRaidus : this.camera.radius\n        }\n      }\n\n      this.camera.update()\n\n      this.canvas.requestAnimationFrame(this.requestRender.bind(this))\n    },\n    onTapControl(e) {\n      const dataSet = e.target.dataset\n\n      const id = dataSet.id\n\n      // 开始处理 ply 资源\n      this.initPLY(id)\n    },\n    changeMaxGaussianCount(e) {\n      this.setData({\n        maxGaussians: e.detail.value\n      })\n\n      console.log('slider maxGaussians:', this.data.maxGaussians)\n    },\n    switchWorker(e) {\n      this.setData({\n        workerOn: e.detail.value\n      })\n\n      this.camera.setWorkerOn(this.data.workerOn)\n\n      console.log('switch WorkerOn:', this.data.workerOn)\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/gaussian-splatting.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-frame-render-canvas\": \"../components/xr-frame-render/index\"\n  },\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n  \"navigationBarTitleText\": \"Gaussian Splatting 预览\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/gaussian-splatting.wxml",
    "content": "\n<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view\n    class=\"canvas-wrap\" style=\"width: {{widthScale * 100}}%; height: {{heightScale * 100}}%\"\n  > \n    <view wx:if=\"{{renderByXRFrame}}\">\n      <xr-frame-render-canvas\n        disable-scroll\n        id=\"canvas\"\n        width=\"{{width}}\"\n        height=\"{{height}}\"\n        style=\"width:{{domWidth}}px;height:{{domHeight}}px;\"\n        bind:sceneReady=\"handleXRSceneReady\"\n      ></xr-frame-render-canvas>\n    </view>\n    <view wx:if=\"{{renderByWebGL2}}\">\n      <canvas type=\"webgl2\" id=\"canvas\" bindtouchstart=\"onTouchStartWebGL\" bindtouchmove=\"onTouchMoveWebGL\"></canvas>\n    </view>\n  </view>\n  <view class=\"control-wrap\">\n    <view class=\"title\">经典 Splat</view>\n    <view class=\"block\">\n      <button class=\"btn\" type=\"primary\" data-id=\"room\" bindtap=\"onTapControl\">房间</button>\n      <button class=\"btn\" type=\"primary\" data-id=\"garden\"  bindtap=\"onTapControl\">花园</button>\n      <button class=\"btn\" type=\"primary\" data-id=\"stump\"  bindtap=\"onTapControl\">树桩</button>\n    </view>\n    <view class=\"title\">自制 Splat</view>\n    <view class=\"block\">\n      <button class=\"btn\" type=\"primary\" data-id=\"oneflower\"  bindtap=\"onTapControl\">盆栽</button>\n      <button class=\"btn\" type=\"primary\" data-id=\"usj\"  bindtap=\"onTapControl\">USJ马里奥</button>\n      <button class=\"btn\" type=\"primary\" data-id=\"sakura\"  bindtap=\"onTapControl\">樱花小道</button>\n      <!-- <button class=\"btn\" type=\"primary\" data-id=\"0517cruch\"  bindtap=\"onTapControl\">教堂花园</button> -->\n    </view>\n  </view>\n  <view class=\"input-wrap\">\n    <view class=\"title\">最大高斯球数</view>\n    <slider class=\"slider\" bindchange=\"changeMaxGaussianCount\" min=\"0\" max=\"1200000\" value=\"{{maxGaussians}}\" show-value/>\n    <view class=\"checkbox-wrap\"><p class=\"words\">是否开启 worker 排序</p><switch class=\"checkbox\" type=\"checkbox\" checked=\"{{workerOn}}\" bindchange=\"switchWorker\"/></view>\n    \n\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/gaussian-splatting.wxss",
    "content": ".canvas-wrap {\n  position: relative;\n  width: 100%;\n  background-color: #000;\n}\n\n.canvas-wrap canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.canvas-wrap #canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.control-wrap {\n  position: absolute;\n  right: 20rpx;\n  top: 20rpx;\n  padding: 10rpx 20rpx;\n  width: 180rpx;\n  height: 510rpx;\n  background-color: rgba(50, 50, 50, 0.6);\n  border-radius: 10rpx;\n}\n\n.control-wrap .block {\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n}\n\n.control-wrap .btn {\n  width: 100%;\n  flex: 1;\n  font-size: 20rpx;\n  margin-bottom: 14rpx;\n  padding-left: 10rpx;\n  padding-right: 10rpx;\n}\n\n.input-wrap {\n  position: absolute;\n  left: 20rpx;\n  right: 260rpx;\n  top: 20rpx;\n  padding: 10rpx 20rpx;\n  height: 200rpx;\n  background-color: rgba(50, 50, 50, 0.6);\n  border-radius: 10rpx;\n}\n.input-wrap .slider {\n  margin-bottom: 30rpx;\n}\n\n.input-wrap .checkbox-wrap {\n  width: 100%;\n  text-align: center;\n}\n\n.checkbox-wrap .words {\n  vertical-align: middle;\n  color: #fff;\n  font-size: 30rpx;\n  font-weight: bold;\n}\n.checkbox-wrap .checkbox {\n  vertical-align: middle;\n  margin-left: 20rpx;\n}\n\n.control-wrap .title, .input-wrap .title {\n  color: #fff;\n  width: 100%;\n  text-align: center;\n  font-size: 24rpx;\n  font-weight: bold;\n  margin-bottom: 10rpx;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/loaders/ply/ply-loader.js",
    "content": "import { wxDecodeAdapter, computeCov3D } from '../util-loader.js'\n\n// implementation from https://github.com/kishimisu/Gaussian-Splatting-WebGL\nexport function loadPly(content, maxGaussians) {\n  // Read header\n  console.log('loadPly', content)\n  const contentStart = wxDecodeAdapter(content.slice(0, 2000), true)\n  // const contentStart = new TextDecoder('utf-8').decode(content.slice(0, 2000))\n  const headerEnd = contentStart.indexOf('end_header') + 'end_header'.length + 1\n  const [header] = contentStart.split('end_header')\n\n  console.log('header', header)\n\n  // Get number of gaussians\n  const regex = /element vertex (\\d+)/\n  const match = header.match(regex)\n  let gaussianCount = parseInt(match[1])\n\n  console.log(`load splatCount: ${gaussianCount}`)\n\n  gaussianCount = Math.min(gaussianCount, maxGaussians)\n\n  // Create arrays for gaussian properties\n  const positions = []\n  const opacities = []\n  const colors = []\n  const cov3Ds = []\n\n  // Helpers\n  const sigmoid = (m1) => 1 / (1 + Math.exp(-m1))\n  const NUM_PROPS = 62\n\n  // Create a dataview to access the buffer's content on a byte levele\n  const view = new DataView(content)\n\n  // Get a slice of the dataview relative to a splat index\n  const fromDataView = (splatID, start, end) => {\n    const startOffset = headerEnd + splatID * NUM_PROPS * 4 + start * 4\n\n    if (end == null) return view.getFloat32(startOffset, true)\n\n    return new Float32Array(end - start).map((_, i) => view.getFloat32(startOffset + i * 4, true))\n  }\n\n  // Extract all properties for a gaussian splat using the dataview\n  const extractSplatData = (splatID) => {\n    const position = fromDataView(splatID, 0, 3)\n    // const n = fromDataView(splatID, 3, 6) // Not used\n    const harmonic = fromDataView(splatID, 6, 9)\n\n    const H_END = 6 + 48 // Offset of the last harmonic coefficient\n    const opacity = fromDataView(splatID, H_END)\n    const scale = fromDataView(splatID, H_END + 1, H_END + 4)\n    const rotation = fromDataView(splatID, H_END + 4, H_END + 8)\n\n    return {\n      position, harmonic, opacity, scale, rotation\n    }\n  }\n\n  // gaussianCount = 10;\n\n  for (let i = 0; i < gaussianCount; i++) {\n    // Extract data for current gaussian\n    let {\n      position, harmonic, opacity, scale, rotation\n    } = extractSplatData(i)\n\n    // Normalize quaternion\n    let length2 = 0\n\n    for (let j = 0; j < 4; j++) length2 += rotation[j] * rotation[j]\n\n    const length = Math.sqrt(length2)\n\n    // console.log('scale', scale[0], scale[1], scale[2]);\n    // console.log('rotation', rotation[0], rotation[1], rotation[2], rotation[3]);\n\n    rotation = rotation.map(v => v / length)\n\n    // Exponentiate scale\n    scale = scale.map(v => Math.exp(v))\n\n    // console.log('scalee', scale[0], scale[1], scale[2]);\n    // console.log('rotatione', rotation[0], rotation[1], rotation[2], rotation[3]);\n\n    // Activate alpha\n    opacity = sigmoid(opacity)\n    opacities.push(opacity)\n\n    // (Webgl-specific) Equivalent to computeColorFromSH() with degree 0:\n    // Use the first spherical harmonic to pre-compute the color.\n    // This allow to avoid sending harmonics to the web worker or GPU,\n    // but removes view-dependent lighting effects like reflections.\n    // If we were to use a degree > 0, we would need to recompute the color\n    // each time the camera moves, and send many more harmonics to the worker:\n    // Degree 1: 4 harmonics needed (12 floats) per gaussian\n    // Degree 2: 9 harmonics needed (27 floats) per gaussian\n    // Degree 3: 16 harmonics needed (48 floats) per gaussian\n    const SH_C0 = 0.28209479177387814\n    const color = [\n      0.5 + SH_C0 * harmonic[0],\n      0.5 + SH_C0 * harmonic[1],\n      0.5 + SH_C0 * harmonic[2]\n    ]\n    colors.push(...color)\n    // harmonics.push(...harmonic)\n\n    // (Webgl-specific) Pre-compute the 3D covariance matrix from\n    // the rotation and scale in order to avoid recomputing it at each frame.\n    // This also allow to avoid sending rotations and scales to the web worker or GPU.\n    const cov3D = computeCov3D(scale, 1, rotation)\n    cov3Ds.push(...cov3D)\n    // rotations.push(...rotation)\n    // scales.push(...scale)\n\n    positions.push(...position)\n  }\n\n  return {\n    positions, opacities, colors, cov3Ds, count: gaussianCount\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/loaders/splat/splat-loader.js",
    "content": "import { wxDecodeAdapter, computeCov3D } from '../util-loader.js'\n\nconst RowSizeBytes = 32\nconst CenterSizeBytes = 12\nconst ScaleSizeBytes = 12\nconst RotationSizeBytes = 4\nconst ColorSizeBytes = 4\n\nconst perPI = Math.PI / 180\n\nexport function loadSplat(content, maxGaussians) {\n  console.log('loadSplat', content)\n\n  const start = new Date().getTime()\n\n  // Create arrays for gaussian properties\n  const positions = []\n  const opacities = []\n  const colors = []\n  const cov3Ds = []\n\n  const inBuffer = content\n\n  let splatCount = inBuffer.byteLength / RowSizeBytes\n  console.log(`load splatCount: ${splatCount}`)\n\n  splatCount = Math.min(splatCount, maxGaussians)\n\n  // splatCount = 10;\n\n  for (let i = 0; i < splatCount; i++) {\n    // Standard .splat row layout:\n    // XYZ - Position (Float32)\n    // XYZ - Scale (Float32)\n    // RGBA - colors (uint8)\n    // IJKL - quaternion/rot (uint8)\n    const inBase = i * RowSizeBytes\n\n    const inCenter = new Float32Array(inBuffer, inBase, 3)\n    const inScale = new Float32Array(inBuffer, inBase + CenterSizeBytes, 3)\n    const inColor = new Uint8Array(inBuffer, inBase + CenterSizeBytes + ScaleSizeBytes, 4)\n    const inRotation = new Uint8Array(inBuffer, inBase + CenterSizeBytes +\n                                      ScaleSizeBytes + ColorSizeBytes, 4)\n\n    let rotation = [(inRotation[0] - 128) / 128, (inRotation[1] - 128) / 128, (inRotation[2] - 128) / 128, (inRotation[3] - 128) / 128]\n\n    // Normalize quaternion\n    let length2 = 0\n    for (let j = 0; j < 4; j++) length2 += rotation[j] * rotation[j]\n    const length = Math.sqrt(length2)\n    rotation = rotation.map(v => v / length)\n\n    // console.log('scale', inScale[0], inScale[1], inScale[2]);\n    // console.log('rotation', rotation[0], rotation[1], rotation[2], rotation[3]);\n\n    // Activate alpha\n    const opacity = inColor[3] / 255\n\n    opacities.push(opacity)\n    colors.push(inColor[0] / 255, inColor[1] / 255, inColor[2] / 255)\n\n    const cov3D = computeCov3D(inScale, 1, rotation)\n    cov3Ds.push(...cov3D)\n\n    positions.push(...inCenter)\n  }\n\n  const end = new Date().getTime()\n\n  const sortTime = `${((end - start) / 1000).toFixed(3)}s`\n  console.log(`parse ${splatCount} gaussians in ${sortTime}.`)\n\n  return {\n    positions, opacities, colors, cov3Ds, count: splatCount\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/loaders/util-loader.js",
    "content": "import * as glMatrix from '../util/gl-matrix-min'\n\nconst { mat3 } = glMatrix\nconst tmp = mat3.create()\nconst S = mat3.create()\nconst R = mat3.create()\nconst M = mat3.create()\nconst Sigma = mat3.create()\n\nfunction computeCov3D(scale, mod, rot) {\n  // Create scaling matrix\n  mat3.set(\n    S,\n    mod * scale[0],\n    0,\n    0,\n    0,\n    mod * scale[1],\n    0,\n    0,\n    0,\n    mod * scale[2]\n  )\n\n  const r = rot[0]\n  const x = rot[1]\n  const y = rot[2]\n  const z = rot[3]\n\n  // Compute rotation matrix from quaternion\n  mat3.set(\n    R,\n    1.0 - 2.0 * (y * y + z * z),\n    2.0 * (x * y - r * z),\n    2.0 * (x * z + r * y),\n    2.0 * (x * y + r * z),\n    1.0 - 2.0 * (x * x + z * z),\n    2.0 * (y * z - r * x),\n    2.0 * (x * z - r * y),\n    2.0 * (y * z + r * x),\n    1.0 - 2.0 * (x * x + y * y)\n  )\n\n  mat3.multiply(M, S, R) // M = S * R\n\n  // Compute 3D world covariance matrix Sigma\n  mat3.multiply(Sigma, mat3.transpose(tmp, M), M) // Sigma = transpose(M) * M\n\n  // Covariance is symmetric, only store upper right\n  const cov3D = [\n    Sigma[0], Sigma[1], Sigma[2],\n    Sigma[4], Sigma[5], Sigma[8]\n  ]\n  return cov3D\n}\n\nfunction wxDecodeAdapter(buffer, isUTF8) {\n  const array = new Uint8Array(buffer)\n  let str = ''\n\n  for (let i = 0; i < array.length; i++) {\n    str += String.fromCharCode(array[i])\n  }\n\n  if (isUTF8) {\n    // utf8 str fix\n    // https://developer.mozilla.org/zh-CN/docs/Web/API/WindowBase64/btoa\n    str = decodeURIComponent(encodeURIComponent(str))\n  }\n\n  return str\n}\n\nexport {\n  wxDecodeAdapter,\n  computeCov3D\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/util/gl-matrix-min.js",
    "content": "/*!\n@fileoverview gl-matrix - High performance matrix and vector operations\n@author Brandon Jones\n@author Colin MacKenzie IV\n@version 3.4.0\n\nCopyright (c) 2015-2021, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n!function(t,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?n(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],n):n((t=\"undefined\"!=typeof globalThis?globalThis:t||self).glMatrix={})}(this,(function(t){\"use strict\";var n=1e-6,a=\"undefined\"!=typeof Float32Array?Float32Array:Array,r=Math.random,u=\"zyx\";var e=Math.PI/180;Math.hypot||(Math.hypot=function(){for(var t=0,n=arguments.length;n--;)t+=arguments[n]*arguments[n];return Math.sqrt(t)});var o=Object.freeze({__proto__:null,EPSILON:n,get ARRAY_TYPE(){return a},RANDOM:r,ANGLE_ORDER:u,setMatrixArrayType:function(t){a=t},toRadian:function(t){return t*e},equals:function(t,a){return Math.abs(t-a)<=n*Math.max(1,Math.abs(t),Math.abs(a))}});function i(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],h=a[1],c=a[2],s=a[3];return t[0]=r*i+e*h,t[1]=u*i+o*h,t[2]=r*c+e*s,t[3]=u*c+o*s,t}function h(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t}var c=i,s=h,M=Object.freeze({__proto__:null,create:function(){var t=new a(4);return a!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t},clone:function(t){var n=new a(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},fromValues:function(t,n,r,u){var e=new a(4);return e[0]=t,e[1]=n,e[2]=r,e[3]=u,e},set:function(t,n,a,r,u){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t},transpose:function(t,n){if(t===n){var a=n[1];t[1]=n[2],t[2]=a}else t[0]=n[0],t[1]=n[2],t[2]=n[1],t[3]=n[3];return t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a*e-u*r;return o?(o=1/o,t[0]=e*o,t[1]=-r*o,t[2]=-u*o,t[3]=a*o,t):null},adjoint:function(t,n){var a=n[0];return t[0]=n[3],t[1]=-n[1],t[2]=-n[2],t[3]=a,t},determinant:function(t){return t[0]*t[3]-t[2]*t[1]},multiply:i,rotate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=Math.sin(a),h=Math.cos(a);return t[0]=r*h+e*i,t[1]=u*h+o*i,t[2]=r*-i+e*h,t[3]=u*-i+o*h,t},scale:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],h=a[1];return t[0]=r*i,t[1]=u*i,t[2]=e*h,t[3]=o*h,t},fromRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=-a,t[3]=r,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t},str:function(t){return\"mat2(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\")\"},frob:function(t){return Math.hypot(t[0],t[1],t[2],t[3])},LDU:function(t,n,a,r){return t[2]=r[2]/r[0],a[0]=r[0],a[1]=r[1],a[3]=r[3]-t[2]*a[1],[t,n,a]},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t},subtract:h,exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=a[0],h=a[1],c=a[2],s=a[3];return Math.abs(r-i)<=n*Math.max(1,Math.abs(r),Math.abs(i))&&Math.abs(u-h)<=n*Math.max(1,Math.abs(u),Math.abs(h))&&Math.abs(e-c)<=n*Math.max(1,Math.abs(e),Math.abs(c))&&Math.abs(o-s)<=n*Math.max(1,Math.abs(o),Math.abs(s))},multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t},mul:c,sub:s});function f(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],h=n[5],c=a[0],s=a[1],M=a[2],f=a[3],l=a[4],v=a[5];return t[0]=r*c+e*s,t[1]=u*c+o*s,t[2]=r*M+e*f,t[3]=u*M+o*f,t[4]=r*l+e*v+i,t[5]=u*l+o*v+h,t}function l(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t[4]=n[4]-a[4],t[5]=n[5]-a[5],t}var v=f,b=l,m=Object.freeze({__proto__:null,create:function(){var t=new a(6);return a!=Float32Array&&(t[1]=0,t[2]=0,t[4]=0,t[5]=0),t[0]=1,t[3]=1,t},clone:function(t){var n=new a(6);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},fromValues:function(t,n,r,u,e,o){var i=new a(6);return i[0]=t,i[1]=n,i[2]=r,i[3]=u,i[4]=e,i[5]=o,i},set:function(t,n,a,r,u,e,o){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],h=a*e-r*u;return h?(h=1/h,t[0]=e*h,t[1]=-r*h,t[2]=-u*h,t[3]=a*h,t[4]=(u*i-e*o)*h,t[5]=(r*o-a*i)*h,t):null},determinant:function(t){return t[0]*t[3]-t[1]*t[2]},multiply:f,rotate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],h=n[5],c=Math.sin(a),s=Math.cos(a);return t[0]=r*s+e*c,t[1]=u*s+o*c,t[2]=r*-c+e*s,t[3]=u*-c+o*s,t[4]=i,t[5]=h,t},scale:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],h=n[5],c=a[0],s=a[1];return t[0]=r*c,t[1]=u*c,t[2]=e*s,t[3]=o*s,t[4]=i,t[5]=h,t},translate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],h=n[5],c=a[0],s=a[1];return t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=r*c+e*s+i,t[5]=u*c+o*s+h,t},fromRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=-a,t[3]=r,t[4]=0,t[5]=0,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t[4]=0,t[5]=0,t},fromTranslation:function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=n[0],t[5]=n[1],t},str:function(t){return\"mat2d(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\", \"+t[4]+\", \"+t[5]+\")\"},frob:function(t){return Math.hypot(t[0],t[1],t[2],t[3],t[4],t[5],1)},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t},subtract:l,multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t[4]=n[4]+a[4]*r,t[5]=n[5]+a[5]*r,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],h=t[5],c=a[0],s=a[1],M=a[2],f=a[3],l=a[4],v=a[5];return Math.abs(r-c)<=n*Math.max(1,Math.abs(r),Math.abs(c))&&Math.abs(u-s)<=n*Math.max(1,Math.abs(u),Math.abs(s))&&Math.abs(e-M)<=n*Math.max(1,Math.abs(e),Math.abs(M))&&Math.abs(o-f)<=n*Math.max(1,Math.abs(o),Math.abs(f))&&Math.abs(i-l)<=n*Math.max(1,Math.abs(i),Math.abs(l))&&Math.abs(h-v)<=n*Math.max(1,Math.abs(h),Math.abs(v))},mul:v,sub:b});function d(){var t=new a(9);return a!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t}function p(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],h=n[5],c=n[6],s=n[7],M=n[8],f=a[0],l=a[1],v=a[2],b=a[3],m=a[4],d=a[5],p=a[6],x=a[7],y=a[8];return t[0]=f*r+l*o+v*c,t[1]=f*u+l*i+v*s,t[2]=f*e+l*h+v*M,t[3]=b*r+m*o+d*c,t[4]=b*u+m*i+d*s,t[5]=b*e+m*h+d*M,t[6]=p*r+x*o+y*c,t[7]=p*u+x*i+y*s,t[8]=p*e+x*h+y*M,t}function x(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t[4]=n[4]-a[4],t[5]=n[5]-a[5],t[6]=n[6]-a[6],t[7]=n[7]-a[7],t[8]=n[8]-a[8],t}var y=p,q=x,g=Object.freeze({__proto__:null,create:d,fromMat4:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[4],t[4]=n[5],t[5]=n[6],t[6]=n[8],t[7]=n[9],t[8]=n[10],t},clone:function(t){var n=new a(9);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},fromValues:function(t,n,r,u,e,o,i,h,c){var s=new a(9);return s[0]=t,s[1]=n,s[2]=r,s[3]=u,s[4]=e,s[5]=o,s[6]=i,s[7]=h,s[8]=c,s},set:function(t,n,a,r,u,e,o,i,h,c){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t[6]=i,t[7]=h,t[8]=c,t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},transpose:function(t,n){if(t===n){var a=n[1],r=n[2],u=n[5];t[1]=n[3],t[2]=n[6],t[3]=a,t[5]=n[7],t[6]=r,t[7]=u}else t[0]=n[0],t[1]=n[3],t[2]=n[6],t[3]=n[1],t[4]=n[4],t[5]=n[7],t[6]=n[2],t[7]=n[5],t[8]=n[8];return t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],h=n[6],c=n[7],s=n[8],M=s*o-i*c,f=-s*e+i*h,l=c*e-o*h,v=a*M+r*f+u*l;return v?(v=1/v,t[0]=M*v,t[1]=(-s*r+u*c)*v,t[2]=(i*r-u*o)*v,t[3]=f*v,t[4]=(s*a-u*h)*v,t[5]=(-i*a+u*e)*v,t[6]=l*v,t[7]=(-c*a+r*h)*v,t[8]=(o*a-r*e)*v,t):null},adjoint:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],h=n[6],c=n[7],s=n[8];return t[0]=o*s-i*c,t[1]=u*c-r*s,t[2]=r*i-u*o,t[3]=i*h-e*s,t[4]=a*s-u*h,t[5]=u*e-a*i,t[6]=e*c-o*h,t[7]=r*h-a*c,t[8]=a*o-r*e,t},determinant:function(t){var n=t[0],a=t[1],r=t[2],u=t[3],e=t[4],o=t[5],i=t[6],h=t[7],c=t[8];return n*(c*e-o*h)+a*(-c*u+o*i)+r*(h*u-e*i)},multiply:p,translate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],h=n[5],c=n[6],s=n[7],M=n[8],f=a[0],l=a[1];return t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=i,t[5]=h,t[6]=f*r+l*o+c,t[7]=f*u+l*i+s,t[8]=f*e+l*h+M,t},rotate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],h=n[5],c=n[6],s=n[7],M=n[8],f=Math.sin(a),l=Math.cos(a);return t[0]=l*r+f*o,t[1]=l*u+f*i,t[2]=l*e+f*h,t[3]=l*o-f*r,t[4]=l*i-f*u,t[5]=l*h-f*e,t[6]=c,t[7]=s,t[8]=M,t},scale:function(t,n,a){var r=a[0],u=a[1];return t[0]=r*n[0],t[1]=r*n[1],t[2]=r*n[2],t[3]=u*n[3],t[4]=u*n[4],t[5]=u*n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},fromTranslation:function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=n[0],t[7]=n[1],t[8]=1,t},fromRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=0,t[3]=-a,t[4]=r,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=n[1],t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},fromMat2d:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=0,t[3]=n[2],t[4]=n[3],t[5]=0,t[6]=n[4],t[7]=n[5],t[8]=1,t},fromQuat:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a+a,i=r+r,h=u+u,c=a*o,s=r*o,M=r*i,f=u*o,l=u*i,v=u*h,b=e*o,m=e*i,d=e*h;return t[0]=1-M-v,t[3]=s-d,t[6]=f+m,t[1]=s+d,t[4]=1-c-v,t[7]=l-b,t[2]=f-m,t[5]=l+b,t[8]=1-c-M,t},normalFromMat4:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],h=n[6],c=n[7],s=n[8],M=n[9],f=n[10],l=n[11],v=n[12],b=n[13],m=n[14],d=n[15],p=a*i-r*o,x=a*h-u*o,y=a*c-e*o,q=r*h-u*i,g=r*c-e*i,_=u*c-e*h,A=s*b-M*v,w=s*m-f*v,z=s*d-l*v,R=M*m-f*b,O=M*d-l*b,j=f*d-l*m,E=p*j-x*O+y*R+q*z-g*w+_*A;return E?(E=1/E,t[0]=(i*j-h*O+c*R)*E,t[1]=(h*z-o*j-c*w)*E,t[2]=(o*O-i*z+c*A)*E,t[3]=(u*O-r*j-e*R)*E,t[4]=(a*j-u*z+e*w)*E,t[5]=(r*z-a*O-e*A)*E,t[6]=(b*_-m*g+d*q)*E,t[7]=(m*y-v*_-d*x)*E,t[8]=(v*g-b*y+d*p)*E,t):null},projection:function(t,n,a){return t[0]=2/n,t[1]=0,t[2]=0,t[3]=0,t[4]=-2/a,t[5]=0,t[6]=-1,t[7]=1,t[8]=1,t},str:function(t){return\"mat3(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\", \"+t[4]+\", \"+t[5]+\", \"+t[6]+\", \"+t[7]+\", \"+t[8]+\")\"},frob:function(t){return Math.hypot(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8])},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t[6]=n[6]+a[6],t[7]=n[7]+a[7],t[8]=n[8]+a[8],t},subtract:x,multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t[6]=n[6]*a,t[7]=n[7]*a,t[8]=n[8]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t[4]=n[4]+a[4]*r,t[5]=n[5]+a[5]*r,t[6]=n[6]+a[6]*r,t[7]=n[7]+a[7]*r,t[8]=n[8]+a[8]*r,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]&&t[8]===n[8]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],h=t[5],c=t[6],s=t[7],M=t[8],f=a[0],l=a[1],v=a[2],b=a[3],m=a[4],d=a[5],p=a[6],x=a[7],y=a[8];return Math.abs(r-f)<=n*Math.max(1,Math.abs(r),Math.abs(f))&&Math.abs(u-l)<=n*Math.max(1,Math.abs(u),Math.abs(l))&&Math.abs(e-v)<=n*Math.max(1,Math.abs(e),Math.abs(v))&&Math.abs(o-b)<=n*Math.max(1,Math.abs(o),Math.abs(b))&&Math.abs(i-m)<=n*Math.max(1,Math.abs(i),Math.abs(m))&&Math.abs(h-d)<=n*Math.max(1,Math.abs(h),Math.abs(d))&&Math.abs(c-p)<=n*Math.max(1,Math.abs(c),Math.abs(p))&&Math.abs(s-x)<=n*Math.max(1,Math.abs(s),Math.abs(x))&&Math.abs(M-y)<=n*Math.max(1,Math.abs(M),Math.abs(y))},mul:y,sub:q});function _(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function A(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],h=n[5],c=n[6],s=n[7],M=n[8],f=n[9],l=n[10],v=n[11],b=n[12],m=n[13],d=n[14],p=n[15],x=a[0],y=a[1],q=a[2],g=a[3];return t[0]=x*r+y*i+q*M+g*b,t[1]=x*u+y*h+q*f+g*m,t[2]=x*e+y*c+q*l+g*d,t[3]=x*o+y*s+q*v+g*p,x=a[4],y=a[5],q=a[6],g=a[7],t[4]=x*r+y*i+q*M+g*b,t[5]=x*u+y*h+q*f+g*m,t[6]=x*e+y*c+q*l+g*d,t[7]=x*o+y*s+q*v+g*p,x=a[8],y=a[9],q=a[10],g=a[11],t[8]=x*r+y*i+q*M+g*b,t[9]=x*u+y*h+q*f+g*m,t[10]=x*e+y*c+q*l+g*d,t[11]=x*o+y*s+q*v+g*p,x=a[12],y=a[13],q=a[14],g=a[15],t[12]=x*r+y*i+q*M+g*b,t[13]=x*u+y*h+q*f+g*m,t[14]=x*e+y*c+q*l+g*d,t[15]=x*o+y*s+q*v+g*p,t}function w(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=r+r,h=u+u,c=e+e,s=r*i,M=r*h,f=r*c,l=u*h,v=u*c,b=e*c,m=o*i,d=o*h,p=o*c;return t[0]=1-(l+b),t[1]=M+p,t[2]=f-d,t[3]=0,t[4]=M-p,t[5]=1-(s+b),t[6]=v+m,t[7]=0,t[8]=f+d,t[9]=v-m,t[10]=1-(s+l),t[11]=0,t[12]=a[0],t[13]=a[1],t[14]=a[2],t[15]=1,t}function z(t,n){return t[0]=n[12],t[1]=n[13],t[2]=n[14],t}function R(t,n){var a=n[0],r=n[1],u=n[2],e=n[4],o=n[5],i=n[6],h=n[8],c=n[9],s=n[10];return t[0]=Math.hypot(a,r,u),t[1]=Math.hypot(e,o,i),t[2]=Math.hypot(h,c,s),t}function O(t,n){var r=new a(3);R(r,n);var u=1/r[0],e=1/r[1],o=1/r[2],i=n[0]*u,h=n[1]*e,c=n[2]*o,s=n[4]*u,M=n[5]*e,f=n[6]*o,l=n[8]*u,v=n[9]*e,b=n[10]*o,m=i+M+b,d=0;return m>0?(d=2*Math.sqrt(m+1),t[3]=.25*d,t[0]=(f-v)/d,t[1]=(l-c)/d,t[2]=(h-s)/d):i>M&&i>b?(d=2*Math.sqrt(1+i-M-b),t[3]=(f-v)/d,t[0]=.25*d,t[1]=(h+s)/d,t[2]=(l+c)/d):M>b?(d=2*Math.sqrt(1+M-i-b),t[3]=(l-c)/d,t[0]=(h+s)/d,t[1]=.25*d,t[2]=(f+v)/d):(d=2*Math.sqrt(1+b-i-M),t[3]=(h-s)/d,t[0]=(l+c)/d,t[1]=(f+v)/d,t[2]=.25*d),t}function j(t,n,a,r,u){var e=1/Math.tan(n/2);if(t[0]=e/a,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=u&&u!==1/0){var o=1/(r-u);t[10]=(u+r)*o,t[14]=2*u*r*o}else t[10]=-1,t[14]=-2*r;return t}var E=j;function P(t,n,a,r,u,e,o){var i=1/(n-a),h=1/(r-u),c=1/(e-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*h,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*c,t[11]=0,t[12]=(n+a)*i,t[13]=(u+r)*h,t[14]=(o+e)*c,t[15]=1,t}var T=P;function S(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t[4]=n[4]-a[4],t[5]=n[5]-a[5],t[6]=n[6]-a[6],t[7]=n[7]-a[7],t[8]=n[8]-a[8],t[9]=n[9]-a[9],t[10]=n[10]-a[10],t[11]=n[11]-a[11],t[12]=n[12]-a[12],t[13]=n[13]-a[13],t[14]=n[14]-a[14],t[15]=n[15]-a[15],t}var D=A,F=S,I=Object.freeze({__proto__:null,create:function(){var t=new a(16);return a!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},clone:function(t){var n=new a(16);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},fromValues:function(t,n,r,u,e,o,i,h,c,s,M,f,l,v,b,m){var d=new a(16);return d[0]=t,d[1]=n,d[2]=r,d[3]=u,d[4]=e,d[5]=o,d[6]=i,d[7]=h,d[8]=c,d[9]=s,d[10]=M,d[11]=f,d[12]=l,d[13]=v,d[14]=b,d[15]=m,d},set:function(t,n,a,r,u,e,o,i,h,c,s,M,f,l,v,b,m){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t[6]=i,t[7]=h,t[8]=c,t[9]=s,t[10]=M,t[11]=f,t[12]=l,t[13]=v,t[14]=b,t[15]=m,t},identity:_,transpose:function(t,n){if(t===n){var a=n[1],r=n[2],u=n[3],e=n[6],o=n[7],i=n[11];t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=a,t[6]=n[9],t[7]=n[13],t[8]=r,t[9]=e,t[11]=n[14],t[12]=u,t[13]=o,t[14]=i}else t[0]=n[0],t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=n[1],t[5]=n[5],t[6]=n[9],t[7]=n[13],t[8]=n[2],t[9]=n[6],t[10]=n[10],t[11]=n[14],t[12]=n[3],t[13]=n[7],t[14]=n[11],t[15]=n[15];return t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],h=n[6],c=n[7],s=n[8],M=n[9],f=n[10],l=n[11],v=n[12],b=n[13],m=n[14],d=n[15],p=a*i-r*o,x=a*h-u*o,y=a*c-e*o,q=r*h-u*i,g=r*c-e*i,_=u*c-e*h,A=s*b-M*v,w=s*m-f*v,z=s*d-l*v,R=M*m-f*b,O=M*d-l*b,j=f*d-l*m,E=p*j-x*O+y*R+q*z-g*w+_*A;return E?(E=1/E,t[0]=(i*j-h*O+c*R)*E,t[1]=(u*O-r*j-e*R)*E,t[2]=(b*_-m*g+d*q)*E,t[3]=(f*g-M*_-l*q)*E,t[4]=(h*z-o*j-c*w)*E,t[5]=(a*j-u*z+e*w)*E,t[6]=(m*y-v*_-d*x)*E,t[7]=(s*_-f*y+l*x)*E,t[8]=(o*O-i*z+c*A)*E,t[9]=(r*z-a*O-e*A)*E,t[10]=(v*g-b*y+d*p)*E,t[11]=(M*y-s*g-l*p)*E,t[12]=(i*w-o*R-h*A)*E,t[13]=(a*R-r*w+u*A)*E,t[14]=(b*x-v*q-m*p)*E,t[15]=(s*q-M*x+f*p)*E,t):null},adjoint:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],h=n[6],c=n[7],s=n[8],M=n[9],f=n[10],l=n[11],v=n[12],b=n[13],m=n[14],d=n[15],p=a*i-r*o,x=a*h-u*o,y=a*c-e*o,q=r*h-u*i,g=r*c-e*i,_=u*c-e*h,A=s*b-M*v,w=s*m-f*v,z=s*d-l*v,R=M*m-f*b,O=M*d-l*b,j=f*d-l*m;return t[0]=i*j-h*O+c*R,t[1]=u*O-r*j-e*R,t[2]=b*_-m*g+d*q,t[3]=f*g-M*_-l*q,t[4]=h*z-o*j-c*w,t[5]=a*j-u*z+e*w,t[6]=m*y-v*_-d*x,t[7]=s*_-f*y+l*x,t[8]=o*O-i*z+c*A,t[9]=r*z-a*O-e*A,t[10]=v*g-b*y+d*p,t[11]=M*y-s*g-l*p,t[12]=i*w-o*R-h*A,t[13]=a*R-r*w+u*A,t[14]=b*x-v*q-m*p,t[15]=s*q-M*x+f*p,t},determinant:function(t){var n=t[0],a=t[1],r=t[2],u=t[3],e=t[4],o=t[5],i=t[6],h=t[7],c=t[8],s=t[9],M=t[10],f=t[11],l=t[12],v=t[13],b=t[14],m=n*o-a*e,d=n*i-r*e,p=a*i-r*o,x=c*v-s*l,y=c*b-M*l,q=s*b-M*v;return h*(n*q-a*y+r*x)-u*(e*q-o*y+i*x)+t[15]*(c*p-s*d+M*m)-f*(l*p-v*d+b*m)},multiply:A,translate:function(t,n,a){var r,u,e,o,i,h,c,s,M,f,l,v,b=a[0],m=a[1],d=a[2];return n===t?(t[12]=n[0]*b+n[4]*m+n[8]*d+n[12],t[13]=n[1]*b+n[5]*m+n[9]*d+n[13],t[14]=n[2]*b+n[6]*m+n[10]*d+n[14],t[15]=n[3]*b+n[7]*m+n[11]*d+n[15]):(r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],h=n[5],c=n[6],s=n[7],M=n[8],f=n[9],l=n[10],v=n[11],t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=i,t[5]=h,t[6]=c,t[7]=s,t[8]=M,t[9]=f,t[10]=l,t[11]=v,t[12]=r*b+i*m+M*d+n[12],t[13]=u*b+h*m+f*d+n[13],t[14]=e*b+c*m+l*d+n[14],t[15]=o*b+s*m+v*d+n[15]),t},scale:function(t,n,a){var r=a[0],u=a[1],e=a[2];return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t[4]=n[4]*u,t[5]=n[5]*u,t[6]=n[6]*u,t[7]=n[7]*u,t[8]=n[8]*e,t[9]=n[9]*e,t[10]=n[10]*e,t[11]=n[11]*e,t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},rotate:function(t,a,r,u){var e,o,i,h,c,s,M,f,l,v,b,m,d,p,x,y,q,g,_,A,w,z,R,O,j=u[0],E=u[1],P=u[2],T=Math.hypot(j,E,P);return T<n?null:(j*=T=1/T,E*=T,P*=T,e=Math.sin(r),i=1-(o=Math.cos(r)),h=a[0],c=a[1],s=a[2],M=a[3],f=a[4],l=a[5],v=a[6],b=a[7],m=a[8],d=a[9],p=a[10],x=a[11],y=j*j*i+o,q=E*j*i+P*e,g=P*j*i-E*e,_=j*E*i-P*e,A=E*E*i+o,w=P*E*i+j*e,z=j*P*i+E*e,R=E*P*i-j*e,O=P*P*i+o,t[0]=h*y+f*q+m*g,t[1]=c*y+l*q+d*g,t[2]=s*y+v*q+p*g,t[3]=M*y+b*q+x*g,t[4]=h*_+f*A+m*w,t[5]=c*_+l*A+d*w,t[6]=s*_+v*A+p*w,t[7]=M*_+b*A+x*w,t[8]=h*z+f*R+m*O,t[9]=c*z+l*R+d*O,t[10]=s*z+v*R+p*O,t[11]=M*z+b*R+x*O,a!==t&&(t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t)},rotateX:function(t,n,a){var r=Math.sin(a),u=Math.cos(a),e=n[4],o=n[5],i=n[6],h=n[7],c=n[8],s=n[9],M=n[10],f=n[11];return n!==t&&(t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t[4]=e*u+c*r,t[5]=o*u+s*r,t[6]=i*u+M*r,t[7]=h*u+f*r,t[8]=c*u-e*r,t[9]=s*u-o*r,t[10]=M*u-i*r,t[11]=f*u-h*r,t},rotateY:function(t,n,a){var r=Math.sin(a),u=Math.cos(a),e=n[0],o=n[1],i=n[2],h=n[3],c=n[8],s=n[9],M=n[10],f=n[11];return n!==t&&(t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t[0]=e*u-c*r,t[1]=o*u-s*r,t[2]=i*u-M*r,t[3]=h*u-f*r,t[8]=e*r+c*u,t[9]=o*r+s*u,t[10]=i*r+M*u,t[11]=h*r+f*u,t},rotateZ:function(t,n,a){var r=Math.sin(a),u=Math.cos(a),e=n[0],o=n[1],i=n[2],h=n[3],c=n[4],s=n[5],M=n[6],f=n[7];return n!==t&&(t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t[0]=e*u+c*r,t[1]=o*u+s*r,t[2]=i*u+M*r,t[3]=h*u+f*r,t[4]=c*u-e*r,t[5]=s*u-o*r,t[6]=M*u-i*r,t[7]=f*u-h*r,t},fromTranslation:function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=n[0],t[13]=n[1],t[14]=n[2],t[15]=1,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=n[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=n[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},fromRotation:function(t,a,r){var u,e,o,i=r[0],h=r[1],c=r[2],s=Math.hypot(i,h,c);return s<n?null:(i*=s=1/s,h*=s,c*=s,u=Math.sin(a),o=1-(e=Math.cos(a)),t[0]=i*i*o+e,t[1]=h*i*o+c*u,t[2]=c*i*o-h*u,t[3]=0,t[4]=i*h*o-c*u,t[5]=h*h*o+e,t[6]=c*h*o+i*u,t[7]=0,t[8]=i*c*o+h*u,t[9]=h*c*o-i*u,t[10]=c*c*o+e,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t)},fromXRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=r,t[6]=a,t[7]=0,t[8]=0,t[9]=-a,t[10]=r,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},fromYRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=0,t[2]=-a,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=a,t[9]=0,t[10]=r,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},fromZRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=0,t[3]=0,t[4]=-a,t[5]=r,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},fromRotationTranslation:w,fromQuat2:function(t,n){var r=new a(3),u=-n[0],e=-n[1],o=-n[2],i=n[3],h=n[4],c=n[5],s=n[6],M=n[7],f=u*u+e*e+o*o+i*i;return f>0?(r[0]=2*(h*i+M*u+c*o-s*e)/f,r[1]=2*(c*i+M*e+s*u-h*o)/f,r[2]=2*(s*i+M*o+h*e-c*u)/f):(r[0]=2*(h*i+M*u+c*o-s*e),r[1]=2*(c*i+M*e+s*u-h*o),r[2]=2*(s*i+M*o+h*e-c*u)),w(t,n,r),t},getTranslation:z,getScaling:R,getRotation:O,decompose:function(t,n,a,r){n[0]=r[12],n[1]=r[13],n[2]=r[14];var u=r[0],e=r[1],o=r[2],i=r[4],h=r[5],c=r[6],s=r[8],M=r[9],f=r[10];a[0]=Math.hypot(u,e,o),a[1]=Math.hypot(i,h,c),a[2]=Math.hypot(s,M,f);var l=1/a[0],v=1/a[1],b=1/a[2],m=u*l,d=e*v,p=o*b,x=i*l,y=h*v,q=c*b,g=s*l,_=M*v,A=f*b,w=m+y+A,z=0;return w>0?(z=2*Math.sqrt(w+1),t[3]=.25*z,t[0]=(q-_)/z,t[1]=(g-p)/z,t[2]=(d-x)/z):m>y&&m>A?(z=2*Math.sqrt(1+m-y-A),t[3]=(q-_)/z,t[0]=.25*z,t[1]=(d+x)/z,t[2]=(g+p)/z):y>A?(z=2*Math.sqrt(1+y-m-A),t[3]=(g-p)/z,t[0]=(d+x)/z,t[1]=.25*z,t[2]=(q+_)/z):(z=2*Math.sqrt(1+A-m-y),t[3]=(d-x)/z,t[0]=(g+p)/z,t[1]=(q+_)/z,t[2]=.25*z),t},fromRotationTranslationScale:function(t,n,a,r){var u=n[0],e=n[1],o=n[2],i=n[3],h=u+u,c=e+e,s=o+o,M=u*h,f=u*c,l=u*s,v=e*c,b=e*s,m=o*s,d=i*h,p=i*c,x=i*s,y=r[0],q=r[1],g=r[2];return t[0]=(1-(v+m))*y,t[1]=(f+x)*y,t[2]=(l-p)*y,t[3]=0,t[4]=(f-x)*q,t[5]=(1-(M+m))*q,t[6]=(b+d)*q,t[7]=0,t[8]=(l+p)*g,t[9]=(b-d)*g,t[10]=(1-(M+v))*g,t[11]=0,t[12]=a[0],t[13]=a[1],t[14]=a[2],t[15]=1,t},fromRotationTranslationScaleOrigin:function(t,n,a,r,u){var e=n[0],o=n[1],i=n[2],h=n[3],c=e+e,s=o+o,M=i+i,f=e*c,l=e*s,v=e*M,b=o*s,m=o*M,d=i*M,p=h*c,x=h*s,y=h*M,q=r[0],g=r[1],_=r[2],A=u[0],w=u[1],z=u[2],R=(1-(b+d))*q,O=(l+y)*q,j=(v-x)*q,E=(l-y)*g,P=(1-(f+d))*g,T=(m+p)*g,S=(v+x)*_,D=(m-p)*_,F=(1-(f+b))*_;return t[0]=R,t[1]=O,t[2]=j,t[3]=0,t[4]=E,t[5]=P,t[6]=T,t[7]=0,t[8]=S,t[9]=D,t[10]=F,t[11]=0,t[12]=a[0]+A-(R*A+E*w+S*z),t[13]=a[1]+w-(O*A+P*w+D*z),t[14]=a[2]+z-(j*A+T*w+F*z),t[15]=1,t},fromQuat:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a+a,i=r+r,h=u+u,c=a*o,s=r*o,M=r*i,f=u*o,l=u*i,v=u*h,b=e*o,m=e*i,d=e*h;return t[0]=1-M-v,t[1]=s+d,t[2]=f-m,t[3]=0,t[4]=s-d,t[5]=1-c-v,t[6]=l+b,t[7]=0,t[8]=f+m,t[9]=l-b,t[10]=1-c-M,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},frustum:function(t,n,a,r,u,e,o){var i=1/(a-n),h=1/(u-r),c=1/(e-o);return t[0]=2*e*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*e*h,t[6]=0,t[7]=0,t[8]=(a+n)*i,t[9]=(u+r)*h,t[10]=(o+e)*c,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*e*2*c,t[15]=0,t},perspectiveNO:j,perspective:E,perspectiveZO:function(t,n,a,r,u){var e=1/Math.tan(n/2);if(t[0]=e/a,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=u&&u!==1/0){var o=1/(r-u);t[10]=u*o,t[14]=u*r*o}else t[10]=-1,t[14]=-r;return t},perspectiveFromFieldOfView:function(t,n,a,r){var u=Math.tan(n.upDegrees*Math.PI/180),e=Math.tan(n.downDegrees*Math.PI/180),o=Math.tan(n.leftDegrees*Math.PI/180),i=Math.tan(n.rightDegrees*Math.PI/180),h=2/(o+i),c=2/(u+e);return t[0]=h,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=c,t[6]=0,t[7]=0,t[8]=-(o-i)*h*.5,t[9]=(u-e)*c*.5,t[10]=r/(a-r),t[11]=-1,t[12]=0,t[13]=0,t[14]=r*a/(a-r),t[15]=0,t},orthoNO:P,ortho:T,orthoZO:function(t,n,a,r,u,e,o){var i=1/(n-a),h=1/(r-u),c=1/(e-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*h,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=c,t[11]=0,t[12]=(n+a)*i,t[13]=(u+r)*h,t[14]=e*c,t[15]=1,t},lookAt:function(t,a,r,u){var e,o,i,h,c,s,M,f,l,v,b=a[0],m=a[1],d=a[2],p=u[0],x=u[1],y=u[2],q=r[0],g=r[1],A=r[2];return Math.abs(b-q)<n&&Math.abs(m-g)<n&&Math.abs(d-A)<n?_(t):(M=b-q,f=m-g,l=d-A,e=x*(l*=v=1/Math.hypot(M,f,l))-y*(f*=v),o=y*(M*=v)-p*l,i=p*f-x*M,(v=Math.hypot(e,o,i))?(e*=v=1/v,o*=v,i*=v):(e=0,o=0,i=0),h=f*i-l*o,c=l*e-M*i,s=M*o-f*e,(v=Math.hypot(h,c,s))?(h*=v=1/v,c*=v,s*=v):(h=0,c=0,s=0),t[0]=e,t[1]=h,t[2]=M,t[3]=0,t[4]=o,t[5]=c,t[6]=f,t[7]=0,t[8]=i,t[9]=s,t[10]=l,t[11]=0,t[12]=-(e*b+o*m+i*d),t[13]=-(h*b+c*m+s*d),t[14]=-(M*b+f*m+l*d),t[15]=1,t)},targetTo:function(t,n,a,r){var u=n[0],e=n[1],o=n[2],i=r[0],h=r[1],c=r[2],s=u-a[0],M=e-a[1],f=o-a[2],l=s*s+M*M+f*f;l>0&&(s*=l=1/Math.sqrt(l),M*=l,f*=l);var v=h*f-c*M,b=c*s-i*f,m=i*M-h*s;return(l=v*v+b*b+m*m)>0&&(v*=l=1/Math.sqrt(l),b*=l,m*=l),t[0]=v,t[1]=b,t[2]=m,t[3]=0,t[4]=M*m-f*b,t[5]=f*v-s*m,t[6]=s*b-M*v,t[7]=0,t[8]=s,t[9]=M,t[10]=f,t[11]=0,t[12]=u,t[13]=e,t[14]=o,t[15]=1,t},str:function(t){return\"mat4(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\", \"+t[4]+\", \"+t[5]+\", \"+t[6]+\", \"+t[7]+\", \"+t[8]+\", \"+t[9]+\", \"+t[10]+\", \"+t[11]+\", \"+t[12]+\", \"+t[13]+\", \"+t[14]+\", \"+t[15]+\")\"},frob:function(t){return Math.hypot(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t[6]=n[6]+a[6],t[7]=n[7]+a[7],t[8]=n[8]+a[8],t[9]=n[9]+a[9],t[10]=n[10]+a[10],t[11]=n[11]+a[11],t[12]=n[12]+a[12],t[13]=n[13]+a[13],t[14]=n[14]+a[14],t[15]=n[15]+a[15],t},subtract:S,multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t[6]=n[6]*a,t[7]=n[7]*a,t[8]=n[8]*a,t[9]=n[9]*a,t[10]=n[10]*a,t[11]=n[11]*a,t[12]=n[12]*a,t[13]=n[13]*a,t[14]=n[14]*a,t[15]=n[15]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t[4]=n[4]+a[4]*r,t[5]=n[5]+a[5]*r,t[6]=n[6]+a[6]*r,t[7]=n[7]+a[7]*r,t[8]=n[8]+a[8]*r,t[9]=n[9]+a[9]*r,t[10]=n[10]+a[10]*r,t[11]=n[11]+a[11]*r,t[12]=n[12]+a[12]*r,t[13]=n[13]+a[13]*r,t[14]=n[14]+a[14]*r,t[15]=n[15]+a[15]*r,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]&&t[8]===n[8]&&t[9]===n[9]&&t[10]===n[10]&&t[11]===n[11]&&t[12]===n[12]&&t[13]===n[13]&&t[14]===n[14]&&t[15]===n[15]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],h=t[5],c=t[6],s=t[7],M=t[8],f=t[9],l=t[10],v=t[11],b=t[12],m=t[13],d=t[14],p=t[15],x=a[0],y=a[1],q=a[2],g=a[3],_=a[4],A=a[5],w=a[6],z=a[7],R=a[8],O=a[9],j=a[10],E=a[11],P=a[12],T=a[13],S=a[14],D=a[15];return Math.abs(r-x)<=n*Math.max(1,Math.abs(r),Math.abs(x))&&Math.abs(u-y)<=n*Math.max(1,Math.abs(u),Math.abs(y))&&Math.abs(e-q)<=n*Math.max(1,Math.abs(e),Math.abs(q))&&Math.abs(o-g)<=n*Math.max(1,Math.abs(o),Math.abs(g))&&Math.abs(i-_)<=n*Math.max(1,Math.abs(i),Math.abs(_))&&Math.abs(h-A)<=n*Math.max(1,Math.abs(h),Math.abs(A))&&Math.abs(c-w)<=n*Math.max(1,Math.abs(c),Math.abs(w))&&Math.abs(s-z)<=n*Math.max(1,Math.abs(s),Math.abs(z))&&Math.abs(M-R)<=n*Math.max(1,Math.abs(M),Math.abs(R))&&Math.abs(f-O)<=n*Math.max(1,Math.abs(f),Math.abs(O))&&Math.abs(l-j)<=n*Math.max(1,Math.abs(l),Math.abs(j))&&Math.abs(v-E)<=n*Math.max(1,Math.abs(v),Math.abs(E))&&Math.abs(b-P)<=n*Math.max(1,Math.abs(b),Math.abs(P))&&Math.abs(m-T)<=n*Math.max(1,Math.abs(m),Math.abs(T))&&Math.abs(d-S)<=n*Math.max(1,Math.abs(d),Math.abs(S))&&Math.abs(p-D)<=n*Math.max(1,Math.abs(p),Math.abs(D))},mul:D,sub:F});function L(){var t=new a(3);return a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function V(t){var n=t[0],a=t[1],r=t[2];return Math.hypot(n,a,r)}function k(t,n,r){var u=new a(3);return u[0]=t,u[1]=n,u[2]=r,u}function Q(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t}function Y(t,n,a){return t[0]=n[0]*a[0],t[1]=n[1]*a[1],t[2]=n[2]*a[2],t}function Z(t,n,a){return t[0]=n[0]/a[0],t[1]=n[1]/a[1],t[2]=n[2]/a[2],t}function N(t,n){var a=n[0]-t[0],r=n[1]-t[1],u=n[2]-t[2];return Math.hypot(a,r,u)}function X(t,n){var a=n[0]-t[0],r=n[1]-t[1],u=n[2]-t[2];return a*a+r*r+u*u}function B(t){var n=t[0],a=t[1],r=t[2];return n*n+a*a+r*r}function U(t,n){var a=n[0],r=n[1],u=n[2],e=a*a+r*r+u*u;return e>0&&(e=1/Math.sqrt(e)),t[0]=n[0]*e,t[1]=n[1]*e,t[2]=n[2]*e,t}function G(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function W(t,n,a){var r=n[0],u=n[1],e=n[2],o=a[0],i=a[1],h=a[2];return t[0]=u*h-e*i,t[1]=e*o-r*h,t[2]=r*i-u*o,t}var C,H=Q,J=Y,K=Z,$=N,tt=X,nt=V,at=B,rt=(C=L(),function(t,n,a,r,u,e){var o,i;for(n||(n=3),a||(a=0),i=r?Math.min(r*n+a,t.length):t.length,o=a;o<i;o+=n)C[0]=t[o],C[1]=t[o+1],C[2]=t[o+2],u(C,C,e),t[o]=C[0],t[o+1]=C[1],t[o+2]=C[2];return t}),ut=Object.freeze({__proto__:null,create:L,clone:function(t){var n=new a(3);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n},length:V,fromValues:k,copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t},set:function(t,n,a,r){return t[0]=n,t[1]=a,t[2]=r,t},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t},subtract:Q,multiply:Y,divide:Z,ceil:function(t,n){return t[0]=Math.ceil(n[0]),t[1]=Math.ceil(n[1]),t[2]=Math.ceil(n[2]),t},floor:function(t,n){return t[0]=Math.floor(n[0]),t[1]=Math.floor(n[1]),t[2]=Math.floor(n[2]),t},min:function(t,n,a){return t[0]=Math.min(n[0],a[0]),t[1]=Math.min(n[1],a[1]),t[2]=Math.min(n[2],a[2]),t},max:function(t,n,a){return t[0]=Math.max(n[0],a[0]),t[1]=Math.max(n[1],a[1]),t[2]=Math.max(n[2],a[2]),t},round:function(t,n){return t[0]=Math.round(n[0]),t[1]=Math.round(n[1]),t[2]=Math.round(n[2]),t},scale:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t},scaleAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t},distance:N,squaredDistance:X,squaredLength:B,negate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t},inverse:function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t[2]=1/n[2],t},normalize:U,dot:G,cross:W,lerp:function(t,n,a,r){var u=n[0],e=n[1],o=n[2];return t[0]=u+r*(a[0]-u),t[1]=e+r*(a[1]-e),t[2]=o+r*(a[2]-o),t},slerp:function(t,n,a,r){var u=Math.acos(Math.min(Math.max(G(n,a),-1),1)),e=Math.sin(u),o=Math.sin((1-r)*u)/e,i=Math.sin(r*u)/e;return t[0]=o*n[0]+i*a[0],t[1]=o*n[1]+i*a[1],t[2]=o*n[2]+i*a[2],t},hermite:function(t,n,a,r,u,e){var o=e*e,i=o*(2*e-3)+1,h=o*(e-2)+e,c=o*(e-1),s=o*(3-2*e);return t[0]=n[0]*i+a[0]*h+r[0]*c+u[0]*s,t[1]=n[1]*i+a[1]*h+r[1]*c+u[1]*s,t[2]=n[2]*i+a[2]*h+r[2]*c+u[2]*s,t},bezier:function(t,n,a,r,u,e){var o=1-e,i=o*o,h=e*e,c=i*o,s=3*e*i,M=3*h*o,f=h*e;return t[0]=n[0]*c+a[0]*s+r[0]*M+u[0]*f,t[1]=n[1]*c+a[1]*s+r[1]*M+u[1]*f,t[2]=n[2]*c+a[2]*s+r[2]*M+u[2]*f,t},random:function(t,n){n=void 0===n?1:n;var a=2*r()*Math.PI,u=2*r()-1,e=Math.sqrt(1-u*u)*n;return t[0]=Math.cos(a)*e,t[1]=Math.sin(a)*e,t[2]=u*n,t},transformMat4:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=a[3]*r+a[7]*u+a[11]*e+a[15];return o=o||1,t[0]=(a[0]*r+a[4]*u+a[8]*e+a[12])/o,t[1]=(a[1]*r+a[5]*u+a[9]*e+a[13])/o,t[2]=(a[2]*r+a[6]*u+a[10]*e+a[14])/o,t},transformMat3:function(t,n,a){var r=n[0],u=n[1],e=n[2];return t[0]=r*a[0]+u*a[3]+e*a[6],t[1]=r*a[1]+u*a[4]+e*a[7],t[2]=r*a[2]+u*a[5]+e*a[8],t},transformQuat:function(t,n,a){var r=a[0],u=a[1],e=a[2],o=a[3],i=n[0],h=n[1],c=n[2],s=u*c-e*h,M=e*i-r*c,f=r*h-u*i,l=u*f-e*M,v=e*s-r*f,b=r*M-u*s,m=2*o;return s*=m,M*=m,f*=m,l*=2,v*=2,b*=2,t[0]=i+s+l,t[1]=h+M+v,t[2]=c+f+b,t},rotateX:function(t,n,a,r){var u=[],e=[];return u[0]=n[0]-a[0],u[1]=n[1]-a[1],u[2]=n[2]-a[2],e[0]=u[0],e[1]=u[1]*Math.cos(r)-u[2]*Math.sin(r),e[2]=u[1]*Math.sin(r)+u[2]*Math.cos(r),t[0]=e[0]+a[0],t[1]=e[1]+a[1],t[2]=e[2]+a[2],t},rotateY:function(t,n,a,r){var u=[],e=[];return u[0]=n[0]-a[0],u[1]=n[1]-a[1],u[2]=n[2]-a[2],e[0]=u[2]*Math.sin(r)+u[0]*Math.cos(r),e[1]=u[1],e[2]=u[2]*Math.cos(r)-u[0]*Math.sin(r),t[0]=e[0]+a[0],t[1]=e[1]+a[1],t[2]=e[2]+a[2],t},rotateZ:function(t,n,a,r){var u=[],e=[];return u[0]=n[0]-a[0],u[1]=n[1]-a[1],u[2]=n[2]-a[2],e[0]=u[0]*Math.cos(r)-u[1]*Math.sin(r),e[1]=u[0]*Math.sin(r)+u[1]*Math.cos(r),e[2]=u[2],t[0]=e[0]+a[0],t[1]=e[1]+a[1],t[2]=e[2]+a[2],t},angle:function(t,n){var a=t[0],r=t[1],u=t[2],e=n[0],o=n[1],i=n[2],h=Math.sqrt((a*a+r*r+u*u)*(e*e+o*o+i*i)),c=h&&G(t,n)/h;return Math.acos(Math.min(Math.max(c,-1),1))},zero:function(t){return t[0]=0,t[1]=0,t[2]=0,t},str:function(t){return\"vec3(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\")\"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=a[0],i=a[1],h=a[2];return Math.abs(r-o)<=n*Math.max(1,Math.abs(r),Math.abs(o))&&Math.abs(u-i)<=n*Math.max(1,Math.abs(u),Math.abs(i))&&Math.abs(e-h)<=n*Math.max(1,Math.abs(e),Math.abs(h))},sub:H,mul:J,div:K,dist:$,sqrDist:tt,len:nt,sqrLen:at,forEach:rt});function et(){var t=new a(4);return a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0),t}function ot(t){var n=new a(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n}function it(t,n,r,u){var e=new a(4);return e[0]=t,e[1]=n,e[2]=r,e[3]=u,e}function ht(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t}function ct(t,n,a,r,u){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t}function st(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t}function Mt(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t}function ft(t,n,a){return t[0]=n[0]*a[0],t[1]=n[1]*a[1],t[2]=n[2]*a[2],t[3]=n[3]*a[3],t}function lt(t,n,a){return t[0]=n[0]/a[0],t[1]=n[1]/a[1],t[2]=n[2]/a[2],t[3]=n[3]/a[3],t}function vt(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t}function bt(t,n){var a=n[0]-t[0],r=n[1]-t[1],u=n[2]-t[2],e=n[3]-t[3];return Math.hypot(a,r,u,e)}function mt(t,n){var a=n[0]-t[0],r=n[1]-t[1],u=n[2]-t[2],e=n[3]-t[3];return a*a+r*r+u*u+e*e}function dt(t){var n=t[0],a=t[1],r=t[2],u=t[3];return Math.hypot(n,a,r,u)}function pt(t){var n=t[0],a=t[1],r=t[2],u=t[3];return n*n+a*a+r*r+u*u}function xt(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a*a+r*r+u*u+e*e;return o>0&&(o=1/Math.sqrt(o)),t[0]=a*o,t[1]=r*o,t[2]=u*o,t[3]=e*o,t}function yt(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function qt(t,n,a,r){var u=n[0],e=n[1],o=n[2],i=n[3];return t[0]=u+r*(a[0]-u),t[1]=e+r*(a[1]-e),t[2]=o+r*(a[2]-o),t[3]=i+r*(a[3]-i),t}function gt(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]}var _t=Mt,At=ft,wt=lt,zt=bt,Rt=mt,Ot=dt,jt=pt,Et=function(){var t=et();return function(n,a,r,u,e,o){var i,h;for(a||(a=4),r||(r=0),h=u?Math.min(u*a+r,n.length):n.length,i=r;i<h;i+=a)t[0]=n[i],t[1]=n[i+1],t[2]=n[i+2],t[3]=n[i+3],e(t,t,o),n[i]=t[0],n[i+1]=t[1],n[i+2]=t[2],n[i+3]=t[3];return n}}(),Pt=Object.freeze({__proto__:null,create:et,clone:ot,fromValues:it,copy:ht,set:ct,add:st,subtract:Mt,multiply:ft,divide:lt,ceil:function(t,n){return t[0]=Math.ceil(n[0]),t[1]=Math.ceil(n[1]),t[2]=Math.ceil(n[2]),t[3]=Math.ceil(n[3]),t},floor:function(t,n){return t[0]=Math.floor(n[0]),t[1]=Math.floor(n[1]),t[2]=Math.floor(n[2]),t[3]=Math.floor(n[3]),t},min:function(t,n,a){return t[0]=Math.min(n[0],a[0]),t[1]=Math.min(n[1],a[1]),t[2]=Math.min(n[2],a[2]),t[3]=Math.min(n[3],a[3]),t},max:function(t,n,a){return t[0]=Math.max(n[0],a[0]),t[1]=Math.max(n[1],a[1]),t[2]=Math.max(n[2],a[2]),t[3]=Math.max(n[3],a[3]),t},round:function(t,n){return t[0]=Math.round(n[0]),t[1]=Math.round(n[1]),t[2]=Math.round(n[2]),t[3]=Math.round(n[3]),t},scale:vt,scaleAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t},distance:bt,squaredDistance:mt,length:dt,squaredLength:pt,negate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=-n[3],t},inverse:function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t[2]=1/n[2],t[3]=1/n[3],t},normalize:xt,dot:yt,cross:function(t,n,a,r){var u=a[0]*r[1]-a[1]*r[0],e=a[0]*r[2]-a[2]*r[0],o=a[0]*r[3]-a[3]*r[0],i=a[1]*r[2]-a[2]*r[1],h=a[1]*r[3]-a[3]*r[1],c=a[2]*r[3]-a[3]*r[2],s=n[0],M=n[1],f=n[2],l=n[3];return t[0]=M*c-f*h+l*i,t[1]=-s*c+f*o-l*e,t[2]=s*h-M*o+l*u,t[3]=-s*i+M*e-f*u,t},lerp:qt,random:function(t,n){var a,u,e,o,i,h;n=void 0===n?1:n;do{i=(a=2*r()-1)*a+(u=2*r()-1)*u}while(i>=1);do{h=(e=2*r()-1)*e+(o=2*r()-1)*o}while(h>=1);var c=Math.sqrt((1-i)/h);return t[0]=n*a,t[1]=n*u,t[2]=n*e*c,t[3]=n*o*c,t},transformMat4:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3];return t[0]=a[0]*r+a[4]*u+a[8]*e+a[12]*o,t[1]=a[1]*r+a[5]*u+a[9]*e+a[13]*o,t[2]=a[2]*r+a[6]*u+a[10]*e+a[14]*o,t[3]=a[3]*r+a[7]*u+a[11]*e+a[15]*o,t},transformQuat:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=a[0],i=a[1],h=a[2],c=a[3],s=c*r+i*e-h*u,M=c*u+h*r-o*e,f=c*e+o*u-i*r,l=-o*r-i*u-h*e;return t[0]=s*c+l*-o+M*-h-f*-i,t[1]=M*c+l*-i+f*-o-s*-h,t[2]=f*c+l*-h+s*-i-M*-o,t[3]=n[3],t},zero:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t},str:function(t){return\"vec4(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\")\"},exactEquals:gt,equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=a[0],h=a[1],c=a[2],s=a[3];return Math.abs(r-i)<=n*Math.max(1,Math.abs(r),Math.abs(i))&&Math.abs(u-h)<=n*Math.max(1,Math.abs(u),Math.abs(h))&&Math.abs(e-c)<=n*Math.max(1,Math.abs(e),Math.abs(c))&&Math.abs(o-s)<=n*Math.max(1,Math.abs(o),Math.abs(s))},sub:_t,mul:At,div:wt,dist:zt,sqrDist:Rt,len:Ot,sqrLen:jt,forEach:Et});function Tt(){var t=new a(4);return a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t[3]=1,t}function St(t,n,a){a*=.5;var r=Math.sin(a);return t[0]=r*n[0],t[1]=r*n[1],t[2]=r*n[2],t[3]=Math.cos(a),t}function Dt(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],h=a[1],c=a[2],s=a[3];return t[0]=r*s+o*i+u*c-e*h,t[1]=u*s+o*h+e*i-r*c,t[2]=e*s+o*c+r*h-u*i,t[3]=o*s-r*i-u*h-e*c,t}function Ft(t,n,a){a*=.5;var r=n[0],u=n[1],e=n[2],o=n[3],i=Math.sin(a),h=Math.cos(a);return t[0]=r*h+o*i,t[1]=u*h+e*i,t[2]=e*h-u*i,t[3]=o*h-r*i,t}function It(t,n,a){a*=.5;var r=n[0],u=n[1],e=n[2],o=n[3],i=Math.sin(a),h=Math.cos(a);return t[0]=r*h-e*i,t[1]=u*h+o*i,t[2]=e*h+r*i,t[3]=o*h-u*i,t}function Lt(t,n,a){a*=.5;var r=n[0],u=n[1],e=n[2],o=n[3],i=Math.sin(a),h=Math.cos(a);return t[0]=r*h+u*i,t[1]=u*h-r*i,t[2]=e*h+o*i,t[3]=o*h-e*i,t}function Vt(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=Math.sqrt(a*a+r*r+u*u),i=Math.exp(e),h=o>0?i*Math.sin(o)/o:0;return t[0]=a*h,t[1]=r*h,t[2]=u*h,t[3]=i*Math.cos(o),t}function kt(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=Math.sqrt(a*a+r*r+u*u),i=o>0?Math.atan2(o,e)/o:0;return t[0]=a*i,t[1]=r*i,t[2]=u*i,t[3]=.5*Math.log(a*a+r*r+u*u+e*e),t}function Qt(t,a,r,u){var e,o,i,h,c,s=a[0],M=a[1],f=a[2],l=a[3],v=r[0],b=r[1],m=r[2],d=r[3];return(o=s*v+M*b+f*m+l*d)<0&&(o=-o,v=-v,b=-b,m=-m,d=-d),1-o>n?(e=Math.acos(o),i=Math.sin(e),h=Math.sin((1-u)*e)/i,c=Math.sin(u*e)/i):(h=1-u,c=u),t[0]=h*s+c*v,t[1]=h*M+c*b,t[2]=h*f+c*m,t[3]=h*l+c*d,t}function Yt(t,n){var a,r=n[0]+n[4]+n[8];if(r>0)a=Math.sqrt(r+1),t[3]=.5*a,a=.5/a,t[0]=(n[5]-n[7])*a,t[1]=(n[6]-n[2])*a,t[2]=(n[1]-n[3])*a;else{var u=0;n[4]>n[0]&&(u=1),n[8]>n[3*u+u]&&(u=2);var e=(u+1)%3,o=(u+2)%3;a=Math.sqrt(n[3*u+u]-n[3*e+e]-n[3*o+o]+1),t[u]=.5*a,a=.5/a,t[3]=(n[3*e+o]-n[3*o+e])*a,t[e]=(n[3*e+u]+n[3*u+e])*a,t[o]=(n[3*o+u]+n[3*u+o])*a}return t}var Zt=ot,Nt=it,Xt=ht,Bt=ct,Ut=st,Gt=Dt,Wt=vt,Ct=yt,Ht=qt,Jt=dt,Kt=Jt,$t=pt,tn=$t,nn=xt,an=gt;var rn,un,en,on,hn,cn,sn=(rn=L(),un=k(1,0,0),en=k(0,1,0),function(t,n,a){var r=G(n,a);return r<-.999999?(W(rn,un,n),nt(rn)<1e-6&&W(rn,en,n),U(rn,rn),St(t,rn,Math.PI),t):r>.999999?(t[0]=0,t[1]=0,t[2]=0,t[3]=1,t):(W(rn,n,a),t[0]=rn[0],t[1]=rn[1],t[2]=rn[2],t[3]=1+r,nn(t,t))}),Mn=(on=Tt(),hn=Tt(),function(t,n,a,r,u,e){return Qt(on,n,u,e),Qt(hn,a,r,e),Qt(t,on,hn,2*e*(1-e)),t}),fn=(cn=d(),function(t,n,a,r){return cn[0]=a[0],cn[3]=a[1],cn[6]=a[2],cn[1]=r[0],cn[4]=r[1],cn[7]=r[2],cn[2]=-n[0],cn[5]=-n[1],cn[8]=-n[2],nn(t,Yt(t,cn))}),ln=Object.freeze({__proto__:null,create:Tt,identity:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},setAxisAngle:St,getAxisAngle:function(t,a){var r=2*Math.acos(a[3]),u=Math.sin(r/2);return u>n?(t[0]=a[0]/u,t[1]=a[1]/u,t[2]=a[2]/u):(t[0]=1,t[1]=0,t[2]=0),r},getAngle:function(t,n){var a=Ct(t,n);return Math.acos(2*a*a-1)},multiply:Dt,rotateX:Ft,rotateY:It,rotateZ:Lt,calculateW:function(t,n){var a=n[0],r=n[1],u=n[2];return t[0]=a,t[1]=r,t[2]=u,t[3]=Math.sqrt(Math.abs(1-a*a-r*r-u*u)),t},exp:Vt,ln:kt,pow:function(t,n,a){return kt(t,n),Wt(t,t,a),Vt(t,t),t},slerp:Qt,random:function(t){var n=r(),a=r(),u=r(),e=Math.sqrt(1-n),o=Math.sqrt(n);return t[0]=e*Math.sin(2*Math.PI*a),t[1]=e*Math.cos(2*Math.PI*a),t[2]=o*Math.sin(2*Math.PI*u),t[3]=o*Math.cos(2*Math.PI*u),t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a*a+r*r+u*u+e*e,i=o?1/o:0;return t[0]=-a*i,t[1]=-r*i,t[2]=-u*i,t[3]=e*i,t},conjugate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=n[3],t},fromMat3:Yt,fromEuler:function(t,n,a,r){var e=arguments.length>4&&void 0!==arguments[4]?arguments[4]:u,o=Math.PI/360;n*=o,r*=o,a*=o;var i=Math.sin(n),h=Math.cos(n),c=Math.sin(a),s=Math.cos(a),M=Math.sin(r),f=Math.cos(r);switch(e){case\"xyz\":t[0]=i*s*f+h*c*M,t[1]=h*c*f-i*s*M,t[2]=h*s*M+i*c*f,t[3]=h*s*f-i*c*M;break;case\"xzy\":t[0]=i*s*f-h*c*M,t[1]=h*c*f-i*s*M,t[2]=h*s*M+i*c*f,t[3]=h*s*f+i*c*M;break;case\"yxz\":t[0]=i*s*f+h*c*M,t[1]=h*c*f-i*s*M,t[2]=h*s*M-i*c*f,t[3]=h*s*f+i*c*M;break;case\"yzx\":t[0]=i*s*f+h*c*M,t[1]=h*c*f+i*s*M,t[2]=h*s*M-i*c*f,t[3]=h*s*f-i*c*M;break;case\"zxy\":t[0]=i*s*f-h*c*M,t[1]=h*c*f+i*s*M,t[2]=h*s*M+i*c*f,t[3]=h*s*f-i*c*M;break;case\"zyx\":t[0]=i*s*f-h*c*M,t[1]=h*c*f+i*s*M,t[2]=h*s*M-i*c*f,t[3]=h*s*f+i*c*M;break;default:throw new Error(\"Unknown angle order \"+e)}return t},str:function(t){return\"quat(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\")\"},clone:Zt,fromValues:Nt,copy:Xt,set:Bt,add:Ut,mul:Gt,scale:Wt,dot:Ct,lerp:Ht,length:Jt,len:Kt,squaredLength:$t,sqrLen:tn,normalize:nn,exactEquals:an,equals:function(t,n){return Math.abs(yt(t,n))>=.999999},rotationTo:sn,sqlerp:Mn,setAxes:fn});function vn(t,n,a){var r=.5*a[0],u=.5*a[1],e=.5*a[2],o=n[0],i=n[1],h=n[2],c=n[3];return t[0]=o,t[1]=i,t[2]=h,t[3]=c,t[4]=r*c+u*h-e*i,t[5]=u*c+e*o-r*h,t[6]=e*c+r*i-u*o,t[7]=-r*o-u*i-e*h,t}function bn(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t}var mn=Xt;var dn=Xt;function pn(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[4],h=a[5],c=a[6],s=a[7],M=n[4],f=n[5],l=n[6],v=n[7],b=a[0],m=a[1],d=a[2],p=a[3];return t[0]=r*p+o*b+u*d-e*m,t[1]=u*p+o*m+e*b-r*d,t[2]=e*p+o*d+r*m-u*b,t[3]=o*p-r*b-u*m-e*d,t[4]=r*s+o*i+u*c-e*h+M*p+v*b+f*d-l*m,t[5]=u*s+o*h+e*i-r*c+f*p+v*m+l*b-M*d,t[6]=e*s+o*c+r*h-u*i+l*p+v*d+M*m-f*b,t[7]=o*s-r*i-u*h-e*c+v*p-M*b-f*m-l*d,t}var xn=pn;var yn=Ct;var qn=Jt,gn=qn,_n=$t,An=_n;var wn=Object.freeze({__proto__:null,create:function(){var t=new a(8);return a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[4]=0,t[5]=0,t[6]=0,t[7]=0),t[3]=1,t},clone:function(t){var n=new a(8);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n},fromValues:function(t,n,r,u,e,o,i,h){var c=new a(8);return c[0]=t,c[1]=n,c[2]=r,c[3]=u,c[4]=e,c[5]=o,c[6]=i,c[7]=h,c},fromRotationTranslationValues:function(t,n,r,u,e,o,i){var h=new a(8);h[0]=t,h[1]=n,h[2]=r,h[3]=u;var c=.5*e,s=.5*o,M=.5*i;return h[4]=c*u+s*r-M*n,h[5]=s*u+M*t-c*r,h[6]=M*u+c*n-s*t,h[7]=-c*t-s*n-M*r,h},fromRotationTranslation:vn,fromTranslation:function(t,n){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t[4]=.5*n[0],t[5]=.5*n[1],t[6]=.5*n[2],t[7]=0,t},fromRotation:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=0,t[5]=0,t[6]=0,t[7]=0,t},fromMat4:function(t,n){var r=Tt();O(r,n);var u=new a(3);return z(u,n),vn(t,r,u),t},copy:bn,identity:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t[6]=0,t[7]=0,t},set:function(t,n,a,r,u,e,o,i,h){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t[6]=i,t[7]=h,t},getReal:mn,getDual:function(t,n){return t[0]=n[4],t[1]=n[5],t[2]=n[6],t[3]=n[7],t},setReal:dn,setDual:function(t,n){return t[4]=n[0],t[5]=n[1],t[6]=n[2],t[7]=n[3],t},getTranslation:function(t,n){var a=n[4],r=n[5],u=n[6],e=n[7],o=-n[0],i=-n[1],h=-n[2],c=n[3];return t[0]=2*(a*c+e*o+r*h-u*i),t[1]=2*(r*c+e*i+u*o-a*h),t[2]=2*(u*c+e*h+a*i-r*o),t},translate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=.5*a[0],h=.5*a[1],c=.5*a[2],s=n[4],M=n[5],f=n[6],l=n[7];return t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=o*i+u*c-e*h+s,t[5]=o*h+e*i-r*c+M,t[6]=o*c+r*h-u*i+f,t[7]=-r*i-u*h-e*c+l,t},rotateX:function(t,n,a){var r=-n[0],u=-n[1],e=-n[2],o=n[3],i=n[4],h=n[5],c=n[6],s=n[7],M=i*o+s*r+h*e-c*u,f=h*o+s*u+c*r-i*e,l=c*o+s*e+i*u-h*r,v=s*o-i*r-h*u-c*e;return Ft(t,n,a),r=t[0],u=t[1],e=t[2],o=t[3],t[4]=M*o+v*r+f*e-l*u,t[5]=f*o+v*u+l*r-M*e,t[6]=l*o+v*e+M*u-f*r,t[7]=v*o-M*r-f*u-l*e,t},rotateY:function(t,n,a){var r=-n[0],u=-n[1],e=-n[2],o=n[3],i=n[4],h=n[5],c=n[6],s=n[7],M=i*o+s*r+h*e-c*u,f=h*o+s*u+c*r-i*e,l=c*o+s*e+i*u-h*r,v=s*o-i*r-h*u-c*e;return It(t,n,a),r=t[0],u=t[1],e=t[2],o=t[3],t[4]=M*o+v*r+f*e-l*u,t[5]=f*o+v*u+l*r-M*e,t[6]=l*o+v*e+M*u-f*r,t[7]=v*o-M*r-f*u-l*e,t},rotateZ:function(t,n,a){var r=-n[0],u=-n[1],e=-n[2],o=n[3],i=n[4],h=n[5],c=n[6],s=n[7],M=i*o+s*r+h*e-c*u,f=h*o+s*u+c*r-i*e,l=c*o+s*e+i*u-h*r,v=s*o-i*r-h*u-c*e;return Lt(t,n,a),r=t[0],u=t[1],e=t[2],o=t[3],t[4]=M*o+v*r+f*e-l*u,t[5]=f*o+v*u+l*r-M*e,t[6]=l*o+v*e+M*u-f*r,t[7]=v*o-M*r-f*u-l*e,t},rotateByQuatAppend:function(t,n,a){var r=a[0],u=a[1],e=a[2],o=a[3],i=n[0],h=n[1],c=n[2],s=n[3];return t[0]=i*o+s*r+h*e-c*u,t[1]=h*o+s*u+c*r-i*e,t[2]=c*o+s*e+i*u-h*r,t[3]=s*o-i*r-h*u-c*e,i=n[4],h=n[5],c=n[6],s=n[7],t[4]=i*o+s*r+h*e-c*u,t[5]=h*o+s*u+c*r-i*e,t[6]=c*o+s*e+i*u-h*r,t[7]=s*o-i*r-h*u-c*e,t},rotateByQuatPrepend:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],h=a[1],c=a[2],s=a[3];return t[0]=r*s+o*i+u*c-e*h,t[1]=u*s+o*h+e*i-r*c,t[2]=e*s+o*c+r*h-u*i,t[3]=o*s-r*i-u*h-e*c,i=a[4],h=a[5],c=a[6],s=a[7],t[4]=r*s+o*i+u*c-e*h,t[5]=u*s+o*h+e*i-r*c,t[6]=e*s+o*c+r*h-u*i,t[7]=o*s-r*i-u*h-e*c,t},rotateAroundAxis:function(t,a,r,u){if(Math.abs(u)<n)return bn(t,a);var e=Math.hypot(r[0],r[1],r[2]);u*=.5;var o=Math.sin(u),i=o*r[0]/e,h=o*r[1]/e,c=o*r[2]/e,s=Math.cos(u),M=a[0],f=a[1],l=a[2],v=a[3];t[0]=M*s+v*i+f*c-l*h,t[1]=f*s+v*h+l*i-M*c,t[2]=l*s+v*c+M*h-f*i,t[3]=v*s-M*i-f*h-l*c;var b=a[4],m=a[5],d=a[6],p=a[7];return t[4]=b*s+p*i+m*c-d*h,t[5]=m*s+p*h+d*i-b*c,t[6]=d*s+p*c+b*h-m*i,t[7]=p*s-b*i-m*h-d*c,t},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t[6]=n[6]+a[6],t[7]=n[7]+a[7],t},multiply:pn,mul:xn,scale:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t[6]=n[6]*a,t[7]=n[7]*a,t},dot:yn,lerp:function(t,n,a,r){var u=1-r;return yn(n,a)<0&&(r=-r),t[0]=n[0]*u+a[0]*r,t[1]=n[1]*u+a[1]*r,t[2]=n[2]*u+a[2]*r,t[3]=n[3]*u+a[3]*r,t[4]=n[4]*u+a[4]*r,t[5]=n[5]*u+a[5]*r,t[6]=n[6]*u+a[6]*r,t[7]=n[7]*u+a[7]*r,t},invert:function(t,n){var a=_n(n);return t[0]=-n[0]/a,t[1]=-n[1]/a,t[2]=-n[2]/a,t[3]=n[3]/a,t[4]=-n[4]/a,t[5]=-n[5]/a,t[6]=-n[6]/a,t[7]=n[7]/a,t},conjugate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=n[3],t[4]=-n[4],t[5]=-n[5],t[6]=-n[6],t[7]=n[7],t},length:qn,len:gn,squaredLength:_n,sqrLen:An,normalize:function(t,n){var a=_n(n);if(a>0){a=Math.sqrt(a);var r=n[0]/a,u=n[1]/a,e=n[2]/a,o=n[3]/a,i=n[4],h=n[5],c=n[6],s=n[7],M=r*i+u*h+e*c+o*s;t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=(i-r*M)/a,t[5]=(h-u*M)/a,t[6]=(c-e*M)/a,t[7]=(s-o*M)/a}return t},str:function(t){return\"quat2(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\", \"+t[3]+\", \"+t[4]+\", \"+t[5]+\", \"+t[6]+\", \"+t[7]+\")\"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],h=t[5],c=t[6],s=t[7],M=a[0],f=a[1],l=a[2],v=a[3],b=a[4],m=a[5],d=a[6],p=a[7];return Math.abs(r-M)<=n*Math.max(1,Math.abs(r),Math.abs(M))&&Math.abs(u-f)<=n*Math.max(1,Math.abs(u),Math.abs(f))&&Math.abs(e-l)<=n*Math.max(1,Math.abs(e),Math.abs(l))&&Math.abs(o-v)<=n*Math.max(1,Math.abs(o),Math.abs(v))&&Math.abs(i-b)<=n*Math.max(1,Math.abs(i),Math.abs(b))&&Math.abs(h-m)<=n*Math.max(1,Math.abs(h),Math.abs(m))&&Math.abs(c-d)<=n*Math.max(1,Math.abs(c),Math.abs(d))&&Math.abs(s-p)<=n*Math.max(1,Math.abs(s),Math.abs(p))}});function zn(){var t=new a(2);return a!=Float32Array&&(t[0]=0,t[1]=0),t}function Rn(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t}function On(t,n,a){return t[0]=n[0]*a[0],t[1]=n[1]*a[1],t}function jn(t,n,a){return t[0]=n[0]/a[0],t[1]=n[1]/a[1],t}function En(t,n){var a=n[0]-t[0],r=n[1]-t[1];return Math.hypot(a,r)}function Pn(t,n){var a=n[0]-t[0],r=n[1]-t[1];return a*a+r*r}function Tn(t){var n=t[0],a=t[1];return Math.hypot(n,a)}function Sn(t){var n=t[0],a=t[1];return n*n+a*a}var Dn=Tn,Fn=Rn,In=On,Ln=jn,Vn=En,kn=Pn,Qn=Sn,Yn=function(){var t=zn();return function(n,a,r,u,e,o){var i,h;for(a||(a=2),r||(r=0),h=u?Math.min(u*a+r,n.length):n.length,i=r;i<h;i+=a)t[0]=n[i],t[1]=n[i+1],e(t,t,o),n[i]=t[0],n[i+1]=t[1];return n}}(),Zn=Object.freeze({__proto__:null,create:zn,clone:function(t){var n=new a(2);return n[0]=t[0],n[1]=t[1],n},fromValues:function(t,n){var r=new a(2);return r[0]=t,r[1]=n,r},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t},set:function(t,n,a){return t[0]=n,t[1]=a,t},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t},subtract:Rn,multiply:On,divide:jn,ceil:function(t,n){return t[0]=Math.ceil(n[0]),t[1]=Math.ceil(n[1]),t},floor:function(t,n){return t[0]=Math.floor(n[0]),t[1]=Math.floor(n[1]),t},min:function(t,n,a){return t[0]=Math.min(n[0],a[0]),t[1]=Math.min(n[1],a[1]),t},max:function(t,n,a){return t[0]=Math.max(n[0],a[0]),t[1]=Math.max(n[1],a[1]),t},round:function(t,n){return t[0]=Math.round(n[0]),t[1]=Math.round(n[1]),t},scale:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t},scaleAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t},distance:En,squaredDistance:Pn,length:Tn,squaredLength:Sn,negate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t},inverse:function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t},normalize:function(t,n){var a=n[0],r=n[1],u=a*a+r*r;return u>0&&(u=1/Math.sqrt(u)),t[0]=n[0]*u,t[1]=n[1]*u,t},dot:function(t,n){return t[0]*n[0]+t[1]*n[1]},cross:function(t,n,a){var r=n[0]*a[1]-n[1]*a[0];return t[0]=t[1]=0,t[2]=r,t},lerp:function(t,n,a,r){var u=n[0],e=n[1];return t[0]=u+r*(a[0]-u),t[1]=e+r*(a[1]-e),t},random:function(t,n){n=void 0===n?1:n;var a=2*r()*Math.PI;return t[0]=Math.cos(a)*n,t[1]=Math.sin(a)*n,t},transformMat2:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[2]*u,t[1]=a[1]*r+a[3]*u,t},transformMat2d:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[2]*u+a[4],t[1]=a[1]*r+a[3]*u+a[5],t},transformMat3:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[3]*u+a[6],t[1]=a[1]*r+a[4]*u+a[7],t},transformMat4:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[4]*u+a[12],t[1]=a[1]*r+a[5]*u+a[13],t},rotate:function(t,n,a,r){var u=n[0]-a[0],e=n[1]-a[1],o=Math.sin(r),i=Math.cos(r);return t[0]=u*i-e*o+a[0],t[1]=u*o+e*i+a[1],t},angle:function(t,n){var a=t[0],r=t[1],u=n[0],e=n[1],o=Math.sqrt((a*a+r*r)*(u*u+e*e)),i=o&&(a*u+r*e)/o;return Math.acos(Math.min(Math.max(i,-1),1))},zero:function(t){return t[0]=0,t[1]=0,t},str:function(t){return\"vec2(\"+t[0]+\", \"+t[1]+\")\"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]},equals:function(t,a){var r=t[0],u=t[1],e=a[0],o=a[1];return Math.abs(r-e)<=n*Math.max(1,Math.abs(r),Math.abs(e))&&Math.abs(u-o)<=n*Math.max(1,Math.abs(u),Math.abs(o))},len:Dn,sub:Fn,mul:In,div:Ln,dist:Vn,sqrDist:kn,sqrLen:Qn,forEach:Yn});t.glMatrix=o,t.mat2=M,t.mat2d=m,t.mat3=g,t.mat4=I,t.quat=ln,t.quat2=wn,t.vec2=Zn,t.vec3=ut,t.vec4=Pt,Object.defineProperty(t,\"__esModule\",{value:!0})}));\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/util/render-xrframe.js",
    "content": "import splat_vs from './shader/splat_xrframe_vs.glsl'\nimport splat_fs from './shader/splat_xrframe_fs.glsl'\n\nconst xrFrameRender = {\n  // 对应案例的初始化逻辑，由统一的 behavior 触发\n  init() {\n    console.log('start init ply')\n\n    const plySrc = 'http://10.9.233.66:8000/ply/point_cloud.ply'\n\n    const filePath = wx.env.USER_DATA_PATH + '/point.ply'\n    wx.downloadFile({\n      filePath,\n      url: plySrc,\n      success: (res) => {\n        console.log('下载回调', res)\n        const fs = wx.getFileSystemManager()\n        fs.readFile({\n          filePath: res.filePath,\n          position: 0,\n          success: async (res) => {\n            console.log('读文件回调，结果返回为', res)\n\n            // const plyInfo = plyLoader.parsePLYBuffer(res.data);\n\n            const plyInfo = loadPly(res.data)\n\n            console.log('plyLoader return', plyInfo)\n\n            // 初始化 worker 相关\n            this._worker.postMessage({\n              type: 'execFunc_init',\n              params: [plyInfo]\n            })\n          },\n          fail(res) {\n            wx.hideLoading()\n            wx.showToast({\n              title: res.errMsg,\n              icon: 'none',\n              duration: 2000\n            })\n            console.error(res)\n          }\n        })\n      },\n      fail(res) {\n        wx.hideLoading()\n        wx.showToast({\n          title: res.errMsg,\n          icon: 'none',\n          duration: 2000\n        })\n        console.error(res)\n      }\n    })\n\n    // 监听worker回调\n    this._worker.onMessage((res) => {\n      if (res.type === 'execFunc_init') {\n        // 初始化 worker 回调\n        console.log('gaussianSplatting init callBack')\n        console.log('res', res)\n\n        this.initGSGeometry(res.result.count, res.result.vertexSize)\n      } else if (res.type === 'execFunc_sort') {\n        // worker 排序 回调\n        // console.log('gaussianSplatting sort callBack', res.result)\n\n        // const vb = getVertexBuffer(this.vertexData);\n\n        this.geometryGeo.uploadVertexBuffer(0, res.result.vertexBuffer)\n\n        // console.log('sort callback', this.geometryGeo, res.result.vertexBuffer)\n      }\n    })\n  },\n  initGSGeometry(gaussianCount, vertexSize) {\n    console.log('initGSGeometry start')\n\n    const xrFrameSystem = wx.getXrFrameSystem()\n    const createGSEffect = (scene) => scene.createEffect({\n      name: 'gaussianSplatting',\n      defaultRenderQueue: 3000,\n      properties: [\n        {\n          key: 'screen_width',\n          type: xrFrameSystem.EUniformType.FLOAT,\n          default: 0\n        },\n        {\n          key: 'screen_height',\n          type: xrFrameSystem.EUniformType.FLOAT,\n          default: 0\n        },\n        {\n          key: 'focal_x',\n          type: xrFrameSystem.EUniformType.FLOAT,\n          default: 0\n        },\n        {\n          key: 'focal_y',\n          type: xrFrameSystem.EUniformType.FLOAT,\n          default: 0\n        },\n        {\n          key: 'tan_fovx',\n          type: xrFrameSystem.EUniformType.FLOAT,\n          default: 0\n        },\n        {\n          key: 'tan_fovy',\n          type: xrFrameSystem.EUniformType.FLOAT,\n          default: 0\n        },\n        {\n          key: 'scale_modifier',\n          type: xrFrameSystem.EUniformType.FLOAT,\n          default: 1\n        },\n      ],\n      images: [],\n      passes: [\n        {\n          renderStates: {\n            blendOn: true,\n            depthWrite: false,\n            cullOn: false,\n          },\n          lightMode: 'ForwardBase',\n          useMaterialRenderStates: true,\n          shaders: [0, 1]\n        }\n      ],\n      shaders: [\n        // Vertex Shader\n        splat_vs,\n        // Fragement Shader\n        splat_fs\n      ],\n    })\n\n    this.geometryRoot = this.xrScene.getElementById('geometryRoot')\n\n    console.log('geometryRoot', this.geometryRoot)\n\n    // 注册 Geometry 信息\n    xrFrameSystem.registerGeometry('gaussian-splatting', scene => {\n      console.log('registerGeometry')\n      const vl = scene.createVertexLayout({\n        attributes: [\n          {\n            name: 'a_center',\n            format: xrFrameSystem.EVertexFormat.FLOAT3,\n            offset: 0,\n          },\n          {\n            name: 'a_opacity',\n            format: xrFrameSystem.EVertexFormat.FLOAT,\n            offset: 12,\n          },\n          {\n            name: 'a_cov3Da',\n            format: xrFrameSystem.EVertexFormat.FLOAT3,\n            offset: 16,\n          },\n          {\n            name: 'a_cov3Db',\n            format: xrFrameSystem.EVertexFormat.FLOAT3,\n            offset: 28,\n          },\n          {\n            name: 'a_color',\n            format: xrFrameSystem.EVertexFormat.FLOAT3,\n            offset: 40,\n          },\n          {\n            name: 'a_corner',\n            format: xrFrameSystem.EVertexFormat.FLOAT2,\n            offset: 52,\n          },\n        ],\n        stride: 60\n      })\n\n      console.log('createVertexLayout')\n\n      const indices = []\n      const verticesPerInstance = 4\n      const instanceCount = gaussianCount / verticesPerInstance\n      for (let i = 0; i < instanceCount; i++) {\n        // 对于每个实例，添加6个索引以形成2个三角形\n        const base = i * 4 // 每个实例的基础顶点索引\n        // 第一个三角形\n        indices.push(base, base + 1, base + 2)\n        // 第二个三角形\n        indices.push(base + 2, base + 1, base + 3)\n      }\n\n      console.log('indices', indices)\n\n      // VertexBuffer IndexBuffer 不能动态更改长度，需要一开始设定较大的长度。\n      const vb = new Float32Array(gaussianCount * vertexSize)\n      const ib = new Uint16Array(indices)\n\n      console.log('vb', vb)\n      console.log('ib', ib)\n\n      const geo = scene.createGeometry(vl, vb, ib)\n\n      geo.setBoundBall(new xrFrameSystem.Vector3(), 1)\n      geo.addSubMesh(ib.length, 0, 0)\n\n      return geo\n    })\n\n    console.log('gaussianSplatting geo')\n\n    xrFrameSystem.registerEffect('gaussianSplatting', createGSEffect)\n\n    console.log('gaussianSplatting effect')\n\n    this.geoElem = this.xrScene.createElement(xrFrameSystem.XRMesh, {\n      geometry: 'gaussian-splatting',\n      position: '0 0 0',\n      scale: '0.2 0.2 0.2'\n    })\n    this.geometryRoot.addChild(this.geoElem)\n\n    console.log('init geo end')\n\n    // 延时保证挂载与初始化完毕\n    setTimeout(() => {\n      this.meshGeo = this.geoElem.getComponent(xrFrameSystem.Mesh)\n      this.geometryGeo = this.meshGeo.geometry\n\n      this.matGeo = this.meshGeo.material\n\n      const gsMaterial = this.xrScene.createMaterial(\n        // 使用定制的效果\n        this.xrScene.assets.getAsset('effect', 'gaussianSplatting')\n      )\n      console.log('gsMaterial', gsMaterial)\n\n      // 设定 绘制双面\n      // gsMaterial.setRenderState(\"cullOn\", false);\n\n      const frameWidth = this.xrScene.frameWidth\n      const frameHeight = this.xrScene.frameHeight\n      const tan_fovy = Math.tan(60 / 180 * Math.PI * 0.5)\n      const tan_fovx = tan_fovy * frameWidth / frameHeight\n      const focal_y = frameHeight / (2 * tan_fovy)\n      const focal_x = frameWidth / (2 * tan_fovx)\n\n      console.log('gsMaterial', gsMaterial)\n\n      console.log('frameWidth', frameWidth)\n      console.log('frameHeight', frameHeight)\n      console.log('tan_fovy', tan_fovy)\n      console.log('tan_fovx', tan_fovx)\n      console.log('focal_y', focal_y)\n      console.log('focal_x', focal_x)\n\n      // 设定屏幕相关uniform\n      gsMaterial.setFloat('screen_width', frameWidth)\n      gsMaterial.setFloat('screen_height', frameHeight)\n      gsMaterial.setFloat('tan_fovy', tan_fovy)\n      gsMaterial.setFloat('tan_fovx', tan_fovx)\n      gsMaterial.setFloat('focal_y', focal_y)\n      gsMaterial.setFloat('focal_x', focal_x)\n\n      this.meshGeo.material = gsMaterial\n\n      console.log('meshGeo')\n\n      // 初始化循环\n      console.log('initRenderLoop')\n      this.initRenderLoop()\n    }, 200)\n  },\n  initRenderLoop() {\n    // this.loopTimer = setInterval(this.loop.bind(this), 2000);\n    this.loopTimer = setTimeout(this.loop.bind(this), 2000)\n  },\n  loop() {\n    // console.log(this.xrCamera._viewMatrix)\n    this._worker.postMessage({\n      type: 'execFunc_sort',\n      params: [\n        {\n          viewMatrix: this.xrCamera._viewMatrix\n        }\n      ]\n    })\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/webgl2/camera-webGL.js",
    "content": "import * as glMatrix from '../util/gl-matrix-min'\n\nconst { mat4, vec3, vec4 } = glMatrix\n\nclass CameraWebGL {\n    constructor(gl, worker, {target = [0, 0, 0], up = [0, 1, 0], camera = []} = {}) {\n        this.gl = gl;\n        this.worker = worker;\n        this.target = [...target] // Position of look-at target\n        this.up = [...up]         // Up vector\n\n        // Camera spherical coordinates (around the target)\n        this.theta  = camera[0] ?? -Math.PI/2\n        this.phi    = camera[1] ?? Math.PI/2\n        this.radius = camera[2] ?? 3\n\n        // Y Field of view\n        // this.fov_y = 0.820176\n        this.fov_y = Math.PI / 180 * 70;\n\n        // False: orbit around object (mouse + wheel)\n        // True: free-fly (mouse + AWSD)\n        this.freeFly = false\n\n        // Indicate that the camera moved and the splats need to be sorted\n        this.needsWorkerUpdate = true\n\n        // Is the user dragging the mouse?\n        this.isDragging = false\n\n        // Helper vectors\n        this.pos = vec3.create()\n        this.front = vec3.create()\n        this.right = vec3.create()        \n\n        // Helper matrices\n        this.modelMatrix = mat4.create()\n        this.viewMatrix = mat4.create()\n        this.projMatrix = mat4.create()\n        this.viewProjMatrix = mat4.create()\n        this.lastViewProjMatrix = mat4.create()\n        this.sceneRotationMatrix = rotateAlign(this.up, [0, 1, 0])\n\n        // Matrices sent to the GPU\n        this.mm = mat4.create()\n        this.vm = mat4.create()\n        this.mvm = mat4.create()\n        this.mvpm = mat4.create()\n\n        // past Touch\n        this.lastTouch = {}\n\n        // 是否已经初始化\n        this.isWorkerInit = false;\n\n        // 是否在排序\n        this.isWorkerSorting = false;\n\n        // 是否开启 worker 更新\n        this.workerOn = true;\n\n        // 初始化\n        this.update();\n    }\n\n    setWorkerOn(flag) {\n        this.workerOn = flag\n    }\n\n    updateCameraInfo(target, theta, phi, radius) {\n        this.target = [...target]\n        this.theta = theta\n        this.phi = phi\n        this.radius = radius\n    }\n\n    getPos(radius = this.radius) {\n        const pos = [\n            radius * Math.sin(this.phi) * Math.cos(this.theta),\n            radius * Math.cos(this.phi),\n            radius * Math.sin(this.phi) * Math.sin(this.theta)\n        ]\n\n        return vec3.transformMat3(pos, pos, this.sceneRotationMatrix)\n    }\n\n    update() {\n        // console.log(this.pos)\n        const gl = this.gl;\n        // Update current position\n        vec3.add(this.pos, this.target, this.getPos(this.freeFly ? 1 : this.radius))\n\n        // Create a lookAt view matrix\n        mat4.lookAt(this.viewMatrix, this.pos, this.target, this.up)\n\n        // Create a perspective projection matrix\n        const aspect = gl.canvas.width / gl.canvas.height\n        mat4.perspective(this.projMatrix, this.fov_y, aspect, 0.01, 1000)\n\n\t\t// Convert view and projection to target coordinate system\n        // Original C++ reference: https://gitlab.inria.fr/sibr/sibr_core/-/blob/gaussian_code_release_union/src/projects/gaussianviewer/renderer/GaussianView.cpp#L464\n        mat4.copy(this.mm, this.modelMatrix);\n        // modelMatrix 进行反转Y轴\n        // invertRow(this.mm, 1);\n        mat4.multiply(this.mvm, this.viewMatrix, this.mm)\n        mat4.multiply(this.mvpm, this.projMatrix, this.mvm)\n\n        invertRow(this.mvm, 2)\n\n        // invertRow(this.mvm, 1)\n        // invertRow(this.mvpm, 1)\n        // (Webgl-specific) Invert x-axis\n        // invertRow(this.mvm, 0)\n        // invertRow(this.mvpm, 0)\n        \n        // console.log('vm', this.vm);\n        // console.log('pm', this.projMatrix);\n\n        if (this.isWorkerInit){\n            if (this.workerOn) {\n                this.updateWorker();\n            }\n        }\n    }\n\n    updateByVK() {\n\t\t// Convert view and projection to target coordinate system\n        // Original C++ reference: https://gitlab.inria.fr/sibr/sibr_core/-/blob/gaussian_code_release_union/src/projects/gaussianviewer/renderer/GaussianView.cpp#L464\n        mat4.copy(this.mm, this.modelMatrix);\n        // modelMatrix 进行反转Y轴\n        // invertRow(this.mm, 1);\n        mat4.multiply(this.mvm, this.viewMatrix, this.mm)\n        mat4.multiply(this.mvpm, this.projMatrix, this.mvm)\n\n        invertRow(this.mvm, 2)\n\n        // invertRow(this.mvm, 1)\n        // invertRow(this.mvpm, 1)\n        // (Webgl-specific) Invert x-axis\n        // invertRow(this.mvm, 0)\n        // invertRow(this.mvpm, 0)\n        \n        // console.log('vm', this.vm);\n        // console.log('pm', this.projMatrix);\n\n        if (this.isWorkerInit){\n            if (this.workerOn) {\n                this.updateWorker();\n            }\n        }\n    }\n\n    updateWorker() {\n        const worker = this.worker;\n\n        // Calculate the dot product between last and current view-projection matrices\n        // If they differ too much, the splats need to be sorted\n        const dot = this.lastViewProjMatrix[2]  * this.mvpm[2] \n                  + this.lastViewProjMatrix[6]  * this.mvpm[6]\n                  + this.lastViewProjMatrix[10] * this.mvpm[10]\n        if (Math.abs(dot - 1) > 0.01) {\n            this.needsWorkerUpdate = true\n            mat4.copy(this.lastViewProjMatrix, this.mvpm)\n        }\n\n        // Sort the splats as soon as the worker is available\n        if (this.needsWorkerUpdate && !this.isWorkerSorting) {\n            this.needsWorkerUpdate = false\n            this.isWorkerSorting = true\n            worker.postMessage({\n                type: 'execFunc_sort',\n                params: [\n                  {\n                    viewProjectionMatrix: this.mvpm\n                  }\n                ]\n              })\n        }\n    }\n}\n\nconst invertRow = (mat, row) => {\n    mat[row + 0] = -mat[row + 0]\n    mat[row + 4] = -mat[row + 4]\n    mat[row + 8] = -mat[row + 8]\n    mat[row + 12] = -mat[row + 12]\n}\n\n// Calculate the rotation matrix that aligns v1 with v2\n// https://gist.github.com/kevinmoran/b45980723e53edeb8a5a43c49f134724\nfunction rotateAlign(v1, v2) {\n    const axis = [\n      v1[1] * v2[2] - v1[2] * v2[1],\n      v1[2] * v2[0] - v1[0] * v2[2],\n      v1[0] * v2[1] - v1[1] * v2[0]\n    ]\n\n    const cosA = v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]\n    const k = 1.0 / (1.0 + cosA)\n  \n    const result = [\n      (axis[0] * axis[0] * k) + cosA, (axis[1] * axis[0] * k) - axis[2], (axis[2] * axis[0] * k) + axis[1],\n      (axis[0] * axis[1] * k) + axis[2], (axis[1] * axis[1] * k) + cosA, (axis[2] * axis[1] * k) - axis[0],\n      (axis[0] * axis[2] * k) - axis[1], (axis[1] * axis[2] * k) + axis[0], (axis[2] * axis[2] * k) + cosA\n    ]\n  \n    return result\n}\n\nexport default CameraWebGL;"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/webgl2/cubeInstance-webGL.js",
    "content": "const cubeVertexShader =\n`\nattribute vec4 aVertexPosition;\nattribute vec4 aVertexColor;\n\nuniform mat4 uModelMatrix;\nuniform mat4 uViewMatrix;\nuniform mat4 uProjectionMatrix;\n\nvarying lowp vec4 vColor;\n\nvoid main(void) {\n    gl_Position = uProjectionMatrix * uViewMatrix * uModelMatrix * aVertexPosition;\n\n    vColor = aVertexColor;\n}\n`\n\nconst cubeFragmentShader =\n`\nvarying lowp vec4 vColor;\n\nvoid main(void) {\n    gl_FragColor = vColor;\n}\n`\n\nclass CubeInstanceWebGL {\n  constructor(gl) {\n    // -- Init Program\n    const shaderProgram = initShaderProgram(gl, cubeVertexShader, cubeFragmentShader)\n\n    this.vao = gl.createVertexArray()\n    gl.bindVertexArray(this.vao)\n    this.positionBuffer = this.initVertexBuffer(gl)\n    this.colorBuffer = this.initColorBuffer(gl)\n    this.indices = this.initIndexBuffer(gl)\n\n    this.programInfo = {\n      program: shaderProgram,\n      attribLocations: {\n        vertexPosition: gl.getAttribLocation(shaderProgram, 'aVertexPosition'),\n        vertexColor: gl.getAttribLocation(shaderProgram, 'aVertexColor'),\n      },\n      uniformLocations: {\n        projectionMatrix: gl.getUniformLocation(shaderProgram, 'uProjectionMatrix'),\n        viewMatrix: gl.getUniformLocation(shaderProgram, 'uViewMatrix'),\n        modelMatrix: gl.getUniformLocation(shaderProgram, 'uModelMatrix'),\n      },\n    }\n\n    // console.log('aVertexPosition', gl.getAttribLocation(shaderProgram, \"aVertexPosition\"))\n    // console.log('aVertexColor', gl.getAttribLocation(shaderProgram, \"aVertexColor\"))\n  }\n\n  initVertexBuffer(gl) {\n    // Create a buffer for the square's positions.\n    const positionBuffer = gl.createBuffer()\n\n    // Select the positionBuffer as the one to apply buffer\n    // operations to from here out.\n    gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer)\n\n    const positions = [\n      // Front face\n      -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0,\n\n      // Back face\n      -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0,\n\n      // Top face\n      -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0,\n\n      // Bottom face\n      -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0,\n\n      // Right face\n      1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0,\n\n      // Left face\n      -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0,\n    ]\n\n    // Now pass the list of positions into WebGL to build the\n    // shape. We do this by creating a Float32Array from the\n    // JavaScript array, then use it to fill the current buffer.\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW)\n\n    return positionBuffer\n  }\n\n  initColorBuffer(gl) {\n    const faceColors = [\n      [1.0, 1.0, 1.0, 1.0], // Front face: white\n      [1.0, 0.0, 0.0, 1.0], // Back face: red\n      [0.0, 1.0, 0.0, 1.0], // Top face: green\n      [0.0, 0.0, 1.0, 1.0], // Bottom face: blue\n      [1.0, 1.0, 0.0, 1.0], // Right face: yellow\n      [1.0, 0.0, 1.0, 1.0], // Left face: purple\n    ]\n\n    // Convert the array of colors into a table for all the vertices.\n\n    let colors = []\n\n    for (let j = 0; j < faceColors.length; ++j) {\n      const c = faceColors[j]\n      // Repeat each color four times for the four vertices of the face\n      colors = colors.concat(c, c, c, c)\n    }\n\n    const colorBuffer = gl.createBuffer()\n    gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer)\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW)\n\n    return colorBuffer\n  }\n\n  initIndexBuffer(gl) {\n    const indexBuffer = gl.createBuffer()\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer)\n\n    // This array defines each face as two triangles, using the\n    // indices into the vertex array to specify each triangle's\n    // position.\n\n    const indices = [\n      0,\n      1,\n      2,\n      0,\n      2,\n      3, // front\n      4,\n      5,\n      6,\n      4,\n      6,\n      7, // back\n      8,\n      9,\n      10,\n      8,\n      10,\n      11, // top\n      12,\n      13,\n      14,\n      12,\n      14,\n      15, // bottom\n      16,\n      17,\n      18,\n      16,\n      18,\n      19, // right\n      20,\n      21,\n      22,\n      20,\n      22,\n      23, // left\n    ]\n\n    // Now send the element array to GL\n\n    gl.bufferData(\n      gl.ELEMENT_ARRAY_BUFFER,\n      new Uint16Array(indices),\n      gl.STATIC_DRAW\n    )\n\n    return indexBuffer\n  }\n}\n\n//\n// Initialize a shader program, so WebGL knows how to draw our data\n//\nfunction initShaderProgram(gl, vsSource, fsSource) {\n  const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource)\n  const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource)\n\n  // Create the shader program\n\n  const shaderProgram = gl.createProgram()\n  gl.attachShader(shaderProgram, vertexShader)\n  gl.attachShader(shaderProgram, fragmentShader)\n  gl.linkProgram(shaderProgram)\n\n  // If creating the shader program failed, alert\n\n  if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {\n    console.error(\n      `Unable to initialize the shader program: ${gl.getProgramInfoLog(\n        shaderProgram\n      )}`\n    )\n    return null\n  }\n\n  return shaderProgram\n}\n\n//\n// creates a shader of the given type, uploads the source and\n// compiles it.\n//\nfunction loadShader(gl, type, source) {\n  const shader = gl.createShader(type)\n\n  // Send the source to the shader object\n\n  gl.shaderSource(shader, source)\n\n  // Compile the shader program\n\n  gl.compileShader(shader)\n\n  // See if it compiled successfully\n\n  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n    console.error(\n      `An error occurred compiling the shaders: ${gl.getShaderInfoLog(shader)}`\n    )\n    gl.deleteShader(shader)\n    return null\n  }\n\n  return shader\n}\n\nexport default CubeInstanceWebGL\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/webgl2/shaders/splat_fragment.glsl.js",
    "content": "export const splatFragmentShader =\n/* glsl */\n`#version 300 es\nprecision mediump float;\n\nin vec3 col;\nin float scale_modif;\nin float depth;\nin vec4 con_o;\nin vec2 xy;\nin vec2 pixf;\n\nout vec4 fragColor;\n\n\n// Original CUDA implementation: https://github.com/graphdeco-inria/diff-gaussian-rasterization/blob/main/cuda_rasterizer/forward.cu#L263\nvoid main() {\n\n    // Resample using conic matrix (cf. \"Surface \n    // Splatting\" by Zwicker et al., 2001)\n    vec2 d = xy - pixf;\n    float power = -0.5 * (con_o.x * d.x * d.x + con_o.z * d.y * d.y) - con_o.y * d.x * d.y;\n\n    if (power > 0.) {\n        discard;\n    }\n\n    // (Custom) As the covariance matrix is calculated in a one-time operation on CPU in this implementation,\n    // we need to apply the scale modifier differently to still allow for real-time scaling of the splats.\n    power *= scale_modif;\n\n    // Eq. (2) from 3D Gaussian splatting paper.\n    float alpha = min(.99f, con_o.w * exp(power));\n    \n    // (Custom) Colorize with depth value instead of color (z-buffer visualization)\n    vec3 color = col;\n\n    if (alpha < 1./255.) {\n        discard;\n    }\n\n    // Eq. (3) from 3D Gaussian splatting paper.\n    fragColor = vec4(color * alpha, alpha);\n\n    // fragColor = vec4(color , con_o.w);\n\n    // fragColor = vec4(0.0, 0.0, 1.0, 1.0);\n}\n`\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/webgl2/shaders/splat_rt_fragment.glsl.js",
    "content": "export const splatRTFragmentShader =\n/* glsl */\n`#version 300 es\nprecision mediump float;\n\nuniform sampler2D u_splat;\n\nin vec2 v_uv;\n\nout vec4 fragColor;\n\nvoid main(void) {\n    fragColor = texture(u_splat, v_uv);\n}\n`\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/webgl2/shaders/splat_rt_vertex.glsl.js",
    "content": "export const splatRTVertexShader =\n/* glsl */\n`#version 300 es\nin vec3 a_pos;\nin vec2 a_texCoord;\n\nout vec2 v_uv;\n\nvoid main(void) {\n    gl_Position = vec4(a_pos, 1.0);\n\n    v_uv = a_texCoord;\n}\n`\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/webgl2/shaders/splat_vertex.glsl.js",
    "content": "export const splatVertexShader =\n/* glsl */\n`#version 300 es\nin vec3 a_center;\nin vec3 a_col;\nin float a_opacity;\nin vec3 a_covA;\nin vec3 a_covB;\n\nuniform float canvas_width;\nuniform float canvas_height;\nuniform float focal_x;\nuniform float focal_y;\nuniform float tan_fovx;\nuniform float tan_fovy;\nuniform float scale_modifier;\nuniform mat4 viewmatrix;\nuniform mat4 modelmatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 modelViewProjectMatrix;\n\nuniform vec3 boxmin;\nuniform vec3 boxmax;\n\nout vec3 col;\nout float depth;\nout float scale_modif;\nout vec4 con_o;\nout vec2 xy;\nout vec2 pixf;\n\nvec3 computeCov2D(vec3 mean, float focal_x, float focal_y, float tan_fovx, float tan_fovy, float[6] cov3D, mat4 viewmatrix) {\n    vec4 t = viewmatrix * vec4(mean, 1.0);\n\n    float limx = 1.3 * tan_fovx;\n    float limy = 1.3 * tan_fovy;\n    float txtz = t.x / t.z;\n    float tytz = t.y / t.z;\n    t.x = min(limx, max(-limx, txtz)) * t.z;\n    t.y = min(limy, max(-limy, tytz)) * t.z;\n\n    mat3 J = mat3(\n        focal_x / t.z, 0, -(focal_x * t.x) / (t.z * t.z),\n        0, focal_y / t.z, -(focal_y * t.y) / (t.z * t.z),\n        0, 0, 0\n    );\n\n    mat3 W =  mat3(\n        viewmatrix[0][0], viewmatrix[1][0], viewmatrix[2][0],\n        viewmatrix[0][1], viewmatrix[1][1], viewmatrix[2][1],\n        viewmatrix[0][2], viewmatrix[1][2], viewmatrix[2][2]\n    );\n\n    mat3 T = W * J;\n\n    mat3 Vrk = mat3(\n        cov3D[0], cov3D[1], cov3D[2],\n        cov3D[1], cov3D[3], cov3D[4],\n        cov3D[2], cov3D[4], cov3D[5]\n    );\n\n    mat3 cov = transpose(T) * transpose(Vrk) * T;\n\n    cov[0][0] += .3;\n    cov[1][1] += .3;\n    return vec3(cov[0][0], cov[0][1], cov[1][1]);\n}\n\nfloat ndc2Pix(float v, float S) {\n    return ((v + 1.) * S - 1.) * .5;\n}\n\n#define hash33(p) fract(sin( (p) * mat3( 127.1,311.7,74.7 , 269.5,183.3,246.1 , 113.5,271.9,124.6) ) *43758.5453123)\n\n// Original CUDA implementation: https://github.com/graphdeco-inria/diff-gaussian-rasterization/blob/main/cuda_rasterizer/forward.cu#L156\nvoid main() {\n    vec3 p_orig = a_center;\n\n    // Transform point by projecting\n    vec4 p_hom = modelViewProjectMatrix * vec4(p_orig, 1);\n    float p_w = 1. / (p_hom.w + 1e-7);\n    vec3 p_proj = p_hom.xyz * p_w;\n\n    // Perform near culling, quit if outside.\n    vec4 p_view = modelViewMatrix * vec4(p_orig, 1);\n    if (p_view.z <= .1) {\n        gl_Position = vec4(0, 0, 0, 1);\n        return;\n    }\n\n\n    // (Webgl-specific) The covariance matrix is pre-computed on the CPU for faster performance\n    float cov3D[6] = float[6](a_covA.x, a_covA.y, a_covA.z, a_covB.x, a_covB.y, a_covB.z);\n    // computeCov3D(a_scale, scale_modifier, a_rot, cov3D);\n\n    // Compute 2D screen-space covariance matrix\n    vec3 cov = computeCov2D(p_orig, focal_x, focal_y, tan_fovx, tan_fovy, cov3D, modelViewMatrix);\n\n    // Invert covariance (EWA algorithm)\n    float det = (cov.x * cov.z - cov.y * cov.y);\n    if (det == 0.) {\n        gl_Position = vec4(0, 0, 0, 1);\n        return;\n    }\n    float det_inv = 1. / det;\n    vec3 conic = vec3(cov.z, -cov.y, cov.x) * det_inv;\n\n    // Compute extent in screen space (by finding eigenvalues of\n    // 2D covariance matrix). Use extent to compute the bounding\n    // rectangle of the splat in screen space.\n\n    float mid = 0.5 * (cov.x + cov.z);\n    float lambda1 = mid + sqrt(max(0.1, mid * mid - det));\n    float lambda2 = mid - sqrt(max(0.1, mid * mid - det));\n    float my_radius = ceil(3. * sqrt(max(lambda1, lambda2)));\n    vec2 point_image = vec2(ndc2Pix(p_proj.x, canvas_width), ndc2Pix(p_proj.y, canvas_height));\n\n    // (Webgl-specific) As the covariance matrix is calculated as a one-time operation on CPU in this implementation,\n    // we need to apply the scale modifier differently to still allow for real-time scaling of the splats.\n    my_radius *= .15 + scale_modifier * .85;\n    scale_modif = 1. / scale_modifier;\n\n    // (Webgl-specific) Convert gl_VertexID from [0,1,2,3] to [-1,-1],[1,-1],[-1,1],[1,1]\n    vec2 corner = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2) - 1.;\n    // Vertex position in screen space\n    vec2 screen_pos = point_image + my_radius * corner;\n\n    // Store some useful helper data for the fragment stage\n    col = a_col;\n    con_o = vec4(conic, a_opacity);\n    xy = point_image;\n    pixf = screen_pos;\n    depth = p_view.z;\n\n    // (Webgl-specific) Convert from screen-space to clip-space\n    vec2 clip_pos = screen_pos / vec2(canvas_width, canvas_height) * 2. - 1.;\n\n    gl_Position = vec4(clip_pos, 0, 1);\n\n\n}\n`\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/webgl2/shaders/yuv_fragment.glsl.js",
    "content": "export const YUVFragmentShader =\n/* glsl */\n`#version 300 es\nprecision mediump float;\n\nuniform sampler2D u_y_texture;\nuniform sampler2D u_uv_texture;\n\nin vec2 v_uv;\n\nout vec4 fragColor;\n\nvoid main(void) {\n    vec4 y_color = texture(u_y_texture, v_uv);\n    vec4 uv_color = texture(u_uv_texture, v_uv);\n\n    float Y, U, V;\n    float R ,G, B;\n    Y = y_color.r;\n    U = uv_color.r - 0.5;\n    V = uv_color.a - 0.5;\n    \n    R = Y + 1.402 * V;\n    G = Y - 0.344 * U - 0.714 * V;\n    B = Y + 1.772 * U;\n    \n    fragColor = vec4(R, G, B, 1.0);\n}\n`\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/webgl2/shaders/yuv_vertex.glsl.js",
    "content": "export const YUVVertexShader =\n/* glsl */\n`#version 300 es\nin vec3 a_pos;\nin vec2 a_texCoord;\n\nuniform mat3 u_displayTransform;\n\nout vec2 v_uv;\n\nvoid main(void) {\n    vec3 p = u_displayTransform * a_pos;\n\n    gl_Position = vec4(p, 1.0);\n\n    v_uv = a_texCoord;\n}\n`\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/webgl2/splat-webGL.js",
    "content": "import { splatVertexShader } from './shaders/splat_vertex.glsl'\nimport { splatFragmentShader } from './shaders/splat_fragment.glsl'\nimport { splatRTVertexShader } from './shaders/splat_rt_vertex.glsl'\nimport { splatRTFragmentShader } from './shaders/splat_rt_fragment.glsl'\n\nclass SplatWebGL {\n  constructor(gl) {\n    // Create shader program\n    const program = createProgram(gl, splatVertexShader, splatFragmentShader)\n\n    this.vao = gl.createVertexArray()\n    gl.bindVertexArray(this.vao)\n\n    const setupAttributeBuffer = (name, components) => {\n      const location = gl.getAttribLocation(program, name)\n      const buffer = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, buffer)\n      gl.enableVertexAttribArray(location)\n      gl.vertexAttribPointer(location, components, gl.FLOAT, false, 0, 0)\n      gl.vertexAttribDivisor(location, 1)\n      return buffer\n    }\n\n    // Create attribute buffers\n    const buffers = {\n      color: setupAttributeBuffer('a_col', 3),\n      center: setupAttributeBuffer('a_center', 3),\n      opacity: setupAttributeBuffer('a_opacity', 1),\n      covA: setupAttributeBuffer('a_covA', 3),\n      covB: setupAttributeBuffer('a_covB', 3),\n    }\n\n    this.program = program\n    this.buffers = buffers\n  }\n}\n\nexport class SplatRenderTexture {\n  constructor(gl) {\n    // 准备 RenderTexutre\n    this.initRenderTexture(gl)\n\n    // Create shader program\n    const shaderProgram = createProgram(gl, splatRTVertexShader, splatRTFragmentShader)\n\n    this.programInfo = {\n      program: shaderProgram,\n      attribLocations: {\n        vertexPosition: gl.getAttribLocation(shaderProgram, 'a_pos'),\n        vertexTexcoord: gl.getAttribLocation(shaderProgram, 'a_texCoord'),\n      },\n      uniformLocations: {\n        uSplat: gl.getAttribLocation(shaderProgram, 'u_splat'),\n      },\n    }\n\n    // init VAO\n    this.initVAO(gl)\n  }\n\n  initRenderTexture(gl) {\n    const targetTextureWidth = gl.canvas.width\n    const targetTextureHeight = gl.canvas.height\n    const targetTexture = gl.createTexture()\n    gl.bindTexture(gl.TEXTURE_2D, targetTexture)\n\n    this.renderTexture = targetTexture\n\n    // 定义0级的大小和格式\n    const level = 0\n    const internalFormat = gl.RGBA\n    const border = 0\n    const format = gl.RGBA\n    const type = gl.UNSIGNED_BYTE\n    const data = null\n    gl.texImage2D(\n      gl.TEXTURE_2D,\n      level,\n      internalFormat,\n      targetTextureWidth,\n      targetTextureHeight,\n      border,\n      format,\n      type,\n      data\n    )\n\n    // 设置过滤，这样我们就不需要 mips\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n\n    // 创建并绑定帧缓冲区\n    const fb = gl.createFramebuffer()\n    gl.bindFramebuffer(gl.FRAMEBUFFER, fb)\n\n    // 将纹理附加为第一个颜色附件\n    const attachmentPoint = gl.COLOR_ATTACHMENT0\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentPoint, gl.TEXTURE_2D, targetTexture, level)\n\n    this.frameBuffer = fb\n    this.rt = targetTexture\n  }\n\n  initVAO(gl) {\n    this.vao = gl.createVertexArray()\n    gl.bindVertexArray(this.vao)\n\n    // positionBuffer\n    const positionBuffer = gl.createBuffer()\n    gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer)\n    const positions = [\n      -1.0, -1.0, 0.0,\n      1.0, -1.0, 0.0,\n      1.0, 1.0, 0.0,\n      -1.0, 1.0, 0.0,\n    ]\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW)\n\n    // texCoordBuffer\n    const texCoordBuffer = gl.createBuffer()\n    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer)\n    // filpY\n    const texCoord = [\n      0, 0,\n      1, 0,\n      1, 1,\n      0, 1\n    ]\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(texCoord), gl.STATIC_DRAW)\n\n    // indexBuffer\n    const indexBuffer = gl.createBuffer()\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer)\n    const indices = [\n      0,\n      1,\n      2,\n      0,\n      2,\n      3\n    ]\n    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW)\n\n    // Create attribute buffers\n    const buffers = {\n      position: positionBuffer,\n      texCoord: texCoordBuffer,\n      indices: indexBuffer\n    }\n\n    this.buffers = buffers\n  }\n}\n\n// Create a program from a vertex and fragment shader\nfunction createProgram(gl, vertexShaderSource, fragmentShaderSource) {\n  const program = gl.createProgram()\n\n  const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource)\n  const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource)\n  gl.attachShader(program, vertexShader)\n  gl.attachShader(program, fragmentShader)\n  gl.linkProgram(program)\n\n  const success = gl.getProgramParameter(program, gl.LINK_STATUS)\n  if (success) return program\n\n  console.log(gl.getProgramInfoLog(program))\n  gl.deleteProgram(program)\n}\n\n// Create and compile a shader from source\nfunction createShader(gl, type, source) {\n  const shader = gl.createShader(type)\n  gl.shaderSource(shader, source)\n  gl.compileShader(shader)\n\n  const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS)\n\n  if (success) return shader\n\n  console.log(gl.getShaderInfoLog(shader))\n  gl.deleteShader(shader)\n}\n\nexport default SplatWebGL\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/gaussian-splatting/webgl2/yuv-webGL.js",
    "content": "import { YUVVertexShader } from './shaders/yuv_vertex.glsl'\nimport { YUVFragmentShader } from './shaders/yuv_fragment.glsl'\n\nexport class YUVRenderWebGL {\n  constructor(gl) {\n    // Create shader program\n    const shaderProgram = createProgram(gl, YUVVertexShader, YUVFragmentShader)\n\n    this.programInfo = {\n      program: shaderProgram,\n      attribLocations: {\n        vertexPosition: gl.getAttribLocation(shaderProgram, 'a_pos'),\n        vertexTexcoord: gl.getAttribLocation(shaderProgram, 'a_texCoord'),\n      },\n      uniformLocations: {\n        displayTransform: gl.getUniformLocation(shaderProgram, 'u_displayTransform'),\n        yTexture: gl.getUniformLocation(shaderProgram, 'u_y_texture'),\n        uvTexture: gl.getUniformLocation(shaderProgram, 'u_uv_texture'),\n      },\n    }\n\n    // init VAO\n    this.initVAO(gl)\n  }\n\n  initVAO(gl) {\n    this.vao = gl.createVertexArray()\n    gl.bindVertexArray(this.vao)\n\n    // positionBuffer\n    const positionBuffer = gl.createBuffer()\n    gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer)\n    const positions = [\n      -1.0, -1.0, 0.0,\n      1.0, -1.0, 0.0,\n      1.0, 1.0, 0.0,\n      -1.0, 1.0, 0.0,\n    ]\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW)\n\n    // texCoordBuffer\n    const texCoordBuffer = gl.createBuffer()\n    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer)\n    // filpY\n    const texCoord = [\n      0, 0,\n      1, 0,\n      1, 1,\n      0, 1\n    ]\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(texCoord), gl.STATIC_DRAW)\n\n    // indexBuffer\n    const indexBuffer = gl.createBuffer()\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer)\n    const indices = [\n      0,\n      1,\n      2,\n      0,\n      2,\n      3\n    ]\n    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW)\n\n    // Create attribute buffers\n    const buffers = {\n      position: positionBuffer,\n      texCoord: texCoordBuffer,\n      indices: indexBuffer\n    }\n\n    this.buffers = buffers\n  }\n}\n\n// Create a program from a vertex and fragment shader\nfunction createProgram(gl, vertexShaderSource, fragmentShaderSource) {\n  const program = gl.createProgram()\n\n  const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource)\n  const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource)\n  gl.attachShader(program, vertexShader)\n  gl.attachShader(program, fragmentShader)\n  gl.linkProgram(program)\n\n  const success = gl.getProgramParameter(program, gl.LINK_STATUS)\n  if (success) return program\n\n  console.log(gl.getProgramInfoLog(program))\n  gl.deleteProgram(program)\n}\n\n// Create and compile a shader from source\nfunction createShader(gl, type, source) {\n  const shader = gl.createShader(type)\n  gl.shaderSource(shader, source)\n  gl.compileShader(shader)\n\n  const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS)\n\n  if (success) return shader\n\n  console.log(gl.getShaderInfoLog(shader))\n  gl.deleteShader(shader)\n}\n\nexport default YUVRenderWebGL\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/hand-detect/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n      cameraPosition: 0\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            plane: {\n              mode: 1\n            },\n            hand: {\n              mode: 1\n            }\n          },\n          version: 'v1',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          session.on('addAnchors', anchors => {\n            this.data.anchor2DList = anchors.map(anchor => ({\n              points: anchor.points,\n              origin: anchor.origin,\n              size: anchor.size\n            }))\n          })\n\n          session.on('updateAnchors', anchors => {\n            this.data.anchor2DList = []\n            // 摄像头实时检测人脸的时候 updateAnchors 会在每帧触发，所以性能要求更高，用 gl 画\n            this.data.anchor2DList = this.data.anchor2DList.concat(anchors.map(anchor => ({\n              points: anchor.points,\n              origin: anchor.origin,\n              size: anchor.size\n            })))\n          })\n\n          session.on('removeAnchors', anchors => {\n            this.data.anchor2DList = []\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/hand-detect/hand-detect.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\n// 顶点着色器\nconst VSHADER_SOURCE = '' +\n  'attribute vec4 a_Position;\\n' + // 声明attribute变量a_Position，用来存放顶点位置信息\n  'void main(){\\n' +\n  '  gl_Position = a_Position;\\n' + // 将顶点坐标赋值给顶点着色器内置变量gl_Position\n  '  gl_PointSize = 4.0;\\n' + // 设置顶点大小\n  '}\\n'\n\n// 片元着色器\nconst FSHADER_SOURCE = '' +\n  '#ifdef GL_ES\\n' +\n  ' precision mediump float;\\n' + // 设置精度\n  '#endif\\n' +\n  'varying vec4 v_Color;\\n' + // 声明varying变量v_Color，用来接收顶点着色器传送的片元颜色信息\n  'void main(){\\n' +\n  '  float d = distance(gl_PointCoord, vec2(0.5, 0.5));\\n' + // 计算像素距离中心点的距离\n  '  if(d < 0.5) {\\n' + // 距离大于0.5放弃片元，小于0.5保留片元\n  '    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\\n' +\n  '  } else { discard; }\\n' +\n  '}\\n'\n\n// 初始化着色器函数\nlet initShadersDone = false\n\nfunction initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE) {\n  // 创建顶点着色器对象\n  const vertexShader = loadShader(gl, gl.VERTEX_SHADER, VSHADER_SOURCE)\n  // 创建片元着色器对象\n  const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, FSHADER_SOURCE)\n\n  if (!vertexShader || !fragmentShader) {\n    return null\n  }\n\n  // 创建程序对象program\n  const program = gl.createProgram()\n  if (!gl.createProgram()) {\n    return null\n  }\n  // 分配顶点着色器和片元着色器到program\n  gl.attachShader(program, vertexShader)\n  gl.attachShader(program, fragmentShader)\n  // 链接program\n  gl.linkProgram(program)\n\n  // 检查程序对象是否连接成功\n  const linked = gl.getProgramParameter(program, gl.LINK_STATUS)\n  if (!linked) {\n    const error = gl.getProgramInfoLog(program)\n    console.log('程序对象连接失败: ' + error)\n    gl.deleteProgram(program)\n    gl.deleteShader(fragmentShader)\n    gl.deleteShader(vertexShader)\n    return null\n  }\n  // 返回程序program对象\n  initShadersDone = true\n  return program\n}\n\nfunction loadShader(gl, type, source) {\n  // 创建顶点着色器对象\n  const shader = gl.createShader(type)\n  if (shader == null) {\n    console.log('创建着色器失败')\n    return null\n  }\n\n  // 引入着色器源代码\n  gl.shaderSource(shader, source)\n\n  // 编译着色器\n  gl.compileShader(shader)\n\n  // 检查顶是否编译成功\n  const compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS)\n  if (!compiled) {\n    const error = gl.getShaderInfoLog(shader)\n    console.log('编译着色器失败: ' + error)\n    gl.deleteShader(shader)\n    return null\n  }\n\n  return shader\n}\n\n// 初始化顶点坐标和顶点颜色\nfunction initVertexBuffers(gl, anchor2DList) {\n  const flattenPoints = []\n  anchor2DList.forEach(anchor => {\n    anchor.points.forEach(point => {\n      const {\n        x,\n        y\n      } = point\n      flattenPoints.push(x * 2 - 1, 1 - y * 2)\n    })\n  })\n\n  const vertices = new Float32Array(flattenPoints)\n  const n = flattenPoints.length / 2\n\n  // 创建缓冲区对象\n  const buffer = gl.createBuffer()\n  // 将顶点坐标和顶点颜色信息写入缓冲区对象\n  gl.bindBuffer(gl.ARRAY_BUFFER, buffer)\n  gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW)\n\n  // 获取顶点着色器attribute变量a_Position存储地址, 分配缓存并开启\n  const a_Position = gl.getAttribLocation(gl.program, 'a_Position')\n  gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)\n  gl.enableVertexAttribArray(a_Position)\n  return n\n}\n\nconst EDGE_VSHADER_SOURCE =\n  `\n  attribute vec2 aPosition; \n  varying vec2 posJudge;\n\n  void main(void) {\n    gl_Position = vec4(aPosition.x, aPosition.y, 1.0, 1.0);\n    posJudge = aPosition;\n  }\n`\n\nconst EDGE_FSHADER_SOURCE =\n  `\n  precision highp float;\n  uniform vec2 rightTopPoint;\n  uniform vec2 centerPoint;\n  varying vec2 posJudge;\n\n  float box(float x, float y){\n    float xc = x - centerPoint.x;\n    float yc = y - centerPoint.y;\n    vec2 point = vec2(xc, yc);\n    float right = rightTopPoint.x;\n    float top =  rightTopPoint.y;\n    float line_width = 0.01;\n    vec2 b1 = 1.0 - step(vec2(right,top), abs(point));\n    float outer = b1.x * b1.y;\n    vec2 b2 = 1.0 - step(vec2(right-line_width,top-line_width), abs(point));\n    float inner = b2.x * b2.y;\n    return outer - inner;\n  }\n\n  void main(void) {\n      if(box(posJudge.x, posJudge.y) == 0.0 ) discard;\n\n      gl_FragColor = vec4(box(posJudge.x, posJudge.y), 0.0, 0.0, 1.0);\n\n  }\n`\n\nfunction initRectEdgeBuffer(gl, x, y, width, height) {\n  const shaderProgram = gl.program\n  const centerX = x * 2 - 1 + width\n  const centerY = -1 * (y * 2 - 1) - height\n  const right = width\n  const top = height\n  const vertices = [\n    -1.0, 1.0,\n    -1.0, -1.0,\n    1.0, 1.0,\n    1.0, -1.0\n  ]\n\n  const vertexBuffer = gl.createBuffer()\n  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)\n  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW)\n  const aPosition = gl.getAttribLocation(shaderProgram, 'aPosition')\n  gl.enableVertexAttribArray(aPosition)\n  gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, 0, 0)\n\n  const rightTop = [\n    right, top\n  ]\n  const rightTopLoc = gl.getUniformLocation(shaderProgram, 'rightTopPoint')\n  gl.uniform2fv(rightTopLoc, rightTop)\n\n  const centerPoint = [\n    centerX, centerY\n  ]\n  const centerPointLoc = gl.getUniformLocation(shaderProgram, 'centerPoint')\n  gl.uniform2fv(centerPointLoc, centerPoint)\n\n  const length = vertices.length / 2\n\n  return length\n}\n\nfunction onDrawRectEdge(gl, x, y, width, height) {\n  width = Math.round(width * 100) / 100\n  height = Math.round(height * 100) / 100\n  const n = initRectEdgeBuffer(gl, x, y, width, height)\n  gl.drawArrays(gl.TRIANGLE_STRIP, 0, n)\n}\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n     * 生命周期函数--监听页面加载\n     */\n    detached() {\n      initShadersDone = false\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({\n          theme\n        }) => {\n          this.setData({\n            theme\n          })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n    },\n    switchCamera(event) {\n      if (this.session.config) {\n        const config = this.session.config\n        const pos = Number(event.currentTarget.dataset.value)\n        config.cameraPosition = pos\n        this.session.config = config\n        this.setData({\n          cameraPosition: event.currentTarget.dataset.value\n        })\n      }\n    },\n    render(frame) {\n      const gl = this.gl\n\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n\n      const anchor2DList = this.data.anchor2DList\n\n      if (!anchor2DList || anchor2DList.length <= 0) {\n\n      } else {\n        if (!initShadersDone) {\n          this.vertexProgram = initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)\n          this.rectEdgeProgram = initShaders(gl, EDGE_VSHADER_SOURCE, EDGE_FSHADER_SOURCE)\n          if (!this.vertexProgram || !this.rectEdgeProgram) {\n            console.log('初始化着色器失败')\n            return\n          }\n          console.log('初始化着色器成功')\n        }\n\n        gl.useProgram(this.vertexProgram)\n        gl.program = this.vertexProgram\n        // 初始化顶点坐标和顶点颜色\n        const n = initVertexBuffers(gl, anchor2DList)\n\n        // 绘制点\n        gl.drawArrays(gl.POINTS, 0, n)\n\n        gl.useProgram(this.rectEdgeProgram)\n        gl.program = this.rectEdgeProgram\n\n        for (let i = 0; i < anchor2DList.length; i++) {\n          onDrawRectEdge(gl, anchor2DList[i].origin.x, anchor2DList[i].origin.y, anchor2DList[i].size.width, anchor2DList[i].size.height)\n        }\n      }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/hand-detect/hand-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"实时手势检测\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/hand-detect/hand-detect.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <view><canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n    </canvas></view>\n  <view class=\"page-body-text tc\" style=\"height:20%\">提示：将摄像头对准手部, 检测到的手部将会被标记出识别框和手部标记点\n    <view wx:if=\"{{cameraPosition == 0}}\">\n        <button type=\"primary\" bindtap=\"switchCamera\" data-value=\"1\" disabled=\"{{buttonDisable}}\">切换为前置摄像头</button>\n    </view>\n    <view wx:else>\n        <button type=\"primary\" bindtap=\"switchCamera\" data-value=\"0\" disabled=\"{{buttonDisable}}\">切换为后置摄像头</button>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/hand-detect/hand-detect.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/hand-detect/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/hand-detect-3d/hand-detect-3d.js",
    "content": "import arBehavior from '../behavior/behavior-ar'\nimport xrFrameBehavior from '../behavior/behavior-xrframe'\n\n// VK 投影矩阵参数定义\nconst NEAR = 0.01\nconst FAR = 1000\n\nconst loggerOnce = false\n\nComponent({\n  behaviors: [arBehavior, xrFrameBehavior],\n  data: {\n    theme: 'light',\n    widthScale: 1, // canvas宽度缩放值\n    heightScale: 0.8, // canvas高度缩放值\n    hintBoxList: [], // 显示提示盒子列表\n  },\n  markerIndex: 0, // 使用的 marker 索引\n  hintInfo: undefined, // 提示框信息\n  lifetimes: {\n    /**\n      * 生命周期函数--监听页面加载\n      */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n\n  methods: {\n    // 对应案例的初始化逻辑，由统一的 behavior 触发\n    init() {\n      // 初始化VK\n      // start完毕后，进行更新渲染循环\n      this.initVK()\n    },\n    initVK() {\n      // VKSession 配置\n      const session = this.session = wx.createVKSession({\n        track: {\n          hand: {\n            mode: 1\n          }\n        },\n        version: 'v1',\n        gl: this.gl\n      })\n\n      try {\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          //  VKSession EVENT resize\n          session.on('resize', () => {\n            this.calcCanvasSize()\n          })\n\n          // 开启三维识别\n          session.update3DMode({ open3d: true })\n\n          // VKSession EVENT addAnchors\n          session.on('addAnchors', anchors => {\n            console.log('addAnchor', anchors)\n          })\n\n          // VKSession EVENT updateAnchors\n          session.on('updateAnchors', anchors => {\n            // console.log(\"updateAnchors\", anchors);\n\n            const anchor = anchors[0]\n            // 目前只处理一个返回的手\n            if (anchor) {\n              // console.log('id', anchor.id);\n              // console.log('type', anchor.type);\n              // console.log('transform', anchor.transform);\n              // console.log('mesh', anchor.mesh);\n              // console.log('origin', anchor.origin);\n              // console.log('size', anchor.size);\n              // console.log('detectId', anchor.detectId);\n              // console.log('confidence', anchor.confidence);\n              // console.log('points3d', anchor.points3d);\n\n              this.wrapTransform = anchor.transform\n              this.position3D = anchor.points3d\n\n              this.updateHintBoxVisble(this.hintBoxList, true)\n            }\n          })\n\n          // VKSession removeAnchors\n          // 识别目标丢失时不断触发\n          session.on('removeAnchors', anchors => {\n            // console.log(\"removeAnchors\");\n\n            this.updateHintBoxVisble(this.hintBoxList, false)\n          })\n\n          console.log('ready to initloop')\n          // start 初始化完毕后，进行更新渲染循环\n          this.initLoop()\n        })\n      } catch (e) {\n        console.error(e)\n      }\n    },\n    // 针对 xr-frame 的初始化逻辑\n    async initXRFrame() {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const scene = this.xrScene\n      const { rootShadow } = scene\n\n      // 缓存主相机\n      this.xrCameraMain = this.xrCamera\n      this.xrCameraMainTrs = this.xrCameraTrs\n\n      // 初始化YUV相机配置\n      this.initXRYUVCamera()\n\n      // === 初始s手挂载点 ===\n      this.handWrap = scene.createElement(xrFrameSystem.XRNode)\n      this.handWrapTrs = this.handWrap.getComponent(xrFrameSystem.Transform)\n      rootShadow.addChild(this.handWrap)\n\n      // 加载提示点\n      this.hintBoxList = this.getHintBox(xrFrameSystem, scene, this.handWrap)\n    },\n    loop() {\n      // console.log('loop')\n\n      // 获取 VKFrame\n      const frame = this.session.getVKFrame(this.data.width, this.data.height)\n\n      // 成功获取 VKFrame 才进行\n      if (!frame) { return }\n\n      // 更新相机 YUV 数据\n      this.updataXRYUV(frame)\n\n      // 获取 VKCamera\n      const VKCamera = frame.camera\n\n      // 更新 xrFrame 相机矩阵\n      this.updataXRCameraMatrix(VKCamera, NEAR, FAR)\n\n      // 存在handWrap，执行信息同步逻辑\n      if (this.handWrap && this.wrapTransform) {\n        const xrFrameSystem = wx.getXrFrameSystem()\n\n        if (!this.DT) { this.DT = new xrFrameSystem.Matrix4() }\n        if (!this.DT2) { this.DT2 = new xrFrameSystem.Matrix4() }\n\n        // 目前VK返回的是行主序矩阵\n        // xrframe 矩阵存储为列主序\n        this.DT.setArray(this.wrapTransform)\n        this.DT.transpose(this.DT2)\n        this.handWrapTrs.setLocalMatrix(this.DT2)\n\n        // 更新提示点位置\n        this.updateHintBoxPosition(this.hintBoxList, this.position3D)\n      }\n    },\n    getHintBox(xrFrameSystem, scene, wrap) {\n      // 初始化提示点\n      const geometryHint = scene.assets.getAsset('geometry', 'sphere')\n      const effectCube = scene.assets.getAsset('effect', 'standard')\n      const boxScale = 0.006\n      const hintBoxList = []\n      for (let i = 0; i < 16; i++) {\n        const colorFloat = i / 16\n        const el = scene.createElement(xrFrameSystem.XRNode, {\n          position: '0 0 0',\n          scale: `${boxScale} ${boxScale} ${boxScale}`,\n        })\n        const elTrs = el.getComponent(xrFrameSystem.Transform)\n        const mat = scene.createMaterial(effectCube)\n\n        const colorR = 1.0 - colorFloat\n        mat.setVector('u_baseColorFactor', xrFrameSystem.Vector4.createFromNumber(1.0, colorR, colorR, 1.0))\n\n        const mesh = el.addComponent(xrFrameSystem.Mesh, {\n          geometry: geometryHint,\n          material: mat,\n        })\n\n        wrap.addChild(el)\n        elTrs.visible = false\n\n        hintBoxList.push(elTrs)\n      }\n\n      return hintBoxList\n    },\n    updateHintBoxPosition(hintBoxList, points3d) {\n      if (hintBoxList && hintBoxList.length > 0) {\n        // console.log('ready to set', hintBoxList);\n        // 存在提示列表，则更新点信息\n        for (let i = 0; i < hintBoxList.length; i++) {\n          const hintBox = hintBoxList[i]\n          hintBox.position.x = points3d[i].x\n          hintBox.position.y = points3d[i].y\n          hintBox.position.z = points3d[i].z\n        }\n      }\n    },\n    updateHintBoxVisble(hintBoxList, visible) {\n      if (hintBoxList && hintBoxList.length > 0) {\n        // console.log('ready to set', hintBoxList);\n        // 存在提示列表，则更新点信息\n        for (let i = 0; i < hintBoxList.length; i++) {\n          const hintBox = hintBoxList[i]\n          if (hintBox.visible !== visible) {\n            hintBox.visible = visible\n          }\n        }\n      }\n    }\n\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/hand-detect-3d/hand-detect-3d.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-frame-canvas\": \"../components/xr-frame/index\"\n  },\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"人手三维识别\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/hand-detect-3d/hand-detect-3d.wxml",
    "content": "\n<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view\n    class=\"canvas-wrap\" style=\"width: {{widthScale * 100}}%; height: {{heightScale * 100}}%\"\n  >\n    <xr-frame-canvas\n      disable-scroll\n      id=\"canvas\"\n      width=\"{{width}}\"\n      height=\"{{height}}\"\n      style=\"width:{{domWidth}}px;height:{{domHeight}}px;\"\n      bind:sceneReady=\"handleXRSceneReady\"\n    ></xr-frame-canvas>\n\n  </view>\n\n\n  <view class=\"hint-bottom page-body-text tc\">\n    <view class=\"btn-wrap\">\n      <button class=\"btn\" type=\"primary\" bindtap=\"switchCamera\">切换前后置摄像头</button>\n    </view>\n    <text>提示：摄像头对准手，然后会显示16个关键点的三维坐标提示小球</text>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/hand-detect-3d/hand-detect-3d.wxss",
    "content": ".canvas-wrap {\n  position: relative;\n  width: 100%;\n  background-color: #000;\n}\n\n.canvas-wrap canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.canvas-wrap #canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n\n.hint-bottom {\n  position: absolute;\n  left: 20px;\n  right: 20px;\n  bottom: 20px;\n  padding: 5px 10px;\n  font-size: 14px;\n  color: #fff;\n  background-color: rgba(0, 0, 0, 0.4);\n  border-radius: 6px;\n}\n\n.hint-bottom .btn-wrap {\n  display: flex;\n}\n\n.hint-bottom .btn{\n  margin: 10px 5px;\n  font-size: 14px;\n  line-height: 18px;\n}\n.wrap-option {\n  position: absolute;\n  left: 20rpx;\n  right: 0;\n  bottom: 20rpx;\n  height: 10%;\n  display: flex;\n}\n\n.wrap-option button {\n  flex: 1;\n  margin: 20rpx 20rpx 20rpx 0;\n  font-size: 30rpx;\n  line-height: 1.2;\n}\n\n.hint-bottom .btn-wrap {\n  display: flex;\n}\n\n.hint-bottom .btn{\n  flex: 1;\n  margin: 10px 5px;\n  font-size: 18px;\n  line-height: 24px;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/loaders/gltf-clone.js",
    "content": "export default function (gltf, THREE) {\n  const clone = {\n    animations: gltf.animations,\n    scene: gltf.scene.clone(true)\n  }\n\n  const skinnedMeshes = {}\n\n  gltf.scene.traverse(node => {\n    if (node.isSkinnedMesh) {\n      skinnedMeshes[node.name] = node\n    }\n  })\n\n  const cloneBones = {}\n  const cloneSkinnedMeshes = {}\n\n  clone.scene.traverse(node => {\n    if (node.isBone) {\n      cloneBones[node.name] = node\n    }\n\n    if (node.isSkinnedMesh) {\n      cloneSkinnedMeshes[node.name] = node\n    }\n  })\n\n  for (const name in skinnedMeshes) {\n    const skinnedMesh = skinnedMeshes[name]\n    const skeleton = skinnedMesh.skeleton\n    const cloneSkinnedMesh = cloneSkinnedMeshes[name]\n\n    const orderedCloneBones = []\n\n    for (let i = 0; i < skeleton.bones.length; ++i) {\n      const cloneBone = cloneBones[skeleton.bones[i].name]\n      orderedCloneBones.push(cloneBone)\n    }\n\n    cloneSkinnedMesh.bind(new THREE.Skeleton(orderedCloneBones, skeleton.boneInverses), cloneSkinnedMesh.matrixWorld)\n  }\n\n  return clone\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/loaders/gltf-loader.js",
    "content": "export function registerGLTFLoader(THREE) {\n  THREE.GLTFLoader = (function () {\n    function GLTFLoader() {\n      this.manager = THREE.DefaultLoadingManager\n      this.dracoLoader = null\n      this.ddsLoader = null\n    }\n    GLTFLoader.prototype = {\n      constructor: GLTFLoader,\n      crossOrigin: 'anonymous',\n      load(url, onLoad) {\n        const scope = this\n        let resourcePath\n        if (this.resourcePath !== undefined) {\n          resourcePath = this.resourcePath\n        } else if (this.path !== undefined) {\n          resourcePath = this.path\n        } else {\n          resourcePath = THREE.LoaderUtils.extractUrlBase(url)\n        }\n        scope.manager.itemStart(url)\n        const _onError = function (e) {\n          console.error(e)\n          scope.manager.itemError(url)\n          scope.manager.itemEnd(url)\n        }\n        const loader = new THREE.FileLoader(scope.manager)\n        loader.setPath(this.path)\n        loader.setResponseType('arraybuffer')\n        loader.load(\n          url,\n          function (data) {\n            try {\n              scope.parse(\n                data,\n                resourcePath,\n                function (gltf) {\n                  onLoad(gltf)\n                  scope.manager.itemEnd(url)\n                },\n                _onError\n              )\n            } catch (e) {\n              _onError(e)\n            }\n          },\n          null,\n          _onError\n        )\n      },\n      parse(data, path, onLoad, onError) {\n        let content\n        const extensions = {}\n        if (typeof data === 'string') {\n          content = data\n        } else {\n          const magic = THREE.LoaderUtils.decodeText(new Uint8Array(data, 0, 4))\n          if (magic === BINARY_EXTENSION_HEADER_MAGIC) {\n            try {\n              extensions[EXTENSIONS.KHR_BINARY_GLTF] = new GLTFBinaryExtension(data)\n            } catch (error) {\n              if (onError) onError(error)\n              return\n            }\n            content = extensions[EXTENSIONS.KHR_BINARY_GLTF].content\n          } else {\n            content = THREE.LoaderUtils.decodeText(new Uint8Array(data))\n          }\n        }\n        const json = JSON.parse(content)\n        if (json.asset === undefined || json.asset.version[0] < 2) {\n          if (onError) onError(new Error('THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported. Use LegacyGLTFLoader instead.'))\n          return\n        }\n        if (json.extensionsUsed) {\n          for (let i = 0; i < json.extensionsUsed.length; ++i) {\n            const extensionName = json.extensionsUsed[i]\n            const extensionsRequired = json.extensionsRequired || []\n            switch (extensionName) {\n              case EXTENSIONS.KHR_LIGHTS_PUNCTUAL:\n                extensions[extensionName] = new GLTFLightsExtension(json)\n                break\n              case EXTENSIONS.KHR_MATERIALS_UNLIT:\n                extensions[extensionName] = new GLTFMaterialsUnlitExtension()\n                break\n              case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:\n                extensions[extensionName] = new GLTFMaterialsPbrSpecularGlossinessExtension()\n                break\n              case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n                extensions[extensionName] = new GLTFDracoMeshCompressionExtension(json, this.dracoLoader)\n                break\n              case EXTENSIONS.MSFT_TEXTURE_DDS:\n                extensions[EXTENSIONS.MSFT_TEXTURE_DDS] = new GLTFTextureDDSExtension(this.ddsLoader)\n                break\n              case EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n                extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM] = new GLTFTextureTransformExtension()\n                break\n              default:\n                if (extensionsRequired.indexOf(extensionName) >= 0) {\n                  console.warn('THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".')\n                }\n            }\n          }\n        }\n        const parser = new GLTFParser(json, extensions, {\n          path: path || this.resourcePath || '',\n          crossOrigin: this.crossOrigin,\n          manager: this.manager\n        })\n        parser.parse(onLoad, onError)\n      }\n    }\n    function GLTFRegistry() {\n      let objects = {}\n      return {\n        get(key) {\n          return objects[key]\n        },\n        add(key, object) {\n          objects[key] = object\n        },\n        remove(key) {\n          delete objects[key]\n        },\n        removeAll() {\n          objects = {}\n        }\n      }\n    }\n    var EXTENSIONS = {\n      KHR_BINARY_GLTF: 'KHR_binary_glTF',\n      KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n      KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n      KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',\n      KHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n      KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n      MSFT_TEXTURE_DDS: 'MSFT_texture_dds'\n    }\n    function GLTFTextureDDSExtension(ddsLoader) {\n      if (!ddsLoader) {\n        throw new Error('THREE.GLTFLoader: Attempting to load .dds texture without importing THREE.DDSLoader')\n      }\n      this.name = EXTENSIONS.MSFT_TEXTURE_DDS\n      this.ddsLoader = ddsLoader\n    }\n    function GLTFLightsExtension(json) {\n      this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL\n      const extension = (json.extensions && json.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL]) || {}\n      this.lightDefs = extension.lights || []\n    }\n    GLTFLightsExtension.prototype.loadLight = function (lightIndex) {\n      const lightDef = this.lightDefs[lightIndex]\n      let lightNode\n      const color = new THREE.Color(0xffffff)\n      if (lightDef.color !== undefined) color.fromArray(lightDef.color)\n      const range = lightDef.range !== undefined ? lightDef.range : 0\n      switch (lightDef.type) {\n        case 'directional':\n          lightNode = new THREE.DirectionalLight(color)\n          lightNode.target.position.set(0, 0, -1)\n          lightNode.add(lightNode.target)\n          break\n        case 'point':\n          lightNode = new THREE.PointLight(color)\n          lightNode.distance = range\n          break\n        case 'spot':\n          lightNode = new THREE.SpotLight(color)\n          lightNode.distance = range\n          lightDef.spot = lightDef.spot || {}\n          lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0\n          lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0\n          lightNode.angle = lightDef.spot.outerConeAngle\n          lightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle\n          lightNode.target.position.set(0, 0, -1)\n          lightNode.add(lightNode.target)\n          break\n        default:\n          throw new Error('THREE.GLTFLoader: Unexpected light type, \"' + lightDef.type + '\".')\n      }\n      lightNode.position.set(0, 0, 0)\n      lightNode.decay = 2\n      if (lightDef.intensity !== undefined) lightNode.intensity = lightDef.intensity\n      lightNode.name = lightDef.name || ('light_' + lightIndex)\n      return Promise.resolve(lightNode)\n    }\n    function GLTFMaterialsUnlitExtension() {\n      this.name = EXTENSIONS.KHR_MATERIALS_UNLIT\n    }\n    GLTFMaterialsUnlitExtension.prototype.getMaterialType = function () {\n      return THREE.MeshBasicMaterial\n    }\n    GLTFMaterialsUnlitExtension.prototype.extendParams = function (materialParams, materialDef, parser) {\n      const pending = []\n      materialParams.color = new THREE.Color(1.0, 1.0, 1.0)\n      materialParams.opacity = 1.0\n      const metallicRoughness = materialDef.pbrMetallicRoughness\n      if (metallicRoughness) {\n        if (Array.isArray(metallicRoughness.baseColorFactor)) {\n          const array = metallicRoughness.baseColorFactor\n          materialParams.color.fromArray(array)\n          materialParams.opacity = array[3]\n        }\n        if (metallicRoughness.baseColorTexture !== undefined) {\n          pending.push(parser.assignTexture(materialParams, 'map', metallicRoughness.baseColorTexture))\n        }\n      }\n      return Promise.all(pending)\n    }\n    var BINARY_EXTENSION_HEADER_MAGIC = 'glTF'\n    const BINARY_EXTENSION_HEADER_LENGTH = 12\n    const BINARY_EXTENSION_CHUNK_TYPES = {\n      JSON: 0x4E4F534A,\n      BIN: 0x004E4942\n    }\n    function GLTFBinaryExtension(data) {\n      this.name = EXTENSIONS.KHR_BINARY_GLTF\n      this.content = null\n      this.body = null\n      const headerView = new DataView(data, 0, BINARY_EXTENSION_HEADER_LENGTH)\n      this.header = {\n        magic: THREE.LoaderUtils.decodeText(new Uint8Array(data.slice(0, 4))),\n        version: headerView.getUint32(4, true),\n        length: headerView.getUint32(8, true)\n      }\n      if (this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC) {\n        throw new Error('THREE.GLTFLoader: Unsupported glTF-Binary header.')\n      } else if (this.header.version < 2.0) {\n        throw new Error('THREE.GLTFLoader: Legacy binary file detected. Use LegacyGLTFLoader instead.')\n      }\n      const chunkView = new DataView(data, BINARY_EXTENSION_HEADER_LENGTH)\n      let chunkIndex = 0\n      while (chunkIndex < chunkView.byteLength) {\n        const chunkLength = chunkView.getUint32(chunkIndex, true)\n        chunkIndex += 4\n        const chunkType = chunkView.getUint32(chunkIndex, true)\n        chunkIndex += 4\n        if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON) {\n          const contentArray = new Uint8Array(data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength)\n          this.content = THREE.LoaderUtils.decodeText(contentArray)\n        } else if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN) {\n          const byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex\n          this.body = data.slice(byteOffset, byteOffset + chunkLength)\n        }\n        chunkIndex += chunkLength\n      }\n      if (this.content === null) {\n        throw new Error('THREE.GLTFLoader: JSON content not found.')\n      }\n    }\n    function GLTFDracoMeshCompressionExtension(json, dracoLoader) {\n      if (!dracoLoader) {\n        throw new Error('THREE.GLTFLoader: No DRACOLoader instance provided.')\n      }\n      this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION\n      this.json = json\n      this.dracoLoader = dracoLoader\n    }\n    GLTFDracoMeshCompressionExtension.prototype.decodePrimitive = function (primitive, parser) {\n      const json = this.json\n      const dracoLoader = this.dracoLoader\n      const bufferViewIndex = primitive.extensions[this.name].bufferView\n      const gltfAttributeMap = primitive.extensions[this.name].attributes\n      const threeAttributeMap = {}\n      const attributeNormalizedMap = {}\n      const attributeTypeMap = {}\n      for (var attributeName in gltfAttributeMap) {\n        var threeAttributeName = ATTRIBUTES[attributeName] || attributeName.toLowerCase()\n        threeAttributeMap[threeAttributeName] = gltfAttributeMap[attributeName]\n      }\n      for (attributeName in primitive.attributes) {\n        var threeAttributeName = ATTRIBUTES[attributeName] || attributeName.toLowerCase()\n        if (gltfAttributeMap[attributeName] !== undefined) {\n          const accessorDef = json.accessors[primitive.attributes[attributeName]]\n          const componentType = WEBGL_COMPONENT_TYPES[accessorDef.componentType]\n          attributeTypeMap[threeAttributeName] = componentType\n          attributeNormalizedMap[threeAttributeName] = accessorDef.normalized === true\n        }\n      }\n      return parser.getDependency('bufferView', bufferViewIndex).then(function (bufferView) {\n        return new Promise(function (resolve) {\n          dracoLoader.decodeDracoFile(\n            bufferView,\n            function (geometry) {\n              for (const attributeName in geometry.attributes) {\n                const attribute = geometry.attributes[attributeName]\n                const normalized = attributeNormalizedMap[attributeName]\n                if (normalized !== undefined) attribute.normalized = normalized\n              }\n              resolve(geometry)\n            },\n            threeAttributeMap,\n            attributeTypeMap\n          )\n        })\n      })\n    }\n    function GLTFTextureTransformExtension() {\n      this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM\n    }\n    GLTFTextureTransformExtension.prototype.extendTexture = function (texture, transform) {\n      texture = texture.clone()\n      if (transform.offset !== undefined) {\n        texture.offset.fromArray(transform.offset)\n      }\n      if (transform.rotation !== undefined) {\n        texture.rotation = transform.rotation\n      }\n      if (transform.scale !== undefined) {\n        texture.repeat.fromArray(transform.scale)\n      }\n      if (transform.texCoord !== undefined) {\n        console.warn('THREE.GLTFLoader: Custom UV sets in \"' + this.name + '\" extension not yet supported.')\n      }\n      texture.needsUpdate = true\n      return texture\n    }\n    function GLTFMaterialsPbrSpecularGlossinessExtension() {\n      return {\n        name: EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS,\n        specularGlossinessParams: ['color', 'map', 'lightMap', 'lightMapIntensity', 'aoMap', 'aoMapIntensity', 'emissive', 'emissiveIntensity', 'emissiveMap', 'bumpMap', 'bumpScale', 'normalMap', 'displacementMap', 'displacementScale', 'displacementBias', 'specularMap', 'specular', 'glossinessMap', 'glossiness', 'alphaMap', 'envMap', 'envMapIntensity', 'refractionRatio'],\n        getMaterialType() {\n          return THREE.ShaderMaterial\n        },\n        extendParams(materialParams, materialDef, parser) {\n          const pbrSpecularGlossiness = materialDef.extensions[this.name]\n          const shader = THREE.ShaderLib.standard\n          const uniforms = THREE.UniformsUtils.clone(shader.uniforms)\n          const specularMapParsFragmentChunk = ['#ifdef USE_SPECULARMAP', '\tuniform sampler2D specularMap;', '#endif'].join('\\n')\n          const glossinessMapParsFragmentChunk = ['#ifdef USE_GLOSSINESSMAP', '\tuniform sampler2D glossinessMap;', '#endif'].join('\\n')\n          const specularMapFragmentChunk = ['vec3 specularFactor = specular;', '#ifdef USE_SPECULARMAP', '\tvec4 texelSpecular = texture2D( specularMap, vUv );', '\ttexelSpecular = sRGBToLinear( texelSpecular );', '\t// reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', '\tspecularFactor *= texelSpecular.rgb;', '#endif'].join('\\n')\n          const glossinessMapFragmentChunk = ['float glossinessFactor = glossiness;', '#ifdef USE_GLOSSINESSMAP', '\tvec4 texelGlossiness = texture2D( glossinessMap, vUv );', '\t// reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', '\tglossinessFactor *= texelGlossiness.a;', '#endif'].join('\\n')\n          const lightPhysicalFragmentChunk = ['PhysicalMaterial material;', 'material.diffuseColor = diffuseColor.rgb;', 'material.specularRoughness = clamp( 1.0 - glossinessFactor, 0.04, 1.0 );', 'material.specularColor = specularFactor.rgb;'].join('\\n')\n          const fragmentShader = shader.fragmentShader.replace('uniform float roughness;', 'uniform vec3 specular;').replace('uniform float metalness;', 'uniform float glossiness;').replace('#include <roughnessmap_pars_fragment>', specularMapParsFragmentChunk).replace('#include <metalnessmap_pars_fragment>', glossinessMapParsFragmentChunk)\n            .replace('#include <roughnessmap_fragment>', specularMapFragmentChunk)\n            .replace('#include <metalnessmap_fragment>', glossinessMapFragmentChunk)\n            .replace('#include <lights_physical_fragment>', lightPhysicalFragmentChunk)\n          delete uniforms.roughness\n          delete uniforms.metalness\n          delete uniforms.roughnessMap\n          delete uniforms.metalnessMap\n          uniforms.specular = {\n            value: new THREE.Color().setHex(0x111111)\n          }\n          uniforms.glossiness = {\n            value: 0.5\n          }\n          uniforms.specularMap = {\n            value: null\n          }\n          uniforms.glossinessMap = {\n            value: null\n          }\n          materialParams.vertexShader = shader.vertexShader\n          materialParams.fragmentShader = fragmentShader\n          materialParams.uniforms = uniforms\n          materialParams.defines = {\n            STANDARD: ''\n          }\n          materialParams.color = new THREE.Color(1.0, 1.0, 1.0)\n          materialParams.opacity = 1.0\n          const pending = []\n          if (Array.isArray(pbrSpecularGlossiness.diffuseFactor)) {\n            const array = pbrSpecularGlossiness.diffuseFactor\n            materialParams.color.fromArray(array)\n            materialParams.opacity = array[3]\n          }\n          if (pbrSpecularGlossiness.diffuseTexture !== undefined) {\n            pending.push(parser.assignTexture(materialParams, 'map', pbrSpecularGlossiness.diffuseTexture))\n          }\n          materialParams.emissive = new THREE.Color(0.0, 0.0, 0.0)\n          materialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0\n          materialParams.specular = new THREE.Color(1.0, 1.0, 1.0)\n          if (Array.isArray(pbrSpecularGlossiness.specularFactor)) {\n            materialParams.specular.fromArray(pbrSpecularGlossiness.specularFactor)\n          }\n          if (pbrSpecularGlossiness.specularGlossinessTexture !== undefined) {\n            const specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture\n            pending.push(parser.assignTexture(materialParams, 'glossinessMap', specGlossMapDef))\n            pending.push(parser.assignTexture(materialParams, 'specularMap', specGlossMapDef))\n          }\n          return Promise.all(pending)\n        },\n        createMaterial(params) {\n          const material = new THREE.ShaderMaterial({\n            defines: params.defines,\n            vertexShader: params.vertexShader,\n            fragmentShader: params.fragmentShader,\n            uniforms: params.uniforms,\n            fog: true,\n            lights: true,\n            opacity: params.opacity,\n            transparent: params.transparent\n          })\n          material.isGLTFSpecularGlossinessMaterial = true\n          material.color = params.color\n          material.map = params.map === undefined ? null : params.map\n          material.lightMap = null\n          material.lightMapIntensity = 1.0\n          material.aoMap = params.aoMap === undefined ? null : params.aoMap\n          material.aoMapIntensity = 1.0\n          material.emissive = params.emissive\n          material.emissiveIntensity = 1.0\n          material.emissiveMap = params.emissiveMap === undefined ? null : params.emissiveMap\n          material.bumpMap = params.bumpMap === undefined ? null : params.bumpMap\n          material.bumpScale = 1\n          material.normalMap = params.normalMap === undefined ? null : params.normalMap\n          if (params.normalScale) material.normalScale = params.normalScale\n          material.displacementMap = null\n          material.displacementScale = 1\n          material.displacementBias = 0\n          material.specularMap = params.specularMap === undefined ? null : params.specularMap\n          material.specular = params.specular\n          material.glossinessMap = params.glossinessMap === undefined ? null : params.glossinessMap\n          material.glossiness = params.glossiness\n          material.alphaMap = null\n          material.envMap = params.envMap === undefined ? null : params.envMap\n          material.envMapIntensity = 1.0\n          material.refractionRatio = 0.98\n          material.extensions.derivatives = true\n          return material\n        },\n        cloneMaterial(source) {\n          const target = source.clone()\n          target.isGLTFSpecularGlossinessMaterial = true\n          const params = this.specularGlossinessParams\n          for (let i = 0,\n            il = params.length; i < il; i++) {\n            const value = source[params[i]]\n            target[params[i]] = (value && value.isColor) ? value.clone() : value\n          }\n          return target\n        },\n        refreshUniforms(renderer, scene, camera, geometry, material) {\n          if (material.isGLTFSpecularGlossinessMaterial !== true) {\n            return\n          }\n          const uniforms = material.uniforms\n          const defines = material.defines\n          uniforms.opacity.value = material.opacity\n          uniforms.diffuse.value.copy(material.color)\n          uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity)\n          uniforms.map.value = material.map\n          uniforms.specularMap.value = material.specularMap\n          uniforms.alphaMap.value = material.alphaMap\n          uniforms.lightMap.value = material.lightMap\n          uniforms.lightMapIntensity.value = material.lightMapIntensity\n          uniforms.aoMap.value = material.aoMap\n          uniforms.aoMapIntensity.value = material.aoMapIntensity\n          let uvScaleMap\n          if (material.map) {\n            uvScaleMap = material.map\n          } else if (material.specularMap) {\n            uvScaleMap = material.specularMap\n          } else if (material.displacementMap) {\n            uvScaleMap = material.displacementMap\n          } else if (material.normalMap) {\n            uvScaleMap = material.normalMap\n          } else if (material.bumpMap) {\n            uvScaleMap = material.bumpMap\n          } else if (material.glossinessMap) {\n            uvScaleMap = material.glossinessMap\n          } else if (material.alphaMap) {\n            uvScaleMap = material.alphaMap\n          } else if (material.emissiveMap) {\n            uvScaleMap = material.emissiveMap\n          }\n          if (uvScaleMap !== undefined) {\n            if (uvScaleMap.isWebGLRenderTarget) {\n              uvScaleMap = uvScaleMap.texture\n            }\n            if (uvScaleMap.matrixAutoUpdate === true) {\n              uvScaleMap.updateMatrix()\n            }\n            uniforms.uvTransform.value.copy(uvScaleMap.matrix)\n          }\n          if (material.envMap) {\n            uniforms.envMap.value = material.envMap\n            uniforms.envMapIntensity.value = material.envMapIntensity\n            uniforms.flipEnvMap.value = material.envMap.isCubeTexture ? -1 : 1\n            uniforms.reflectivity.value = material.reflectivity\n            uniforms.refractionRatio.value = material.refractionRatio\n            uniforms.maxMipLevel.value = renderer.properties.get(material.envMap).__maxMipLevel\n          }\n          uniforms.specular.value.copy(material.specular)\n          uniforms.glossiness.value = material.glossiness\n          uniforms.glossinessMap.value = material.glossinessMap\n          uniforms.emissiveMap.value = material.emissiveMap\n          uniforms.bumpMap.value = material.bumpMap\n          uniforms.normalMap.value = material.normalMap\n          uniforms.displacementMap.value = material.displacementMap\n          uniforms.displacementScale.value = material.displacementScale\n          uniforms.displacementBias.value = material.displacementBias\n          if (uniforms.glossinessMap.value !== null && defines.USE_GLOSSINESSMAP === undefined) {\n            defines.USE_GLOSSINESSMAP = ''\n            defines.USE_ROUGHNESSMAP = ''\n          }\n          if (uniforms.glossinessMap.value === null && defines.USE_GLOSSINESSMAP !== undefined) {\n            delete defines.USE_GLOSSINESSMAP\n            delete defines.USE_ROUGHNESSMAP\n          }\n        }\n      }\n    }\n    function GLTFCubicSplineInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) {\n      THREE.Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer)\n    }\n    GLTFCubicSplineInterpolant.prototype = Object.create(THREE.Interpolant.prototype)\n    GLTFCubicSplineInterpolant.prototype.constructor = GLTFCubicSplineInterpolant\n    GLTFCubicSplineInterpolant.prototype.copySampleValue_ = function (index) {\n      const result = this.resultBuffer\n      const values = this.sampleValues\n      const valueSize = this.valueSize\n      const offset = index * valueSize * 3 + valueSize\n      for (let i = 0; i !== valueSize; i++) {\n        result[i] = values[offset + i]\n      }\n      return result\n    }\n    GLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_\n    GLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_\n    GLTFCubicSplineInterpolant.prototype.interpolate_ = function (i1, t0, t, t1) {\n      const result = this.resultBuffer\n      const values = this.sampleValues\n      const stride = this.valueSize\n      const stride2 = stride * 2\n      const stride3 = stride * 3\n      const td = t1 - t0\n      const p = (t - t0) / td\n      const pp = p * p\n      const ppp = pp * p\n      const offset1 = i1 * stride3\n      const offset0 = offset1 - stride3\n      const s2 = -2 * ppp + 3 * pp\n      const s3 = ppp - pp\n      const s0 = 1 - s2\n      const s1 = s3 - pp + p\n      for (let i = 0; i !== stride; i++) {\n        const p0 = values[offset0 + i + stride]\n        const m0 = values[offset0 + i + stride2] * td\n        const p1 = values[offset1 + i + stride]\n        const m1 = values[offset1 + i] * td\n        result[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1\n      }\n      return result\n    }\n    const WEBGL_CONSTANTS = {\n      FLOAT: 5126,\n      FLOAT_MAT3: 35675,\n      FLOAT_MAT4: 35676,\n      FLOAT_VEC2: 35664,\n      FLOAT_VEC3: 35665,\n      FLOAT_VEC4: 35666,\n      LINEAR: 9729,\n      REPEAT: 10497,\n      SAMPLER_2D: 35678,\n      POINTS: 0,\n      LINES: 1,\n      LINE_LOOP: 2,\n      LINE_STRIP: 3,\n      TRIANGLES: 4,\n      TRIANGLE_STRIP: 5,\n      TRIANGLE_FAN: 6,\n      UNSIGNED_BYTE: 5121,\n      UNSIGNED_SHORT: 5123\n    }\n    var WEBGL_COMPONENT_TYPES = {\n      5120: Int8Array,\n      5121: Uint8Array,\n      5122: Int16Array,\n      5123: Uint16Array,\n      5125: Uint32Array,\n      5126: Float32Array\n    }\n    const WEBGL_FILTERS = {\n      9728: THREE.NearestFilter,\n      9729: THREE.LinearFilter,\n      9984: THREE.NearestMipmapNearestFilter,\n      9985: THREE.LinearMipmapNearestFilter,\n      9986: THREE.NearestMipmapLinearFilter,\n      9987: THREE.LinearMipmapLinearFilter\n    }\n    const WEBGL_WRAPPINGS = {\n      33071: THREE.ClampToEdgeWrapping,\n      33648: THREE.MirroredRepeatWrapping,\n      10497: THREE.RepeatWrapping\n    }\n    const WEBGL_TYPE_SIZES = {\n      SCALAR: 1,\n      VEC2: 2,\n      VEC3: 3,\n      VEC4: 4,\n      MAT2: 4,\n      MAT3: 9,\n      MAT4: 16\n    }\n    var ATTRIBUTES = {\n      POSITION: 'position',\n      NORMAL: 'normal',\n      TANGENT: 'tangent',\n      TEXCOORD_0: 'uv',\n      TEXCOORD_1: 'uv2',\n      COLOR_0: 'color',\n      WEIGHTS_0: 'skinWeight',\n      JOINTS_0: 'skinIndex',\n    }\n    const PATH_PROPERTIES = {\n      scale: 'scale',\n      translation: 'position',\n      rotation: 'quaternion',\n      weights: 'morphTargetInfluences'\n    }\n    const INTERPOLATION = {\n      CUBICSPLINE: undefined,\n      LINEAR: THREE.InterpolateLinear,\n      STEP: THREE.InterpolateDiscrete\n    }\n    const ALPHA_MODES = {\n      OPAQUE: 'OPAQUE',\n      MASK: 'MASK',\n      BLEND: 'BLEND'\n    }\n    const MIME_TYPE_FORMATS = {\n      'image/png': THREE.RGBAFormat,\n      'image/jpeg': THREE.RGBFormat\n    }\n    function resolveURL(url, path) {\n      if (typeof url !== 'string' || url === '') return ''\n      if (/^https?:\\/\\//i.test(path) && /^\\//.test(url)) {\n        path = path.replace(/(^https?:\\/\\/[^\\/]+).*/i, '$1')\n      }\n      if (/^(https?:)?\\/\\//i.test(url)) return url\n      if (/^data:.*,.*$/i.test(url)) return url\n      if (/^blob:.*$/i.test(url)) return url\n      return path + url\n    }\n    let defaultMaterial\n    function createDefaultMaterial() {\n      defaultMaterial = defaultMaterial || new THREE.MeshStandardMaterial({\n        color: 0xFFFFFF,\n        emissive: 0x000000,\n        metalness: 1,\n        roughness: 1,\n        transparent: false,\n        depthTest: true,\n        side: THREE.FrontSide\n      })\n      return defaultMaterial\n    }\n    function addUnknownExtensionsToUserData(knownExtensions, object, objectDef) {\n      for (const name in objectDef.extensions) {\n        if (knownExtensions[name] === undefined) {\n          object.userData.gltfExtensions = object.userData.gltfExtensions || {}\n          object.userData.gltfExtensions[name] = objectDef.extensions[name]\n        }\n      }\n    }\n    function assignExtrasToUserData(object, gltfDef) {\n      if (gltfDef.extras !== undefined) {\n        if (typeof gltfDef.extras === 'object') {\n          Object.assign(object.userData, gltfDef.extras)\n        } else {\n          console.warn('THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras)\n        }\n      }\n    }\n    function addMorphTargets(geometry, targets, parser) {\n      let hasMorphPosition = false\n      let hasMorphNormal = false\n      for (var i = 0,\n        il = targets.length; i < il; i++) {\n        var target = targets[i]\n        if (target.POSITION !== undefined) hasMorphPosition = true\n        if (target.NORMAL !== undefined) hasMorphNormal = true\n        if (hasMorphPosition && hasMorphNormal) break\n      }\n      if (!hasMorphPosition && !hasMorphNormal) return Promise.resolve(geometry)\n      const pendingPositionAccessors = []\n      const pendingNormalAccessors = []\n      for (var i = 0,\n        il = targets.length; i < il; i++) {\n        var target = targets[i]\n        if (hasMorphPosition) {\n          var pendingAccessor = target.POSITION !== undefined ? parser.getDependency('accessor', target.POSITION) : geometry.attributes.position\n          pendingPositionAccessors.push(pendingAccessor)\n        }\n        if (hasMorphNormal) {\n          var pendingAccessor = target.NORMAL !== undefined ? parser.getDependency('accessor', target.NORMAL) : geometry.attributes.normal\n          pendingNormalAccessors.push(pendingAccessor)\n        }\n      }\n      return Promise.all([Promise.all(pendingPositionAccessors), Promise.all(pendingNormalAccessors)]).then(function (accessors) {\n        const morphPositions = accessors[0]\n        const morphNormals = accessors[1]\n        for (var i = 0,\n          il = morphPositions.length; i < il; i++) {\n          if (geometry.attributes.position === morphPositions[i]) continue\n          morphPositions[i] = cloneBufferAttribute(morphPositions[i])\n        }\n        for (var i = 0,\n          il = morphNormals.length; i < il; i++) {\n          if (geometry.attributes.normal === morphNormals[i]) continue\n          morphNormals[i] = cloneBufferAttribute(morphNormals[i])\n        }\n        for (var i = 0,\n          il = targets.length; i < il; i++) {\n          const target = targets[i]\n          const attributeName = 'morphTarget' + i\n          if (hasMorphPosition) {\n            if (target.POSITION !== undefined) {\n              const positionAttribute = morphPositions[i]\n              positionAttribute.name = attributeName\n              const position = geometry.attributes.position\n              for (var j = 0,\n                jl = positionAttribute.count; j < jl; j++) {\n                positionAttribute.setXYZ(j, positionAttribute.getX(j) + position.getX(j), positionAttribute.getY(j) + position.getY(j), positionAttribute.getZ(j) + position.getZ(j))\n              }\n            }\n          }\n          if (hasMorphNormal) {\n            if (target.NORMAL !== undefined) {\n              const normalAttribute = morphNormals[i]\n              normalAttribute.name = attributeName\n              const normal = geometry.attributes.normal\n              for (var j = 0,\n                jl = normalAttribute.count; j < jl; j++) {\n                normalAttribute.setXYZ(j, normalAttribute.getX(j) + normal.getX(j), normalAttribute.getY(j) + normal.getY(j), normalAttribute.getZ(j) + normal.getZ(j))\n              }\n            }\n          }\n        }\n        if (hasMorphPosition) geometry.morphAttributes.position = morphPositions\n        if (hasMorphNormal) geometry.morphAttributes.normal = morphNormals\n        return geometry\n      })\n    }\n    function updateMorphTargets(mesh, meshDef) {\n      mesh.updateMorphTargets()\n      if (meshDef.weights !== undefined) {\n        for (var i = 0,\n          il = meshDef.weights.length; i < il; i++) {\n          mesh.morphTargetInfluences[i] = meshDef.weights[i]\n        }\n      }\n      if (meshDef.extras && Array.isArray(meshDef.extras.targetNames)) {\n        const targetNames = meshDef.extras.targetNames\n        if (mesh.morphTargetInfluences.length === targetNames.length) {\n          mesh.morphTargetDictionary = {}\n          for (var i = 0,\n            il = targetNames.length; i < il; i++) {\n            mesh.morphTargetDictionary[targetNames[i]] = i\n          }\n        } else {\n          console.warn('THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.')\n        }\n      }\n    }\n    function createPrimitiveKey(primitiveDef) {\n      const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]\n      let geometryKey\n      if (dracoExtension) {\n        geometryKey = 'draco:' + dracoExtension.bufferView + ':' + dracoExtension.indices + ':' + createAttributesKey(dracoExtension.attributes)\n      } else {\n        geometryKey = primitiveDef.indices + ':' + createAttributesKey(primitiveDef.attributes) + ':' + primitiveDef.mode\n      }\n      return geometryKey\n    }\n    function createAttributesKey(attributes) {\n      let attributesKey = ''\n      const keys = Object.keys(attributes).sort()\n      for (let i = 0,\n        il = keys.length; i < il; i++) {\n        attributesKey += keys[i] + ':' + attributes[keys[i]] + ';'\n      }\n      return attributesKey\n    }\n    function cloneBufferAttribute(attribute) {\n      if (attribute.isInterleavedBufferAttribute) {\n        const count = attribute.count\n        const itemSize = attribute.itemSize\n        const array = attribute.array.slice(0, count * itemSize)\n        for (let i = 0,\n          j = 0; i < count; ++i) {\n          array[j++] = attribute.getX(i)\n          if (itemSize >= 2) array[j++] = attribute.getY(i)\n          if (itemSize >= 3) array[j++] = attribute.getZ(i)\n          if (itemSize >= 4) array[j++] = attribute.getW(i)\n        }\n        return new THREE.BufferAttribute(array, itemSize, attribute.normalized)\n      }\n      return attribute.clone()\n    }\n    function GLTFParser(json, extensions, options) {\n      this.json = json || {}\n      this.extensions = extensions || {}\n      this.options = options || {}\n      this.cache = new GLTFRegistry()\n      this.primitiveCache = {}\n      this.textureLoader = new THREE.TextureLoader(this.options.manager)\n      this.textureLoader.setCrossOrigin(this.options.crossOrigin)\n      this.fileLoader = new THREE.FileLoader(this.options.manager)\n      this.fileLoader.setResponseType('arraybuffer')\n    }\n    GLTFParser.prototype.parse = function (onLoad, onError) {\n      const parser = this\n      const json = this.json\n      const extensions = this.extensions\n      this.cache.removeAll()\n      this.markDefs()\n      Promise.all([this.getDependencies('scene'), this.getDependencies('animation'), this.getDependencies('camera')]).then(function (dependencies) {\n        const result = {\n          scene: dependencies[0][json.scene || 0],\n          scenes: dependencies[0],\n          animations: dependencies[1],\n          cameras: dependencies[2],\n          asset: json.asset,\n          parser,\n          userData: {}\n        }\n        addUnknownExtensionsToUserData(extensions, result, json)\n        assignExtrasToUserData(result, json)\n        onLoad(result)\n      })\n        .catch(onError)\n    }\n    GLTFParser.prototype.markDefs = function () {\n      const nodeDefs = this.json.nodes || []\n      const skinDefs = this.json.skins || []\n      const meshDefs = this.json.meshes || []\n      const meshReferences = {}\n      const meshUses = {}\n      for (let skinIndex = 0,\n        skinLength = skinDefs.length; skinIndex < skinLength; skinIndex++) {\n        const joints = skinDefs[skinIndex].joints\n        for (let i = 0,\n          il = joints.length; i < il; i++) {\n          nodeDefs[joints[i]].isBone = true\n        }\n      }\n      for (let nodeIndex = 0,\n        nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex++) {\n        const nodeDef = nodeDefs[nodeIndex]\n        if (nodeDef.mesh !== undefined) {\n          if (meshReferences[nodeDef.mesh] === undefined) {\n            meshReferences[nodeDef.mesh] = meshUses[nodeDef.mesh] = 0\n          }\n          meshReferences[nodeDef.mesh]++\n          if (nodeDef.skin !== undefined) {\n            meshDefs[nodeDef.mesh].isSkinnedMesh = true\n          }\n        }\n      }\n      this.json.meshReferences = meshReferences\n      this.json.meshUses = meshUses\n    }\n    GLTFParser.prototype.getDependency = function (type, index) {\n      const cacheKey = type + ':' + index\n      let dependency = this.cache.get(cacheKey)\n      if (!dependency) {\n        switch (type) {\n          case 'scene':\n            dependency = this.loadScene(index)\n            break\n          case 'node':\n            dependency = this.loadNode(index)\n            break\n          case 'mesh':\n            dependency = this.loadMesh(index)\n            break\n          case 'accessor':\n            dependency = this.loadAccessor(index)\n            break\n          case 'bufferView':\n            dependency = this.loadBufferView(index)\n            break\n          case 'buffer':\n            dependency = this.loadBuffer(index)\n            break\n          case 'material':\n            dependency = this.loadMaterial(index)\n            break\n          case 'texture':\n            dependency = this.loadTexture(index)\n            break\n          case 'skin':\n            dependency = this.loadSkin(index)\n            break\n          case 'animation':\n            dependency = this.loadAnimation(index)\n            break\n          case 'camera':\n            dependency = this.loadCamera(index)\n            break\n          case 'light':\n            dependency = this.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL].loadLight(index)\n            break\n          default:\n            throw new Error('Unknown type: ' + type)\n        }\n        this.cache.add(cacheKey, dependency)\n      }\n      return dependency\n    }\n    GLTFParser.prototype.getDependencies = function (type) {\n      let dependencies = this.cache.get(type)\n      if (!dependencies) {\n        const parser = this\n        const defs = this.json[type + (type === 'mesh' ? 'es' : 's')] || []\n        dependencies = Promise.all(defs.map(function (def, index) {\n          return parser.getDependency(type, index)\n        }))\n        this.cache.add(type, dependencies)\n      }\n      return dependencies\n    }\n    GLTFParser.prototype.loadBuffer = function (bufferIndex) {\n      const bufferDef = this.json.buffers[bufferIndex]\n      const loader = this.fileLoader\n      if (bufferDef.type && bufferDef.type !== 'arraybuffer') {\n        throw new Error('THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.')\n      }\n      if (bufferDef.uri === undefined && bufferIndex === 0) {\n        return Promise.resolve(this.extensions[EXTENSIONS.KHR_BINARY_GLTF].body)\n      }\n      const options = this.options\n      return new Promise(function (resolve, reject) {\n        loader.load(\n          resolveURL(bufferDef.uri, options.path),\n          resolve,\n          undefined,\n          function () {\n            reject(new Error('THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".'))\n          }\n        )\n      })\n    }\n    GLTFParser.prototype.loadBufferView = function (bufferViewIndex) {\n      const bufferViewDef = this.json.bufferViews[bufferViewIndex]\n      return this.getDependency('buffer', bufferViewDef.buffer).then(function (buffer) {\n        const byteLength = bufferViewDef.byteLength || 0\n        const byteOffset = bufferViewDef.byteOffset || 0\n        return buffer.slice(byteOffset, byteOffset + byteLength)\n      })\n    }\n    GLTFParser.prototype.loadAccessor = function (accessorIndex) {\n      const parser = this\n      const json = this.json\n      const accessorDef = this.json.accessors[accessorIndex]\n      if (accessorDef.bufferView === undefined && accessorDef.sparse === undefined) {\n        return Promise.resolve(null)\n      }\n      const pendingBufferViews = []\n      if (accessorDef.bufferView !== undefined) {\n        pendingBufferViews.push(this.getDependency('bufferView', accessorDef.bufferView))\n      } else {\n        pendingBufferViews.push(null)\n      }\n      if (accessorDef.sparse !== undefined) {\n        pendingBufferViews.push(this.getDependency('bufferView', accessorDef.sparse.indices.bufferView))\n        pendingBufferViews.push(this.getDependency('bufferView', accessorDef.sparse.values.bufferView))\n      }\n      return Promise.all(pendingBufferViews).then(function (bufferViews) {\n        const bufferView = bufferViews[0]\n        const itemSize = WEBGL_TYPE_SIZES[accessorDef.type]\n        const TypedArray = WEBGL_COMPONENT_TYPES[accessorDef.componentType]\n        const elementBytes = TypedArray.BYTES_PER_ELEMENT\n        const itemBytes = elementBytes * itemSize\n        const byteOffset = accessorDef.byteOffset || 0\n        const byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[accessorDef.bufferView].byteStride : undefined\n        const normalized = accessorDef.normalized === true\n        let array; let\n          bufferAttribute\n        if (byteStride && byteStride !== itemBytes) {\n          const ibSlice = Math.floor(byteOffset / byteStride)\n          const ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count\n          let ib = parser.cache.get(ibCacheKey)\n          if (!ib) {\n            array = new TypedArray(bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes)\n            ib = new THREE.InterleavedBuffer(array, byteStride / elementBytes)\n            parser.cache.add(ibCacheKey, ib)\n          }\n          bufferAttribute = new THREE.InterleavedBufferAttribute(ib, itemSize, (byteOffset % byteStride) / elementBytes, normalized)\n        } else {\n          if (bufferView === null) {\n            array = new TypedArray(accessorDef.count * itemSize)\n          } else {\n            array = new TypedArray(bufferView, byteOffset, accessorDef.count * itemSize)\n          }\n          bufferAttribute = new THREE.BufferAttribute(array, itemSize, normalized)\n        }\n        if (accessorDef.sparse !== undefined) {\n          const itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR\n          const TypedArrayIndices = WEBGL_COMPONENT_TYPES[accessorDef.sparse.indices.componentType]\n          const byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0\n          const byteOffsetValues = accessorDef.sparse.values.byteOffset || 0\n          const sparseIndices = new TypedArrayIndices(bufferViews[1], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices)\n          const sparseValues = new TypedArray(bufferViews[2], byteOffsetValues, accessorDef.sparse.count * itemSize)\n          if (bufferView !== null) {\n            bufferAttribute.setArray(bufferAttribute.array.slice())\n          }\n          for (let i = 0,\n            il = sparseIndices.length; i < il; i++) {\n            const index = sparseIndices[i]\n            bufferAttribute.setX(index, sparseValues[i * itemSize])\n            if (itemSize >= 2) bufferAttribute.setY(index, sparseValues[i * itemSize + 1])\n            if (itemSize >= 3) bufferAttribute.setZ(index, sparseValues[i * itemSize + 2])\n            if (itemSize >= 4) bufferAttribute.setW(index, sparseValues[i * itemSize + 3])\n            if (itemSize >= 5) throw new Error('THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.')\n          }\n        }\n        return bufferAttribute\n      })\n    }\n    GLTFParser.prototype.loadTexture = function (textureIndex) {\n      const parser = this\n      const json = this.json\n      const options = this.options\n      const textureLoader = this.textureLoader\n      // var URL = global.URL;\n      const textureDef = json.textures[textureIndex]\n      const textureExtensions = textureDef.extensions || {}\n      let source\n      if (textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS]) {\n        source = json.images[textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS].source]\n      } else {\n        source = json.images[textureDef.source]\n      }\n      let sourceURI = source.uri\n      let isObjectURL = false\n      if (source.bufferView !== undefined) {\n        sourceURI = parser.getDependency('bufferView', source.bufferView).then(function (bufferView) {\n          isObjectURL = true\n          // 微信小程序不支持 Blob 对象，则使用 base64 编码的字符串来创建 data URI\n          const base64Str = wx.arrayBufferToBase64(bufferView)\n          sourceURI = `data:${source.mimeType};base64,${base64Str}`\n          return sourceURI\n        })\n      }\n      return Promise.resolve(sourceURI).then(function (sourceURI) {\n        let loader = THREE.Loader.Handlers.get(sourceURI)\n        if (!loader) {\n          loader = textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS] ? parser.extensions[EXTENSIONS.MSFT_TEXTURE_DDS].ddsLoader : textureLoader\n        }\n        return new Promise(function (resolve, reject) {\n          loader.load(resolveURL(sourceURI, options.path), resolve, undefined, reject)\n        })\n      }).then(function (texture) {\n        if (isObjectURL === true) {\n          // URL.revokeObjectURL(sourceURI)\n        }\n        texture.flipY = false\n        if (textureDef.name !== undefined) texture.name = textureDef.name\n        if (source.mimeType in MIME_TYPE_FORMATS) {\n          texture.format = MIME_TYPE_FORMATS[source.mimeType]\n        }\n        const samplers = json.samplers || {}\n        const sampler = samplers[textureDef.sampler] || {}\n        texture.magFilter = WEBGL_FILTERS[sampler.magFilter] || THREE.LinearFilter\n        texture.minFilter = WEBGL_FILTERS[sampler.minFilter] || THREE.LinearMipmapLinearFilter\n        texture.wrapS = WEBGL_WRAPPINGS[sampler.wrapS] || THREE.RepeatWrapping\n        texture.wrapT = WEBGL_WRAPPINGS[sampler.wrapT] || THREE.RepeatWrapping\n        return texture\n      })\n    }\n    GLTFParser.prototype.assignTexture = function (materialParams, mapName, mapDef) {\n      const parser = this\n      return this.getDependency('texture', mapDef.index).then(function (texture) {\n        if (!texture.isCompressedTexture) {\n          switch (mapName) {\n            case 'aoMap':\n            case 'emissiveMap':\n            case 'metalnessMap':\n            case 'normalMap':\n            case 'roughnessMap':\n              texture.format = THREE.RGBFormat\n              break\n          }\n        }\n        if (parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]) {\n          const transform = mapDef.extensions !== undefined ? mapDef.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM] : undefined\n          if (transform) {\n            texture = parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM].extendTexture(texture, transform)\n          }\n        }\n        materialParams[mapName] = texture\n      })\n    }\n    GLTFParser.prototype.assignFinalMaterial = function (mesh) {\n      const geometry = mesh.geometry\n      let material = mesh.material\n      const extensions = this.extensions\n      const useVertexTangents = geometry.attributes.tangent !== undefined\n      const useVertexColors = geometry.attributes.color !== undefined\n      const useFlatShading = geometry.attributes.normal === undefined\n      const useSkinning = mesh.isSkinnedMesh === true\n      const useMorphTargets = Object.keys(geometry.morphAttributes).length > 0\n      const useMorphNormals = useMorphTargets && geometry.morphAttributes.normal !== undefined\n      if (mesh.isPoints) {\n        var cacheKey = 'PointsMaterial:' + material.uuid\n        let pointsMaterial = this.cache.get(cacheKey)\n        if (!pointsMaterial) {\n          pointsMaterial = new THREE.PointsMaterial()\n          THREE.Material.prototype.copy.call(pointsMaterial, material)\n          pointsMaterial.color.copy(material.color)\n          pointsMaterial.map = material.map\n          pointsMaterial.lights = false\n          pointsMaterial.sizeAttenuation = false\n          this.cache.add(cacheKey, pointsMaterial)\n        }\n        material = pointsMaterial\n      } else if (mesh.isLine) {\n        var cacheKey = 'LineBasicMaterial:' + material.uuid\n        let lineMaterial = this.cache.get(cacheKey)\n        if (!lineMaterial) {\n          lineMaterial = new THREE.LineBasicMaterial()\n          THREE.Material.prototype.copy.call(lineMaterial, material)\n          lineMaterial.color.copy(material.color)\n          lineMaterial.lights = false\n          this.cache.add(cacheKey, lineMaterial)\n        }\n        material = lineMaterial\n      }\n      if (useVertexTangents || useVertexColors || useFlatShading || useSkinning || useMorphTargets) {\n        var cacheKey = 'ClonedMaterial:' + material.uuid + ':'\n        if (material.isGLTFSpecularGlossinessMaterial) cacheKey += 'specular-glossiness:'\n        if (useSkinning) cacheKey += 'skinning:'\n        if (useVertexTangents) cacheKey += 'vertex-tangents:'\n        if (useVertexColors) cacheKey += 'vertex-colors:'\n        if (useFlatShading) cacheKey += 'flat-shading:'\n        if (useMorphTargets) cacheKey += 'morph-targets:'\n        if (useMorphNormals) cacheKey += 'morph-normals:'\n        let cachedMaterial = this.cache.get(cacheKey)\n        if (!cachedMaterial) {\n          cachedMaterial = material.isGLTFSpecularGlossinessMaterial ? extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].cloneMaterial(material) : material.clone()\n          if (useSkinning) cachedMaterial.skinning = true\n          if (useVertexTangents) cachedMaterial.vertexTangents = true\n          if (useVertexColors) cachedMaterial.vertexColors = THREE.VertexColors\n          if (useFlatShading) cachedMaterial.flatShading = true\n          if (useMorphTargets) cachedMaterial.morphTargets = true\n          if (useMorphNormals) cachedMaterial.morphNormals = true\n          this.cache.add(cacheKey, cachedMaterial)\n        }\n        material = cachedMaterial\n      }\n      if (material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined) {\n        console.log('THREE.GLTFLoader: Duplicating UVs to support aoMap.')\n        geometry.addAttribute('uv2', new THREE.BufferAttribute(geometry.attributes.uv.array, 2))\n      }\n      if (material.isGLTFSpecularGlossinessMaterial) {\n        mesh.onBeforeRender = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].refreshUniforms\n      }\n      mesh.material = material\n    }\n    GLTFParser.prototype.loadMaterial = function (materialIndex) {\n      const parser = this\n      const json = this.json\n      const extensions = this.extensions\n      const materialDef = json.materials[materialIndex]\n      let materialType\n      const materialParams = {}\n      const materialExtensions = materialDef.extensions || {}\n      const pending = []\n      if (materialExtensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]) {\n        const sgExtension = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]\n        materialType = sgExtension.getMaterialType()\n        pending.push(sgExtension.extendParams(materialParams, materialDef, parser))\n      } else if (materialExtensions[EXTENSIONS.KHR_MATERIALS_UNLIT]) {\n        const kmuExtension = extensions[EXTENSIONS.KHR_MATERIALS_UNLIT]\n        materialType = kmuExtension.getMaterialType()\n        pending.push(kmuExtension.extendParams(materialParams, materialDef, parser))\n      } else {\n        materialType = THREE.MeshStandardMaterial\n        const metallicRoughness = materialDef.pbrMetallicRoughness || {}\n        materialParams.color = new THREE.Color(1.0, 1.0, 1.0)\n        materialParams.opacity = 1.0\n        if (Array.isArray(metallicRoughness.baseColorFactor)) {\n          const array = metallicRoughness.baseColorFactor\n          materialParams.color.fromArray(array)\n          materialParams.opacity = array[3]\n        }\n        if (metallicRoughness.baseColorTexture !== undefined) {\n          pending.push(parser.assignTexture(materialParams, 'map', metallicRoughness.baseColorTexture))\n        }\n        materialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0\n        materialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0\n        if (metallicRoughness.metallicRoughnessTexture !== undefined) {\n          pending.push(parser.assignTexture(materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture))\n          pending.push(parser.assignTexture(materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture))\n        }\n      }\n      if (materialDef.doubleSided === true) {\n        materialParams.side = THREE.DoubleSide\n      }\n      const alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE\n      if (alphaMode === ALPHA_MODES.BLEND) {\n        materialParams.transparent = true\n      } else {\n        materialParams.transparent = false\n        if (alphaMode === ALPHA_MODES.MASK) {\n          materialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5\n        }\n      }\n      if (materialDef.normalTexture !== undefined && materialType !== THREE.MeshBasicMaterial) {\n        pending.push(parser.assignTexture(materialParams, 'normalMap', materialDef.normalTexture))\n        materialParams.normalScale = new THREE.Vector2(1, 1)\n        if (materialDef.normalTexture.scale !== undefined) {\n          materialParams.normalScale.set(materialDef.normalTexture.scale, materialDef.normalTexture.scale)\n        }\n      }\n      if (materialDef.occlusionTexture !== undefined && materialType !== THREE.MeshBasicMaterial) {\n        pending.push(parser.assignTexture(materialParams, 'aoMap', materialDef.occlusionTexture))\n        if (materialDef.occlusionTexture.strength !== undefined) {\n          materialParams.aoMapIntensity = materialDef.occlusionTexture.strength\n        }\n      }\n      if (materialDef.emissiveFactor !== undefined && materialType !== THREE.MeshBasicMaterial) {\n        materialParams.emissive = new THREE.Color().fromArray(materialDef.emissiveFactor)\n      }\n      if (materialDef.emissiveTexture !== undefined && materialType !== THREE.MeshBasicMaterial) {\n        pending.push(parser.assignTexture(materialParams, 'emissiveMap', materialDef.emissiveTexture))\n      }\n      return Promise.all(pending).then(function () {\n        let material\n        if (materialType === THREE.ShaderMaterial) {\n          material = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].createMaterial(materialParams)\n        } else {\n          material = new materialType(materialParams)\n        }\n        if (materialDef.name !== undefined) material.name = materialDef.name\n        if (material.map) material.map.encoding = THREE.sRGBEncoding\n        if (material.emissiveMap) material.emissiveMap.encoding = THREE.sRGBEncoding\n        if (material.specularMap) material.specularMap.encoding = THREE.sRGBEncoding\n        assignExtrasToUserData(material, materialDef)\n        if (materialDef.extensions) addUnknownExtensionsToUserData(extensions, material, materialDef)\n        return material\n      })\n    }\n    function addPrimitiveAttributes(geometry, primitiveDef, parser) {\n      const attributes = primitiveDef.attributes\n      const pending = []\n      function assignAttributeAccessor(accessorIndex, attributeName) {\n        return parser.getDependency('accessor', accessorIndex).then(function (accessor) {\n          geometry.addAttribute(attributeName, accessor)\n        })\n      }\n      for (const gltfAttributeName in attributes) {\n        const threeAttributeName = ATTRIBUTES[gltfAttributeName] || gltfAttributeName.toLowerCase()\n        if (threeAttributeName in geometry.attributes) continue\n        pending.push(assignAttributeAccessor(attributes[gltfAttributeName], threeAttributeName))\n      }\n      if (primitiveDef.indices !== undefined && !geometry.index) {\n        const accessor = parser.getDependency('accessor', primitiveDef.indices).then(function (accessor) {\n          geometry.setIndex(accessor)\n        })\n        pending.push(accessor)\n      }\n      assignExtrasToUserData(geometry, primitiveDef)\n      return Promise.all(pending).then(function () {\n        return primitiveDef.targets !== undefined ? addMorphTargets(geometry, primitiveDef.targets, parser) : geometry\n      })\n    }\n    GLTFParser.prototype.loadGeometries = function (primitives) {\n      const parser = this\n      const extensions = this.extensions\n      const cache = this.primitiveCache\n      function createDracoPrimitive(primitive) {\n        return extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(primitive, parser).then(function (geometry) {\n          return addPrimitiveAttributes(geometry, primitive, parser)\n        })\n      }\n      const pending = []\n      for (let i = 0,\n        il = primitives.length; i < il; i++) {\n        const primitive = primitives[i]\n        const cacheKey = createPrimitiveKey(primitive)\n        const cached = cache[cacheKey]\n        if (cached) {\n          pending.push(cached.promise)\n        } else {\n          var geometryPromise\n          if (primitive.extensions && primitive.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]) {\n            geometryPromise = createDracoPrimitive(primitive)\n          } else {\n            geometryPromise = addPrimitiveAttributes(new THREE.BufferGeometry(), primitive, parser)\n          }\n          cache[cacheKey] = {\n            primitive,\n            promise: geometryPromise\n          }\n          pending.push(geometryPromise)\n        }\n      }\n      return Promise.all(pending)\n    }\n    GLTFParser.prototype.loadMesh = function (meshIndex) {\n      const parser = this\n      const json = this.json\n      const meshDef = json.meshes[meshIndex]\n      const primitives = meshDef.primitives\n      const pending = []\n      for (let i = 0,\n        il = primitives.length; i < il; i++) {\n        const material = primitives[i].material === undefined ? createDefaultMaterial() : this.getDependency('material', primitives[i].material)\n        pending.push(material)\n      }\n      return Promise.all(pending).then(function (originalMaterials) {\n        return parser.loadGeometries(primitives).then(function (geometries) {\n          const meshes = []\n          for (var i = 0,\n            il = geometries.length; i < il; i++) {\n            const geometry = geometries[i]\n            const primitive = primitives[i]\n            var mesh\n            const material = originalMaterials[i]\n            if (primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || primitive.mode === undefined) {\n              mesh = meshDef.isSkinnedMesh === true ? new THREE.SkinnedMesh(geometry, material) : new THREE.Mesh(geometry, material)\n              if (mesh.isSkinnedMesh === true && !mesh.geometry.attributes.skinWeight.normalized) {\n                mesh.normalizeSkinWeights()\n              }\n              if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP) {\n                mesh.drawMode = THREE.TriangleStripDrawMode\n              } else if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN) {\n                mesh.drawMode = THREE.TriangleFanDrawMode\n              }\n            } else if (primitive.mode === WEBGL_CONSTANTS.LINES) {\n              mesh = new THREE.LineSegments(geometry, material)\n            } else if (primitive.mode === WEBGL_CONSTANTS.LINE_STRIP) {\n              mesh = new THREE.Line(geometry, material)\n            } else if (primitive.mode === WEBGL_CONSTANTS.LINE_LOOP) {\n              mesh = new THREE.LineLoop(geometry, material)\n            } else if (primitive.mode === WEBGL_CONSTANTS.POINTS) {\n              mesh = new THREE.Points(geometry, material)\n            } else {\n              throw new Error('THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode)\n            }\n            if (Object.keys(mesh.geometry.morphAttributes).length > 0) {\n              updateMorphTargets(mesh, meshDef)\n            }\n            mesh.name = meshDef.name || ('mesh_' + meshIndex)\n            if (geometries.length > 1) mesh.name += '_' + i\n            assignExtrasToUserData(mesh, meshDef)\n            parser.assignFinalMaterial(mesh)\n            meshes.push(mesh)\n          }\n          if (meshes.length === 1) {\n            return meshes[0]\n          }\n          const group = new THREE.Group()\n          for (var i = 0,\n            il = meshes.length; i < il; i++) {\n            group.add(meshes[i])\n          }\n          return group\n        })\n      })\n    }\n    GLTFParser.prototype.loadCamera = function (cameraIndex) {\n      let camera\n      const cameraDef = this.json.cameras[cameraIndex]\n      const params = cameraDef[cameraDef.type]\n      if (!params) {\n        console.warn('THREE.GLTFLoader: Missing camera parameters.')\n        return\n      }\n      if (cameraDef.type === 'perspective') {\n        camera = new THREE.PerspectiveCamera(THREE.Math.radToDeg(params.yfov), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6)\n      } else if (cameraDef.type === 'orthographic') {\n        camera = new THREE.OrthographicCamera(params.xmag / -2, params.xmag / 2, params.ymag / 2, params.ymag / -2, params.znear, params.zfar)\n      }\n      if (cameraDef.name !== undefined) camera.name = cameraDef.name\n      assignExtrasToUserData(camera, cameraDef)\n      return Promise.resolve(camera)\n    }\n    GLTFParser.prototype.loadSkin = function (skinIndex) {\n      const skinDef = this.json.skins[skinIndex]\n      const skinEntry = {\n        joints: skinDef.joints\n      }\n      if (skinDef.inverseBindMatrices === undefined) {\n        return Promise.resolve(skinEntry)\n      }\n      return this.getDependency('accessor', skinDef.inverseBindMatrices).then(function (accessor) {\n        skinEntry.inverseBindMatrices = accessor\n        return skinEntry\n      })\n    }\n    GLTFParser.prototype.loadAnimation = function (animationIndex) {\n      const json = this.json\n      const animationDef = json.animations[animationIndex]\n      const pendingNodes = []\n      const pendingInputAccessors = []\n      const pendingOutputAccessors = []\n      const pendingSamplers = []\n      const pendingTargets = []\n      for (let i = 0,\n        il = animationDef.channels.length; i < il; i++) {\n        const channel = animationDef.channels[i]\n        const sampler = animationDef.samplers[channel.sampler]\n        const target = channel.target\n        const name = target.node !== undefined ? target.node : target.id\n        const input = animationDef.parameters !== undefined ? animationDef.parameters[sampler.input] : sampler.input\n        const output = animationDef.parameters !== undefined ? animationDef.parameters[sampler.output] : sampler.output\n        pendingNodes.push(this.getDependency('node', name))\n        pendingInputAccessors.push(this.getDependency('accessor', input))\n        pendingOutputAccessors.push(this.getDependency('accessor', output))\n        pendingSamplers.push(sampler)\n        pendingTargets.push(target)\n      }\n      return Promise.all([Promise.all(pendingNodes), Promise.all(pendingInputAccessors), Promise.all(pendingOutputAccessors), Promise.all(pendingSamplers), Promise.all(pendingTargets)]).then(function (dependencies) {\n        const nodes = dependencies[0]\n        const inputAccessors = dependencies[1]\n        const outputAccessors = dependencies[2]\n        const samplers = dependencies[3]\n        const targets = dependencies[4]\n        const tracks = []\n        for (let i = 0,\n          il = nodes.length; i < il; i++) {\n          const node = nodes[i]\n          const inputAccessor = inputAccessors[i]\n          const outputAccessor = outputAccessors[i]\n          const sampler = samplers[i]\n          const target = targets[i]\n          if (node === undefined) continue\n          node.updateMatrix()\n          node.matrixAutoUpdate = true\n          var TypedKeyframeTrack\n          switch (PATH_PROPERTIES[target.path]) {\n            case PATH_PROPERTIES.weights:\n              TypedKeyframeTrack = THREE.NumberKeyframeTrack\n              break\n            case PATH_PROPERTIES.rotation:\n              TypedKeyframeTrack = THREE.QuaternionKeyframeTrack\n              break\n            case PATH_PROPERTIES.position:\n            case PATH_PROPERTIES.scale:\n            default:\n              TypedKeyframeTrack = THREE.VectorKeyframeTrack\n              break\n          }\n          const targetName = node.name ? node.name : node.uuid\n          const interpolation = sampler.interpolation !== undefined ? INTERPOLATION[sampler.interpolation] : THREE.InterpolateLinear\n          var targetNames = []\n          if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) {\n            node.traverse(function (object) {\n              if (object.isMesh === true && object.morphTargetInfluences) {\n                targetNames.push(object.name ? object.name : object.uuid)\n              }\n            })\n          } else {\n            targetNames.push(targetName)\n          }\n          let outputArray = outputAccessor.array\n          if (outputAccessor.normalized) {\n            var scale\n            if (outputArray.constructor === Int8Array) {\n              scale = 1 / 127\n            } else if (outputArray.constructor === Uint8Array) {\n              scale = 1 / 255\n            } else if (outputArray.constructor == Int16Array) {\n              scale = 1 / 32767\n            } else if (outputArray.constructor === Uint16Array) {\n              scale = 1 / 65535\n            } else {\n              throw new Error('THREE.GLTFLoader: Unsupported output accessor component type.')\n            }\n            const scaled = new Float32Array(outputArray.length)\n            for (var j = 0,\n              jl = outputArray.length; j < jl; j++) {\n              scaled[j] = outputArray[j] * scale\n            }\n            outputArray = scaled\n          }\n          for (var j = 0,\n            jl = targetNames.length; j < jl; j++) {\n            const track = new TypedKeyframeTrack(targetNames[j] + '.' + PATH_PROPERTIES[target.path], inputAccessor.array, outputArray, interpolation)\n            if (sampler.interpolation === 'CUBICSPLINE') {\n              track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline(result) {\n                return new GLTFCubicSplineInterpolant(this.times, this.values, this.getValueSize() / 3, result)\n              }\n              track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true\n            }\n            tracks.push(track)\n          }\n        }\n        const name = animationDef.name !== undefined ? animationDef.name : 'animation_' + animationIndex\n        return new THREE.AnimationClip(name, undefined, tracks)\n      })\n    }\n    GLTFParser.prototype.loadNode = function (nodeIndex) {\n      const json = this.json\n      const extensions = this.extensions\n      const parser = this\n      const meshReferences = json.meshReferences\n      const meshUses = json.meshUses\n      const nodeDef = json.nodes[nodeIndex]\n      return (function () {\n        const pending = []\n        if (nodeDef.mesh !== undefined) {\n          pending.push(parser.getDependency('mesh', nodeDef.mesh).then(function (mesh) {\n            let node\n            if (meshReferences[nodeDef.mesh] > 1) {\n              const instanceNum = meshUses[nodeDef.mesh]++\n              node = mesh.clone()\n              node.name += '_instance_' + instanceNum\n              node.onBeforeRender = mesh.onBeforeRender\n              for (let i = 0,\n                il = node.children.length; i < il; i++) {\n                node.children[i].name += '_instance_' + instanceNum\n                node.children[i].onBeforeRender = mesh.children[i].onBeforeRender\n              }\n            } else {\n              node = mesh\n            }\n            if (nodeDef.weights !== undefined) {\n              node.traverse(function (o) {\n                if (!o.isMesh) return\n                for (let i = 0,\n                  il = nodeDef.weights.length; i < il; i++) {\n                  o.morphTargetInfluences[i] = nodeDef.weights[i]\n                }\n              })\n            }\n            return node\n          }))\n        }\n        if (nodeDef.camera !== undefined) {\n          pending.push(parser.getDependency('camera', nodeDef.camera))\n        }\n        if (nodeDef.extensions && nodeDef.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL] && nodeDef.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL].light !== undefined) {\n          pending.push(parser.getDependency('light', nodeDef.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL].light))\n        }\n        return Promise.all(pending)\n      }()).then(function (objects) {\n        let node\n        if (nodeDef.isBone === true) {\n          node = new THREE.Bone()\n        } else if (objects.length > 1) {\n          node = new THREE.Group()\n        } else if (objects.length === 1) {\n          node = objects[0]\n        } else {\n          node = new THREE.Object3D()\n        }\n        if (node !== objects[0]) {\n          for (let i = 0,\n            il = objects.length; i < il; i++) {\n            node.add(objects[i])\n          }\n        }\n        if (nodeDef.name !== undefined) {\n          node.userData.name = nodeDef.name\n          node.name = THREE.PropertyBinding.sanitizeNodeName(nodeDef.name)\n        }\n        assignExtrasToUserData(node, nodeDef)\n        if (nodeDef.extensions) addUnknownExtensionsToUserData(extensions, node, nodeDef)\n        if (nodeDef.matrix !== undefined) {\n          const matrix = new THREE.Matrix4()\n          matrix.fromArray(nodeDef.matrix)\n          node.applyMatrix(matrix)\n        } else {\n          if (nodeDef.translation !== undefined) {\n            node.position.fromArray(nodeDef.translation)\n          }\n          if (nodeDef.rotation !== undefined) {\n            node.quaternion.fromArray(nodeDef.rotation)\n          }\n          if (nodeDef.scale !== undefined) {\n            node.scale.fromArray(nodeDef.scale)\n          }\n        }\n        return node\n      })\n    }\n    GLTFParser.prototype.loadScene = (function () {\n      function buildNodeHierachy(nodeId, parentObject, json, parser) {\n        const nodeDef = json.nodes[nodeId]\n        return parser.getDependency('node', nodeId).then(function (node) {\n          if (nodeDef.skin === undefined) return node\n          let skinEntry\n          return parser.getDependency('skin', nodeDef.skin).then(function (skin) {\n            skinEntry = skin\n            const pendingJoints = []\n            for (let i = 0,\n              il = skinEntry.joints.length; i < il; i++) {\n              pendingJoints.push(parser.getDependency('node', skinEntry.joints[i]))\n            }\n            return Promise.all(pendingJoints)\n          }).then(function (jointNodes) {\n            node.traverse(function (mesh) {\n              if (!mesh.isMesh) return\n              const bones = []\n              const boneInverses = []\n              for (let j = 0,\n                jl = jointNodes.length; j < jl; j++) {\n                const jointNode = jointNodes[j]\n                if (jointNode) {\n                  bones.push(jointNode)\n                  const mat = new THREE.Matrix4()\n                  if (skinEntry.inverseBindMatrices !== undefined) {\n                    mat.fromArray(skinEntry.inverseBindMatrices.array, j * 16)\n                  }\n                  boneInverses.push(mat)\n                } else {\n                  console.warn('THREE.GLTFLoader: Joint \"%s\" could not be found.', skinEntry.joints[j])\n                }\n              }\n              mesh.bind(new THREE.Skeleton(bones, boneInverses), mesh.matrixWorld)\n            })\n            return node\n          })\n        }).then(function (node) {\n          parentObject.add(node)\n          const pending = []\n          if (nodeDef.children) {\n            const children = nodeDef.children\n            for (let i = 0,\n              il = children.length; i < il; i++) {\n              const child = children[i]\n              pending.push(buildNodeHierachy(child, node, json, parser))\n            }\n          }\n          return Promise.all(pending)\n        })\n      }\n      return function loadScene(sceneIndex) {\n        const json = this.json\n        const extensions = this.extensions\n        const sceneDef = this.json.scenes[sceneIndex]\n        const parser = this\n        const scene = new THREE.Scene()\n        if (sceneDef.name !== undefined) scene.name = sceneDef.name\n        assignExtrasToUserData(scene, sceneDef)\n        if (sceneDef.extensions) addUnknownExtensionsToUserData(extensions, scene, sceneDef)\n        const nodeIds = sceneDef.nodes || []\n        const pending = []\n        for (let i = 0,\n          il = nodeIds.length; i < il; i++) {\n          pending.push(buildNodeHierachy(nodeIds[i], scene, json, parser))\n        }\n        return Promise.all(pending).then(function () {\n          return scene\n        })\n      }\n    }())\n    return GLTFLoader\n  }())\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/ocr-detect/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio / 2\n              this.canvas.height = height * pixelRatio / 2\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.textContentList) this.textContentList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            OCR: {\n              mode: 1\n            }\n          },\n          version: 'v1',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio / 2\n            this.canvas.height = height * pixelRatio / 2\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          session.on('addAnchors', anchors => {\n            console.log('anchor add')\n          })\n          session.on('updateAnchors', anchors => {\n            this.data.textContentList = []\n\n            // 摄像头实时检测人脸的时候 updateAnchors 会在每帧触发，所以性能要求更高，用 gl 画\n            this.data.textContentList = this.data.textContentList.concat(anchors.map(anchor => ({\n              text: anchor.text,\n              subtext: anchor.subtext,\n              box: anchor.box\n            })))\n\n            let wholeText\n            if (this.data.textContentList.length != 0) {\n              wholeText = this.data.textContentList[0].text\n            }\n\n            this.setData({\n              textContentList: this.data.textContentList,\n              wholeText\n            })\n          })\n          session.on('removeAnchors', anchors => {\n            console.log('anchor remove')\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/ocr-detect/ocr-detect.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\n// 初始化着色器函数\nlet initShadersDone = false\n\nfunction initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE) {\n  // 创建顶点着色器对象\n  const vertexShader = loadShader(gl, gl.VERTEX_SHADER, VSHADER_SOURCE)\n  // 创建片元着色器对象\n  const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, FSHADER_SOURCE)\n\n  if (!vertexShader || !fragmentShader) {\n    return null\n  }\n\n  // 创建程序对象program\n  const program = gl.createProgram()\n  if (!gl.createProgram()) {\n    return null\n  }\n  // 分配顶点着色器和片元着色器到program\n  gl.attachShader(program, vertexShader)\n  gl.attachShader(program, fragmentShader)\n  // 链接program\n  gl.linkProgram(program)\n\n  // 检查程序对象是否连接成功\n  const linked = gl.getProgramParameter(program, gl.LINK_STATUS)\n  if (!linked) {\n    const error = gl.getProgramInfoLog(program)\n    console.log('程序对象连接失败: ' + error)\n    gl.deleteProgram(program)\n    gl.deleteShader(fragmentShader)\n    gl.deleteShader(vertexShader)\n    return null\n  }\n  // 返回程序program对象\n  initShadersDone = true\n  return program\n}\n\nfunction loadShader(gl, type, source) {\n  // 创建顶点着色器对象\n  const shader = gl.createShader(type)\n  if (shader == null) {\n    console.log('创建着色器失败')\n    return null\n  }\n\n  // 引入着色器源代码\n  gl.shaderSource(shader, source)\n\n  // 编译着色器\n  gl.compileShader(shader)\n\n  // 检查顶是否编译成功\n  const compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS)\n  if (!compiled) {\n    const error = gl.getShaderInfoLog(shader)\n    console.log('编译着色器失败: ' + error)\n    gl.deleteShader(shader)\n    return null\n  }\n\n  return shader\n}\n\nconst EDGE_VSHADER_SOURCE =\n  `\n  attribute vec4 aPosition; \n  void main(void) {\n    gl_Position =  aPosition;\n  }\n`\n\nconst EDGE_FSHADER_SOURCE =\n  `\n  precision highp float;\n  void main() {\n      gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n  }\n`\n\nfunction initEdgeBuffer(gl, lt, lr, rb, lb) {\n  const shaderProgram = gl.program\n  const vertices = [\n    lt.x, lt.y, 0.0,\n    lr.x, lr.y, 0.0,\n    rb.x, rb.y, 0.0,\n    lb.x, lb.y, 0.0,\n  ]\n\n  const vertexBuffer = gl.createBuffer()\n  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)\n  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW)\n  const aPosition = gl.getAttribLocation(shaderProgram, 'aPosition')\n  gl.enableVertexAttribArray(aPosition)\n  gl.vertexAttribPointer(aPosition, 3, gl.FLOAT, false, 0, 0)\n  const length = vertices.length / 3\n  return length\n}\n\nfunction onDrawEdge(gl, lt, lr, rb, lb) {\n  const n = initEdgeBuffer(gl, lt, lr, rb, lb)\n  gl.drawArrays(gl.LINE_LOOP, 0, n)\n}\n\nfunction convert(obj) {\n  obj.x = obj.x * 2 - 1\n  obj.y = (1 - obj.y) * 2 - 1\n  return obj\n}\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n     * 生命周期函数--监听页面加载\n     */\n    detached() {\n      initShadersDone = false\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({\n          theme\n        }) => {\n          this.setData({\n            theme\n          })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n\n      // //逐帧渲染 debug\n      // const onFrame1 = timestamp => {\n      //     this.renderer.autoClearColor = false\n      //     this.renderer.render(this.scene, this.camera)\n      //     this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n      //   this.canvas.requestAnimationFrame(onFrame1)\n      // }\n      // this.canvas.requestAnimationFrame(onFrame1)\n    },\n\n    render(frame) {\n      const gl = this.gl\n\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n\n      const textContentList = this.data.textContentList\n\n      if (!textContentList || textContentList.length <= 0) {\n        return\n      } else {\n        if (!initShadersDone) {\n          this.edgeProgram = initShaders(gl, EDGE_VSHADER_SOURCE, EDGE_FSHADER_SOURCE)\n          if (!this.edgeProgram) {\n            console.log('初始化着色器失败')\n            return\n          }\n          console.log('初始化着色器成功')\n        }\n\n        if (textContentList[0].box == undefined) {\n          return\n        }\n\n        gl.useProgram(this.edgeProgram)\n        gl.program = this.edgeProgram\n\n        let lt; let lr; let rb; let lb\n        for (let i = 0; i < textContentList.length; i++) {\n          lt = textContentList[i].box[0]\n          lr = textContentList[i].box[1]\n          rb = textContentList[i].box[2]\n          lb = textContentList[i].box[3]\n          const avgX = (lt.x + lr.x + rb.x + lb.x) / 4\n          const avgY = (lt.y + lr.y + rb.y + lb.y) / 4\n          textContentList[i].centerX = avgX * this.data.width\n          textContentList[i].centerY = avgY * this.data.height\n\n          lt = convert(lt)\n          lr = convert(lr)\n          rb = convert(rb)\n          lb = convert(lb)\n          onDrawEdge(gl, lt, lr, rb, lb)\n        }\n      }\n\n      this.setData({\n        textContentList\n      })\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/ocr-detect/ocr-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"实时OCR检测\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/ocr-detect/ocr-detect.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <view><canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n    </canvas></view>\n  <view wx:if=\"{{textContentList}}\">\n    <view wx:for=\"{{textContentList}}\">\n      <text wx:if=\"{{item.subtext != undefined && item.centerX != undefined}}\" style=\"position:absolute; top:{{item.centerY}}px; left:{{item.centerX}}px\">{{item.subtext}}</text>\n    </view>\n  </view>\n  <view class=\"page-body-text tc\" style=\"position:relative; height:20%\">\n    <text>提示：将摄像头对准图片的文字, 下方显示检测到的文字</text>\n    <text style=\"position:absolute; top:30%; left:0%\">{{wholeText}}</text>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/ocr-detect/ocr-detect.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/ocr-detect/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/osd-ar/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.6)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n        const THREE = this.THREE\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            plane: {\n              mode: 1\n            },\n            OSD: true,\n          },\n          version: 'v1',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.6, info.pixelRatio)\n          })\n\n          if (this.afterVKSessionCreated) {\n            this.afterVKSessionCreated()\n          }\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/osd-ar/osd-ar.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    theme: 'light',\n    frameShow: false,\n    frameX: 0,\n    frameY: 0,\n    frameWidth: 0,\n    frameHeight: 0,\n  },\n  lifetimes: {\n    /**\n      * 生命周期函数--监听页面加载\n      */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n    },\n    afterVKSessionCreated() {\n      this.session.on('addAnchors', anchors => {\n        const anchor = anchors[0]\n        const {\n          width,\n          height\n        } = this.data\n        if (anchor && this.markerId) {\n          this.setData({\n            frameShow: true,\n            frameX: anchor.origin.x * width,\n            frameY: anchor.origin.y * height,\n            frameWidth: anchor.size.width * width,\n            frameHeight: anchor.size.height * height,\n          })\n        }\n      })\n      this.session.on('updateAnchors', anchors => {\n        const anchor = anchors[0]\n        const {\n          width,\n          height\n        } = this.data\n        if (anchor) {\n          this.setData({\n            frameX: anchor.origin.x * width,\n            frameY: anchor.origin.y * height,\n            frameWidth: anchor.size.width * width,\n            frameHeight: anchor.size.height * height,\n          })\n        }\n      })\n      this.session.on('removeAnchors', anchors => {\n        this.setData({\n          frameShow: false,\n        })\n      })\n    },\n    chooseMedia() {\n      wx.chooseMedia({\n        count: 1,\n        mediaType: ['image'],\n        success: res => {\n          console.log('chooseMedia res', res)\n          const imgUrl = res.tempFiles[0].tempFilePath\n          wx.getImageInfo({\n            src: imgUrl,\n            success: res => {\n              const {\n                width,\n                height\n              } = res\n              console.log('getImageInfo res', res)\n              this.setData({\n                imgUrl,\n              })\n            },\n            fail: res => {\n              console.error(res)\n            }\n          })\n        },\n        fail: res => {\n          console.error(res)\n        }\n      })\n    },\n    render(frame) {\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n    },\n    addOSDMarker() {\n      if (this.markerId) return\n      const fs = wx.getFileSystemManager()\n      const filePath = `${wx.env.USER_DATA_PATH}/osd-ar.jpg`\n\n      // const download = callback => wx.downloadFile({\n      //     // 此处设置为osd识别对象的地址\n      //     url: 'https://res.wx.qq.com/op_res/h7DtLCbw1wzG7mzwlyfmmTDYUjq6pwCAHN5Ep0xA9PDvSa_knfz1Vg5E6vSKxxWG2mnHVzl2qBC789tQwNl_pw',\n      //     success(res) {\n      //         fs.saveFile({\n      //             filePath,\n      //             tempFilePath: res.tempFilePath,\n      //             success: callback,\n      //         })\n      //     }\n      // })\n\n      const download = callback => {\n        fs.saveFile({\n          filePath,\n          tempFilePath: this.data.imgUrl,\n          success: callback,\n          fail: res => {\n            console.error(res)\n          }\n        })\n      }\n      const add = () => {\n        console.log('[addMarker] --> ', filePath)\n        this.markerId = this.session.addOSDMarker(filePath)\n        this.setData({\n          filePathNow: filePath\n        })\n      }\n\n      const getFilePathNow = () => this.data.filePathNow\n      fs.stat({\n        path: filePath,\n        success(res) {\n          const path = getFilePathNow()\n          if (path != filePath) {\n            if (res.stats.isFile() && path) {\n              fs.unlinkSync(path)\n            }\n            download(add)\n          } else {\n            add()\n          }\n        },\n        fail: (res) => {\n          console.error(res)\n          download(add)\n        }\n      })\n    },\n    removeOSDMarker() {\n      if (this.markerId) {\n        this.session.removeOSDMarker(this.markerId)\n        this.markerId = null\n      }\n    },\n    getAllOSDMarker() {\n      console.log(this.session.getAllOSDMarker())\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/osd-ar/osd-ar.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"单样本检测(OSD)\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/osd-ar/osd-ar.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\">\n    <cover-image wx:if=\"{{frameShow}}\" src=\"https://res.wx.qq.com/op_res/vuq1REjK0nVNaho6w8kmHV5aDzSkn0M-iUVNpYLxWipTY59073MWwoFTVOv_6zP0Ya3FejuoJ3dNiT-N24kzgw\" style=\"position: absolute; top: {{frameY}}px; left: {{frameX}}px; width: {{frameWidth}}px; height: {{frameHeight}}px;\"></cover-image>\n  </canvas>\n  <view class=\"btn-cnt\">\n    <button type=\"primary\" disabled=\"{{!imgUrl}}\" bindtap=\"addOSDMarker\">添加 OSD marker</button>\n    <button type=\"primary\" disabled=\"{{!imgUrl}}\" bindtap=\"removeOSDMarker\">删除 OSD marker</button>\n    <button type=\"primary\" disabled=\"{{!imgUrl}}\" bindtap=\"getAllOSDMarker\">获取所有 OSD marker</button>\n  </view>\n  <view class=\"photo-cnt\">\n    <view class=\"page-body-text tc\">提示：选择图片作为OSD对象, 点击添加OSD marker, 然后手机摄像头对准下方所选图片</view>\n    <view>\n      <image wx:if=\"{{imgUrl}}\" src=\"{{imgUrl}}\" style=\"width: 50vw; height: 20vh; margin-left:25%\" mode=\"aspectFit\" />\n      <image wx:else=\"{{imgUrl}}\" src=\"./choose.png\" style=\"width: 50vw; height: 20vh; margin-left:25%\" mode=\"aspectFit\" />\n    </view>\n  </view>\n  <view class=\"btn-cnt\">\n    <button type=\"primary\" class=\"btn-choose\" bindtap=\"chooseMedia\">选择图片</button>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/osd-ar/osd-ar.wxss",
    "content": ".btn-cnt {\n  display: flex;\n}\n\n.photo-cnt {\n  position: absolute;\n  margin-top: 60vh;\n}\n\n.btn-choose {\n  flex: 0 50%;\n  display: flex;\n  height: 5vh;\n  margin-bottom: 5vh;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/osd-ar/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-body-detect/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            plane: {\n              mode: 1\n            },\n            body: {\n              mode: 2\n            }\n          },\n          version: 'v1',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          session.on('addAnchors', anchors => {\n            this.setData({\n              anchor2DList: anchors.map(anchor => ({\n                points: anchor.points,\n                origin: anchor.origin,\n                size: anchor.size\n              })),\n            })\n          })\n          session.on('updateAnchors', anchors => {\n            this.data.anchor2DList = []\n            // 手动传入图像的时候用dom画点和框就行\n            this.setData({\n              anchor2DList: anchors.map(anchor => ({\n                points: anchor.points,\n                origin: anchor.origin,\n                size: anchor.size\n              })),\n            })\n          })\n          session.on('removeAnchors', anchors => {\n            this.setData({\n              anchor2DList: [],\n            })\n            this.data.anchor2DList = []\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-body-detect/photo-body-detect.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    bodyImgUrl: '',\n    bodyImgWidth: 0,\n    bodyImgHeight: 0,\n    bodyImgOriginWidth: 0,\n    bodyImgOriginHeight: 0,\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    chooseMedia() {\n      wx.chooseMedia({\n        count: 1,\n        mediaType: ['image'],\n        success: res => {\n          console.log('chooseMedia res', res)\n          const imgUrl = res.tempFiles[0].tempFilePath\n          wx.getImageInfo({\n            src: imgUrl,\n            success: res => {\n              const fixWidth = 300\n              const {\n                width,\n                height\n              } = res\n              console.log('getImageInfo res', res)\n              this.setData({\n                bodyImgUrl: imgUrl,\n                bodyImgWidth: fixWidth,\n                bodyImgHeight: (fixWidth / width) * height,\n                bodyImgOriginWidth: width,\n                bodyImgOriginHeight: height\n              })\n            },\n            fail: res => {\n              console.error(res)\n            }\n          })\n        },\n        fail: res => {\n          console.error(res)\n        }\n      })\n    },\n    init() {\n      this.initGL()\n    },\n    render(frame) {\n      return\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullbody(this.THREE.CullbodyNone)\n    },\n    async detectbody() {\n      if (this.data.bodyImgUrl) {\n        const canvas = wx.createOffscreenCanvas({\n          type: '2d',\n          width: this.data.bodyImgOriginWidth,\n          height: this.data.bodyImgOriginHeight,\n        })\n        const context = canvas.getContext('2d')\n        const img = canvas.createImage()\n        await new Promise(resolve => {\n          img.onload = resolve\n          img.src = this.data.bodyImgUrl\n        })\n\n        context.clearRect(0, 0, this.data.bodyImgOriginWidth, this.data.bodyImgOriginHeight)\n        context.drawImage(img, 0, 0, this.data.bodyImgOriginWidth, this.data.bodyImgOriginHeight)\n\n        this.imgData = context.getImageData(0, 0, this.data.bodyImgOriginWidth, this.data.bodyImgOriginHeight)\n\n        console.log('[frameBuffer] --> ', this.imgData.data.buffer)\n        console.log('this.session.detectbody', this.session.detectbody)\n        console.log('width', this.data.bodyImgOriginWidth)\n        console.log('height', this.data.bodyImgOriginHeight)\n        this.session.detectBody({\n          frameBuffer: this.imgData.data.buffer,\n          width: this.data.bodyImgOriginWidth,\n          height: this.data.bodyImgOriginHeight,\n          scoreThreshold: 0.5, // 评分阈值\n          sourceType: 1\n        })\n      }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-body-detect/photo-body-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"照片人体检测\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-body-detect/photo-body-detect.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n<view style=\"display: flex; justify-content: center;margin: 12px;\">\n    <view>原图：</view>\n    <image src=\"{{bodyImgUrl}}\" style=\"width: 100px; height: 100px;\" mode=\"aspectFit\" />\n</view>\n<canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\">\n</canvas>\n<view class=\"btn-cnt\">\n    <button type=\"primary\" bindtap=\"chooseMedia\">选择图片</button>\n    <button type=\"primary\" disabled=\"{{!bodyImgUrl}}\" style=\"margin-top: 20px;\" bindtap=\"detectbody\">开始检测</button>\n</view>\n\n\n<view wx:if=\"{{anchor2DList}}\">\n    <view wx:for=\"{{anchor2DList}}\" style=\"margin: 30px auto; position: relative; width: {{bodyImgWidth}}px; height: {{bodyImgHeight}}px;\">\n        <image src=\"{{bodyImgUrl}}\" style=\"width: {{bodyImgWidth}}px; height: {{bodyImgHeight}}px;\" />\n        <view style=\"position: absolute; left: {{item.origin.x * bodyImgWidth}}px; top: {{item.origin.y * bodyImgHeight}}px; width: {{item.size.width * bodyImgWidth}}px; height: {{item.size.height * bodyImgHeight}}px; border: solid red 2px\"></view>\n        <view wx:for=\"{{item.points}}\" wx:key=\"id\" style=\"position: absolute; left: {{item.x * bodyImgWidth}}px; top: {{item.y * bodyImgHeight}}px; width: 4px; height: 4px; background-color: #00ff00; border-radius: 50%;\"></view>\n    </view>\n</view>\n<view class=\"page-body-text tc\" style=\"height:20%\">提示：点击选择图片，上传本地人体照片，然后开始检测，对应人体将会显示识别框和人体标记点</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-body-detect/photo-body-detect.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-body-detect/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-depth-detect/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            depth: {\n              mode: 2\n            }\n          },\n          cameraPosition: 0,\n          version: 'v1',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          session.on('addAnchors', anchors => {\n          })\n          session.on('updateAnchors', anchors => {\n            const depthArray = []\n            // 手动传入图像的时候用dom画点和框就行\n            const anchor2DList = anchors.map(anchor => ({\n              value: anchor.depthArray,\n              size: anchor.size\n            }))\n            wx.hideLoading()\n            if (anchor2DList.length > 0) {\n              let width = 80\n              let height = 80\n              anchor2DList.forEach(anchor => {\n                width = anchor.size[0]\n                height = anchor.size[1]\n                anchor.value.forEach(item => {\n                  depthArray.push(item.value)\n                })\n                this.renderDepthGL(depthArray, width, height)\n              })\n            }\n          })\n          session.on('removeAnchors', anchors => {\n          })\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-depth-detect/depthBehavior.js",
    "content": "const depthBehavior = Behavior({\n  methods: {\n    initDepthShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_texture_float')\n      if (!ext) console.warn('OES_texture_float not support')\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        precision highp float;\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        varying vec2 v_texCoord;\n        void main() {\n          gl_Position = vec4(a_position, 0, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n        uniform sampler2D depth_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 depth_color = texture2D(depth_texture, v_texCoord);\n          gl_FragColor = vec4(depth_color.rgb , 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._depthProgram = gl.createProgram()\n      this._depthProgram.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformTexture = gl.getUniformLocation(program, 'depth_texture')\n      gl.uniform1i(uniformTexture, 5)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initDepthVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._depthProgram, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._depthProgram, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 0, 0, 0, 1, 1, 0, 1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._depthVao = vao\n    },\n    initDepthGL() {\n      this.initDepthShader()\n      this.initDepthVAO()\n    },\n    renderDepthGL(depthBuffer, width, height) {\n      const gl = this.renderer.getContext()\n\n      gl.disable(gl.DEPTH_TEST) // 缺少这句安卓端可能绘制不出图像\n\n      const depthTexture = gl.createTexture()\n      gl.bindTexture(gl.TEXTURE_2D, depthTexture)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n\n      const ext = gl.getExtension('OES_texture_float')\n      if (ext) {\n        const data = new Float32Array(width * height * 4)\n        for (let i = 0; i < depthBuffer.length; i++) {\n          data[i * 4] = depthBuffer[i]\n          data[i * 4 + 1] = depthBuffer[i]\n          data[i * 4 + 2] = depthBuffer[i]\n          data[i * 4 + 3] = depthBuffer[i]\n        }\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.FLOAT, data)\n      } else {\n        const data = new Uint8Array(width * height * 4)\n        for (let i = 0; i < depthBuffer.length; i++) {\n          const num = parseInt(depthBuffer[i] * 255)\n          data[i * 4] = num\n          data[i * 4 + 1] = num\n          data[i * 4 + 2] = num\n          data[i * 4 + 3] = num\n        }\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data)\n      }\n\n      depthTexture._gl = gl\n      gl.bindTexture(gl.TEXTURE_2D, null)\n\n      if (depthTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._depthProgram)\n        this.ext.bindVertexArrayOES(this._depthVao)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, depthTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default depthBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-depth-detect/photo-depth-detect.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\nimport depthBehavior from './depthBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior, depthBehavior],\n  data: {\n    depthImgUrl: '',\n    depthImgWidth: 0,\n    depthImgHeight: 0,\n    depthImgOriginWidth: 0,\n    depthImgOriginHeight: 0,\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    chooseMedia() {\n      wx.chooseMedia({\n        count: 1,\n        mediaType: ['image'],\n        success: res => {\n          console.log('chooseMedia res', res)\n          const imgUrl = res.tempFiles[0].tempFilePath\n          wx.getImageInfo({\n            src: imgUrl,\n            success: res => {\n              const fixWidth = 300\n              const {\n                width,\n                height\n              } = res\n              console.log('getImageInfo res', res)\n\n              let depthImgWidth\n              let depthImgHeight\n              if (width > height) {\n                depthImgWidth = fixWidth\n                depthImgHeight = fixWidth * height / width\n              } else {\n                depthImgWidth = fixWidth * width / height\n                depthImgHeight = fixWidth\n              }\n              this.setData({\n                depthImgUrl: imgUrl,\n                depthImgWidth,\n                depthImgHeight,\n                depthImgOriginWidth: width,\n                depthImgOriginHeight: height\n              })\n            },\n            fail: res => {\n              console.error(res)\n            }\n          })\n        },\n        fail: res => {\n          console.error(res)\n        }\n      })\n    },\n    init() {\n      this.initGL()\n      this.initDepthGL()\n      console.log('init finish')\n    },\n    async detectDepth() {\n      if (this.data.depthImgUrl) {\n        const canvas = wx.createOffscreenCanvas({\n          type: '2d',\n          width: this.data.depthImgOriginWidth,\n          height: this.data.depthImgOriginHeight,\n        })\n        const context = canvas.getContext('2d')\n        const img = canvas.createImage()\n        await new Promise(resolve => {\n          img.onload = resolve\n          img.src = this.data.depthImgUrl\n        })\n\n        context.clearRect(0, 0, this.data.depthImgOriginWidth, this.data.depthImgOriginHeight)\n        context.drawImage(img, 0, 0, this.data.depthImgOriginWidth, this.data.depthImgOriginHeight)\n\n        this.imgData = context.getImageData(0, 0, this.data.depthImgOriginWidth, this.data.depthImgOriginHeight)\n\n        console.log('[frameBuffer] --> ', this.imgData.data.buffer)\n        console.log('this.session.detectDepth', this.session.detectDepth)\n        console.log('width', this.data.depthImgOriginWidth)\n        console.log('height', this.data.depthImgOriginHeight)\n        wx.showLoading({ title: '深度图生成中...' })\n        this.session.detectDepth({\n          frameBuffer: this.imgData.data.buffer,\n          width: this.data.depthImgOriginWidth,\n          height: this.data.depthImgOriginHeight,\n        })\n      }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-depth-detect/photo-depth-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"照片深度图检测\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-depth-detect/photo-depth-detect.less",
    "content": "/* packageAPI/pages/ar/photo-depth-detect/photo-depth-detect.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-depth-detect/photo-depth-detect.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n<view style=\"display: flex; justify-content: center;margin: 12px;\">\n    <view>原图：</view>\n    <image src=\"{{depthImgUrl}}\" style=\"width: 100px; height: 100px;\" mode=\"aspectFit\" />\n</view>\n<view class=\"btn-cnt\">\n    <button type=\"primary\" bindtap=\"chooseMedia\">选择图片</button>\n    <button type=\"primary\" disabled=\"{{!depthImgUrl}}\" style=\"margin-top: 20px;\" bindtap=\"detectDepth\">开始检测</button>\n</view>\n\n<canvas type=\"webgl\" id=\"webgl\" style=\"left:50%; transform: translate(-50%, 0); width: {{depthImgWidth}}px; height: {{depthImgHeight}}px; position:relative\">\n</canvas>\n\n<view class=\"page-body-text tc\" style=\"height:20%\">提示：点击选择图片，上传本地深度图照片，然后开始检测，将会显示深度图信息</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-depth-detect/photo-depth-detect.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-depth-detect/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-face-detect/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            face: {\n              mode: 2\n            }\n          },\n          version: 'v1',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          session.on('addAnchors', anchors => {\n            this.setData({\n              anchor2DList: anchors.map(anchor => ({\n                points: anchor.points,\n                origin: anchor.origin,\n                size: anchor.size\n              })),\n            })\n          })\n          session.on('updateAnchors', anchors => {\n            this.data.anchor2DList = []\n            // 手动传入图像的时候用dom画点和框就行\n            this.setData({\n              anchor2DList: anchors.map(anchor => ({\n                points: anchor.points,\n                origin: anchor.origin,\n                size: anchor.size\n              })),\n            })\n          })\n          session.on('removeAnchors', anchors => {\n            this.setData({\n              anchor2DList: [],\n            })\n            this.data.anchor2DList = []\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-face-detect/photo-face-detect.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    faceImgUrl: '',\n    faceImgWidth: 0,\n    faceImgHeight: 0,\n    faceImgOriginWidth: 0,\n    faceImgOriginHeight: 0,\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    chooseMedia() {\n      wx.chooseMedia({\n        count: 1,\n        mediaType: ['image'],\n        success: res => {\n          console.log('chooseMedia res', res)\n          const imgUrl = res.tempFiles[0].tempFilePath\n          wx.getImageInfo({\n            src: imgUrl,\n            success: res => {\n              const fixWidth = 300\n              const {\n                width,\n                height\n              } = res\n              console.log('getImageInfo res', res)\n              this.setData({\n                faceImgUrl: imgUrl,\n                faceImgWidth: fixWidth,\n                faceImgHeight: (fixWidth / width) * height,\n                faceImgOriginWidth: width,\n                faceImgOriginHeight: height\n              })\n            },\n            fail: res => {\n              console.error(res)\n            }\n          })\n        },\n        fail: res => {\n          console.error(res)\n        }\n      })\n    },\n    init() {\n      // this.initGL()\n    },\n    render(frame) {\n      return\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n    },\n    async detectFace() {\n      if (this.data.faceImgUrl) {\n        const canvas = wx.createOffscreenCanvas({\n          type: '2d',\n          width: this.data.faceImgOriginWidth,\n          height: this.data.faceImgOriginHeight,\n        })\n        const context = canvas.getContext('2d')\n        const img = canvas.createImage()\n        await new Promise(resolve => {\n          img.onload = resolve\n          img.src = this.data.faceImgUrl\n        })\n\n        context.clearRect(0, 0, this.data.faceImgOriginWidth, this.data.faceImgOriginHeight)\n        context.drawImage(img, 0, 0, this.data.faceImgOriginWidth, this.data.faceImgOriginHeight)\n\n        this.imgData = context.getImageData(0, 0, this.data.faceImgOriginWidth, this.data.faceImgOriginHeight)\n\n        console.log('[frameBuffer] --> ', this.imgData.data.buffer)\n        console.log('this.session.detectFace', this.session.detectFace)\n        console.log('width', this.data.faceImgOriginWidth)\n        console.log('height', this.data.faceImgOriginHeight)\n\n        this.session.detectFace({\n          frameBuffer: this.imgData.data.buffer,\n          width: this.data.faceImgOriginWidth,\n          height: this.data.faceImgOriginHeight,\n          scoreThreshold: 0.5, // 评分阈值\n          sourceType: 1,\n          modelMode: 1,\n        })\n      }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-face-detect/photo-face-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"照片人脸检测\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-face-detect/photo-face-detect.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n<view style=\"display: flex; justify-content: center;margin: 12px;\">\n    <view>原图：</view>\n    <image src=\"{{faceImgUrl}}\" style=\"width: 100px; height: 100px;\" mode=\"aspectFit\" />\n</view>\n<canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\">\n</canvas>\n<view class=\"btn-cnt\">\n    <button type=\"primary\" bindtap=\"chooseMedia\">选择图片</button>\n    <button type=\"primary\" disabled=\"{{!faceImgUrl}}\" style=\"margin-top: 20px;\" bindtap=\"detectFace\">开始检测</button>\n</view>\n\n\n<view wx:if=\"{{anchor2DList}}\" style=\"position:relative;\">\n    <image src=\"{{faceImgUrl}}\" style=\"margin: 30px; width: {{faceImgWidth}}px; height: {{faceImgHeight}}px;\" />\n    <view wx:for=\"{{anchor2DList}}\" style=\"position:absolute; top: 0px; margin: 30px;  width: {{faceImgWidth}}px; height: {{faceImgHeight}}px;\">\n        <view style=\"position: absolute; left: {{item.origin.x * faceImgWidth}}px; top: {{item.origin.y * faceImgHeight}}px; width: {{item.size.width * faceImgWidth}}px; height: {{item.size.height * faceImgHeight}}px; border: solid red 2px\"></view>\n        <view wx:for=\"{{item.points}}\" wx:key=\"id\" style=\"position: absolute; left: {{item.x * faceImgWidth}}px; top: {{item.y * faceImgHeight}}px; width: 4px; height: 4px; background-color: #00ff00; border-radius: 50%;\"></view>\n    </view>\n</view>\n<view class=\"page-body-text tc\" style=\"height:20%\">提示：点击选择图片，上传本地人脸照片，然后开始检测，对应人脸将会显示识别框和人脸标记点</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-face-detect/photo-face-detect.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-face-detect/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      console.log('初始化shader完成')\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p =  vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-hand-detect/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            plane: {\n              mode: 1\n            },\n            hand: {\n              mode: 2\n            }\n          },\n          version: 'v1',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          session.on('addAnchors', anchors => {\n            this.setData({\n              anchor2DList: anchors.map(anchor => ({\n                points: anchor.points,\n                origin: anchor.origin,\n                size: anchor.size,\n                gesture: anchor.gesture\n              })),\n            })\n          })\n\n          session.on('updateAnchors', anchors => {\n            this.data.anchor2DList = []\n            // 手动传入图像的时候用dom画点和框就行\n            this.setData({\n              anchor2DList: anchors.map(anchor => ({\n                points: anchor.points,\n                origin: anchor.origin,\n                size: anchor.size,\n                gesture: anchor.gesture\n              })),\n            })\n          })\n\n          session.on('removeAnchors', anchors => {\n            this.setData({\n              anchor2DList: [],\n            })\n            this.data.anchor2DList = []\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-hand-detect/photo-hand-detect.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    handImgUrl: '',\n    handImgWidth: 0,\n    handImgHeight: 0,\n    handImgOriginWidth: 0,\n    handImgOriginHeight: 0,\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    chooseMedia() {\n      wx.chooseMedia({\n        count: 1,\n        mediaType: ['image'],\n        success: res => {\n          console.log('chooseMedia res', res)\n          const imgUrl = res.tempFiles[0].tempFilePath\n          wx.getImageInfo({\n            src: imgUrl,\n            success: res => {\n              const fixWidth = 300\n              const {\n                width,\n                height\n              } = res\n              console.log('getImageInfo res', res)\n              this.setData({\n                handImgUrl: imgUrl,\n                handImgWidth: fixWidth,\n                handImgHeight: (fixWidth / width) * height,\n                handImgOriginWidth: width,\n                handImgOriginHeight: height\n              })\n            },\n            fail: res => {\n              console.error(res)\n            }\n          })\n        },\n        fail: res => {\n          console.error(res)\n        }\n      })\n    },\n    init() {\n      this.initGL()\n    },\n    render(frame) {\n      return\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullhand(this.THREE.CullhandNone)\n    },\n    async detectHand() {\n      if (this.data.handImgUrl) {\n        const canvas = wx.createOffscreenCanvas({\n          type: '2d',\n          width: this.data.handImgOriginWidth,\n          height: this.data.handImgOriginHeight,\n        })\n        const context = canvas.getContext('2d')\n        const img = canvas.createImage()\n        await new Promise(resolve => {\n          img.onload = resolve\n          img.src = this.data.handImgUrl\n        })\n\n        context.clearRect(0, 0, this.data.handImgOriginWidth, this.data.handImgOriginHeight)\n        context.drawImage(img, 0, 0, this.data.handImgOriginWidth, this.data.handImgOriginHeight)\n\n        this.imgData = context.getImageData(0, 0, this.data.handImgOriginWidth, this.data.handImgOriginHeight)\n\n        console.log('[frameBuffer] --> ', this.imgData.data.buffer)\n        console.log('this.session.detectHand', this.session.detectHand)\n        console.log('width', this.data.handImgOriginWidth)\n        console.log('height', this.data.handImgOriginHeight)\n        this.session.detectHand({\n          frameBuffer: this.imgData.data.buffer,\n          width: this.data.handImgOriginWidth,\n          height: this.data.handImgOriginHeight,\n          scoreThreshold: 0.5, // 评分阈值\n          algoMode: 2\n        })\n      }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-hand-detect/photo-hand-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"照片手势检测\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-hand-detect/photo-hand-detect.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n<view style=\"display: flex; justify-content: center;margin: 12px;\">\n    <view>原图：</view>\n    <image src=\"{{handImgUrl}}\" style=\"width: 100px; height: 100px;\" mode=\"aspectFit\" />\n</view>\n<canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\">\n</canvas>\n<view class=\"btn-cnt\">\n    <button type=\"primary\" bindtap=\"chooseMedia\">选择图片</button>\n    <button type=\"primary\" disabled=\"{{!handImgUrl}}\" style=\"margin-top: 20px;\" bindtap=\"detectHand\">开始检测</button>\n</view>\n\n\n<view wx:if=\"{{anchor2DList}}\">\n    <view wx:for=\"{{anchor2DList}}\" style=\"margin: 30px auto; position: relative; width: {{handImgWidth}}px; height: {{handImgHeight}}px;\">\n        <image src=\"{{handImgUrl}}\" style=\"width: {{handImgWidth}}px; height: {{handImgHeight}}px;\" />\n        <view style=\"position: absolute; left: {{item.origin.x * handImgWidth}}px; top: {{item.origin.y * handImgHeight}}px; width: {{item.size.width * handImgWidth}}px; height: {{item.size.height * handImgHeight}}px; border: solid red 2px\"></view>\n        <view wx:for=\"{{item.points}}\" wx:key=\"id\" style=\"position: absolute; left: {{item.x * handImgWidth}}px; top: {{item.y * handImgHeight}}px; width: 4px; height: 4px; background-color: #00ff00; border-radius: 50%;\"></view>\n    </view>\n</view>\n<view class=\"page-hand-text tc\" style=\"height:20%\">提示：点击选择图片，上传本地手部照片，然后开始检测，对应手部将会显示识别框和手部标记点</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-hand-detect/photo-hand-detect.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-hand-detect/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-idcard-detect/photo-idcard-detect.js",
    "content": "Component({\n  behaviors: [],\n  data: {\n    // 主题相关逻辑\n    theme: 'light',\n    // 上传识别相关逻辑\n    imgUrl: '',\n    imgWidth: 0,\n    imgHeight: 0,\n    imgOriginWidth: 0,\n    imgOriginHeight: 0,\n    // 显示身份证识别结果\n    detected: false,\n    detectSuccess: false,\n    isComplete: false,\n    label: '',\n    orientation: 0,\n    box: [],\n    cropImg: null,\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    onReady() {\n      this.initVK()\n    },\n    // VK 初始化逻辑\n    initVK() {\n      // VKSession 配置\n      const session = this.session = wx.createVKSession({\n        track: {\n          IDCard: {\n            mode: 2 // 照片模式\n          }\n        },\n        version: 'v1',\n        gl: this.gl\n      })\n\n      // VKSession start\n      session.start(err => {\n        session.on('updateAnchors', anchors => {\n          console.log('updateAnchors')\n\n          // 处理返回的身份证信息\n          if (anchors && anchors[0]) {\n            // 存在数组，证明存在身份证信息\n            const anchor = anchors[0]\n\n            // console.log(anchor.isComplete, anchor.label, anchor.orientation, anchor.box);\n\n            this.setData({\n              detected: true,\n              detectSuccess: true,\n              isComplete: anchor.isComplete,\n              label: anchor.label,\n              orientation: anchor.orientation,\n              box: anchor.box,\n            })\n\n            // 裁剪信息\n            const affineImgWidth = anchor.affineImgWidth\n            const affineImgHeight = anchor.affineImgHeight\n            const affineMat = anchor.affineMat\n\n            // 存在裁剪信息，进行身份证裁剪处理\n            if (affineImgWidth && affineImgHeight && affineMat) {\n              console.log(affineImgWidth, affineImgHeight, affineMat)\n\n              const cropIDcardImg = this.getCropIDcard(affineImgWidth, affineImgHeight, affineMat)\n\n              this.setData({\n                cropImg: cropIDcardImg\n              })\n            }\n          }\n        })\n        session.on('removeAnchors', anchors => {\n          console.log('anchor remove')\n\n          // 图片没有识别到身份证\n          this.setData({\n            detected: true,\n            detectSuccess: false,\n          })\n        })\n      })\n    },\n    // 裁剪身份证图片\n    getCropIDcard(affineImgWidth, affineImgHeight, affineMat) {\n      const canvas = wx.createOffscreenCanvas({\n        type: '2d',\n        width: affineImgWidth,\n        height: affineImgHeight,\n      })\n      const context = canvas.getContext('2d')\n\n      context.clearRect(0, 0, affineImgWidth, affineImgHeight)\n      /*\n            * affineMat 3x3仿射变换矩阵，行主序\n            *  [0 1 2\n            *   3 4 5\n            *   6 7 8]\n            */\n      /*\n            * canvas 2d setTransform\n            * setTransform(a, b, c, d, e, f)\n            *  [a c e\n            *   b d f\n            *   0 0 1]\n            */\n      context.setTransform(\n        Number(affineMat[0]),\n        Number(affineMat[3]),\n        Number(affineMat[1]),\n        Number(affineMat[4]),\n        Number(affineMat[2]),\n        Number(affineMat[5])\n      )\n      console.log(this.img, this.data.imgOriginWidth, this.data.imgOriginHeight)\n      context.drawImage(this.img, 0, 0, this.data.imgOriginWidth, this.data.imgOriginHeight)\n      const imgUrl = canvas.toDataURL()\n\n      // console.log(imgUrl);\n\n      return imgUrl\n    },\n    // 上传识别图片\n    chooseMedia() {\n      wx.chooseMedia({\n        count: 1,\n        mediaType: ['image'],\n        success: res => {\n          console.log('chooseMedia res', res)\n          const imgUrl = res.tempFiles[0].tempFilePath\n          wx.getImageInfo({\n            src: imgUrl,\n            success: res => {\n              const fixWidth = 300\n              const {\n                width,\n                height\n              } = res\n              console.log('getImageInfo res', res)\n              this.setData({\n                imgUrl,\n                imgWidth: fixWidth,\n                imgHeight: (fixWidth / width) * height,\n                imgOriginWidth: width,\n                imgOriginHeight: height\n              })\n            },\n            fail: res => {\n              console.error(res)\n            }\n          })\n        },\n        fail: res => {\n          console.error(res)\n        }\n      })\n    },\n    // 识别身份证逻辑\n    async detectIDCard() {\n      console.log('detectIDCard')\n      if (this.data.imgUrl) {\n        const canvas = wx.createOffscreenCanvas({\n          type: '2d',\n          width: this.data.imgOriginWidth,\n          height: this.data.imgOriginHeight,\n        })\n        const context = canvas.getContext('2d')\n        const img = canvas.createImage()\n        // 使用中的 图片对象\n        this.img = img\n        await new Promise(resolve => {\n          img.onload = resolve\n          img.src = this.data.imgUrl\n        })\n\n        context.clearRect(0, 0, this.data.imgOriginWidth, this.data.imgOriginHeight)\n        context.drawImage(img, 0, 0, this.data.imgOriginWidth, this.data.imgOriginHeight)\n\n        // 使用中的 image ArrayBuffer\n        this.imgData = context.getImageData(0, 0, this.data.imgOriginWidth, this.data.imgOriginHeight)\n\n        console.log('[frameBuffer] --> ', this.imgData.data.buffer)\n        console.log('this.session.detectIDCard', this.session.detectIDCard)\n        console.log('width', this.data.imgOriginWidth)\n        console.log('height', this.data.imgOriginHeight)\n        this.session.detectIDCard({\n          // 识别身份证图片的信息\n          frameBuffer: this.imgData.data.buffer,\n          width: this.data.imgOriginWidth,\n          height: this.data.imgOriginHeight,\n          // 是否获取裁剪图片信息\n          getAffineImg: true,\n        })\n      }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-idcard-detect/photo-idcard-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"照片身份证检测\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-idcard-detect/photo-idcard-detect.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <view class=\"img-wrap\">\n        <p class=\"preview-title\">识别图片：</p>\n        <image class=\"preview-img\" src=\"{{imgUrl}}\" mode=\"aspectFit\" />\n    </view>\n\n    <view class=\"btn-cnt\">\n        <view class=\"flex-row\">\n            <button type=\"primary\" bindtap=\"chooseMedia\">使用小程序相机拍摄</button>\n            <button type=\"primary\" bindtap=\"chooseMedia\">使用本地图片</button>\n        </view>\n        <button class=\"btn-sub\" type=\"primary\" disabled=\"{{!imgUrl}}\" bindtap=\"detectIDCard\">开始识别身份证</button>\n    </view>\n    <view class=\"info-wrap\">\n        <view class=\"info-list\" wx:if=\"{{detected}}\">\n            <view wx:if=\"{{detectSuccess}}\">\n                <view class=\"info-title\">识别身份证信息</view>\n                <p>{{isComplete === 0 ? '不完整' : '完整'}}</p>\n                <p>{{label === 0 ? '照片面' : '国徽面'}}</p>\n                <p>{{orientation === 0 ? '朝上' : ''}}{{orientation === 1 ? '朝右' : ''}}{{orientation === 2 ? '朝下' : ''}}{{orientation === 3 ? '朝左' : ''}}</p>\n                <p>坐标框: 左上({{box[0].x}}, {{box[0].y}}) 右上({{box[1].x}}, {{box[1].y}}) 右下({{box[2].x}}, {{box[2].y}}) 左下({{box[3].x}}, {{box[3].y}})</p>\n                <image class=\"crop-img\" wx:if=\"{{cropImg}}\" src=\"{{cropImg}}\" mode=\"aspectFit\" />\n            </view>\n            <view wx:if=\"{{!detectSuccess}}\">\n                <view class=\"info-title\">未识别到身份证</view>\n            </view>\n        </view>\n    </view>\n\n    <view class=\"hint-bottom page-body-text tc\">\n        <text>提示：点击选择图片，上传本地照片或使用小程序相机拍摄，然后开始身份证检测，将会显示检测到的身份证信息（需基础库版本3.3.0）</text>\n    </view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-idcard-detect/photo-idcard-detect.wxss",
    "content": ".img-wrap {\n    display: flex;\n    justify-content: center;\n    margin: 20px 20px;\n}\n\n.preview-title {\n    flex: 1;\n    font-weight: bold;\n    line-height: 160px;\n    text-align: center;\n}\n\n.preview-img {\n    flex: 2;\n    height: 160px;\n    border: 1px solid black;\n    border-radius: 3px;\n    background-color: rgb(220, 220, 220);\n}\n\n.btn-cnt {\n    margin: 10px 20px;\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n}\n\n.btn-cnt .flex-row {\n    display: flex;\n    flex-direction: row;\n}\n\n.btn-cnt button {\n    margin: 5px;\n    width: 160px;\n    font-size: 16px;\n}\n\n.btn-cnt .btn-sub {\n    width: 200px;\n    height: 50px;\n}\n\n.info-wrap {\n    margin: 0 30px;\n}\n\n.info-list {\n    border: 1px solid black;\n    border-radius: 6px;\n    padding: 10px 0;\n    text-align: center;\n}\n\n.info-list .info-title {\n    text-align: center;\n    font-size: 18px;\n    line-height: 40px;\n}\n\n.info-list p {\n    display: inline-block;\n    font-size: 14px;\n    margin: 3px 5px;\n    padding: 0px 5px;\n}\n\n.crop-img {\n    margin-top: 10px;\n    width: 240px;\n    height: 160px;\n}\n\n.hint-bottom {\n    position: absolute;\n    left: 20px;\n    right: 20px;\n    bottom: 20px;\n    padding: 5px 20px;\n    font-size: 12px;\n    color: #fff;\n    background-color: rgba(0, 0, 0, 0.5);\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-ocr-detect/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.textContentList) this.textContentList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            OCR: {\n              mode: 2\n            }\n          },\n          version: 'v1',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          session.on('addAnchors', anchors => {\n            console.log('anchor add')\n          })\n          session.on('updateAnchors', anchors => {\n            this.data.textContentList = []\n            console.log(anchors)\n            this.data.textContentList = this.data.textContentList.concat(anchors.map(anchor => {\n              let result = {}\n              result = {\n                text: anchor.text,\n                subtext: anchor.subtext,\n                box: anchor.box,\n                centerX: anchor.centerX,\n                centerY: anchor.centerY,\n              }\n              if (anchor.box) {\n                const lt = anchor.box[0]\n                const lr = anchor.box[1]\n                const rb = anchor.box[2]\n                const lb = anchor.box[3]\n                const width = lr.x - lt.x\n                const height = lb.y - lt.y\n                const avgX = (lt.x + lr.x + rb.x + lb.x) / 4\n                const avgY = (lt.y + lr.y + rb.y + lb.y) / 4\n                anchor.centerX = avgX * this.data.faceImgWidth\n                anchor.centerY = avgY * this.data.faceImgHeight\n                result.origin = {\n                  x: lt.x,\n                  y: lt.y,\n                }\n                result.size = {\n                  width,\n                  height,\n                }\n              }\n              return result\n            }))\n\n            let wholeText\n            if (this.data.textContentList.length != 0) {\n              wholeText = this.data.textContentList[0].text\n            }\n\n            this.setData({\n              textContentList: this.data.textContentList,\n              wholeText\n            })\n          })\n          session.on('removeAnchors', anchors => {\n            console.log('anchor remove')\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-ocr-detect/photo-ocr-detect.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    faceImgUrl: '',\n    faceImgWidth: 0,\n    faceImgHeight: 0,\n    faceImgOriginWidth: 0,\n    faceImgOriginHeight: 0,\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    chooseMedia() {\n      wx.chooseMedia({\n        count: 1,\n        mediaType: ['image'],\n        success: res => {\n          console.log('chooseMedia res', res)\n          const imgUrl = res.tempFiles[0].tempFilePath\n          wx.getImageInfo({\n            src: imgUrl,\n            success: res => {\n              const fixWidth = 300\n              const {\n                width,\n                height\n              } = res\n              console.log('getImageInfo res', res)\n              this.setData({\n                faceImgUrl: imgUrl,\n                faceImgWidth: fixWidth,\n                faceImgHeight: (fixWidth / width) * height,\n                faceImgOriginWidth: width,\n                faceImgOriginHeight: height\n              })\n            },\n            fail: res => {\n              console.error(res)\n            }\n          })\n        },\n        fail: res => {\n          console.error(res)\n        }\n      })\n    },\n    init() {\n      this.initGL()\n    },\n    render(frame) {\n      return\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n    },\n    async runOCR() {\n      if (this.data.faceImgUrl) {\n        const canvas = wx.createOffscreenCanvas({\n          type: '2d',\n          width: this.data.faceImgOriginWidth,\n          height: this.data.faceImgOriginHeight,\n        })\n        const context = canvas.getContext('2d')\n        const img = canvas.createImage()\n        await new Promise(resolve => {\n          img.onload = resolve\n          img.src = this.data.faceImgUrl\n        })\n\n        context.clearRect(0, 0, this.data.faceImgOriginWidth, this.data.faceImgOriginHeight)\n        context.drawImage(img, 0, 0, this.data.faceImgOriginWidth, this.data.faceImgOriginHeight)\n\n        this.imgData = context.getImageData(0, 0, this.data.faceImgOriginWidth, this.data.faceImgOriginHeight)\n\n        console.log('[frameBuffer] --> ', this.imgData.data.buffer)\n        console.log('this.session.runOCR', this.session.runOCR)\n        console.log('width', this.data.faceImgOriginWidth)\n        console.log('height', this.data.faceImgOriginHeight)\n        this.session.runOCR({\n          frameBuffer: this.imgData.data.buffer,\n          width: this.data.faceImgOriginWidth,\n          height: this.data.faceImgOriginHeight,\n        })\n      }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-ocr-detect/photo-ocr-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"照片OCR检测\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-ocr-detect/photo-ocr-detect.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n<view style=\"display: flex; justify-content: center;margin: 12px;\">\n    <view>原图：</view>\n    <image src=\"{{faceImgUrl}}\" style=\"width: 100px; height: 100px;\" mode=\"aspectFit\" />\n</view>\n<canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\">\n</canvas>\n<view class=\"btn-cnt\">\n    <button type=\"primary\" bindtap=\"chooseMedia\">选择图片</button>\n    <button type=\"primary\" disabled=\"{{!faceImgUrl}}\" style=\"margin-top: 20px;\" bindtap=\"runOCR\">开始检测</button>\n</view>\n\n\n<view wx:if=\"{{textContentList}}\" style=\"position:relative; height:30%\">\n    <image src=\"{{faceImgUrl}}\" style=\"position:absolute; left:50%; transform:translate(-50%); width: {{faceImgWidth}}px; height: {{faceImgHeight}}px;\" />\n    <view wx:for=\"{{textContentList}}\" style=\"position:absolute; top: 0px; margin: 30px; width: {{faceImgWidth}}px; height: {{faceImgHeight}}px;\">\n      <text wx:if=\"{{item.subtext != undefined && item.centerX != undefined}}\" style=\"position:absolute; top:{{item.centerY}}px; left:{{item.centerX}}px\">{{item.subtext}}</text>\n      <view wx:if=\"{{item.orign != undefined}}\" style=\"position: absolute; left: {{item.origin.x * faceImgWidth}}px; top: {{item.origin.y * faceImgHeight}}px; width: {{item.size.width * faceImgWidth}}px; height: {{item.size.height * faceImgHeight}}px; border: solid red 2px\"></view>\n    </view>\n</view>\n<view class=\"page-body-text tc\" style=\"position:relative; height:20%\">\n<text>提示：点击选择图片，上传本地照片，然后开始文字检测，将会显示检测到的文字</text>\n<text style=\"position:absolute; top:50%; left:0%\">{{wholeText}}</text>\n</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-ocr-detect/photo-ocr-detect.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-ocr-detect/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-shoe-detect/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.textContentList) this.textContentList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            shoe: {\n              mode: 2\n            }\n          },\n          version: 'v1',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          session.on('addAnchors', anchors => {\n            console.log('anchor add')\n          })\n          session.on('updateAnchors', anchors => {\n            console.log(anchors)\n            this.data.anchor2DList = []\n            // 手动传入图像的时候用dom画点和框就行\n            this.setData({\n              anchor2DList: anchors.map(anchor => ({\n                points: anchor.points,\n                origin: anchor.origin,\n                size: anchor.size\n              })),\n            })\n          })\n          session.on('removeAnchors', anchors => {\n            console.log('anchor remove')\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-shoe-detect/photo-shoe-detect.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    shoeImgUrl: '',\n    shoeImgWidth: 0,\n    shoeImgHeight: 0,\n    shoeImgOriginWidth: 0,\n    shoeImgOriginHeight: 0,\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    chooseMedia() {\n      wx.chooseMedia({\n        count: 1,\n        mediaType: ['image'],\n        success: res => {\n          console.log('chooseMedia res', res)\n          const imgUrl = res.tempFiles[0].tempFilePath\n          wx.getImageInfo({\n            src: imgUrl,\n            success: res => {\n              const fixWidth = 300\n              const {\n                width,\n                height\n              } = res\n              console.log('getImageInfo res', res)\n              this.setData({\n                shoeImgUrl: imgUrl,\n                shoeImgWidth: fixWidth,\n                shoeImgHeight: (fixWidth / width) * height,\n                shoeImgOriginWidth: width,\n                shoeImgOriginHeight: height\n              })\n            },\n            fail: res => {\n              console.error(res)\n            }\n          })\n        },\n        fail: res => {\n          console.error(res)\n        }\n      })\n    },\n    init() {\n      this.initGL()\n    },\n    render(frame) {\n\n    },\n    async detectShoe() {\n      if (this.data.shoeImgUrl) {\n        const canvas = wx.createOffscreenCanvas({\n          type: '2d',\n          width: this.data.shoeImgOriginWidth,\n          height: this.data.shoeImgOriginHeight,\n        })\n        const context = canvas.getContext('2d')\n        const img = canvas.createImage()\n        await new Promise(resolve => {\n          img.onload = resolve\n          img.src = this.data.shoeImgUrl\n        })\n\n        context.clearRect(0, 0, this.data.shoeImgOriginWidth, this.data.shoeImgOriginHeight)\n        context.drawImage(img, 0, 0, this.data.shoeImgOriginWidth, this.data.shoeImgOriginHeight)\n\n        this.imgData = context.getImageData(0, 0, this.data.shoeImgOriginWidth, this.data.shoeImgOriginHeight)\n\n        console.log('[frameBuffer] --> ', this.imgData.data.buffer)\n        console.log('this.session.detectShoe', this.session.detectShoe)\n        console.log('width', this.data.shoeImgOriginWidth)\n        console.log('height', this.data.shoeImgOriginHeight)\n        this.session.detectShoe({\n          frameBuffer: this.imgData.data.buffer,\n          width: this.data.shoeImgOriginWidth,\n          height: this.data.shoeImgOriginHeight,\n        })\n      }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-shoe-detect/photo-shoe-detect.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"照片鞋部检测\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-shoe-detect/photo-shoe-detect.less",
    "content": "/* packageAPI/pages/ar/photo-shoe-detect/photo-shoe-detect.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-shoe-detect/photo-shoe-detect.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n<view style=\"display: flex; justify-content: center;margin: 12px;\">\n    <view>原图：</view>\n    <image src=\"{{shoeImgUrl}}\" style=\"width: 100px; height: 100px;\" mode=\"aspectFit\" />\n</view>\n<canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\">\n</canvas>\n<view class=\"btn-cnt\">\n    <button type=\"primary\" bindtap=\"chooseMedia\">选择图片</button>\n    <button type=\"primary\" disabled=\"{{!shoeImgUrl}}\" style=\"margin-top: 20px;\" bindtap=\"detectShoe\">开始检测</button>\n</view>\n\n\n<view wx:if=\"{{textContentList}}\" style=\"position:relative; height:30%\">\n    <image src=\"{{shoeImgUrl}}\" style=\"position:absolute; left:50%; transform:translate(-50%); width: {{shoeImgWidth}}px; height: {{shoeImgHeight}}px;\" />\n    <view wx:for=\"{{anchor2DList}}\" style=\"position:absolute; top: 0px; margin: 30px;  width: {{shoeImgWidth}}px; height: {{shoeImgHeight}}px;\">\n        <view style=\"position: absolute; left: {{item.origin.x * shoeImgWidth}}px; top: {{item.origin.y * shoeImgHeight}}px; width: {{item.size.width * shoeImgWidth}}px; height: {{item.size.height * shoeImgHeight}}px; border: solid red 2px\"></view>\n        <view wx:for=\"{{item.points}}\" wx:key=\"id\" style=\"position: absolute; left: {{item.x * shoeImgWidth}}px; top: {{item.y * shoeImgHeight}}px; width: 4px; height: 4px; background-color: #00ff00; border-radius: 50%;\"></view>\n    </view>\n</view>\n<view class=\"page-body-text tc\" style=\"position:relative; height:20%\">\n<text>提示：点击选择图片，上传本地鞋部照片，然后开始检测，对应鞋部将会显示识别框和鞋部标记点</text>\n</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-shoe-detect/photo-shoe-detect.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/photo-shoe-detect/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\nimport cloneGltf from '../loaders/gltf-clone'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n        const THREE = this.THREE\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            plane: {\n              mode: 1\n            },\n          },\n          version: 'v1',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          const loader = new THREE.GLTFLoader()\n          loader.load('https://dldir1.qq.com/weixin/miniprogram/RobotExpressive_aa2603d917384b68bb4a086f32dabe83.glb', gltf => {\n            this.model = {\n              scene: gltf.scene,\n              animations: gltf.animations,\n            }\n          })\n\n          this.clock = new THREE.Clock()\n\n          loader.load('https://dldir1.qq.com/weixin/miniprogram/reticle_4b6cc19698ca4a08b31fd3c95ce412ec.glb', gltf => {\n            const reticle = this.reticle = gltf.scene\n\n            reticle.visible = false\n            this.scene.add(reticle)\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n      updateAnimation() {\n        const dt = this.clock.getDelta()\n        if (this.mixers) this.mixers.forEach(mixer => mixer.update(dt))\n      },\n      copyRobot() {\n        const THREE = this.THREE\n        const {\n          scene,\n          animations\n        } = cloneGltf(this.model, THREE)\n        scene.scale.set(0.05, 0.05, 0.05)\n\n        // 动画混合器\n        const mixer = new THREE.AnimationMixer(scene)\n        for (let i = 0; i < animations.length; i++) {\n          const clip = animations[i]\n          if (clip.name === 'Dance') {\n            const action = mixer.clipAction(clip)\n            action.play()\n          }\n        }\n\n        this.mixers = this.mixers || []\n        this.mixers.push(mixer)\n\n        scene._mixer = mixer\n        return scene\n      },\n      getRobot() {\n        const THREE = this.THREE\n\n        const model = new THREE.Object3D()\n        model.add(this.copyRobot())\n\n        this._insertModels = this._insertModels || []\n        this._insertModels.push(model)\n\n        if (this._insertModels.length > 5) {\n          const needRemove = this._insertModels.splice(0, this._insertModels.length - 5)\n          needRemove.forEach(item => {\n            if (item._mixer) {\n              const mixer = item._mixer\n              this.mixers.splice(this.mixers.indexOf(mixer), 1)\n              mixer.uncacheRoot(mixer.getRoot())\n            }\n            if (item.parent) item.parent.remove(item)\n          })\n        }\n        return model\n      },\n      onTouchEnd(evt) {\n        if (this.scene && this.model && this.reticle) {\n          const model = this.getRobot()\n          model.position.copy(this.reticle.position)\n          model.rotation.copy(this.reticle.rotation)\n          this.scene.add(model)\n        }\n      }\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar/plane-ar.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n    },\n    render(frame) {\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      // 修改光标位置\n      const reticle = this.reticle\n      if (reticle) {\n        const hitTestRes = this.session.hitTest(0.5, 0.5)\n        if (hitTestRes.length) {\n          reticle.matrixAutoUpdate = false\n          reticle.matrix.fromArray(hitTestRes[0].transform)\n          reticle.matrix.decompose(reticle.position, reticle.quaternion, reticle.scale)\n          reticle.visible = true\n        } else {\n          reticle.visible = false\n        }\n      }\n\n      // 更新动画\n      this.updateAnimation()\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar/plane-ar.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"水平面AR\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar/plane-ar.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n<view><canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n    </canvas></view>\n<view class=\"page-body-text tc\" style=\"height:20%\">提示：触碰屏幕任意点, 可在对应位置生成示例的机器小人, 其中光标标记指示的是水平面</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar/plane-ar.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-3dof/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\nimport cloneGltf from '../loaders/gltf-clone'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n        const THREE = this.THREE\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            plane: {\n              mode: 1\n            },\n            threeDof: true,\n          },\n          version: 'v1',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          const loader = new THREE.GLTFLoader()\n          loader.load('https://dldir1.qq.com/weixin/miniprogram/RobotExpressive_aa2603d917384b68bb4a086f32dabe83.glb', gltf => {\n            this.model = {\n              scene: gltf.scene,\n              animations: gltf.animations,\n            }\n          })\n\n          this.clock = new THREE.Clock()\n\n          loader.load('https://dldir1.qq.com/weixin/miniprogram/reticle_4b6cc19698ca4a08b31fd3c95ce412ec.glb', gltf => {\n            const reticle = this.reticle = gltf.scene\n\n            reticle.visible = false\n            this.scene.add(reticle)\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n      updateAnimation() {\n        const dt = this.clock.getDelta()\n        if (this.mixers) this.mixers.forEach(mixer => mixer.update(dt))\n      },\n      copyRobot() {\n        const THREE = this.THREE\n        const {\n          scene,\n          animations\n        } = cloneGltf(this.model, THREE)\n        scene.scale.set(0.05, 0.05, 0.05)\n\n        // 动画混合器\n        const mixer = new THREE.AnimationMixer(scene)\n        for (let i = 0; i < animations.length; i++) {\n          const clip = animations[i]\n          if (clip.name === 'Dance') {\n            const action = mixer.clipAction(clip)\n            action.play()\n          }\n        }\n\n        this.mixers = this.mixers || []\n        this.mixers.push(mixer)\n\n        scene._mixer = mixer\n        return scene\n      },\n      getRobot() {\n        const THREE = this.THREE\n\n        const model = new THREE.Object3D()\n        model.add(this.copyRobot())\n\n        this._insertModels = this._insertModels || []\n        this._insertModels.push(model)\n\n        if (this._insertModels.length > 5) {\n          const needRemove = this._insertModels.splice(0, this._insertModels.length - 5)\n          needRemove.forEach(item => {\n            if (item._mixer) {\n              const mixer = item._mixer\n              this.mixers.splice(this.mixers.indexOf(mixer), 1)\n              mixer.uncacheRoot(mixer.getRoot())\n            }\n            if (item.parent) item.parent.remove(item)\n          })\n        }\n        return model\n      },\n      onTouchEnd(evt) {\n        if (this.scene && this.model && this.reticle) {\n          const model = this.getRobot()\n          model.position.copy(this.reticle.position)\n          model.rotation.copy(this.reticle.rotation)\n          this.scene.add(model)\n        }\n      }\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-3dof/plane-ar-3dof.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n    },\n    render(frame) {\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      // 修改光标位置\n      const reticle = this.reticle\n      if (reticle) {\n        const hitTestRes = this.session.hitTest(0.5, 0.5)\n        if (hitTestRes.length) {\n          reticle.matrixAutoUpdate = false\n          reticle.matrix.fromArray(hitTestRes[0].transform)\n          reticle.matrix.decompose(reticle.position, reticle.quaternion, reticle.scale)\n          reticle.visible = true\n        } else {\n          reticle.visible = false\n        }\n      }\n\n      // 更新动画\n      this.updateAnimation()\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-3dof/plane-ar-3dof.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"水平面旋转AR\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-3dof/plane-ar-3dof.less",
    "content": "/* packageAPI/pages/ar/plane-ar-3dof/plane-ar-3dof.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-3dof/plane-ar-3dof.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n<view><canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n    </canvas></view>\n<view class=\"page-body-text tc\" style=\"height:20%\">提示：触碰屏幕任意点, 可在对应位置生成示例的机器小人, 其中光标标记指示的是水平面</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-3dof/plane-ar-3dof.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-3dof/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\nimport cloneGltf from '../loaders/gltf-clone'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n        const THREE = this.THREE\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        this.session = wx.createVKSession({\n          track: {\n            plane: {\n              mode: 1\n            },\n          },\n          version: 'v2',\n          gl: this.gl,\n        })\n        const session = this.session\n        session.start(err => {\n          if (err) {\n            this.setData({\n              errMsg: 'VK error: ' + err\n            })\n            return console.error('VK error: ', err)\n          }\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          const loader = new THREE.GLTFLoader()\n          loader.load('https://dldir1.qq.com/weixin/miniprogram/RobotExpressive_aa2603d917384b68bb4a086f32dabe83.glb', gltf => {\n            this.model = {\n              scene: gltf.scene,\n              animations: gltf.animations,\n            }\n          })\n\n          this.clock = new THREE.Clock()\n\n          loader.load('https://dldir1.qq.com/weixin/miniprogram/reticle_4b6cc19698ca4a08b31fd3c95ce412ec.glb', gltf => {\n            const reticle = this.reticle = gltf.scene\n\n            reticle.visible = false\n            this.scene.add(reticle)\n          })\n\n          this.setData({\n            showTip: true\n          })\n          setTimeout(() => {\n            this.setData({\n              showTip: false\n            })\n          }, 10000)\n\n          // anchor 检测\n          const createPlane = size => {\n            const geometry = new THREE.PlaneGeometry(size.width, size.height)\n            const material = new THREE.MeshBasicMaterial({\n              color: 0xffffff,\n              side: THREE.DoubleSide,\n              transparent: true,\n              opacity: 0.5\n            })\n            const mesh = new THREE.Mesh(geometry, material)\n            mesh.rotateX(Math.PI / 2)\n            const cnt = new THREE.Object3D()\n            cnt.add(mesh)\n            return cnt\n          }\n          const updateMatrix = (object, m) => {\n            object.matrixAutoUpdate = false\n            object.matrix.fromArray(m)\n          }\n          session.on('addAnchors', anchors => {\n            anchors.forEach(anchor => {\n              const size = anchor.size\n              let object\n              if (anchor.type == 0) {\n                object = createPlane(size)\n                this.setData({\n                  showTip: false\n                })\n              } else {\n                if (!this.model) {\n                  console.warn('this.model 还没加载完成 ！！！！！')\n                  return\n                }\n                object = new THREE.Object3D()\n                const model = this.getRobot()\n                model.rotateX(-Math.PI / 2)\n                object.add(model)\n              }\n\n              object._id = anchor.id\n              object._size = size\n              updateMatrix(object, anchor.transform)\n              this.planeBox.add(object)\n            })\n          })\n          session.on('updateAnchors', anchors => {\n            const map = anchors.reduce((temp, item) => {\n              temp[item.id] = item\n              return temp\n            }, {})\n            const deletePlaneBoxs = []\n            const newPlaneBoxs = []\n            this.planeBox.children.forEach(object => {\n              if (object._id && map[object._id]) {\n                const anchor = map[object._id]\n                const size = anchor.size\n                if (size && object._size && (size.width !== object._size.width || size.height !== object._size.height)) {\n                  // this.planeBox.remove(object)\n                  // object = createPlane(size)\n                  // this.planeBox.add(object)\n                  // 塞入删除队列\n                  deletePlaneBoxs.push(object)\n                  const newPlane = createPlane(size)\n                  newPlane._id = anchor.id\n                  newPlane._size = size\n                  updateMatrix(newPlane, anchor.transform)\n                  // 塞入添加队列\n                  newPlaneBoxs.push(newPlane)\n                } else {\n                  object._id = anchor.id\n                  object._size = size\n                  updateMatrix(object, anchor.transform)\n                }\n              }\n            })\n            // 延后删除\n            for (let i = 0; i < deletePlaneBoxs.length; i++) {\n              this.planeBox.remove(deletePlaneBoxs[i])\n            }\n            // 延后添加\n            for (let i = 0; i < newPlaneBoxs.length; i++) {\n              this.planeBox.add(newPlaneBoxs[i])\n            }\n          })\n          session.on('removeAnchors', anchors => {\n            const map = anchors.reduce((temp, item) => {\n              temp[item.id] = item\n              return temp\n            }, {})\n            const deletePlaneBoxs = []\n            this.planeBox.children.forEach(object => {\n              if (object._id && map[object._id]) {\n                // this.planeBox.remove(object)\n                // 塞入删除队列\n                deletePlaneBoxs.push(object)\n              }\n            })\n            // 延后删除\n            for (let i = 0; i < deletePlaneBoxs.length; i++) {\n              this.planeBox.remove(deletePlaneBoxs[i])\n            }\n          })\n\n          // 平面集合\n          const planeBox = this.planeBox = new THREE.Object3D()\n          this.scene.add(planeBox)\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n\n        const geometry = new THREE.BoxGeometry(1, 1, 1)\n\n        const scale = 0.1\n        const m1 = new THREE.MeshPhysicalMaterial({\n          metalness: 0.0,\n          roughness: 0.1,\n          color: 0xff0000,\n        })\n        const x = new THREE.Mesh(geometry, m1)\n        x.position.set(1.5 * scale, 0, 0)\n        x.scale.set(3 * scale, 0.1 * scale, 0.1 * scale)\n        scene.add(x)\n\n        const m2 = new THREE.MeshPhysicalMaterial({\n          metalness: 0.0,\n          roughness: 0.1,\n          color: 0x00ff00,\n        })\n        const y = new THREE.Mesh(geometry, m2)\n        y.position.set(0, 1.5 * scale, 0)\n        y.scale.set(0.1 * scale, 3 * scale, 0.1 * scale)\n        scene.add(y)\n\n        const m3 = new THREE.MeshPhysicalMaterial({\n          metalness: 0.0,\n          roughness: 0.1,\n          color: 0x0000ff,\n        })\n        const z = new THREE.Mesh(geometry, m3)\n        z.position.set(0, 0, 1.5 * scale)\n        z.scale.set(0.1 * scale, 0.1 * scale, 3 * scale)\n        scene.add(z)\n      },\n      updateAnimation() {\n        const dt = this.clock.getDelta()\n        if (this.mixers) this.mixers.forEach(mixer => mixer.update(dt))\n      },\n      copyRobot() {\n        const THREE = this.THREE\n        const {\n          scene,\n          animations\n        } = cloneGltf(this.model, THREE)\n        scene.scale.set(0.05, 0.05, 0.05)\n\n        // 动画混合器\n        const mixer = new THREE.AnimationMixer(scene)\n        for (let i = 0; i < animations.length; i++) {\n          const clip = animations[i]\n          if (clip.name === 'Dance') {\n            const action = mixer.clipAction(clip)\n            action.play()\n          }\n        }\n\n        this.mixers = this.mixers || []\n        this.mixers.push(mixer)\n\n        scene._mixer = mixer\n        return scene\n      },\n      getRobot() {\n        const THREE = this.THREE\n\n        const model = new THREE.Object3D()\n        model.add(this.copyRobot())\n\n        this._insertModels = this._insertModels || []\n        this._insertModels.push(model)\n\n        if (this._insertModels.length > 5) {\n          const needRemove = this._insertModels.splice(0, this._insertModels.length - 5)\n          needRemove.forEach(item => {\n            if (item._mixer) {\n              const mixer = item._mixer\n              this.mixers.splice(this.mixers.indexOf(mixer), 1)\n              mixer.uncacheRoot(mixer.getRoot())\n            }\n            if (item.parent) item.parent.remove(item)\n          })\n        }\n        return model\n      },\n      onTouchEnd(evt) {\n        if (this.scene && this.model && this.reticle) {\n          const model = this.getRobot()\n          model.position.copy(this.reticle.position)\n          model.rotation.copy(this.reticle.rotation)\n          this.scene.add(model)\n        }\n      }\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2/plane-ar-v2.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nlet time = 0\nconst countNumber = 20\nlet count = 0\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n    },\n    render(frame) {\n      const start = Date.now()\n\n      this.renderGL(frame)\n      const camera = frame.camera\n\n      // 修改光标位置\n      const reticle = this.reticle\n      if (reticle) {\n        const hitTestRes = this.session.hitTest(0.5, 0.5)\n        if (hitTestRes.length) {\n          reticle.matrixAutoUpdate = false\n          reticle.matrix.fromArray(hitTestRes[0].transform)\n          reticle.matrix.decompose(reticle.position, reticle.quaternion, reticle.scale)\n          if (reticle.position.z != 0) reticle.visible = true\n        } else {\n          reticle.visible = false\n        }\n      }\n\n      // 更新动画\n      this.updateAnimation()\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n\n      const end = Date.now()\n\n      time += end - start\n      count++\n      // if(count >= countNumber){\n      //   console.log(`${count}次平均耗时统计为${time/count}ms`)\n      //   count = 0\n      //   time = 0\n      // }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2/plane-ar-v2.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"水平面AR-v2\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2/plane-ar-v2.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n<view><canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n    <view wx:if=\"{{errMsg}}\" class=\"page-body-text tc\" style=\"position: absolute; top: {{height / 2}}px; left: {{width / 4}}px;  width:50%; color:red\">{{errMsg}}</view>\n    <cover-view wx:for=\"{{anchor2DList}}\" wx:key=\"id\" style=\"position: absolute; top: {{item.x}}px; left: {{item.y}}px; width: {{item.w}}px; height: {{item.h}}px; background-color: #FFF; opacity: 0.7;\"></cover-view>\n    <image wx:if=\"{{showTip}}\" style=\"position: absolute; top: 25%; left: 25%; width: 50%; height: 50%;\" src=\"./move.gif\"></image>\n</canvas>\n</view>\n<view class=\"page-body-text tc\" style=\"height:20%\">提示：触碰屏幕任意点, 可在真实水平位置生成示例的机器小人, 其中光标标记指示的是真实水平面</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2/plane-ar-v2.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-depth/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\nimport cloneGltf from '../loaders/gltf-clone'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.scene2) {\n          this.scene2.dispose()\n          this.scene2 = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.robotBox) this.robotBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n        const THREE = this.THREE\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        this.session = wx.createVKSession({\n          track: {\n            plane: {\n              mode: 1\n            },\n            depth: {\n              mode: 1\n            },\n          },\n          version: 'v2',\n          gl: this.gl,\n        })\n        const session = this.session\n        session.start(err => {\n          if (err) {\n            this.setData({\n              errMsg: 'VK error: ' + err\n            })\n            return console.error('VK error: ', err)\n          }\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          const loader = new THREE.GLTFLoader()\n          loader.load('https://dldir1.qq.com/weixin/miniprogram/RobotExpressive_aa2603d917384b68bb4a086f32dabe83.glb', gltf => {\n            this.model = {\n              scene: gltf.scene,\n              animations: gltf.animations,\n            }\n          })\n\n          this.clock = new THREE.Clock()\n\n          loader.load('https://dldir1.qq.com/weixin/miniprogram/reticle_4b6cc19698ca4a08b31fd3c95ce412ec.glb', gltf => {\n            const reticle = this.reticle = gltf.scene\n\n            reticle.visible = false\n            this.planeBox.add(reticle)\n          })\n\n          // anchor 检测\n          const createPlane = size => {\n            const geometry = new THREE.PlaneGeometry(size.width, size.height)\n            const material = new THREE.MeshBasicMaterial({\n              color: 0xffffff,\n              side: THREE.DoubleSide,\n              transparent: true,\n              opacity: 0.5\n            })\n            const mesh = new THREE.Mesh(geometry, material)\n            mesh.rotateX(Math.PI / 2)\n            const cnt = new THREE.Object3D()\n            cnt.add(mesh)\n            this.plane = cnt\n            this.plane.width = size.width\n            this.plane.height = size.height\n            return cnt\n          }\n          const updateMatrix = (object, m) => {\n            object.matrixAutoUpdate = false\n            object.matrix.fromArray(m)\n          }\n          session.on('addAnchors', anchors => {\n            anchors.forEach(anchor => {\n              const size = anchor.size\n              let object\n              if (size) {\n                //  object = createPlane(size)\n                this.planeBox.add(object)\n              } else {\n                if (!this.model) {\n                  console.warn('this.model 还没加载完成 ！！！！！')\n                  return\n                }\n                object = new THREE.Object3D()\n                const model = this.getRobot()\n                model.rotateX(-Math.PI / 2)\n                object.add(model)\n                this.robotBox.add(object)\n              }\n\n              if (object) {\n                object._id = anchor.id\n                object._size = size\n                updateMatrix(object, anchor.transform)\n              }\n            })\n          })\n          session.on('updateAnchors', anchors => {\n            const map = anchors.reduce((temp, item) => {\n              temp[item.id] = item\n              return temp\n            }, {})\n            this.planeBox.children.forEach(object => {\n              if (object._id && map[object._id]) {\n                const anchor = map[object._id]\n                const size = anchor.size\n                if (size && object._size && (size.width !== object._size.width || size.height !== object._size.height)) {\n                  this.planeBox.remove(object)\n                  //  object = createPlane(size)\n                  this.plane = object\n                  this.planeBox.add(object)\n                }\n                object._id = anchor.id\n                object._size = size\n                updateMatrix(object, anchor.transform)\n              }\n            })\n          })\n          session.on('removeAnchors', anchors => {\n            const map = anchors.reduce((temp, item) => {\n              temp[item.id] = item\n              return temp\n            }, {})\n            this.planeBox.children.forEach(object => {\n              if (object._id && map[object._id]) this.planeBox.remove(object)\n            })\n            this.robotBox.children.forEach(object => {\n              if (object._id && map[object._id]) this.robotBox.remove(object)\n            })\n          })\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                try {\n                  this.render(frame)\n                } catch (e) {\n                  console.log(e)\n                }\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n        // 平面集合\n        this.robotBox = new THREE.Object3D()\n        this.planeBox = new THREE.Object3D()\n        scene.add(this.robotBox)\n\n        this.scene2 = new THREE.Scene()\n        this.scene2.add(this.planeBox)\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n      updateAnimation() {\n        const dt = this.clock.getDelta()\n        if (this.mixers) this.mixers.forEach(mixer => mixer.update(dt))\n      },\n      copyRobot() {\n        const THREE = this.THREE\n        const {\n          scene,\n          animations\n        } = cloneGltf(this.model, THREE)\n        scene.scale.set(0.1, 0.1, 0.1)\n\n        // 动画混合器\n        const mixer = new THREE.AnimationMixer(scene)\n        for (let i = 0; i < animations.length; i++) {\n          const clip = animations[i]\n          if (clip.name === 'Dance') {\n            const action = mixer.clipAction(clip)\n            action.play()\n          }\n        }\n\n        this.mixers = this.mixers || []\n        this.mixers.push(mixer)\n\n        scene._mixer = mixer\n        return scene\n      },\n      getRobot() {\n        const THREE = this.THREE\n\n        const model = new THREE.Object3D()\n        model.add(this.copyRobot())\n\n        this._insertModels = this._insertModels || []\n        this._insertModels.push(model)\n\n        if (this._insertModels.length > 5) {\n          const needRemove = this._insertModels.splice(0, this._insertModels.length - 5)\n          needRemove.forEach(item => {\n            if (item._mixer) {\n              const mixer = item._mixer\n              this.mixers.splice(this.mixers.indexOf(mixer), 1)\n              mixer.uncacheRoot(mixer.getRoot())\n            }\n            if (item.parent) item.parent.remove(item)\n          })\n        }\n        return model\n      },\n      onTouchEnd(evt) {\n        if (this.reticle.visible) {\n          // 0.05 -0.47 -0.14\n          this.hitPosition = this.reticle.position.clone()\n          console.log(this.hitPosition)\n\n          const model = this.getRobot()\n          model.position.copy(this.hitPosition)\n          model.rotation.copy(this.reticle.rotation)\n          this.robotBox.add(model)\n        }\n      }\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-depth/depthBehavior.js",
    "content": "const depthBehavior = Behavior({\n  methods: {\n    initDepthShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_texture_float')\n      if (!ext) console.warn('OES_texture_float not support')\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        precision highp float;\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n        uniform sampler2D depth_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 depth_color = texture2D(depth_texture, v_texCoord);\n          gl_FragColor = vec4(depth_color.rgb, 1.0);\n        }\n      `\n\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._depthProgram = gl.createProgram()\n      this._depthProgram.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformTexture = gl.getUniformLocation(program, 'depth_texture')\n      gl.uniform1i(uniformTexture, 5)\n\n      this._depthDt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initDepthVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._depthProgram, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.3, 0.3, 1, 0.3, 0.3, 1, 1, 1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._depthProgram, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._depthVao = vao\n    },\n    initDepthGL() {\n      this.initDepthShader()\n      this.initDepthVAO()\n    },\n    renderDepthGL(frame) {\n      const gl = this.renderer.getContext()\n      const displayTransform = frame.getDisplayTransform()\n\n      // DepthBuffer\n      const depthBufferRes = frame.getDepthBuffer()\n      const depthBuffer = new Float32Array(depthBufferRes.DepthAddress)\n\n      const texture = gl.createTexture()\n      gl.bindTexture(gl.TEXTURE_2D, texture)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n\n      const width = depthBufferRes.width\n      const height = depthBufferRes.height\n\n      // const ext = gl.getExtension(\"OES_texture_float\");\n      // if (ext) {\n      //   gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.FLOAT, depthBuffer);\n      // } else {\n      // }\n\n      // 先直接采用 uint8 写入深度纹理，使用浮点写入的方法会存在锯齿\n      const data = new Uint8Array(width * height * 4)\n      for (let i = 0; i < depthBuffer.length; i++) {\n        const num = parseInt(depthBuffer[i] * 255)\n        data[i] = num\n      }\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data)\n\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n      gl.useProgram(this._depthProgram)\n      this.ext.bindVertexArrayOES(this._depthVao)\n\n      gl.uniformMatrix3fv(this._depthDt, false, displayTransform)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n      gl.bindTexture(gl.TEXTURE_2D, texture)\n\n      gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n      gl.useProgram(currentProgram)\n      gl.activeTexture(currentActiveTexture)\n      this.ext.bindVertexArrayOES(currentVAO)\n    },\n  },\n})\n\nexport default depthBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-depth/plane-ar-v2-depth.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\nimport depthBehavior from './depthBehavior'\n\nconst NEAR = 0.1\nconst FAR = 100\nlet cubeVao = null\nconst countNumber = 20\nlet count = 0\nlet time = 0\n\nconst CUBE_VSHADER_SOURCE =\n  `\n  #version 300 es \n  in vec3 aPosition; \n  uniform vec3 basePosition;\n  uniform mat4 viewMatrix;\n  uniform mat4 projMatrix;\n\n  void main(void) {\n    vec3 pos = vec3(aPosition.x * 0.05, aPosition.y * 0.05, aPosition.z * 0.05);\n    gl_Position = projMatrix * viewMatrix * vec4(basePosition + pos, 1.0);\n  }\n`\n\nconst CUBE_FSHADER_SOURCE =\n  `\n  #version 300 es \n  precision highp float;\n  out vec4 FragColor;\n\n  void main() {\n    FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n  }\n`\n\nfunction createCubeVAO(gl, program) {\n  const ext = gl.getExtension('OES_vertex_array_object')\n  const vao = ext.createVertexArrayOES()\n  ext.bindVertexArrayOES(vao)\n\n  const vertices = [\n    -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0,\n    1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0,\n    1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0,\n    1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0,\n    1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0,\n    -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n    -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0,\n    -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0,\n    -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0,\n    1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0,\n    -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0,\n    1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0\n  ]\n  const vertexBuffer = gl.createBuffer()\n  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)\n  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW)\n  const aPosition = gl.getAttribLocation(program, 'aPosition')\n  gl.enableVertexAttribArray(aPosition)\n  gl.vertexAttribPointer(aPosition, 3, gl.FLOAT, false, 0, 0)\n  vao.posBuffer = vertexBuffer\n  return vao\n}\n\nfunction onDrawCube(gl, program, hitPosition, vm, pm) {\n  const ext = gl.getExtension('OES_vertex_array_object')\n  const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n  const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n  const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n  const bindingTexture = gl.getParameter(gl.TEXTURE_BINDING_2D)\n\n  if (!cubeVao) {\n    cubeVao = createCubeVAO(gl, program)\n  } else {\n    ext.bindVertexArrayOES(cubeVao)\n  }\n  gl.useProgram(program)\n\n  const basePos = gl.getUniformLocation(program, 'basePosition')\n  gl.uniform3fv(basePos, [hitPosition.x, hitPosition.y, hitPosition.z])\n\n  const viewLoc = gl.getUniformLocation(program, 'viewMatrix')\n  gl.uniformMatrix4fv(viewLoc, false, vm)\n\n  const projLoc = gl.getUniformLocation(program, 'projMatrix')\n  gl.uniformMatrix4fv(projLoc, false, pm)\n\n  gl.drawArrays(gl.TRIANGLE_STRIP, 0, 36)\n\n  gl.useProgram(currentProgram)\n  ext.bindVertexArrayOES(currentVAO)\n  gl.activeTexture(currentActiveTexture)\n  gl.bindTexture(gl.TEXTURE_2D, bindingTexture)\n}\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior, depthBehavior],\n  data: {\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n     * 生命周期函数--监听页面加载\n     */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({\n          theme\n        }) => {\n          this.setData({\n            theme\n          })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n      this.initDepthGL()\n    },\n    render(frame) {\n      this.session.setDepthOccRange(NEAR, FAR)\n\n      const start = Date.now()\n\n      const gl = this.renderer.getContext()\n      gl.clear()\n      this.renderGL(frame)\n      const camera = frame.camera\n      // 修改光标位置\n      const reticle = this.reticle\n      if (reticle) {\n        const hitTestRes = this.session.hitTest(0.5, 0.5)\n        if (hitTestRes.length) {\n          reticle.matrixAutoUpdate = false\n          reticle.matrix.fromArray(hitTestRes[0].transform)\n          reticle.matrix.decompose(reticle.position, reticle.quaternion, reticle.scale)\n          reticle.visible = true\n        } else {\n          reticle.visible = false\n        }\n      }\n\n      // 更新动画\n      this.updateAnimation()\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.autoClearDepth = false\n\n      this.renderer.render(this.scene2, this.camera)\n      this.renderDepthGL(frame)\n\n      gl.depthFunc(gl.LESS)\n      this.renderer.render(this.scene, this.camera)\n\n      // if (!this.cubeProgram) {\n      //   this.cubeProgram = this.compileShader(gl, CUBE_VSHADER_SOURCE, CUBE_FSHADER_SOURCE)\n      // }\n\n      // if (this.hitPosition) {\n      //   onDrawCube(gl, this.cubeProgram, this.hitPosition, this.camera.matrixWorldInverse.elements, this.camera.projectionMatrix.elements)\n      // }\n\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n\n      const end = Date.now()\n\n      time += end - start\n      count++\n      if (count >= countNumber) {\n        // console.log(`${count}次平均耗时统计为${time/count}ms`)\n        count = 0\n        time = 0\n      }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-depth/plane-ar-v2-depth.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"水平面AR-v2-虚实遮挡\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-depth/plane-ar-v2-depth.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n<view><canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n    <view wx:if=\"{{errMsg}}\" class=\"page-body-text tc\" style=\"position: absolute; top: {{height / 2}}px; left: {{width / 4}}px;  width:50%; color:red\">{{errMsg}}</view>\n</canvas></view>\n<view class=\"page-body-text tc\" style=\"height:20%\">提示：触碰屏幕任意点, 可在真实水平位置生成示例的机器小人, 其中光标标记指示的是真实水平面, 通过场景深度信息可遮挡小人</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-depth/plane-ar-v2-depth.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-depth/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    compileShader(gl, vs, fs) {\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const program = gl.createProgram()\n      program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.deleteShader(vertShader)\n\n      if (fs) {\n        const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n        gl.shaderSource(fragShader, fs)\n        gl.compileShader(fragShader)\n        gl.attachShader(program, fragShader)\n        gl.deleteShader(fragShader)\n      }\n\n      gl.linkProgram(program)\n\n      if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n        const info = gl.getProgramInfoLog(program)\n        console.log(info)\n        throw new Error(`Could not compile WebGL program. \\n\\n${info}`)\n      }\n\n      gl.useProgram(program)\n\n      return program\n    },\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          v_texCoord = a_texCoord;\n          gl_Position = vec4(p.x, p.y, p.z, 1);\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n\n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const program = this._program = this.compileShader(gl, vs, fs)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n\n      const dvs = `#version 300 es\n      precision highp float;\n      in vec2 a_position;\n      in vec2 a_texCoord;\n      uniform mat3 displayTransform;\n      uniform sampler2D depth_texture;     \n      out vec2 v_texCoord;\n\n      void main() {\n        vec3 p = displayTransform * vec3(a_position, 1);\n        v_texCoord = a_texCoord;\n        vec4 depth_color = texture(depth_texture, v_texCoord);\n        gl_Position = vec4(p.x, p.y, p.z, 1);\n      }\n    `\n\n      const dfs = `#version 300 es\n      precision highp float;\n      uniform sampler2D depth_texture;      \n      out vec4 FragColor;\n      in vec2 v_texCoord;\n\n      void main() {\n        vec4 depth_color = texture(depth_texture, v_texCoord);\n        gl_FragDepth = depth_color.r;\n     //   FragColor = vec4(depth_color.rgb, 1.0);\n      }\n  `\n\n      const depthOutputProgram = this._depthOutputProgram = this.compileShader(gl, dvs, dfs)\n      const uniformDepthTexture = gl.getUniformLocation(depthOutputProgram, 'depth_texture')\n      gl.uniform1i(uniformDepthTexture, 5)\n      this._deptht = gl.getUniformLocation(depthOutputProgram, 'displayTransform')\n\n      gl.useProgram(currentProgram)\n    },\n    buildPlane(\n      vertices,\n      indices,\n      width,\n      height,\n      widthSegments,\n      heightSegments\n    ) {\n      const width_half = width / 2\n      const height_half = height / 2\n\n      const gridX = Math.floor(widthSegments)\n      const gridY = Math.floor(heightSegments)\n\n      const gridX1 = gridX + 1\n      const gridY1 = gridY + 1\n\n      const segment_width = width / gridX\n      const segment_height = height / gridY\n\n      for (let iy = 0; iy < gridY1; iy++) {\n        const y = iy * segment_height - height_half\n\n        for (let ix = 0; ix < gridX1; ix++) {\n          const x = ix * segment_width - width_half\n\n          vertices.push(\n            // a_position\n            x,\n            -y,\n            0,\n            // a_texCoord\n            ix / gridX,\n            1 - (iy / gridY)\n          )\n        }\n      }\n      for (let iy = 0; iy < gridY; iy++) {\n        for (let ix = 0; ix < gridX; ix++) {\n          const a = ix + gridX1 * iy\n          const b = ix + gridX1 * (iy + 1)\n          const c = (ix + 1) + gridX1 * (iy + 1)\n          const d = (ix + 1) + gridX1 * iy\n          indices.push(a, b, d)\n          indices.push(b, c, d)\n        }\n      }\n    },\n    initVAO(program) {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      if (!this.ext) this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      return vao\n    },\n    initDepthOutputVAO(program, width, height) {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n\n      if (!this.ext) {\n        this.ext = ext\n      }\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const vertices = []\n      const indices = []\n\n      this.buildPlane(vertices, indices, 1, 1, width, height)\n\n      const posAttr = gl.getAttribLocation(program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(indices), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      return vao\n    },\n    initGL() {\n      this.initShader()\n      this._vao = this.initVAO(this._program)\n    },\n    drawDepth(frame) {\n      const gl = this.renderer.getContext()\n      const displayTransform = frame.getDisplayTransform()\n\n      // DepthBuffer\n      const depthBufferRes = frame.getDepthBuffer()\n      const depthBuffer = new Float32Array(depthBufferRes.DepthAddress)\n\n      const texture = gl.createTexture()\n      gl.bindTexture(gl.TEXTURE_2D, texture)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n\n      const width = depthBufferRes.width\n      const height = depthBufferRes.height\n\n      // const ext = gl.getExtension(\"OES_texture_float\");\n      // if (ext) {\n      //   gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.FLOAT, depthBuffer);\n      // } else {\n      // }\n\n      // 先直接采用 uint8 写入深度纹理，使用浮点写入的方法会存在锯齿\n      const data = new Uint8Array(width * height * 4)\n      for (let i = 0; i < depthBuffer.length; i++) {\n        const num = parseInt(depthBuffer[i] * 255)\n        data[i] = num\n      }\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data)\n\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const bindingTexture = gl.getParameter(gl.TEXTURE_BINDING_2D)\n\n      if (!this._vao2) {\n        // this._vao2 = this.initDepthOutputVAO(this._depthOutputProgram, width, height)\n        this._vao2 = this.initVAO(this._depthOutputProgram)\n      }\n\n      this.ext.bindVertexArrayOES(this._vao2)\n      gl.useProgram(this._depthOutputProgram)\n\n      gl.uniformMatrix3fv(this._depthDt, false, displayTransform)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n      gl.bindTexture(gl.TEXTURE_2D, texture)\n\n      gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n      gl.activeTexture(gl.TEXTURE0 + 5)\n      gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n      gl.useProgram(currentProgram)\n      gl.activeTexture(currentActiveTexture)\n      gl.bindTexture(gl.TEXTURE_2D, bindingTexture)\n\n      this.ext.bindVertexArrayOES(currentVAO)\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n        const bindingTexture = gl.getParameter(gl.TEXTURE_BINDING_2D)\n\n        gl.enable(gl.DEPTH_TEST)\n        gl.depthMask(true)\n        gl.depthFunc(gl.ALWAYS)\n\n        this.drawDepth(frame)\n\n        gl.depthMask(false)\n\n        this.ext.bindVertexArrayOES(this._vao)\n        gl.useProgram(this._program)\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture)\n\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-marker/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\nimport cloneGltf from '../loaders/gltf-clone'\n\nconst info = wx.getSystemInfoSync()\n// 此处如果为jpeg,则后缀名也需要改成对应后缀\n// const filePath = `${wx.env.USER_DATA_PATH}/marker-ar1.jpg`\n// const mapfilePath = `${wx.env.USER_DATA_PATH}/marker-ar.jpg`\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n      markerId: [],\n      imgList: [],\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.6)\n\n            //  this.downloadFile()\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      chooseMedia() {\n        wx.chooseMedia({\n          count: 1,\n          mediaType: ['image'],\n          success: res => {\n            console.log('chooseMedia res', res)\n            const imgUrl = res.tempFiles[0].tempFilePath\n            wx.getImageInfo({\n              src: imgUrl,\n              success: res => {\n                const {\n                  width,\n                  height\n                } = res\n                console.log('getImageInfo res', res)\n\n                this.addMarker(imgUrl)\n              },\n              fail: res => {\n                console.error(res)\n              }\n            })\n          },\n          fail: res => {\n            console.error(res)\n          }\n        })\n      },\n      errImg(e) {\n        console.log('err img', e)\n      },\n      loadImg() {\n        console.log('load img')\n      },\n      add3DMarker() {\n        const mapfilePath = `${wx.env.USER_DATA_PATH}/marker-ar1.map`\n\n        console.log('now download....')\n\n        const fs = wx.getFileSystemManager()\n\n        const download = callback => wx.downloadFile({\n          // 此处设置为识别的2d对象的jpg地址\n          url: 'http://dldir1.qq.com/weixin/checkresupdate/ncov_7bf1a739c43f4f80b3fb3488b592f355.map',\n          success(res) {\n            console.log('downloadFile success:', res)\n            fs.saveFile({\n              mapfilePath,\n              tempFilePath: res.tempFilePath,\n              success: callback,\n            })\n          },\n          fail(e) {\n            console.log('downloadFile fail:', e)\n          }\n        })\n\n        const add = () => {\n          console.log('[add3DMarker] --> ', mapfilePath)\n\n          fs.access({\n            path: mapfilePath,\n            success(res) {\n              // 文件存在\n              console.log('文件存在')\n              console.log(res)\n            },\n            fail(res) {\n              // 文件不存在或其他错误\n              console.log('文件不存在')\n              console.error(res)\n            }\n          })\n          this.session.addMarker(mapfilePath)\n        }\n        download(add)\n      },\n      add3DMarker2() {\n        const mapfilePath = `${wx.env.USER_DATA_PATH}/marker-ar.map`\n\n        console.log('now download....')\n\n        const fs = wx.getFileSystemManager()\n\n        const download = callback => wx.downloadFile({\n          // 此处设置为识别的2d对象的jpg地址\n          url: 'http://dldir1.qq.com/weixin/checkresupdate/ncov_7bf1a739c43f4f80b3fb3488b592f355.map',\n          success(res) {\n            console.log('downloadFile success:', res)\n            fs.saveFile({\n              mapfilePath,\n              tempFilePath: res.tempFilePath,\n              success: callback,\n            })\n          },\n          fail(e) {\n            console.log('downloadFile fail:', e)\n          }\n        })\n\n        const add = () => {\n          console.log('[add3DMarker] --> ', mapfilePath)\n          this.session.addMarker(mapfilePath)\n        }\n        download(add)\n      },\n      addMarker(url) {\n        // if (this.data.markerId) return\n        const fs = wx.getFileSystemManager()\n        // 此处如果为jpeg,则后缀名也需要改成对应后缀\n        // const filePath = `${wx.env.USER_DATA_PATH}/marker-ar.map`\n        const filePath = `${wx.env.USER_DATA_PATH}/marker-ar` + this.data.markerId.length + '.jpeg'\n\n        const download = callback => {\n          fs.saveFile({\n            filePath,\n            tempFilePath: url,\n            success: callback,\n            fail: res => {\n              console.error(res)\n            }\n          })\n        }\n        const add = () => {\n          console.log('[addMarker' + this.data.markerId.length + '] --> ', filePath)\n          const id = this.session.addMarker(filePath)\n          this.data.markerId.push(id)\n          this.data.imgList.push(filePath)\n\n          this.setData({\n            markerId: this.data.markerId,\n            imgList: this.data.imgList\n          })\n        }\n        download(add)\n      },\n\n      removeAllMarker() {\n        if (this.data.markerId.length != 0) {\n          for (let i = 0; i < this.data.markerId.length; i++) {\n            this.session.removeMarker(this.data.markerId[i])\n          }\n          this.data.markerId = []\n          this.data.imgList = []\n          this.setData({\n            markerId: this.data.markerId,\n            imgList: this.data.imgList\n          })\n          this.removeRobot()\n        }\n      },\n      getAllMarker() {\n        console.log(this.session.getAllMarker())\n      },\n\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        this.session = wx.createVKSession({\n          track: {\n            plane: {\n              mode: 1\n            },\n            marker: true,\n          },\n          version: 'v2',\n          gl: this.gl,\n        })\n\n        const THREE = this.THREE\n\n        const session = this.session\n        session.start(err => {\n          if (err) {\n            this.setData({\n              errMsg: 'VK error: ' + err\n            })\n            return console.error('VK error: ', err)\n          }\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.6, info.pixelRatio)\n          })\n\n          const loader = new THREE.GLTFLoader()\n          loader.load('https://dldir1.qq.com/weixin/miniprogram/RobotExpressive_aa2603d917384b68bb4a086f32dabe83.glb', gltf => {\n            this.model = {\n              scene: gltf.scene,\n              animations: gltf.animations,\n            }\n\n            console.log('model加载完成')\n          })\n\n          this.clock = new THREE.Clock()\n\n          loader.load('https://dldir1.qq.com/weixin/miniprogram/reticle_4b6cc19698ca4a08b31fd3c95ce412ec.glb', gltf => {\n            const reticle = this.reticle = gltf.scene\n\n            reticle.visible = false\n            this.scene.add(reticle)\n          })\n\n          this.setData({\n            showTip: true\n          })\n          setTimeout(() => {\n            this.setData({\n              showTip: false\n            })\n          }, 10000)\n\n          // anchor 检测\n          const createPlane = size => {\n            const geometry = new THREE.PlaneGeometry(size.width, size.height)\n            const material = new THREE.MeshBasicMaterial({\n              color: 0xffffff,\n              side: THREE.DoubleSide,\n              transparent: true,\n              opacity: 0.5\n            })\n            const mesh = new THREE.Mesh(geometry, material)\n            mesh.rotateX(Math.PI / 2)\n            const cnt = new THREE.Object3D()\n            cnt.add(mesh)\n            return cnt\n          }\n          const updateMatrix = (object, m) => {\n            object.matrixAutoUpdate = false\n            object.matrix.fromArray(m)\n          }\n          session.on('addAnchors', anchors => {\n            console.log('add anchor')\n            anchors.forEach(anchor => {\n              console.log('type: ', anchor.type)\n              const size = anchor.size\n              let object\n              if (anchor.type == 0) {\n                object = createPlane(size)\n                this.setData({\n                  showTip: false\n                })\n              } else {\n                if (!this.model) {\n                  console.warn('this.model 还没加载完成 ！！！！！')\n                  return\n                }\n                object = new THREE.Object3D()\n                const model = this.getRobot()\n                model.rotateX(-Math.PI / 2)\n                object.add(model)\n              }\n\n              object._id = anchor.id\n              object._size = size\n              updateMatrix(object, anchor.transform)\n              this.planeBox.add(object)\n            })\n          })\n          session.on('updateAnchors', anchors => {\n            console.log('update')\n            const map = anchors.reduce((temp, item) => {\n              temp[item.id] = item\n              console.log(item.id, item)\n              return temp\n            }, {})\n            this.planeBox.children.forEach(object => {\n              if (object._id && map[object._id]) {\n                const anchor = map[object._id]\n                const size = anchor.size\n                if (size && object._size && (size.width !== object._size.width || size.height !== object._size.height)) {\n                  this.planeBox.remove(object)\n                  object = createPlane(size)\n                  this.planeBox.add(object)\n                }\n\n                object._id = anchor.id\n                object._size = size\n                updateMatrix(object, anchor.transform)\n              }\n            })\n          })\n          session.on('removeAnchors', anchors => {\n            console.log('remove anchor')\n            const map = anchors.reduce((temp, item) => {\n              console.log('type:', item.type)\n              temp[item.id] = item\n              return temp\n            }, {})\n            this.planeBox.children.forEach(object => {\n              if (object._id && map[object._id]) this.planeBox.remove(object)\n            })\n          })\n\n          // 平面集合\n          const planeBox = this.planeBox = new THREE.Object3D()\n          this.scene.add(planeBox)\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      removeRobot() {\n        this.planeBox.children.forEach(object => {\n          this.planeBox.remove(object)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n      updateAnimation() {\n        const dt = this.clock.getDelta()\n        if (this.mixers) this.mixers.forEach(mixer => mixer.update(dt))\n      },\n      copyRobot() {\n        const THREE = this.THREE\n        const {\n          scene,\n          animations\n        } = cloneGltf(this.model, THREE)\n        scene.scale.set(0.05, 0.05, 0.05)\n\n        // 动画混合器\n        const mixer = new THREE.AnimationMixer(scene)\n        for (let i = 0; i < animations.length; i++) {\n          const clip = animations[i]\n          if (clip.name === 'Dance') {\n            const action = mixer.clipAction(clip)\n            action.play()\n          }\n        }\n\n        this.mixers = this.mixers || []\n        this.mixers.push(mixer)\n\n        scene._mixer = mixer\n        return scene\n      },\n      getRobot() {\n        const THREE = this.THREE\n\n        const model = new THREE.Object3D()\n        model.add(this.copyRobot())\n\n        this._insertModels = this._insertModels || []\n        this._insertModels.push(model)\n\n        if (this._insertModels.length > 5) {\n          const needRemove = this._insertModels.splice(0, this._insertModels.length - 5)\n          needRemove.forEach(item => {\n            if (item._mixer) {\n              const mixer = item._mixer\n              this.mixers.splice(this.mixers.indexOf(mixer), 1)\n              mixer.uncacheRoot(mixer.getRoot())\n            }\n            if (item.parent) item.parent.remove(item)\n          })\n        }\n        return model\n      },\n      onTouchEnd(evt) {\n        if (this.scene && this.model && this.reticle) {\n          const model = this.getRobot()\n          model.position.copy(this.reticle.position)\n          model.rotation.copy(this.reticle.rotation)\n          this.scene.add(model)\n        }\n      }\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-marker/plane-ar-v2-marker.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nlet time = 0\nconst countNumber = 20\nlet count = 0\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n    },\n    render(frame) {\n      const start = Date.now()\n\n      this.renderGL(frame)\n      const camera = frame.camera\n\n      // 修改光标位置\n      const reticle = this.reticle\n      if (reticle) {\n        const hitTestRes = this.session.hitTest(0.5, 0.5)\n        if (hitTestRes.length) {\n          reticle.matrixAutoUpdate = false\n          reticle.matrix.fromArray(hitTestRes[0].transform)\n          reticle.matrix.decompose(reticle.position, reticle.quaternion, reticle.scale)\n          if (reticle.position.z != 0) reticle.visible = true\n        } else {\n          reticle.visible = false\n        }\n      }\n\n      // 更新动画\n      this.updateAnimation()\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n\n      const end = Date.now()\n\n      time += end - start\n      count++\n      // if(count >= countNumber){\n      //   console.log(`${count}次平均耗时统计为${time/count}ms`)\n      //   count = 0\n      //   time = 0\n      // }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-marker/plane-ar-v2-marker.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"水平面AR-v2-marker识别\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-marker/plane-ar-v2-marker.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n      <view wx:if=\"{{errMsg}}\" class=\"page-body-text tc\" style=\"position: absolute; top: {{height / 2}}px; left: {{width / 4}}px;  width:50%; color:red\">{{errMsg}}</view>\n      <image wx:if=\"{{showTip}}\" style=\"position: absolute; top: 25%; left: 25%; width: 50%; height: 50%;\" src=\"./move.gif\"></image>\n    </canvas>\n\n  <cover-view class=\"btn-cnt\">\n      <!-- <button type=\"primary\" style=\"width: 50vw;\" bindtap=\"add3DMarker\">添加3D marker</button>\n      <button type=\"primary\" style=\"width: 50vw;\" bindtap=\"add3DMarker2\">添加3D marker 2</button> -->\n      <button type=\"primary\" disabled=\"{{markerId.length == 0}}\"  style=\"width: 50vw;\" bindtap=\"removeAllMarker\">删除全部 marker</button>\n      <button type=\"primary\" disabled=\"{{markerId.length == 0}}\"  style=\"width: 50vw;\" bindtap=\"getAllMarker\">获取所有 marker</button>\n  </cover-view>\n\n\n  <view class=\"photo-cnt\">\n    <view class=\"page-body-text tc\" style=\"height:20%\">提示：触碰屏幕任意点, 光标标记指示的是真实水平面，触碰平面可以生成机器人，通过点击加号添加多张图片,进行marker识别</view>\n  </view>\n\n  <scroll-view class=\"scroll-view_H\" scroll-x type=\"list\" enable-flex style=\"width: 100%; height: 20vh; display:flex;\">\n  <view>\n    <image style=\"border-radius: 15px; width: 30vw; height: 30vw; margin-left: 0%\" bindtap=\"chooseMedia\" src=\"./add.png\" />\n  </view>  \n  <view wx:for=\"{{imgList}}\" wx:for-index=\"imgIndex\" wx:for-item=\"imgItem\">\n      <image  src=\"{{imgItem}}\" wx:if=\"{{imgItem}}\" style=\" border-radius: 15px; width: 30vw; height: 30vw; margin-left: 25 + {{imgIndex}} * 25%\" mode=\"aspectFit\" binderror=\"errImg\" bindload=\"loadImg\" data-err-img=\"{{imgIndex}}\" />\n  </view>\n      \n  </scroll-view>\n\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-marker/plane-ar-v2-marker.wxss",
    "content": ".btn-cnt {\n  display: flex;\n}\n\n.photo-cnt {\nposition: absolute;\nmargin-top: 60vh;\n}\n\n.btn-choose {\nflex:0 50%;\ndisplay: flex;\nheight: 5vh;\nmargin-bottom: 5vh;\n}\n\n.scroll-view_H {\n    white-space: nowrap;\n  }"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-marker/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-options/plane-ar-v2-options.js",
    "content": "import arBehavior from '../behavior/behavior-ar'\nimport threeBehavior from '../behavior/behavior-three'\n\n// VK 投影矩阵参数定义\nconst NEAR = 0.01\nconst FAR = 1000\n\nComponent({\n  behaviors: [arBehavior, threeBehavior],\n  data: {\n    theme: 'light',\n    widthScale: 1, // canvas宽度缩放值\n    heightScale: 0.6, // canvas高度缩放值\n    markerImgList: [], // 使用的 marker 列表\n    chooseImgList: [], // 使用的 图片 列表\n  },\n  markerIndex: 0, // 使用的 marker 索引\n  showBoxList: [], // 提示盒子列表,\n  hintCenter: null, // 红色提示点\n  useDepthBuffer: false, // 开启深度buffer\n  lifetimes: {\n    /**\n      * 生命周期函数--监听页面加载\n      */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n\n  methods: {\n    // 对应案例的初始化逻辑，由统一的 behavior 触发\n    init() {\n      // 初始化 Three.js，用于模型相关的渲染\n      this.initTHREE()\n      this.initDepthGL()\n\n      this.loader.load('https://dldir1.qq.com/weixin/miniprogram/reticle_4b6cc19698ca4a08b31fd3c95ce412ec.glb', gltf => {\n        const reticle = this.hintCenter = gltf.scene\n\n        reticle.visible = false\n        this.scene.add(reticle)\n      })\n\n      // 初始化 GL，基于 Three.js 的 Context，用于相机YUV渲染\n      this.initYUV()\n\n      // 初始化VK\n      // start完毕后，进行更新渲染循环\n      this.initVK()\n\n      this.markerIndex = 0\n      this.showBoxList = []\n      this.useDepthBuffer = false\n    },\n    initVK() {\n      // VKSession 配置\n      const session = this.session = wx.createVKSession({\n        track: {\n          plane: {\n            mode: 1\n          },\n          marker: true,\n        },\n        version: 'v2',\n        gl: this.gl\n      })\n\n      session.start(err => {\n        if (err) return console.error('VK error: ', err)\n\n        console.log('@@@@@@@@ VKSession.version', session.version)\n\n        //  VKSession EVENT resize\n        session.on('resize', () => {\n          this.calcCanvasSize()\n        })\n\n        // VKSession EVENT addAnchors\n        session.on('addAnchors', anchors => {\n          // console.log(\"addAnchor\", anchors);\n\n          anchors.forEach(anchor => {\n            const showBox = {\n              id: anchor.id,\n              size: anchor.size,\n              transform: anchor.transform\n            }\n\n            switch (anchor.type) {\n              case 0:\n                // plane Anchor\n                const boxPlane = this.createBox(0xffffff, anchor.type)\n                boxPlane.box.scale.set(showBox.size.width, 0.02, showBox.height)\n                console.log('boxPlane.size', showBox.size)\n\n                showBox.type = 'Plane'\n                showBox.wrap = boxPlane.wrap\n                showBox.box = boxPlane.box\n                break\n              case 1:\n                // marker Anchor\n                const boxMarker = this.createBox(0x55cc55, anchor.type)\n                boxMarker.box.scale.set(1, 0.1, 1)\n                console.log('boxMarker.size', showBox.size)\n\n                showBox.type = 'Marker'\n                showBox.wrap = boxMarker.wrap\n                showBox.box = boxMarker.box\n                break\n            }\n\n            this.showBoxList.push(showBox)\n          })\n\n          console.log('this.showBoxList', this.showBoxList)\n        })\n\n        // VKSession EVENT updateAnchors\n        session.on('updateAnchors', anchors => {\n          // plane + marker 模式下，可以有多个识别目标\n          // console.log('this.showBoxList', this.showBoxList)\n\n          // 仅更新已经添加的Anchor\n          this.showBoxList.forEach(showBox => {\n            for (let i = 0; i < anchors.length; i++) {\n              if (showBox.id === anchors[i].id) {\n                // 匹配\n                if (showBox.size !== anchors[i].size) {\n                  switch (showBox.type) {\n                    case 'Plane':\n                      showBox.box.scale.set(anchors[i].size.width, 0.02, anchors[i].size.height)\n                      break\n                    case 'Marker':\n                      break\n                  }\n                }\n                showBox.size = anchors[i].size\n                showBox.transform = anchors[i].transform\n                break\n              }\n            }\n          })\n        })\n\n        // VKSession removeAnchors\n        // 识别目标丢失时，会触发一次\n        session.on('removeAnchors', anchors => {\n          // console.log('removeAnchors', anchors)\n\n          // 存在要删除的 Anchor\n          if (anchors.length > 0) {\n            this.showBoxList = this.showBoxList.filter((showBox) => {\n              let flag = true\n              for (let i = 0; i < anchors.length; i++) {\n                if (showBox.id === anchors[i].id) {\n                  console.log('remove', showBox.id)\n                  let scene = this.scene\n                  if (showBox.type === 'Marker') {\n                    scene = this.sceneCull\n                  }\n                  // 从three里面去掉\n                  scene.remove(showBox.wrap)\n                  // 标记删除\n                  flag = false\n                  break\n                }\n              }\n              return flag\n            })\n          }\n        })\n\n        console.log('ready to initloop')\n        // start 初始化完毕后，进行更新渲染循环\n        this.initLoop()\n      })\n    },\n    loop() {\n      // console.log('loop')\n\n      // 获取 VKFrame\n      const frame = this.session.getVKFrame(this.canvas.width, this.canvas.height)\n\n      // 成功获取 VKFrame 才进行\n      if (!frame) { return }\n\n      // 更新相机 YUV 数据\n      this.renderYUV(frame)\n\n      // 获取 VKCamera\n      const VKCamera = frame.camera\n\n      // 相机\n      if (VKCamera) {\n        // 接管 ThreeJs 相机矩阵更新，Marker模式下，主要由视图和投影矩阵改变渲染效果\n        this.camera.matrixAutoUpdate = false\n\n        // 视图矩阵\n        this.camera.matrixWorldInverse.fromArray(VKCamera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        // 投影矩阵\n        const projectionMatrix = VKCamera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      // 更新提示盒子 位置\n      if (this.showBoxList) {\n        this.showBoxList.forEach(showBox => {\n          showBox.wrap.matrix.fromArray(showBox.transform)\n        })\n      }\n\n      const reticle = this.hintCenter\n      if (reticle) {\n        const hitTestRes = this.session.hitTest(0.5, 0.5)\n        if (hitTestRes.length) {\n          reticle.matrixAutoUpdate = false\n          reticle.matrix.fromArray(hitTestRes[0].transform)\n          reticle.matrix.decompose(reticle.position, reticle.quaternion, reticle.scale)\n          reticle.visible = true\n        } else {\n          reticle.visible = false\n        }\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.autoClearDepth = false\n\n      // 绘制提示的物体\n      this.renderer.state.setCullFace(this.THREE.CullFaceBack)\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n\n      if (this.useDepthBuffer) {\n        // 1. 在左下角绘制深度提示\n        // 2. 写入深度遮挡纹理到深度值\n        this.renderDepthGL(frame)\n      }\n      // 绘制进行深度遮挡的物体\n      this.renderer.render(this.sceneCull, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n    },\n    createBox(color, type) {\n      const THREE = this.THREE\n      let scene = this.scene\n\n      let material\n\n      // 根据类型添加不一样的行为\n      switch (type) {\n        case 0:\n          // plane Anchor\n          material = new THREE.MeshBasicMaterial({\n            metalness: 0.0,\n            roughness: 0.1,\n            color,\n            transparent: true,\n            opacity: 0.8\n          })\n          break\n        case 1:\n          // marker Anchor\n\n          const uniforms = {\n            time: { value: Math.random() * 100 }\n          }\n\n          material = new THREE.ShaderMaterial({\n            uniforms,\n            vertexShader: `\n              varying vec2 vUv;\n              void main()\t{\n                vUv = uv;\n                vec4 mvPosition =  modelViewMatrix * vec4( position, 1.0 );\n                gl_Position = projectionMatrix * mvPosition;\n              }\n            `,\n            fragmentShader: `varying vec2 vUv;\n              uniform float time;\n              void main()\t{\n                vec2 p = - 1.0 + 2.0 * vUv;\n                float a = time * 40.0;\n                float d, e, f, g = 1.0 / 40.0 ,h ,i ,r ,q;\n        \n                e = 400.0 * ( p.x * 0.5 + 0.5 );\n                f = 400.0 * ( p.y * 0.5 + 0.5 );\n                i = 200.0 + sin( e * g + a / 150.0 ) * 20.0;\n                d = 200.0 + cos( f * g / 2.0 ) * 18.0 + cos( e * g ) * 7.0;\n                r = sqrt( pow( abs( i - e ), 2.0 ) + pow( abs( d - f ), 2.0 ) );\n                q = f / r;\n                e = ( r * cos( q ) ) - a / 2.0;\n                f = ( r * sin( q ) ) - a / 2.0;\n                d = sin( e * g ) * 176.0 + sin( e * g ) * 164.0 + r;\n                h = ( ( f + d ) + a / 2.0 ) * g;\n                i = cos( h + r * p.x / 1.3 ) * ( e + e + a ) + cos( q * g * 6.0 ) * ( r + h / 3.0 );\n                h = sin( f * g ) * 144.0 - sin( e * g ) * 212.0 * p.x;\n                h = ( h + ( f - e ) * q + sin( r - ( a + h ) / 7.0 ) * 10.0 + i / 4.0 ) * g;\n                i += cos( h * 2.3 * sin( a / 350.0 - q ) ) * 184.0 * sin( q - ( r * 4.3 + a / 12.0 ) * g ) + tan( r * g + h ) * 184.0 * cos( r * g + h );\n                i = mod( i / 5.6, 256.0 ) / 64.0;\n                if ( i < 0.0 ) i += 4.0;\n                if ( i >= 2.0 ) i = 4.0 - i;\n                d = r / 350.0;\n                d += sin( d * d * 8.0 ) * 0.52;\n                f = ( sin( a * g ) + 1.0 ) / 2.0;\n                gl_FragColor = vec4( vec3( f * i / 1.6, i / 2.0 + d / 13.0, i ) * d * p.x + vec3( i / 1.3 + d / 8.0, i / 2.0 + d / 18.0, i ) * d * ( 1.0 - p.x ), 1.0 );\n              }`,\n          })\n\n          scene = this.sceneCull\n\n          break\n      }\n\n      const geometry = new THREE.BoxGeometry(1, 1, 1)\n\n      const wrap = new THREE.Object3D()\n      // 禁止矩阵自动更新，只能手动写入信息\n      wrap.matrixAutoUpdate = false\n\n      // 绘制区域的box\n      const box = new THREE.Mesh(geometry, material)\n      wrap.add(box)\n\n      scene.add(wrap)\n\n      box.visible = true\n\n      return {\n        wrap,\n        box,\n      }\n    },\n    chooseMedia() {\n      // marker图片上传逻辑\n      wx.chooseMedia({\n        count: 9,\n        mediaType: ['image'],\n        sizeType: ['original'],\n        success: res => {\n          console.log('chooseMedia res', res)\n\n          const chooseImgListRes = []\n          for (let i = 0; i < res.tempFiles.length; i++) {\n            const imgUrl = res.tempFiles[i].tempFilePath\n            chooseImgListRes.push(imgUrl)\n          }\n\n          console.log('set chooseImgList', chooseImgListRes)\n          this.setData({\n            chooseImgList: chooseImgListRes,\n          })\n        },\n        fail: res => {\n          console.error(res)\n        }\n      })\n    },\n    async addMarker() {\n      console.log('addMarker')\n      const fs = wx.getFileSystemManager()\n\n      const markerImgListRes = this.data.markerImgList.concat([])\n      const preMarkerIndex = this.markerIndex\n\n      console.log('pre markerImgList', preMarkerIndex, markerImgListRes)\n\n      // 检查与添加 marker 函数\n      const chooseImgCount = this.data.chooseImgList.length\n      let handledCount = 0\n      const checkMarkerAdded = () => {\n        if (handledCount === chooseImgCount) {\n          this.markerIndex = markerImgListRes.length\n\n          console.log('markerImgList set', markerImgListRes, this.markerIndex)\n          this.setData({\n            chooseImgList: [],\n            markerImgList: markerImgListRes\n          })\n        }\n      }\n\n      // 准备进行choose的图片保存到fs\n      for (let i = 0; i < chooseImgCount; i++) {\n        const chooseImgUrl = this.data.chooseImgList[i]\n        const fileEnd = chooseImgUrl.split('.').slice(-1)[0]\n        const fileIndex = preMarkerIndex + i\n        // 算法侧目前只认 map png jpg jpeg 后缀文件\n        const filePath = `${wx.env.USER_DATA_PATH}/marker-ar-${fileIndex}.${fileEnd}`\n\n        const saveAndAddMarker = () => {\n          console.log('saveFileSync start', filePath, chooseImgUrl)\n          // 存入文件系统，并添加到marker\n          fs.saveFile({\n            filePath,\n            tempFilePath: chooseImgUrl,\n            success: () => {\n              console.log('[addMarker] --> ', filePath)\n              const markerId = this.session.addMarker(filePath)\n              markerImgListRes.push({\n                markerId,\n                filePath\n              })\n              handledCount++\n              checkMarkerAdded()\n            },\n            fail: res => {\n              console.error(res)\n              console.log('文件保存失败', filePath)\n              handledCount++\n              checkMarkerAdded()\n            }\n          })\n        }\n\n        console.log('uploadFile Path', filePath)\n        // 确定文件，存在即删除\n        fs.stat({\n          path: filePath,\n          success: (res) => {\n            if (res.stats.isFile()) {\n              fs.unlinkSync(filePath)\n              console.log('fs unlinkSync', filePath)\n            }\n            saveAndAddMarker()\n          },\n          fail: (res) => {\n            console.error(res)\n            console.log('fs中不存在，直接写入', filePath)\n\n            saveAndAddMarker()\n          }\n        })\n      }\n    },\n    removeMarker() {\n      if (this.data.markerImgList) {\n        for (let i = 0; i < this.data.markerImgList.length; i++) {\n          const markerImg = this.data.markerImgList[i]\n          this.session.removeMarker(markerImg.markerId)\n        }\n        this.markerIndex = 0\n        this.setData({\n          markerImgList: [],\n        })\n      }\n    },\n    placeItem() {\n      if (this.hintCenter && this.hintCenter.visible) {\n        const THREE = this.THREE\n        const scene = this.sceneCull\n\n        // 加载模型\n        this.loader.load('https://dldir1.qq.com/weixin/miniprogram/RobotExpressive_aa2603d917384b68bb4a086f32dabe83.glb', gltf => {\n          const wrap = new THREE.Object3D()\n\n          wrap.add(gltf.scene)\n\n          scene.add(wrap)\n\n          const position = new THREE.Vector3()\n          const rotation = new THREE.Quaternion()\n          const scale = new THREE.Vector3()\n          this.hintCenter.matrix.decompose(position, rotation, scale)\n          wrap.position.set(position.x, position.y, position.z)\n          wrap.rotation.set(rotation.x, rotation.y, rotation.z, rotation.w)\n          wrap.scale.set(0.1, 0.1, 0.1)\n\n          console.log('model加载完成')\n\n          console.log('position', position.x, position.y, position.z)\n          // console.log('rotation', rotation.x, rotation.y, rotation.z, rotation.w);\n          // boxPlace.box.matrix.FromMatrix4(this.hintCenter.matrix);\n        })\n      }\n    },\n    changeDepthFlag() {\n      const depthNear = 0.1\n      const depthFar = 20\n      this.session.setDepthOccRange(depthNear, depthFar)\n\n      this.useDepthBuffer = !this.useDepthBuffer\n      this.session.setDepthSwitch(this.useDepthBuffer)\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-options/plane-ar-v2-options.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"平面AR附加能力\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-options/plane-ar-v2-options.wxml",
    "content": "\n<view class=\"page wrap-fix\" data-weui-theme=\"{{theme}}\">\n  <view class=\"canvas-wrap\" style=\"width: {{widthScale * 100}}%; height: {{heightScale * 100}}%\">\n    <canvas type=\"webgl\" id=\"canvas\"></canvas>\n    \n    <view class=\"hint-box\"  wx:for=\"{{hintBoxList}}\"  wx:for-item=\"hintBox\" wx:key=\"hintBoxId\"\n      style=\"left: {{hintBox.left}}%; top: {{hintBox.top}}%; width: {{hintBox.width}}px;  height: {{hintBox.height}}px;\"\n    >\n      <p class=\"hint-id\">识别id: {{hintBox.markerId}}</p>\n    </view>\n  </view>\n\n  <view class=\"hint-words\">提示：选择用于识别的图片, 点击添加为marker, 然后手机摄像头对准下方所选图片（需要基础库3.3.3）</view>\n\n  <view class=\"wrap-option\">\n    <view class=\"row\">\n      <button type=\"primary\" bindtap=\"placeItem\">识别点放置模型</button>\n      <!-- <button type=\"primary\" bindtap=\"changeDepthFlag\">开启关闭深度遮挡</button> -->\n    </view>\n    <view class=\"row\">\n      <button type=\"primary\" disabled=\"{{markerImgList.length === 0}}\" bindtap=\"removeMarker\">删除已有 marker</button>\n    </view>\n\n  </view>\n  <view class=\"wrap-marker\">\n    <view class=\"wrap-left\">\n      <button type=\"primary\" class=\"btn-left\" disabled=\"{{chooseImgList.length === 0}}\" bindtap=\"addMarker\">添加 marker</button>\n    </view>\n    <view class=\"wrap-right img-list\">\n      <view class=\"img-list\">\n        <image wx:for=\"{{markerImgList}}\"  wx:for-item=\"markerImg\" wx:key=\"markerIndex\" src=\"{{markerImg.filePath}}\" mode=\"aspectFit\" />\n      </view>\n      <view class=\"hint-empty\" wx:if=\"{{markerImgList.length === 0}}\">\n        <p>上传图片后点击左侧按钮<br/>将图片添加到 Marker 识别列表</p>\n      </view>\n    </view>\n  </view>\n  <view class=\"wrap-choose\">\n    <view class=\"wrap-left\">\n      <button type=\"primary\" class=\"btn-left\" bindtap=\"chooseMedia\">选择识别图片</button>\n    </view>\n    <view class=\"wrap-right\">\n      <view class=\"img-list\">\n        <image wx:for=\"{{chooseImgList}}\"  wx:for-item=\"chooseImg\" wx:key=\"chooseIndex\" src=\"{{chooseImg}}\" mode=\"aspectFit\" />\n      </view>\n      <view class=\"hint-empty\" wx:if=\"{{chooseImgList.length === 0}}\">\n        <p>点击左侧按钮上传图片（允许上传1-9张）</p>\n      </view>\n    </view>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/plane-ar-v2-options/plane-ar-v2-options.wxss",
    "content": ".canvas-wrap {\n  position: relative;\n  width: 100%;\n  background-color: #000;\n}\n\n.canvas-wrap #canvas {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.hint-box {\n  position: absolute;\n  left: 0%;\n  top: 0%;\n  width: 0;\n  height: 0;\n}\n.hint-id {\n  position: absolute;\n  left: -6rpx;\n  right: -6rpx;\n  bottom: 100%;\n  color: #fff;\n  font-size: 20rpx;\n  line-height: 40rpx;\n  text-align: center;\n  text-overflow: ellipsis;\n  background-color: #07c160;\n  border-radius: 8rpx;\n\n}\n\n.wrap-fix {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.hint-words {\n  position: absolute;\n  left: 20rpx;\n  top: 20rpx;\n  right: 20rpx;\n  padding: 10rpx 20rpx;\n  line-height: 40rpx;\n  text-align: center;\n  border-radius: 6rpx;\n  background-color: rgba(0, 0, 0, .3);\n  font-size: 26rpx;\n  color: #fff;\n}\n\n.wrap-left {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 30rpx;\n  width: 160rpx;\n}\n\nbutton.btn-left {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  padding: 12rpx;\n  font-size: 30rpx;\n  line-height: 1.2;\n}\n\n.wrap-right {\n  position: absolute;\n  left: 180rpx;\n  right: 20rpx;\n  top: 0;\n  bottom: 30rpx;\n  display: flex;\n}\n\n.img-list {\n  display: flex;\n  overflow: auto;\n}\n\n.img-list image {\n  height: 100%;\n}\n\n.hint-empty {\n  position: relative;\n  flex: 1;\n  border: 4rpx dotted rgba(0, 0, 0, .3);\n  border-radius: 6rpx;\n}\n\n.hint-empty p {\n  position: absolute;\n  left: 20rpx;\n  right: 20rpx;\n  top: 50%;\n  transform: translate(0, -50%);\n  text-align: center;\n  font-size: 26rpx;\n  color: rgba(0, 0, 0, .3);\n}\n\n.wrap-choose {\n  position: absolute;\n  left: 20rpx;\n  right: 20rpx;\n  bottom: 0;\n  height: 12%;\n}\n\n.wrap-marker {\n  position: absolute;\n  left: 20rpx;\n  right: 20rpx;\n  bottom: 12%;\n  height: 12%;\n}\n\n.wrap-option {\n  position: absolute;\n  left: 20rpx;\n  right: 0;\n  bottom: 24%;\n  height: 14%;\n  flex-direction: column;\n  display: flex;\n}\n\n.wrap-option .row {\n  flex: 1;\n  display: flex;\n  flex-direction: row;\n  text-align: center;\n}\n.wrap-option button {\n  flex: 1;\n  margin: 5rpx 20rpx 20rpx 0;\n  font-size: 30rpx;\n  line-height: 1.2;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/shoe-detect/shoe-detect.js",
    "content": "import arBehavior from '../behavior/behavior-ar'\nimport xrFrameBehavior from '../behavior/behavior-xrframe'\n\n// VK 投影矩阵参数定义\nconst NEAR = 0.01\nconst FAR = 1000\n\nconst loggerOnce = false\n\nComponent({\n  behaviors: [arBehavior, xrFrameBehavior],\n  data: {\n    theme: 'light',\n    cameraPosition: 0,\n    heightScale: 0.76,\n    buttonDisable: true,\n    isIOS: false,\n    showHintBox: false,\n    showLegMask: false,\n  },\n  hintBoxList: [], // 提示点集合\n  lifetimes: {\n    /**\n     * 生命周期函数--监听页面加载\n     */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      const systemInfo = wx.getSystemInfoSync()\n      this.setData({\n        theme: systemInfo.theme || 'light',\n        isIOS: systemInfo.platform === 'ios',\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({\n          theme\n        }) => {\n          this.setData({\n            theme\n          })\n        })\n      }\n    },\n  },\n  methods: {\n    // 对应案例的初始化逻辑，由统一的 behavior 触发\n    init() {\n      // 初始化VK\n      // start完毕后，进行更新渲染循环\n      this.initVK()\n    },\n    initVK() {\n      // VKSession 配置\n      const session = this.session = wx.createVKSession({\n        track: {\n          shoe: {\n            mode: 1\n          }\n        },\n        cameraPosition: 0,\n        version: 'v1',\n        gl: this.gl\n      })\n\n      try {\n      // VKSession start\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          if (!this.data.showLegMask) {\n          // 初始化设定\n            this.session.updateMaskMode({ useMask: false })\n          }\n\n          //  VKSession EVENT resize\n          session.on('resize', () => {\n            this.calcCanvasSize()\n          })\n\n          // VKSession EVENT addAnchors\n          session.on('addAnchors', anchors => {\n            // console.log(\"addAnchor\", anchors)\n          })\n\n          // VKSession EVENT updateAnchors\n          session.on('updateAnchors', anchors => {\n          // console.log(\"updateAnchors\")\n\n            if (anchors.length === 1) {\n            // 只有一双的情况下，可以做一个简单的显示性检测，进行非 remove 事件下的隐藏\n              const anchorSingle = anchors[0]\n              const shoedirecSingle = anchorSingle.shoedirec\n\n              if (shoedirecSingle === 0) {\n              // 只有左脚，此时尝试隐藏右脚\n                if (this.modelShowRight && this.modelTrsRight) {\n                // 右脚\n                  this.scaleTrs(this.modelTrsRight, 0, 0, 0)\n                  this.updateHintBoxVisible(this.hintBoxListRight, false)\n                  this.modelShowRight = false\n                }\n              } else if (shoedirecSingle === 1) {\n              // 只有右脚，此时尝试隐藏左脚\n                if (this.modelShowLeft && this.modelTrsLeft) {\n                // 左脚\n                  this.scaleTrs(this.modelTrsLeft, 0, 0, 0)\n                  this.updateHintBoxVisible(this.hintBoxListLeft, false)\n                  this.modelShowLeft = false\n                }\n              }\n            }\n\n            for (let i = 0; i < anchors.length; i++) {\n              const anchor = anchors[i]\n              // console.log('transform', anchor.transform);\n              // console.log('points3d', anchor.points3d);\n              const modelScale = 1\n\n              if (anchor.shoedirec === 0) {\n              // 左脚\n                this.shoeTransformLeft = anchor.transform\n                this.points3dLeft = anchor.points3d\n\n                if (!this.modelShowLeft && this.modelTrsLeft) {\n                  this.scaleTrs(this.modelTrsLeft, modelScale, modelScale, modelScale)\n                  this.updateHintBoxVisible(this.hintBoxListLeft, true)\n                  this.modelShowLeft = true\n                }\n              } else if (anchor.shoedirec === 1) {\n              // 右脚\n                this.shoeTransformRight = anchor.transform\n                this.points3dRight = anchor.points3d\n\n                if (!this.modelShowRight && this.modelTrsRight) {\n                  this.scaleTrs(this.modelTrsRight, modelScale, modelScale, modelScale)\n                  this.updateHintBoxVisible(this.hintBoxListRight, true)\n                  this.modelShowRight = true\n                }\n              }\n            }\n          })\n\n          // VKSession removeAnchors\n          // 识别目标丢失时，会不断触发\n          session.on('removeAnchors', anchors => {\n          // console.log(\"removeAnchors\")\n\n            // Hide\n            if (this.modelShowLeft && this.modelTrsLeft) {\n            // 左脚\n              this.scaleTrs(this.modelTrsLeft, 0)\n              this.updateHintBoxVisible(this.hintBoxListLeft, false)\n              this.modelShowLeft = false\n            }\n            if (this.modelShowRight && this.modelTrsRight) {\n            // 右脚\n              this.scaleTrs(this.modelTrsRight, 0)\n              this.updateHintBoxVisible(this.hintBoxListRight, false)\n              this.modelShowRight = false\n            }\n          })\n\n          console.log('ready to initloop')\n          // start 初始化完毕后，进行更新渲染循环\n          this.initLoop()\n        })\n      } catch (e) {\n        console.error(e)\n      }\n    },\n    // 针对 xr-frame 的初始化逻辑\n    async initXRFrame() {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const scene = this.xrScene\n      const { rootShadow } = scene\n\n      // 缓存主相机\n      this.xrCameraMain = this.xrCamera\n      this.xrCameraMainTrs = this.xrCameraTrs\n      // 试鞋案例，使用rt相机作为xrCamera\n      const xrCameraEl = scene.getElementById('rtCamera')\n      this.xrCamera = xrCameraEl.getComponent(xrFrameSystem.Camera)\n      this.xrCameraTrs = xrCameraEl.getComponent(xrFrameSystem.Transform)\n\n      // 初始化YUV相机配置\n      this.initXRYUVCamera()\n\n      // 初始化ShoeMask平面，会用绘制RT中物体\n      this.addShoeMaskPlane()\n\n      // 左右鞋子分别处理\n      const shoeFrontFix = 0.2 // 额外前移，适配鞋后\n      const shoeBottomFix = -0.4 // 额外下移，适配鞋底\n      // const shoeFrontFix = 0;\n      // const shoeBottomFix = 0;\n\n      const shoeScaleFactorX = 1.1 // 针对窄鞋缩放，优化效果\n\n      // 模型缩放\n      let modelScale = 220\n      // 针对 3.2.1 版本基础库，iOS 试鞋，返回的投影矩阵，进行的兼容修复\n      if (!this.data.isIOS) {\n        modelScale *= 1.2\n      }\n\n      // 遮挡模型\n      const occGeometry = scene.assets.getAsset('geometry', 'cylinder')\n      const occEffect = scene.assets.getAsset('effect', 'standard')\n\n      // === 左边鞋子流程 ===\n      // 初始化挂载点\n      this.modelWrapLeft = scene.createElement(xrFrameSystem.XRNode)\n      this.modelWrapTrsLeft = this.modelWrapLeft.getComponent(xrFrameSystem.Transform)\n      rootShadow.addChild(this.modelWrapLeft)\n\n      console.log('modelWrapLeft ready')\n\n      // 点挂载\n      const modelPointLeft = scene.createElement(xrFrameSystem.XRNode, {\n        position: '0 0 0',\n        scale: '0 0 0',\n      })\n      this.modelTrsLeft = modelPointLeft.getComponent(xrFrameSystem.Transform)\n      this.modelShowLeft = false\n      this.modelWrapLeft.addChild(modelPointLeft)\n\n      // 加载鞋子模型\n      const shoeModelLeft = await scene.assets.loadAsset({\n        type: 'gltf',\n        assetId: 'gltf-shoe-left',\n        src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/shoe-1-left.glb',\n      })\n      console.log('shoeModelLeft', shoeModelLeft.value)\n      const elLeft = scene.createElement(xrFrameSystem.XRGLTF, {\n        model: 'gltf-shoe-left',\n        position: `0 ${shoeBottomFix} ${shoeFrontFix}`,\n        scale: `${modelScale * shoeScaleFactorX} ${modelScale} ${modelScale}`,\n        layer: 2\n      })\n      this.modelLeft = elLeft\n      // this.modelTrsLeft = elLeft.getComponent(xrFrameSystem.Transform);\n      // this.modelShowLeft = false;\n      // this.modelWrapLeft.addChild(elLeft);\n      modelPointLeft.addChild(elLeft)\n\n      // 遮挡模型\n      const occlusionLeft = scene.createElement(xrFrameSystem.XRNode, {\n        position: '0.1 3.5 -2.3',\n        rotation: '-20 0 0',\n        scale: '1.5 2 1.6',\n        layer: 2\n      })\n      const occMatLeft = scene.createMaterial(occEffect)\n      // 遮挡渲染状态\n      occMatLeft.renderQueue = 1\n      occMatLeft.alphaMode = 'BLEND'\n      occMatLeft.setVector('u_baseColorFactor', xrFrameSystem.Vector4.createFromNumber(1.0, 1.0, 1.0, 0.0))\n      const occMeshLeft = occlusionLeft.addComponent(xrFrameSystem.Mesh, {\n        geometry: occGeometry,\n        material: occMatLeft,\n      })\n      modelPointLeft.addChild(occlusionLeft)\n\n      // left done\n      console.log('this.modelTrsLeft', this.modelTrsLeft)\n      console.log('shoeModelLeft ready')\n\n      // 加载提示点\n      this.hintBoxListLeft = this.getHintBox(xrFrameSystem, scene, this.modelWrapLeft)\n\n      // === 右边鞋子流程 ===\n      // 初始化挂载点\n      this.modelWrapRight = scene.createElement(xrFrameSystem.XRNode)\n      this.modelWrapTrsRight = this.modelWrapRight.getComponent(xrFrameSystem.Transform)\n      rootShadow.addChild(this.modelWrapRight)\n\n      console.log('modelWrapRight ready')\n\n      // 点挂载\n      const modelPointRight = scene.createElement(xrFrameSystem.XRNode, {\n        position: '0 0 0',\n        scale: '0 0 0',\n      })\n      this.modelTrsRight = modelPointRight.getComponent(xrFrameSystem.Transform)\n      this.modelShowRight = false\n      this.modelWrapRight.addChild(modelPointRight)\n\n      // 加载鞋子模型\n      const shoeModelRight = await scene.assets.loadAsset({\n        type: 'gltf',\n        assetId: 'gltf-shoe-right',\n        src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/shoe-1-right.glb',\n      })\n      console.log('shoeModelRight', shoeModelRight.value)\n      const elRight = scene.createElement(xrFrameSystem.XRGLTF, {\n        model: 'gltf-shoe-right',\n        position: `0 ${shoeBottomFix} ${shoeFrontFix}`,\n        scale: `${modelScale * shoeScaleFactorX} ${modelScale} ${modelScale}`,\n        layer: 2\n      })\n      this.modelRight = elRight\n      // this.modelTrsRight = elRight.getComponent(xrFrameSystem.Transform);\n      // this.modelShowRight = false;\n      // this.modelWrapRight.addChild(elRight);\n      modelPointRight.addChild(elRight)\n\n      // 遮挡模型\n      const occlusionRight = scene.createElement(xrFrameSystem.XRNode, {\n        position: '0.1 3.5 -2.3',\n        rotation: '-20 0 0',\n        scale: '1.5 2 1.6',\n        layer: 2\n      })\n      const occMatRight = scene.createMaterial(occEffect)\n      // 遮挡渲染状态\n      occMatRight.renderQueue = 1\n      occMatRight.alphaMode = 'BLEND'\n      occMatRight.setVector('u_baseColorFactor', xrFrameSystem.Vector4.createFromNumber(1.0, 1.0, 1.0, 0.0))\n      const occMeshRight = occlusionRight.addComponent(xrFrameSystem.Mesh, {\n        geometry: occGeometry,\n        material: occMatRight,\n      })\n      modelPointRight.addChild(occlusionRight)\n\n      // right done\n      console.log('this.modelTrsRight', this.modelTrsRight)\n      console.log('shoeModelRight ready')\n\n      // 加载提示点\n      this.hintBoxListRight = this.getHintBox(xrFrameSystem, scene, this.modelWrapRight)\n    },\n    loop() {\n      // console.log('loop')\n      // 获取 VKFrame\n      const frame = this.session.getVKFrame(this.data.domWidth, this.data.domHeight)\n\n      // 成功获取 VKFrame 才进行\n      if (!frame) { return }\n\n      // 更新腿部分割纹理\n      if (this.data.showLegMask) {\n        this.updateShoeMask(frame)\n        // console.log(getLegSegmentBuffer);\n      }\n\n      // 更新相机 YUV 数据\n      this.updataXRYUV(frame)\n\n      // 获取 VKCamera\n      const VKCamera = frame.camera\n\n      // 更新 xrFrame 相机矩阵\n      this.updataXRCameraMatrix(VKCamera, NEAR, FAR)\n\n      // 存在model，更新矩阵\n      // 左边鞋子流程\n      if (this.modelWrapLeft && this.modelTrsLeft && this.points3dLeft && this.shoeTransformLeft) {\n        const xrFrameSystem = wx.getXrFrameSystem()\n\n        if (!this.DT) { this.DT = new xrFrameSystem.Matrix4() }\n        if (!this.DT2) { this.DT2 = new xrFrameSystem.Matrix4() }\n\n        // 目前VK返回的是行主序矩阵\n        // xrframe 矩阵存储为列主序\n        this.DT.setArray(this.shoeTransformLeft)\n        this.DT.transpose(this.DT2)\n        this.modelWrapTrsLeft.setLocalMatrix(this.DT2)\n\n        // 放置鞋子\n        this.modelTrsLeft.position.x = (this.points3dLeft[3].x + this.points3dLeft[4].x) / 2\n        this.modelTrsLeft.position.y = (this.points3dLeft[3].y + this.points3dLeft[4].y) / 2\n        this.modelTrsLeft.position.z = (this.points3dLeft[0].z + this.points3dLeft[1].z) / 2\n\n        this.updateHintBoxPosition(this.hintBoxListLeft, this.points3dLeft)\n      }\n      // 右边鞋子流程\n      if (this.modelWrapRight && this.modelTrsRight && this.points3dRight && this.shoeTransformRight) {\n        const xrFrameSystem = wx.getXrFrameSystem()\n\n        if (!this.DT) { this.DT = new xrFrameSystem.Matrix4() }\n        if (!this.DT2) { this.DT2 = new xrFrameSystem.Matrix4() }\n\n        // 目前VK返回的是行主序矩阵\n        // xrframe 矩阵存储为列主序\n        this.DT.setArray(this.shoeTransformRight)\n        this.DT.transpose(this.DT2)\n        this.modelWrapTrsRight.setLocalMatrix(this.DT2)\n\n        // 放置鞋子\n        this.modelTrsRight.position.x = (this.points3dRight[3].x + this.points3dRight[4].x) / 2\n        this.modelTrsRight.position.y = (this.points3dRight[3].y + this.points3dRight[4].y) / 2\n        this.modelTrsRight.position.z = (this.points3dRight[0].z + this.points3dRight[1].z) / 2\n\n        this.updateHintBoxPosition(this.hintBoxListRight, this.points3dRight)\n      }\n    },\n    // 缩放 xr-frame TRS\n    scaleTrs(trs, scaleX, scaleY, scaleZ) {\n      trs.scale.x = scaleX\n      trs.scale.y = scaleY\n      trs.scale.z = scaleZ\n    },\n    getHintBox(xrFrameSystem, scene, wrap) {\n      // 初始化提示点\n      const geometryCube = scene.assets.getAsset('geometry', 'cube')\n      const effectCube = scene.assets.getAsset('effect', 'standard')\n      const boxScale = 0.2\n      const hintBoxList = []\n      for (let i = 0; i < 8; i++) {\n        const colorFloat = i / 16\n        const el = scene.createElement(xrFrameSystem.XRNode, {\n          position: '0 0 0',\n          scale: `${boxScale} ${boxScale} ${boxScale}`,\n          layer: 2\n        })\n        const elTrs = el.getComponent(xrFrameSystem.Transform)\n        const mat = scene.createMaterial(effectCube)\n        mat.setVector('u_baseColorFactor', xrFrameSystem.Vector4.createFromNumber(colorFloat + 0.3, 0.2, 0.2, 1.0))\n        mat.renderQueue = 9990\n        mat.setRenderState('depthTestOn', false)\n\n        const mesh = el.addComponent(xrFrameSystem.Mesh, {\n          geometry: geometryCube,\n          material: mat,\n        })\n\n        wrap.addChild(el)\n        elTrs.visible = false\n\n        hintBoxList.push(elTrs)\n      }\n\n      return hintBoxList\n    },\n    updateHintBoxVisible(hintBoxList, visible) {\n      if (hintBoxList && hintBoxList.length > 0) {\n        // 存在提示列表，则更新点信息\n        for (let i = 0; i < hintBoxList.length; i++) {\n          const hintBox = hintBoxList[i]\n          const visibleFlag = this.data.showHintBox && visible\n          if (hintBox.visible !== visibleFlag) {\n            hintBox.visible = visibleFlag\n          }\n        }\n      }\n    },\n    updateHintBoxPosition(hintBoxList, points3d) {\n      if (hintBoxList && hintBoxList.length > 0) {\n        // console.log('ready to set', hintBoxList);\n        // 存在提示列表，则更新点信息\n        for (let i = 0; i < hintBoxList.length; i++) {\n          const hintBox = hintBoxList[i]\n          hintBox.position.x = points3d[i].x\n          hintBox.position.y = points3d[i].y\n          hintBox.position.z = points3d[i].z\n        }\n      }\n    },\n    addShoeMaskPlane() {\n      const scene = this.xrScene\n      const { rootShadow } = scene\n\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      const el = scene.createElement(xrFrameSystem.XRNode, {\n        layer: 1\n      })\n\n      const shoeMaskGeometry = scene.assets.getAsset('geometry', 'ar-camera-plane')\n      let shoeMaskEffect = scene.assets.getAsset('effect', 'ar-shoe-mask')\n\n      if (!shoeMaskEffect) {\n        xrFrameSystem.registerEffect('ar-shoe-mask', scene => scene.createEffect({\n          properties: [\n            { key: 'u_baseColorFactor', type: xrFrameSystem.EUniformType.FLOAT4, default: [1, 1, 1, 1] },\n          ],\n          images: [\n            {\n              key: 'u_shoeMask',\n              default: 'black',\n              macro: 'WX_AR_SHOEMASk'\n            },\n            {\n              key: 'u_renderTexture',\n              default: 'black',\n              macro: 'WX_AR_RENDERTEXTURE'\n            },\n          ],\n          defaultRenderQueue: 2,\n          passes: [{\n            renderStates: {\n              blendOn: true,\n              depthWrite: false,\n              // Default FrontFace is CW\n              cullOn: true,\n              cullFace: xrFrameSystem.ECullMode.BACK,\n            },\n            lightMode: 'ForwardBase',\n            useMaterialRenderStates: true,\n            shaders: [0, 1]\n          }],\n          shaders:\n          [\n            `#version 100\n            attribute vec3 a_position;\n            attribute vec2 a_texCoord;\n  \n            precision highp float;\n  \n            varying highp vec2 v_texCoord;\n  \n            void main() {\n                v_texCoord = a_texCoord;\n                vec4 pos = vec4(a_position.xy, 1., 1.);\n                gl_Position =  pos;\n            }\n            `,\n            `#version 100\n            precision mediump float;\n            precision highp int;\n  \n            uniform sampler2D u_shoeMask;\n            uniform sampler2D u_renderTexture;\n  \n            varying highp vec2 v_texCoord;\n  \n            void main()\n            {\n              vec2 uv = vec2(v_texCoord.x, v_texCoord.y);  \n              vec4 renderTexture = texture2D(u_renderTexture, uv);\n\n              #ifdef WX_USE_SHOEMASK\n                // 透明度混合\n                vec2 uvFlip = vec2(v_texCoord.x, 1.0 - v_texCoord.y);\n                vec4 shoeMask = texture2D(u_shoeMask, uvFlip);\n\n                if (shoeMask.r > 0.0) {\n                  float alpha = renderTexture.w * (1.0 - shoeMask.r);\n                  gl_FragData[0] = vec4(renderTexture.x, renderTexture.y, renderTexture.z, alpha);\n                } else {\n                  gl_FragData[0] = vec4(renderTexture.x, renderTexture.y, renderTexture.z, renderTexture.w);\n                }\n              #else\n                gl_FragData[0] = vec4(renderTexture.x, renderTexture.y, renderTexture.z, renderTexture.w);\n\n              #endif\n            }\n            `\n          ]\n        }))\n        shoeMaskEffect = scene.assets.getAsset('effect', 'ar-shoe-mask')\n      }\n\n      const shoeMaskMat = scene.createMaterial(shoeMaskEffect)\n\n      // 获取屏幕renderTexture\n      this.renderTexture = scene.assets.getAsset('render-texture', 'rt')\n      shoeMaskMat.setTexture('u_renderTexture', this.renderTexture.texture)\n\n      shoeMaskMat.renderQueue = 2 // 第二个绘制\n      const mesh = el.addComponent(xrFrameSystem.Mesh, {\n        geometry: shoeMaskGeometry,\n        material: shoeMaskMat\n      })\n\n      // ShoeMask纹理\n      this.shoeMaskMat = shoeMaskMat\n      this.shoeMaskMatInit = false\n\n      // 不进入正常的剔除\n      rootShadow.addChild(el)\n    },\n    updateShoeMask(frame) {\n      const scene = this.xrScene\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      // 腿部分割\n      const legSegmentBuffer = frame.getLegSegmentBuffer()\n      // 存在数据才进行rt初始化\n      if (legSegmentBuffer && legSegmentBuffer.width > 0 && legSegmentBuffer.height > 0) {\n        // 存在数据，开启宏\n        this.shoeMaskMat.setMacro('WX_USE_SHOEMASK', true)\n\n        // 未创建贴图缓存，先创建\n        if (!this.shoeMaskTexure) {\n          this.shoeMaskTexure = scene.createTexture({\n            width: legSegmentBuffer.width,\n            height: legSegmentBuffer.height,\n            source: [legSegmentBuffer.MaskAddress],\n            magFilter: xrFrameSystem.EFilterMode.LINEAR,\n            minFilter: xrFrameSystem.EFilterMode.LINEAR,\n            pixelFormat: xrFrameSystem.ETextureFormat.R8\n          })\n        }\n\n        const shoeMaskMat = this.shoeMaskMat\n        // 未绑定贴图的情况下，绑定贴图\n        if (!this.shoeMaskMatInit) {\n          shoeMaskMat.setTexture('u_shoeMask', this.shoeMaskTexure)\n          this.shoeMaskMatInit = true\n        }\n\n        this.shoeMaskTexure.update({ buffer: legSegmentBuffer.MaskAddress })\n      } else {\n        console.error('getLegSegmentBuffer is empty', legSegmentBuffer, legSegmentBuffer.width, legSegmentBuffer.height)\n      }\n    },\n    // 点击腿Mask切换\n    onTapMask() {\n      const maskFlag = !this.data.showLegMask\n\n      if (this.session && this.session.updateMaskMode) {\n        // 开启关闭 shoeMask\n        this.session.updateMaskMode({ useMask: maskFlag })\n\n        if (!maskFlag) {\n          this.shoeMaskMat.setMacro('WX_USE_SHOEMASK', false)\n        }\n\n        this.setData({\n          showLegMask: maskFlag\n        })\n      } else {\n        console.error('请初始化vk后，再点击切换按钮')\n      }\n    },\n    // 点击提示点切换\n    onTapHint() {\n      const hintFlag = !this.data.showHintBox\n\n      this.setData({\n        showHintBox: hintFlag\n      })\n\n      // nextTick 保证 setData\n      setTimeout(() => {\n        if (this.modelShowLeft && this.modelTrsLeft) {\n          // 左脚\n          this.updateHintBoxVisible(this.hintBoxListLeft, hintFlag)\n        }\n        if (this.modelShowRight && this.modelTrsRight) {\n          // 右脚\n          this.updateHintBoxVisible(this.hintBoxListRight, hintFlag)\n        }\n      }, 33)\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/shoe-detect/shoe-detect.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-frame-canvas\": \"../components/xr-frame/index\"\n  },\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"实时鞋部检测-试鞋案例\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/shoe-detect/shoe-detect.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view\n    class=\"canvas-wrap\" style=\"width: {{widthScale * 100}}%; height: {{heightScale * 100}}%\"\n  >\n    <xr-frame-canvas\n      disable-scroll\n      id=\"canvas\"\n      width=\"{{width}}\"\n      height=\"{{height}}\"\n      style=\"width:{{domWidth}}px;height:{{domHeight}}px;\"\n      bind:sceneReady=\"handleXRSceneReady\"\n    ></xr-frame-canvas>\n\n  </view>\n\n\n  <view class=\"hint-bottom page-body-text tc\">\n      <view class=\"btn-wrap\">\n        <button class=\"btn\" type=\"primary\" bindtap=\"onTapMask\">\n          开关腿部遮挡 (状态{{showLegMask ? \"开启\" : \"关闭\"}})\n        </button>\n        <button class=\"btn\" type=\"primary\" bindtap=\"onTapHint\">\n          开关鞋提示点 (状态{{showHintBox ? \"开启\" : \"关闭\"}})\n        </button>\n      </view>\n      <text>提示：将摄像头对准鞋部, 检测到的鞋部将会被标记出识别框和鞋部标记点（基础库 3.2.1 起支持）</text>\n  </view>\n\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/shoe-detect/shoe-detect.wxss",
    "content": ".canvas-wrap {\n    position: relative;\n    width: 100%;\n    background-color: #000;\n}\n\n.canvas-wrap canvas {\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n}\n\n.canvas-wrap #canvas {\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n}\n\n.hint-bottom {\n    position: absolute;\n    left: 20px;\n    right: 20px;\n    bottom: 20px;\n    padding: 5px 10px;\n    font-size: 14px;\n    color: #fff;\n    background-color: rgba(0, 0, 0, 0.4);\n    border-radius: 6px;\n}\n\n.hint-bottom .btn-wrap {\n    display: flex;\n}\n\n.hint-bottom .btn{\n    margin: 10px 5px;\n    font-size: 14px;\n    line-height: 18px;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/visionkit-basic/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\nimport cloneGltf from '../loaders/gltf-clone'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n        const THREE = this.THREE\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            plane: {\n              mode: 1\n            },\n          },\n          version: 'v1',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          const loader = new THREE.GLTFLoader()\n          loader.load('https://dldir1.qq.com/weixin/miniprogram/RobotExpressive_aa2603d917384b68bb4a086f32dabe83.glb', gltf => {\n            this.model = {\n              scene: gltf.scene,\n              animations: gltf.animations,\n            }\n          })\n\n          this.clock = new THREE.Clock()\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n\n      copyRobot() {\n        const THREE = this.THREE\n        const {\n          scene,\n          animations\n        } = cloneGltf(this.model, THREE)\n        scene.scale.set(0.05, 0.05, 0.05)\n\n        // 动画混合器\n        const mixer = new THREE.AnimationMixer(scene)\n        for (let i = 0; i < animations.length; i++) {\n          const clip = animations[i]\n          if (clip.name === 'Dance') {\n            const action = mixer.clipAction(clip)\n            action.play()\n          }\n        }\n\n        this.mixers = this.mixers || []\n        this.mixers.push(mixer)\n\n        scene._mixer = mixer\n        return scene\n      },\n      getRobot() {\n        const THREE = this.THREE\n\n        const model = new THREE.Object3D()\n        model.add(this.copyRobot())\n\n        this._insertModels = this._insertModels || []\n        this._insertModels.push(model)\n\n        if (this._insertModels.length > 5) {\n          const needRemove = this._insertModels.splice(0, this._insertModels.length - 5)\n          needRemove.forEach(item => {\n            if (item._mixer) {\n              const mixer = item._mixer\n              this.mixers.splice(this.mixers.indexOf(mixer), 1)\n              mixer.uncacheRoot(mixer.getRoot())\n            }\n            if (item.parent) item.parent.remove(item)\n          })\n        }\n\n        return model\n      },\n      onTouchEnd(evt) {\n        // 点击位置放一个机器人\n        const touches = evt.changedTouches.length ? evt.changedTouches : evt.touches\n        if (touches.length === 1) {\n          const touch = touches[0]\n          if (this.session && this.scene && this.model) {\n            const hitTestRes = this.session.hitTest(touch.x / this.data.width, touch.y / this.data.height, this.resetPanel)\n            this.resetPanel = false\n            if (hitTestRes.length) {\n              const model = this.getRobot()\n              model.matrixAutoUpdate = false\n              model.matrix.fromArray(hitTestRes[0].transform)\n              this.scene.add(model)\n            }\n          }\n        }\n      }\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/visionkit-basic/visionkit-basic.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n    },\n    render(frame) {\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      const dt = this.clock.getDelta()\n      if (this.mixers) {\n        this.mixers.forEach(mixer => mixer.update(dt))\n      }\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/visionkit-basic/visionkit-basic.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"VisionKit基础\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/visionkit-basic/visionkit-basic.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n<view><canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n    </canvas></view>\n<view class=\"page-body-text tc\" style=\"height:20%\">提示：触碰屏幕任意点, 可在对应位置生成示例的机器小人</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/visionkit-basic/visionkit-basic.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/visionkit-basic/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/visionkit-basic-v2/behavior.js",
    "content": "import {\n  createScopedThreejs\n} from './threejs-miniprogram'\nimport {\n  registerGLTFLoader\n} from '../loaders/gltf-loader'\nimport cloneGltf from '../loaders/gltf-clone'\n\nconst info = wx.getSystemInfoSync()\n\nexport default function getBehavior() {\n  return Behavior({\n    data: {\n      width: 1,\n      height: 1,\n      fps: 0,\n      memory: 0,\n      cpu: 0,\n    },\n    methods: {\n      onReady() {\n        wx.createSelectorQuery()\n          .select('#webgl')\n          .node()\n          .exec(res => {\n            this.canvas = res[0].node\n\n            const info = wx.getSystemInfoSync()\n            const pixelRatio = info.pixelRatio\n            const calcSize = (width, height) => {\n              console.log(`canvas size: width = ${width} , height = ${height}`)\n              this.canvas.width = width * pixelRatio\n              this.canvas.height = height * pixelRatio\n              this.setData({\n                width,\n                height,\n              })\n            }\n            calcSize(info.windowWidth, info.windowHeight * 0.8)\n\n            this.initVK()\n          })\n      },\n      onUnload() {\n        if (this._texture) {\n          this._texture.dispose()\n          this._texture = null\n        }\n        if (this.renderer) {\n          this.renderer.dispose()\n          this.renderer = null\n        }\n        if (this.scene) {\n          this.scene.dispose()\n          this.scene = null\n        }\n        if (this.camera) this.camera = null\n        if (this.model) this.model = null\n        if (this._insertModel) this._insertModel = null\n        if (this._insertModels) this._insertModels = null\n        if (this.planeBox) this.planeBox = null\n        if (this.mixers) {\n          this.mixers.forEach(mixer => mixer.uncacheRoot(mixer.getRoot()))\n          this.mixers = null\n        }\n        if (this.clock) this.clock = null\n\n        if (this.THREE) this.THREE = null\n        if (this._tempTexture && this._tempTexture.gl) {\n          this._tempTexture.gl.deleteTexture(this._tempTexture)\n          this._tempTexture = null\n        }\n        if (this._fb && this._fb.gl) {\n          this._fb.gl.deleteFramebuffer(this._fb)\n          this._fb = null\n        }\n        if (this._program && this._program.gl) {\n          this._program.gl.deleteProgram(this._program)\n          this._program = null\n        }\n        if (this.canvas) this.canvas = null\n        if (this.gl) this.gl = null\n        if (this.session) this.session = null\n        if (this.anchor2DList) this.anchor2DList = []\n      },\n      initVK() {\n        // 初始化 threejs\n        this.initTHREE()\n        const THREE = this.THREE\n\n        // 自定义初始化\n        if (this.init) this.init()\n\n        console.log('this.gl', this.gl)\n\n        const session = this.session = wx.createVKSession({\n          track: {\n            plane: {\n              mode: 1\n            },\n          },\n          version: 'v2',\n          gl: this.gl\n        })\n        session.start(err => {\n          if (err) return console.error('VK error: ', err)\n\n          console.log('@@@@@@@@ VKSession.version', session.version)\n\n          const canvas = this.canvas\n\n          const calcSize = (width, height, pixelRatio) => {\n            console.log(`canvas size: width = ${width} , height = ${height}`)\n            this.canvas.width = width * pixelRatio\n            this.canvas.height = height * pixelRatio\n            this.setData({\n              width,\n              height,\n            })\n          }\n\n          session.on('resize', () => {\n            const info = wx.getSystemInfoSync()\n            calcSize(info.windowWidth, info.windowHeight * 0.8, info.pixelRatio)\n          })\n\n          const loader = new THREE.GLTFLoader()\n          loader.load('https://dldir1.qq.com/weixin/miniprogram/RobotExpressive_aa2603d917384b68bb4a086f32dabe83.glb', gltf => {\n            this.model = {\n              scene: gltf.scene,\n              animations: gltf.animations,\n            }\n          })\n\n          this.clock = new THREE.Clock()\n\n          // 限制调用帧率\n          const fps = 30\n          const fpsInterval = 1000 / fps\n          let last = Date.now()\n\n          // 逐帧渲染\n          const onFrame = timestamp => {\n            const now = Date.now()\n            const mill = now - last\n            // 经过了足够的时间\n            if (mill > fpsInterval) {\n              last = now - (mill % fpsInterval) // 校正当前时间\n              const frame = session.getVKFrame(canvas.width, canvas.height)\n              if (frame) {\n                this.render(frame)\n              }\n            }\n            session.requestAnimationFrame(onFrame)\n          }\n          session.requestAnimationFrame(onFrame)\n        })\n      },\n      initTHREE() {\n        const THREE = this.THREE = createScopedThreejs(this.canvas)\n        registerGLTFLoader(THREE)\n\n        // 相机\n        this.camera = new THREE.Camera()\n\n        // 场景\n        const scene = this.scene = new THREE.Scene()\n\n        // 光源\n        const light1 = new THREE.HemisphereLight(0xffffff, 0x444444) // 半球光\n        light1.position.set(0, 0.2, 0)\n        scene.add(light1)\n        const light2 = new THREE.DirectionalLight(0xffffff) // 平行光\n        light2.position.set(0, 0.2, 0.1)\n        scene.add(light2)\n\n        // 渲染层\n        const renderer = this.renderer = new THREE.WebGLRenderer({\n          antialias: true,\n          alpha: true\n        })\n        renderer.gammaOutput = true\n        renderer.gammaFactor = 2.2\n      },\n\n      copyRobot() {\n        const THREE = this.THREE\n        const {\n          scene,\n          animations\n        } = cloneGltf(this.model, THREE)\n        scene.scale.set(0.05, 0.05, 0.05)\n\n        // 动画混合器\n        const mixer = new THREE.AnimationMixer(scene)\n        for (let i = 0; i < animations.length; i++) {\n          const clip = animations[i]\n          if (clip.name === 'Dance') {\n            const action = mixer.clipAction(clip)\n            action.play()\n          }\n        }\n\n        this.mixers = this.mixers || []\n        this.mixers.push(mixer)\n\n        scene._mixer = mixer\n        return scene\n      },\n      getRobot() {\n        const THREE = this.THREE\n\n        const model = new THREE.Object3D()\n        model.add(this.copyRobot())\n\n        this._insertModels = this._insertModels || []\n        this._insertModels.push(model)\n\n        if (this._insertModels.length > 5) {\n          const needRemove = this._insertModels.splice(0, this._insertModels.length - 5)\n          needRemove.forEach(item => {\n            if (item._mixer) {\n              const mixer = item._mixer\n              this.mixers.splice(this.mixers.indexOf(mixer), 1)\n              mixer.uncacheRoot(mixer.getRoot())\n            }\n            if (item.parent) item.parent.remove(item)\n          })\n        }\n\n        return model\n      },\n      onTouchEnd(evt) {\n        // 点击位置放一个机器人\n        const touches = evt.changedTouches.length ? evt.changedTouches : evt.touches\n        if (touches.length === 1) {\n          const touch = touches[0]\n          if (this.session && this.scene && this.model) {\n            const hitTestRes = this.session.hitTest(touch.x / this.data.width, touch.y / this.data.height, this.resetPanel)\n            this.resetPanel = false\n            if (hitTestRes.length) {\n              const model = this.getRobot()\n              model.matrixAutoUpdate = false\n              model.matrix.fromArray(hitTestRes[0].transform)\n              this.scene.add(model)\n            }\n          }\n        }\n      }\n    },\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/visionkit-basic-v2/visionkit-basic-v2.js",
    "content": "import getBehavior from './behavior'\nimport yuvBehavior from './yuvBehavior'\n\nconst NEAR = 0.001\nconst FAR = 1000\n\nComponent({\n  behaviors: [getBehavior(), yuvBehavior],\n  data: {\n    theme: 'light',\n  },\n  lifetimes: {\n    /**\n        * 生命周期函数--监听页面加载\n        */\n    detached() {\n      console.log('页面detached')\n      if (wx.offThemeChange) {\n        wx.offThemeChange()\n      }\n    },\n    ready() {\n      console.log('页面准备完全')\n      this.setData({\n        theme: getApp().globalData.theme || 'light'\n      })\n\n      if (wx.onThemeChange) {\n        wx.onThemeChange(({ theme }) => {\n          this.setData({ theme })\n        })\n      }\n    },\n  },\n  methods: {\n    init() {\n      this.initGL()\n    },\n    render(frame) {\n      this.renderGL(frame)\n\n      const camera = frame.camera\n\n      const dt = this.clock.getDelta()\n      if (this.mixers) {\n        this.mixers.forEach(mixer => mixer.update(dt))\n      }\n\n      // 相机\n      if (camera) {\n        this.camera.matrixAutoUpdate = false\n        this.camera.matrixWorldInverse.fromArray(camera.viewMatrix)\n        this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)\n\n        const projectionMatrix = camera.getProjectionMatrix(NEAR, FAR)\n        this.camera.projectionMatrix.fromArray(projectionMatrix)\n        this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)\n      }\n\n      this.renderer.autoClearColor = false\n      this.renderer.render(this.scene, this.camera)\n      this.renderer.state.setCullFace(this.THREE.CullFaceNone)\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/visionkit-basic-v2/visionkit-basic-v2.json",
    "content": "{\n  \"usingComponents\": {},\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"VisionKit基础-v2\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/visionkit-basic-v2/visionkit-basic-v2.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n<view><canvas type=\"webgl\" id=\"webgl\" style=\"width: {{width}}px; height: {{height}}px\" bindtouchend=\"onTouchEnd\">\n    </canvas></view>\n<view class=\"page-body-text tc\" style=\"height:20%\">提示：v2版本识别平面, 触碰屏幕任意点, 在平面位置会生成示例的机器小人</view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/visionkit-basic-v2/visionkit-basic-v2.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/ar/visionkit-basic-v2/yuvBehavior.js",
    "content": "const yuvBehavior = Behavior({\n  methods: {\n    initShader() {\n      const gl = this.gl = this.renderer.getContext()\n      const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n      const vs = `\n        attribute vec2 a_position;\n        attribute vec2 a_texCoord;\n        uniform mat3 displayTransform;\n        varying vec2 v_texCoord;\n        void main() {\n          vec3 p = displayTransform * vec3(a_position, 0);\n          gl_Position = vec4(p, 1);\n          v_texCoord = a_texCoord;\n        }\n      `\n      const fs = `\n        precision highp float;\n\n        uniform sampler2D y_texture;\n        uniform sampler2D uv_texture;\n        varying vec2 v_texCoord;\n        void main() {\n          vec4 y_color = texture2D(y_texture, v_texCoord);\n          vec4 uv_color = texture2D(uv_texture, v_texCoord);\n\n          float Y, U, V;\n          float R ,G, B;\n          Y = y_color.r;\n          U = uv_color.r - 0.5;\n          V = uv_color.a - 0.5;\n          \n          R = Y + 1.402 * V;\n          G = Y - 0.344 * U - 0.714 * V;\n          B = Y + 1.772 * U;\n          \n          gl_FragColor = vec4(R, G, B, 1.0);\n        }\n      `\n      const vertShader = gl.createShader(gl.VERTEX_SHADER)\n      gl.shaderSource(vertShader, vs)\n      gl.compileShader(vertShader)\n\n      const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n      gl.shaderSource(fragShader, fs)\n      gl.compileShader(fragShader)\n\n      const program = this._program = gl.createProgram()\n      this._program.gl = gl\n      gl.attachShader(program, vertShader)\n      gl.attachShader(program, fragShader)\n      gl.deleteShader(vertShader)\n      gl.deleteShader(fragShader)\n      gl.linkProgram(program)\n      gl.useProgram(program)\n\n      const uniformYTexture = gl.getUniformLocation(program, 'y_texture')\n      gl.uniform1i(uniformYTexture, 5)\n      const uniformUVTexture = gl.getUniformLocation(program, 'uv_texture')\n      gl.uniform1i(uniformUVTexture, 6)\n\n      this._dt = gl.getUniformLocation(program, 'displayTransform')\n      gl.useProgram(currentProgram)\n    },\n    initVAO() {\n      const gl = this.renderer.getContext()\n      const ext = gl.getExtension('OES_vertex_array_object')\n      this.ext = ext\n\n      const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n      const vao = ext.createVertexArrayOES()\n\n      ext.bindVertexArrayOES(vao)\n\n      const posAttr = gl.getAttribLocation(this._program, 'a_position')\n      const pos = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, pos)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(posAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(posAttr)\n      vao.posBuffer = pos\n\n      const texcoordAttr = gl.getAttribLocation(this._program, 'a_texCoord')\n      const texcoord = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, texcoord)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW)\n      gl.vertexAttribPointer(texcoordAttr, 2, gl.FLOAT, false, 0, 0)\n      gl.enableVertexAttribArray(texcoordAttr)\n      vao.texcoordBuffer = texcoord\n\n      ext.bindVertexArrayOES(currentVAO)\n      this._vao = vao\n    },\n    initGL() {\n      this.initShader()\n      this.initVAO()\n    },\n    renderGL(frame) {\n      const gl = this.renderer.getContext()\n      gl.disable(gl.DEPTH_TEST)\n      const {\n        yTexture,\n        uvTexture\n      } = frame.getCameraTexture(gl, 'yuv')\n      const displayTransform = frame.getDisplayTransform()\n      if (yTexture && uvTexture) {\n        const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM)\n        const currentActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE)\n        const currentVAO = gl.getParameter(gl.VERTEX_ARRAY_BINDING)\n\n        gl.useProgram(this._program)\n        this.ext.bindVertexArrayOES(this._vao)\n\n        gl.uniformMatrix3fv(this._dt, false, displayTransform)\n        gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        const bindingTexture5 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, yTexture)\n\n        gl.activeTexture(gl.TEXTURE0 + 6)\n        const bindingTexture6 = gl.getParameter(gl.TEXTURE_BINDING_2D)\n        gl.bindTexture(gl.TEXTURE_2D, uvTexture)\n\n        gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)\n\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture6)\n        gl.activeTexture(gl.TEXTURE0 + 5)\n        gl.bindTexture(gl.TEXTURE_2D, bindingTexture5)\n\n        gl.useProgram(currentProgram)\n        gl.activeTexture(currentActiveTexture)\n        this.ext.bindVertexArrayOES(currentVAO)\n      }\n    },\n  },\n})\n\nexport default yuvBehavior\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/activity_assist/activity_assist.js",
    "content": "const config = require('../../../../config')\nconst util = require('../../../../util/util')\n\nconst systemInfo = getApp().globalData\nPage({\n  data: {\n    activityList: [],\n  },\n\n  onShareAppMessage() {\n    return {\n      title: '群签到助手',\n      path: 'packageAPI/pages/chattool/activity_assist/activity_assist'\n    }\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad() {\n    if (util.compareVersion(systemInfo.SDKVersion, '3.7.8') < 0) {\n      wx.showModal({\n        title: '需升级微信到新版本体验',\n        showCancel: false,\n        content: '',\n      })\n      return\n    }\n\n    wx.cloud.init({\n      env: config.envId,\n      traceUser: true,\n    })\n\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  onShow() {\n    this.refresh()\n  },\n\n  refresh() {\n    this.fetchActivityList()\n  },\n\n  fetchActivityList() {\n    wx.cloud.callFunction({\n      name: 'quickstartFunctions',\n      data: {\n        type: 'fetchActivityList',\n      }\n    }).then(resp => {\n      console.info('fetchActivityList: ', resp)\n      if (resp.result) {\n        const activityList = resp.result.dataList\n        this.setData({ activityList })\n      }\n    }).catch(err => {\n      console.error('fetchActivityList fail: ', err)\n    })\n  },\n\n  create() {\n    wx.openChatTool({\n      url: '/packageChatTool/pages/activity_create/index',\n    })\n  },\n\n  goDetail(e) {\n    const { id, roomid, singlechat } = e.currentTarget.dataset\n    wx.openChatTool({\n      roomid,\n      isSingleChat: Boolean(singlechat),\n      url: `/packageChatTool/pages/activity_detail/index?activityId=${id}`,\n    })\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/activity_assist/activity_assist.json",
    "content": "{\n  \"navigationBarTitleText\": \"聊天工具\",\n  \"renderer\": \"webview\",\n  \"componentFramework\": \"glass-easel\",\n  \"usingComponents\": {\n    \"t-collapse\": \"../../../components/tdesign-miniprogram/collapse/collapse\",\n    \"t-collapse-panel\": \"../../../components/tdesign-miniprogram/collapse-panel/collapse-panel\",\n    \"t-cell\": \"../../../components/tdesign-miniprogram/cell/cell\",\n    \"t-cell-group\": \"../../../components/tdesign-miniprogram/cell-group/cell-group\",\n    \"t-icon\": \"../../../components/tdesign-miniprogram/icon/icon\"\n  }\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/activity_assist/activity_assist.less",
    "content": "/**app.wxss**/\npage {\n  background: rgb(237, 237, 237);\n  height: 100vh;\n  --td-navbar-bg-color: rgb(237, 237, 237);\n}\n\n.center {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.page-container {\n  height: 100%;\n  width: 100%;\n  box-sizing: border-box;\n}\n\n.container {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  box-sizing: border-box;\n} \n\n.card {\n  margin: 0 32rpx;\n  margin-bottom: 32rpx;\n}\n\n.card-title {\n  padding: 32rpx 0;\n  padding-top: 0;\n  color: rgb(112, 107, 107);\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/activity_assist/activity_assist.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<scroll-view type=\"list\" class=\"page-container\" scroll-y>\n\t<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n\t\t<template is=\"head\" data=\"{{title: '群签到助手'}}\" />\n\t\t<view class=\"page-body\">\n\t\t\t<view class=\"card\">\n\t\t\t\t<view class=\"card-title\" />\n\t\t\t\t<t-cell\n\t\t\t\t title=\"创建新活动\"\n\t\t\t\t hover\n\t\t\t\t arrow\n\t\t\t\t bind:click=\"create\"\n\t\t\t\t/>\n\t\t\t</view>\n\n\t\t\t<view class=\"card\">\n\t\t\t\t<t-cell\n\t\t\t\t title=\"已发布活动\"\n\t\t\t\t hover\n\t\t\t\t right-icon=\"refresh\"\n\t\t\t\t bind:tap=\"refresh\"\n\t\t\t\t/>\n\t\t\t\t<block wx:for=\"{{activityList}}\" wx:key=\"_id\">\n\t\t\t\t\t<t-cell\n\t\t\t\t\t title=\"{{item.title}}\"\n\t\t\t\t\t hover\n\t\t\t\t\t arrow\n\t\t\t\t\t data-roomid=\"{{item.roomid}}\"\n\t\t\t\t\t data-singlechat=\"{{item.isSingleChat}}\"\n\t\t\t\t\t data-id=\"{{item.activityId}}\"\n\t\t\t\t\t bind:click=\"goDetail\"\n\t\t\t\t\t/>\n\t\t\t\t</block>\n\t\t\t</view>\n\t\t</view>\n\t\t<template is=\"foot\" />\n\t</view>\n</scroll-view>\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/material_open/material_open.js",
    "content": "import { getGroupEnterInfo } from '../util'\n\nconst config = require('../../../../config')\n\nlet needShowEntrance = true\nconst entrancePath = 'packageAPI/pages/chattool/material_open/material_open'\nconst templateId = '4A68CBB88A92B0A9311848DBA1E94A199B166463' // 完成\n// let templateId = '2A84254B945674A2F88CE4970782C402795EB607' // 参与\n\nconst fileUrl = 'https://res.wx.qq.com/open/js/jweixin-1.6.0.js'\nconst videoUrl = 'https://res.wx.qq.com/op_res/o3RWIC_o--wNf_qA3B4ghHbL_qKRRwsUM39dGTzltCR2__61DnEANInj5AJJmVXsHvx9FyHlDftU3KhcGCukDA'\n\nconst { envVersion } = wx.getAccountInfoSync().miniProgram\n\nconst getVersionType = () => {\n  if (envVersion === 'release') {\n    return 0\n  } else if (envVersion === 'develop') {\n    return 1\n  } else if (envVersion === 'trial') {\n    return 2\n  }\n\n  return 0\n}\n\nPage({\n  data: {\n    members: [],\n    needShowEntrance,\n    entrancePath,\n    shareText: `「团建目的地选择」统计结果：\n    - 清远 5 票\n    - 南沙 3 票\n    - 惠州 2 票`,\n    isTemplateComplete: true\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad(options) {\n    this._activityId = options.activityId\n\n    wx.cloud.init({\n      env: config.envId,\n      traceUser: true,\n    })\n\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  async signIn() {\n    const activityId = this._activityId\n    if (!activityId) {\n      wx.showToast({\n        title: '需从动态消息卡片',\n        icon: 'none'\n      })\n      return\n    }\n\n    await getGroupEnterInfo()\n      .then(groupInfo => {\n        const { groupOpenID } = groupInfo\n        this.updateChatToolMsg(activityId, {\n          targetState: 1,\n          parameterList: [{\n            groupOpenID,\n            state: 1,\n          }]\n        })\n        wx.showToast({\n          title: '签到成功',\n          icon: 'none'\n        })\n      }).catch(err => {\n        console.error('getGroupEnterInfo fail: ', err)\n      })\n  },\n\n  remindExpiration() {\n    const activityId = this._activityId\n    if (!activityId) {\n      wx.showToast({\n        title: '需从动态消息卡片',\n        icon: 'none'\n      })\n      return\n    }\n    this.updateChatToolMsg(activityId, {\n      targetState: 2,\n    })\n    wx.showToast({\n      title: '已触发',\n      icon: 'none'\n    })\n  },\n\n  earlyTerminate() {\n    const activityId = this._activityId\n    if (!activityId) {\n      wx.showToast({\n        title: '需从动态消息卡片',\n        icon: 'none'\n      })\n      return\n    }\n    this.updateChatToolMsg(activityId, {\n      targetState: 3,\n    })\n    wx.showToast({\n      title: '已触发',\n      icon: 'none'\n    })\n  },\n\n  updateChatToolMsg(activityId, params = {}) {\n    const { targetState, parameterList } = params\n    wx.cloud.callFunction({\n      name: 'openapi',\n      data: {\n        action: 'updateChatToolMsg',\n        activityId,\n        templateId,\n        targetState: targetState || 1,\n        parameterList: parameterList || [],\n        versionType: getVersionType()\n      }\n    }).then(resp => {\n      console.info('updateChatToolMsg: ', resp)\n    }).catch(err => {\n      console.info('updateChatToolMsg Fail: ', err)\n    })\n  },\n\n  viewChatMaterials() {\n    wx.navigateTo({\n      url: '../material_view/material_view',\n    })\n  },\n\n  changeNeedShowEntrance() {\n    needShowEntrance = !needShowEntrance\n    this.setData({\n      needShowEntrance\n    })\n  },\n\n  shareUpdatableMessage() {\n    const that = this\n    wx.cloud.callFunction({\n      name: 'openapi',\n      data: {\n        action: 'createActivityId',\n      }\n    }).then(resp => {\n      const activityId = resp.result.activityId\n      wx.updateShareMenu({\n        withShareTicket: true,\n        isUpdatableMessage: true,\n        useForChatTool: true,\n        chooseType: 2,\n        activityId,\n        templateInfo: {\n          templateId,\n        },\n        success(res) {\n          wx.shareAppMessageToGroup({\n            title: '动态消息卡片',\n            path: `${entrancePath}?activityId=${activityId}`,\n            complete(res) {\n              that._activityId = activityId\n              console.info('shareAppMessageToGroup: ', res)\n            }\n          })\n        },\n        complete(res) {\n          console.info('updateShareMenu: ', res)\n        }\n      })\n    })\n  },\n\n  shareImage() {\n    wx.downloadFile({\n      url: 'https://cdc-opendesign-1258344706.cos.ap-guangzhou.myqcloud.com/image/emywrxo77wrzaj3kn3exgk81c1e5x6767l/k689zkwkdmj9ngm/2024/11/06/vlnycdv60lakegvyup38kfh2wbhuzgha2ua6xfdfxxcdoaf6/xj812q7y2n3obyq/abe09549-8469-4e6d-a4f2-7c7e20cdad54.png?imageMogr2/thumbnail/600x340%3E',\n      success: (res) => {\n        wx.shareImageToGroup({\n          imagePath: res.tempFilePath, // 本地路径或临时路径\n          needShowEntrance,\n          entrancePath,\n          complete(res) {\n            console.info('shareImageToGroup: ', res)\n          }\n        })\n      }\n    })\n  },\n\n  shareEmoji() {\n    wx.downloadFile({\n      url: 'https://mmbiz.qpic.cn/mmbiz_gif/EXAZAY4U1KCcdEB1gicNwIL4lUrpVQ5H5jOSfiaVHJ5n4EQyPrLqgRtbb6X1hRIiaZqMIibVME51FYRf7p2kC4OdLA/0/132',\n      success: (res) => {\n        wx.shareEmojiToGroup({\n          imagePath: res.tempFilePath, // 本地路径或临时路径\n          needShowEntrance,\n          entrancePath,\n          complete(res) {\n            console.info('shareEmojiToGroup: ', res)\n          }\n        })\n      }\n    })\n  },\n\n  shareVideo() {\n    wx.downloadFile({\n      url: videoUrl,\n      success(res) {\n        wx.shareVideoToGroup({\n          videoPath: res.tempFilePath,\n          thumbPath: '',\n          needShowEntrance,\n          entrancePath,\n          complete(res) {\n            console.info('shareVideoToGroup: ', res)\n          }\n        })\n      },\n      fail: console.error,\n    })\n  },\n\n  shareFile() {\n    wx.downloadFile({\n      url: fileUrl,\n      success(res) {\n        wx.shareFileToGroup({\n          filePath: res.tempFilePath,\n          fileName: '',\n          needShowEntrance,\n          entrancePath,\n          complete(res) {\n            console.info('shareFileToGroup: ', res)\n          }\n        })\n      },\n      fail: console.error,\n    })\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/material_open/material_open.json",
    "content": "{\n  \"navigationBarTitleText\": \"聊天工具\",\n  \"renderer\": \"webview\",\n  \"componentFramework\": \"glass-easel\",\n  \"usingComponents\": {\n    \"t-collapse\": \"../../../components/tdesign-miniprogram/collapse/collapse\",\n    \"t-collapse-panel\": \"../../../components/tdesign-miniprogram/collapse-panel/collapse-panel\",\n    \"t-cell\": \"../../../components/tdesign-miniprogram/cell/cell\",\n    \"t-cell-group\": \"../../../components/tdesign-miniprogram/cell-group/cell-group\",\n    \"t-icon\": \"../../../components/tdesign-miniprogram/icon/icon\"\n  }\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/material_open/material_open.less",
    "content": "/**app.wxss**/\npage {\n  background: rgb(237, 237, 237);\n  height: 100vh;\n  --td-navbar-bg-color: rgb(237, 237, 237);\n}\n\n.center {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.page-container {\n  height: 100%;\n  width: 100%;\n  box-sizing: border-box;\n}\n\n.container {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  box-sizing: border-box;\n  padding: 0 24rpx;\n} \n\n.form-textarea {\n  box-sizing: border-box;\n  width: 100%;\n  padding: 20px;\n  background-color: rgb(233, 233, 182);\n  border-radius: 10px;\n}\n\n.btn {\n  width: 100% !important;\n  margin: 10px 0;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/material_open/material_open.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<scroll-view type=\"list\" class=\"page-container\" scroll-y>\n\t<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n\t\t<template is=\"head\" data=\"{{title: '聊天内容长按打开'}}\" />\n\t\t<view class=\"page-body\">\n\t\t\t<button bind:tap=\"viewChatMaterials\" class=\"btn\" type=\"primary\">查看聊天内容</button>\n      <button bind:tap=\"shareUpdatableMessage\" class=\"btn\" type=\"primary\">发送动态消息卡片</button>\n\t\t\t<button bind:tap=\"signIn\" class=\"btn\" type=\"primary\">签到动态消息卡片</button>\n      <button bind:tap=\"earlyTerminate\" class=\"btn\" type=\"primary\">设置动态消息结束</button>\n      <button bind:tap=\"changeNeedShowEntrance\" class=\"btn\" type=\"primary\">{{needShowEntrance ? '显示' : '隐藏'}}发送消息小尾巴</button>\n\t\t\t<form bind:submitToGroup=\"onSubmitToGroup\">\n\t\t\t\t<textarea class=\"form-textarea\" value=\"{{shareText}}\" />\n\t\t\t\t<button\n          class=\"btn\"\n          style=\"width: 100%;\"\n          type=\"primary\"\n          form-type=\"submitToGroup\"\n          need-show-entrance=\"{{needShowEntrance}}\"\n          entrance-path=\"{{entrancePath}}\"\n          >发布文本到群\n        </button>\n      </form>\n      <button bind:tap=\"shareImage\" class=\"btn\" type=\"primary\">发送图片到群</button>\n      <button bind:tap=\"shareEmoji\" class=\"btn\" type=\"primary\">发送表情到群</button>\n      <button bind:tap=\"shareVideo\" class=\"btn\" type=\"primary\">发送视频到群</button>\n      <button bind:tap=\"shareFile\" class=\"btn\" type=\"primary\">发送文件到群</button>\n\t\t</view>\n\t\t<template is=\"foot\" />\n\t</view>\n</scroll-view>\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/material_view/material_view.js",
    "content": "const chatRecordTypes = ['text', 'image', 'video', 'other']\n\nconst mockData = {\n  materials: [\n    {\n      groupOpenID: '',\n      type: 'text/message',\n      content: '大家想要中秋去哪玩呀',\n    },\n    {\n      groupOpenID: '',\n      type: 'text/message',\n      content: '没想好呢，要不要去内蒙古',\n    },\n    {\n      groupOpenID: '',\n      type: 'text/message',\n      content: '内蒙古有啥好玩的呀',\n    },\n    {\n      groupOpenID: '',\n      type: 'image/png',\n      name: '图片名称',\n      path: 'https://gips2.baidu.com/it/u=1651586290,17201034&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f600_800',\n      size: '图片大小'\n    },\n    {\n      groupOpenID: '',\n      type: 'text/message',\n      content: 'https://mp.weixin.qq.com/s/ZnR0kBKrC4el9aiYpitxHA',\n    },\n    {\n      groupOpenID: '',\n      type: 'text/message',\n      content: '@欢乐马 的哥哥是不是去过呀',\n    },\n    {\n      groupOpenID: '',\n      type: 'text/message',\n      content: '对的对的，他去年去过，我去要一下他去年的图片',\n    },\n    {\n      groupOpenID: '',\n      type: 'image/png',\n      name: '图片名称',\n      path: 'https://res.wx.qq.com/wxdoc/dist/assets/img/demo.ef5c5bef.jpg',\n      size: '图片大小'\n    },\n    {\n      groupOpenID: '',\n      type: 'text/message',\n      content: '哇看起来真不错',\n    },\n    {\n      groupOpenID: '',\n      type: 'video/mp4',\n      name: '视频名称',\n      path: '视频路径',\n      size: '视频大小'\n    },\n    {\n      groupOpenID: '',\n      type: 'text/message',\n      content: '视频看起来也很震撼',\n    },\n    {\n      groupOpenID: '',\n      type: 'text/message',\n      content: '要不再问问行程规划！',\n    },\n    {\n      groupOpenID: '',\n      type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n      name: '23中秋 阿尔山行程.xlsx',\n      path: '文件路径',\n      size: '文件大小',\n    },\n    {\n      groupOpenID: '',\n      type: 'application/pdf',\n      name: '23中秋 阿尔山行程.pdf',\n      path: '文件路径',\n      size: '文件大小',\n    },\n  ]\n}\n\nPage({\n  data: {\n    materials: [],\n    canvasWidth: 0,\n    canvasHeight: 0\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad() {\n    this._forwardMaterials = []\n    this.getMaterials()\n    // this.formatMaterials(mockData.materials)\n\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  getMaterials() {\n    const that = this\n    wx.getChatForwardMaterials({\n      needGroupOpenID: true,\n      success(res) {\n        if (res.materials) {\n          that.formatMaterials(res.materials)\n        }\n      }\n    })\n  },\n\n  formatMaterials(forwardMaterials = []) {\n    this._forwardMaterials = forwardMaterials\n    this.triggerMergedImage()\n\n    const materials = []\n    for (const item of forwardMaterials) {\n      let recordType = ''\n      if (item.type === 'text/message') {\n        recordType = chatRecordTypes[0]\n      } else if (item.type.startsWith('image/')) {\n        recordType = chatRecordTypes[1]\n      } else if (item.type.startsWith('video/')) {\n        recordType = chatRecordTypes[2]\n      } else {\n        recordType = chatRecordTypes[3]\n      }\n      materials.push({\n        ...item,\n        recordType,\n      })\n    }\n    this.setData({\n      materials\n    })\n  },\n\n  async triggerMergedImage() {\n    try {\n      const tempFilePaths = this._forwardMaterials\n        .filter(item => item.type.startsWith('image'))\n        .map(item => item.path)\n      console.info('tempFilePaths: ', tempFilePaths)\n      const shareImagePath = await this.mergeImages(tempFilePaths)\n      this.setData({\n        shareImagePath,\n      })\n      console.info('shareImagePath: ', shareImagePath)\n    } catch (error) {\n      console.error('mergeImages fail: ', error)\n    }\n  },\n\n  shareMergedImage() {\n    if (!this.data.shareImagePath) {\n      wx.showToast({\n        title: '拼图失败',\n        icon: 'none'\n      })\n      this.triggerMergedImage()\n      return\n    }\n    wx.shareImageToGroup({\n      imagePath: this.data.shareImagePath,\n      needShowEntrance: false,\n      complete(res) {\n        console.info('shareImageToGroup: ', res)\n      }\n    })\n  },\n\n  async mergeImages(tempFilePaths) {\n    try {\n      // 获取 canvas 节点\n      const { node: canvas, width: cw, height: ch } = await this.getCanvasNode()\n\n      // 获取 2D 上下文\n      const ctx = canvas.getContext('2d')\n\n      // 预加载所有图片\n      const images = await this.loadAllImages(canvas, tempFilePaths)\n\n      // 绘制图片\n      this.drawImages(ctx, images, 400)\n\n      // 生成临时文件\n      return await this.canvasToTempFile(canvas)\n    } catch (err) {\n      console.error('合并失败:', err)\n      return null\n    }\n  },\n\n  // 获取 Canvas 节点（Promise 封装）\n  getCanvasNode() {\n    return new Promise((resolve, reject) => {\n      wx.createSelectorQuery()\n        .select('#myCanvas')\n        .fields({ node: true, size: true })\n        .exec(res => {\n          if (res[0]) resolve(res[0])\n          else reject(new Error('Canvas 节点获取失败'))\n        })\n    })\n  },\n\n  // 计算画布尺寸\n  calculateLayout(paths) {\n    const imgSize = 100\n    const spacing = 10\n    const perLine = 3\n\n    const rows = Math.ceil(paths.length / perLine)\n    return {\n      canvasWidth: perLine * imgSize + (perLine - 1) * spacing,\n      canvasHeight: rows * imgSize + (rows - 1) * spacing\n    }\n  },\n\n  // 加载所有图片（Web Image 对象）\n  loadAllImages(canvas, paths) {\n    return Promise.all(paths.map(url => new Promise((resolve, reject) => {\n      const image = canvas.createImage()\n      image.onload = () => resolve(image)\n      image.onerror = reject\n      image.src = url // 支持本地路径和网络图片\n    })))\n  },\n\n  // 执行图片绘制\n  drawImages(ctx, images, canvasWidth) {\n    const imgSize = 100\n    const spacing = 10\n    const perLine = 3\n\n    images.forEach((image, index) => {\n      const row = Math.floor(index / perLine)\n      const col = index % perLine\n\n      const x = col * (imgSize + spacing)\n      const y = row * (imgSize + spacing)\n\n      // 绘制图像（支持缩放裁剪）\n      ctx.drawImage(\n        image,\n        0,\n        0,\n        image.width,\n        image.height, // 源图裁剪区域\n        x,\n        y,\n        imgSize,\n        imgSize // 画布绘制区域\n      )\n    })\n  },\n\n  // Canvas 转临时文件\n  canvasToTempFile(canvas) {\n    return new Promise((resolve, reject) => {\n      wx.canvasToTempFilePath({\n        canvas,\n        fileType: 'png',\n        width: 400,\n        height: 500,\n        quality: 1,\n        success: res => resolve(res.tempFilePath),\n        fail: reject\n      })\n    })\n  }\n\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/material_view/material_view.json",
    "content": "{\n  \"navigationBarTitleText\": \"聊天工具\",\n  \"renderer\": \"webview\",\n  \"componentFramework\": \"glass-easel\",\n  \"usingComponents\": {\n    \"t-collapse\": \"../../../components/tdesign-miniprogram/collapse/collapse\",\n    \"t-collapse-panel\": \"../../../components/tdesign-miniprogram/collapse-panel/collapse-panel\",\n    \"t-cell\": \"../../../components/tdesign-miniprogram/cell/cell\",\n    \"t-cell-group\": \"../../../components/tdesign-miniprogram/cell-group/cell-group\",\n    \"t-icon\": \"../../../components/tdesign-miniprogram/icon/icon\"\n  }\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/material_view/material_view.less",
    "content": "/**app.wxss**/\npage {\n  background: rgb(237, 237, 237);\n  height: 100vh;\n  --td-navbar-bg-color: rgb(237, 237, 237);\n}\n\n.center {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.page-container {\n  height: 100%;\n  width: 100%;\n  box-sizing: border-box;\n}\n\n.container {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  box-sizing: border-box;\n  padding: 0 24rpx;\n} \n\n.chat-img {\n  width: 300px;\n  height: 200px;\n}\n\n.chat-item {\n  margin: 10px 0;\n  padding: 10px 5px;\n  background-color: #FFF;\n  border: 1px solid #ccc;\n  overflow: hidden;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/material_view/material_view.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<scroll-view type=\"list\" class=\"page-container\" scroll-y>\n\t<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n\t\t<template is=\"head\" data=\"{{title: '聊天内容展示'}}\" />\n\t\t<view class=\"page-body\">\n      <block wx:if=\"{{shareImagePath}}\">\n        <image src=\"{{shareImagePath}}\" mode=\"aspectFill\"></image>\n      </block>\n      <button style=\"width: 100%;\" type=\"primary\" bind:tap=\"shareMergedImage\">分享拼图</button>\n\t\t\t<block wx:if=\"{{materials.length}}\">\n\t\t\t\t<view class=\"chat-list\">\n\t\t\t\t\t<block wx:for=\"{{materials}}\" wx:key=\"messageId\">\n\t\t\t\t\t\t<view class=\"chat-item\">\n\t\t\t\t\t\t\t<view>消息 id: {{item.messageId}}</view>\n\t\t\t\t\t\t\t<view>消息类型: {{item.type}} </view>\n\t\t\t\t\t\t\t<block wx:if=\"{{item.recordType === 'text'}}\">\n\t\t\t\t\t\t\t\t<view>消息内容: {{item.content}}</view>\n\t\t\t\t\t\t\t</block>\n\t\t\t\t\t\t\t<block wx:elif=\"{{item.recordType === 'image'}}\">\n\t\t\t\t\t\t\t\t<image class=\"chat-img\" src=\"{{item.path}}\" mode=\"aspectFill\" />\n\t\t\t\t\t\t\t</block>\n\t\t\t\t\t\t\t<block wx:else>\n\t\t\t\t\t\t\t\t<view>文件路径: {{item.path}}</view>\n\t\t\t\t\t\t\t</block>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</block>\n\t\t\t\t</view>\n\t\t\t</block>\n\t\t</view>\n\t\t<template is=\"foot\" />\n\t</view>\n</scroll-view>\n\n<canvas \n  type=\"2d\" \n  id=\"myCanvas\" \n  style=\"width: 400px; height: 500px;position:fixed;left:-999px;\"\n></canvas>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/chattool/util.js",
    "content": "export function getGroupEnterInfo() {\n  return new Promise((resolve, reject) => {\n    wx.getGroupEnterInfo({\n      allowSingleChat: true,\n      needGroupOpenID: true,\n      success(res) {\n        const cloudID = res.cloudID\n        wx.cloud.callFunction({\n          name: 'quickstartFunctions',\n          data: {\n            type: 'getGroupEnterInfo',\n            groupInfo: wx.cloud.CloudID(cloudID)\n          }\n        }).then(resp => {\n          const groupInfo = resp.result.groupInfo\n          if (groupInfo && groupInfo.data) {\n            const openid = resp.result.openid\n            const opengid = groupInfo.data.opengid\n            const openSingleRoomID = groupInfo.data.open_single_roomid\n            const groupOpenID = groupInfo.data.group_openid\n            const data = {\n              openid,\n              groupOpenID,\n              roomid: opengid || openSingleRoomID,\n              chatType: groupInfo.data.chat_type\n            }\n            resolve(data)\n          } else {\n            reject()\n          }\n        }).catch(err => {\n          reject(err)\n        })\n      },\n      fail(res) {\n        reject(res)\n      },\n      complete(res) {\n        console.info('getGroupEnterInfo complete: ', res)\n      }\n    })\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/add-contact/add-contact.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '新增联系人',\n      path: 'packageAPI/pages/device/add-contact/add-contact'\n    }\n  },\n\n  submit(e) {\n    const formData = e.detail.value\n    wx.addPhoneContact({\n      ...formData,\n      success() {\n        wx.showToast({\n          title: '联系人创建成功'\n        })\n      },\n      fail() {\n        wx.showToast({\n          title: '联系人创建失败'\n        })\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/add-contact/add-contact.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"新增联系人\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/add-contact/add-contact.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'addPhoneContact'}}\"/>\n\n  <view class=\"page-body\">\n    <form bindsubmit=\"submit\">\n      <view class=\"page-section\">\n        <view class=\"weui-cells__title\">姓氏</view>\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <input class=\"weui-input\" name=\"lastName\" />\n          </view>\n        </view>\n      </view>\n      <view class=\"page-section\">\n        <view class=\"weui-cells__title\">名字</view>\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <input class=\"weui-input\" name=\"firstName\" />\n          </view>\n        </view>\n      </view>\n      <view class=\"page-section\">\n        <view class=\"weui-cells__title\">手机号</view>\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <input class=\"weui-input\" name=\"mobilePhoneNumber\" />\n          </view>\n        </view>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" formType=\"submit\">创建联系人</button>\n        <button type=\"default\" formType=\"reset\">重置</button>\n      </view>\n    </form>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/add-contact/add-contact.wxss",
    "content": "\n\ninput {\n  width: 100%;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/bluetooth/bluetooth.js",
    "content": "function inArray(arr, key, val) {\n  for (let i = 0; i < arr.length; i++) {\n    if (arr[i][key] === val) {\n      return i\n    }\n  }\n  return -1\n}\n\n// ArrayBuffer转16进度字符串示例\nfunction ab2hex(buffer) {\n  const hexArr = Array.prototype.map.call(\n    new Uint8Array(buffer),\n    function (bit) {\n      return (`00${bit.toString(16)}`).slice(-2)\n    }\n  )\n  return hexArr.join('')\n}\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '蓝牙',\n      path: 'packageAPI/pages/device/bluetooth/bluetooth'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    devices: [],\n    connected: false,\n    chs: [],\n  },\n  openBluetoothAdapter() {\n    const that = this\n    wx.openBluetoothAdapter({\n      success: (res) => {\n        console.log('openBluetoothAdapter success', res)\n        that.startBluetoothDevicesDiscovery()\n      },\n      fail: (res) => {\n        if (res.errCode === 10001) {\n          wx.showModal({\n            title: '错误',\n            content: '未找到蓝牙设备, 请打开蓝牙后重试。',\n            showCancel: false\n          })\n          wx.onBluetoothAdapterStateChange(function (res) {\n            if (res && res.available) {\n              that.startBluetoothDevicesDiscovery()\n            }\n          })\n        }\n      }\n    })\n  },\n  getBluetoothAdapterState() {\n    wx.getBluetoothAdapterState({\n      success: (res) => {\n        console.log('getBluetoothAdapterState', res)\n        if (res.discovering) {\n          this.onBluetoothDeviceFound()\n        } else if (res.available) {\n          this.startBluetoothDevicesDiscovery()\n        }\n      }\n    })\n  },\n  startBluetoothDevicesDiscovery() {\n    if (this._discoveryStarted) {\n      return\n    }\n    this._discoveryStarted = true\n    wx.startBluetoothDevicesDiscovery({\n      allowDuplicatesKey: true,\n      success: (res) => {\n        console.log('startBluetoothDevicesDiscovery success', res)\n        this.onBluetoothDeviceFound()\n      },\n    })\n  },\n  stopBluetoothDevicesDiscovery() {\n    wx.stopBluetoothDevicesDiscovery({\n      complete: () => {\n        this._discoveryStarted = false\n      }\n    })\n  },\n  onBluetoothDeviceFound() {\n    wx.onBluetoothDeviceFound((res) => {\n      res.devices.forEach(device => {\n        if (!device.name && !device.localName) {\n          return\n        }\n        const foundDevices = this.data.devices\n        const idx = inArray(foundDevices, 'deviceId', device.deviceId)\n        const data = {}\n        if (idx === -1) {\n          data[`devices[${foundDevices.length}]`] = device\n        } else {\n          data[`devices[${idx}]`] = device\n        }\n        this.setData(data)\n      })\n    })\n  },\n  createBLEConnection(e) {\n    const ds = e.currentTarget.dataset\n    const deviceId = ds.deviceId\n    const name = ds.name\n    wx.showLoading()\n    wx.createBLEConnection({\n      deviceId,\n      success: () => {\n        this.setData({\n          connected: true,\n          name,\n          deviceId,\n        })\n        this.getBLEDeviceServices(deviceId)\n      },\n      complete() {\n        wx.hideLoading()\n      }\n    })\n    this.stopBluetoothDevicesDiscovery()\n  },\n  closeBLEConnection() {\n    wx.closeBLEConnection({\n      deviceId: this.data.deviceId\n    })\n    this.setData({\n      connected: false,\n      chs: [],\n      canWrite: false,\n    })\n  },\n  changeMode() {\n    wx.navigateTo({\n      url: './slave/slave',\n    })\n  },\n  getBLEDeviceServices(deviceId) {\n    wx.getBLEDeviceServices({\n      deviceId,\n      success: (res) => {\n        for (let i = 0; i < res.services.length; i++) {\n          if (res.services[i].isPrimary) {\n            this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid)\n            return\n          }\n        }\n      }\n    })\n  },\n  getBLEDeviceCharacteristics(deviceId, serviceId) {\n    wx.getBLEDeviceCharacteristics({\n      deviceId,\n      serviceId,\n      success: (res) => {\n        console.log('getBLEDeviceCharacteristics success', res.characteristics)\n\n        for (let i = 0; i < res.characteristics.length; i++) {\n          const item = res.characteristics[i]\n          if (item.properties.read) {\n            wx.readBLECharacteristicValue({\n              deviceId,\n              serviceId,\n              characteristicId: item.uuid,\n            })\n          }\n          if (item.properties.write) {\n            this.setData({\n              canWrite: true\n            })\n            this._deviceId = deviceId\n            this._serviceId = serviceId\n            this._characteristicId = item.uuid\n            console.log('write')\n            this.writeBLECharacteristicValue()\n          }\n          if (item.properties.notify || item.properties.indicate) {\n            wx.notifyBLECharacteristicValueChange({\n              deviceId,\n              serviceId,\n              characteristicId: item.uuid,\n              state: true,\n            })\n          }\n        }\n      },\n      fail(res) {\n        console.error('getBLEDeviceCharacteristics', res)\n      }\n    })\n    // 操作之前先监听，保证第一时间获取数据\n    wx.onBLECharacteristicValueChange((characteristic) => {\n      const idx = inArray(this.data.chs, 'uuid', characteristic.characteristicId)\n      const data = {}\n      if (idx === -1) {\n        data[`chs[${this.data.chs.length}]`] = {\n          uuid: characteristic.characteristicId,\n          value: ab2hex(characteristic.value)\n        }\n      } else {\n        data[`chs[${idx}]`] = {\n          uuid: characteristic.characteristicId,\n          value: ab2hex(characteristic.value)\n        }\n      }\n      wx.showToast({\n        title: '收到从机数据',\n      })\n      // data[`chs[${this.data.chs.length}]`] = {\n      //   uuid: characteristic.characteristicId,\n      //   value: ab2hex(characteristic.value)\n      // }\n      this.setData(data)\n    })\n  },\n  writeBLECharacteristicValue() {\n    // 向蓝牙设备发送一个0x00的16进制数据\n    const buffer = new ArrayBuffer(1)\n    const dataView = new DataView(buffer)\n    // eslint-disable-next-line\n    dataView.setUint8(0, Math.random() * 19| 0)\n    wx.writeBLECharacteristicValue({\n      deviceId: this._deviceId,\n      serviceId: this._serviceId,\n      characteristicId: this._characteristicId,\n      value: buffer,\n      success() {\n        console.log('writeBLECharacteristicValue: 成功')\n      },\n      fail() {\n        console.log('writeBLECharacteristicValue: 失败')\n      },\n      complete() {\n        console.log('writeBLECharacteristicValue: 结束')\n      }\n    })\n  },\n  closeBluetoothAdapter() {\n    wx.closeBluetoothAdapter()\n    this._discoveryStarted = false\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n    this.closeBluetoothAdapter()\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/bluetooth/bluetooth.json",
    "content": "{\n   \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"蓝牙\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/bluetooth/bluetooth.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<wxs module=\"utils\">\nmodule.exports.max = function(n1, n2) {\n  return Math.max(n1, n2)\n}\nmodule.exports.len = function(arr) {\n  arr = arr || []\n  return arr.length\n}\n</wxs>\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'bluetooth'}}\"/>\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info\">\n        <view class=\"devices_summary\">已发现 {{devices.length}} 个外围设备：</view>\n        <scroll-view class=\"device_list\" scroll-y scroll-with-animation>\n          <view wx:for=\"{{devices}}\" wx:key=\"index\"\n           data-device-id=\"{{item.deviceId}}\"\n           data-name=\"{{item.name || item.localName}}\"\n           bindtap=\"createBLEConnection\" \n           class=\"device_item\"\n           hover-class=\"device_item_hover\">\n            <view style=\"font-size: 16px;\">{{item.name}}</view>\n            <view style=\"font-size: 10px\">信号强度: {{item.RSSI}}dBm ({{utils.max(0, item.RSSI + 100)}}%)</view>\n            <view style=\"font-size: 10px\">UUID: {{item.deviceId}}</view>\n            <view style=\"font-size: 10px\">Service数量: {{utils.len(item.advertisServiceUUIDs)}}</view>\n          </view>\n        </scroll-view>\n      </view>\n\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"openBluetoothAdapter\">开始扫描</button>\n        <button bindtap=\"stopBluetoothDevicesDiscovery\">停止扫描</button>\n      </view>\n       <view class=\"btn-area\">\n        <button type=\"primary\" \n        bind:tap=\"changeMode\">\n          进去从机模式\n        </button>\n       </view>\n    </view>\n  </view>\n\n  <view class=\"connected_info\" wx:if=\"{{connected}}\">\n    <view>\n      <text>已连接到 {{name}}</text>\n      <view class=\"operation\">\n      <button wx:if=\"{{canWrite}}\" size=\"mini\" bindtap=\"writeBLECharacteristicValue\">写数据</button>\n      <button size=\"mini\" bindtap=\"closeBLEConnection\">断开连接</button>\n      </view>\n    </view>\n    <view wx:for=\"{{chs}}\" wx:key=\"index\" style=\"font-size: 12px; margin-top: 10px;\">\n      <view>特性UUID: {{item.uuid}}</view>\n      <view>特性值: {{item.value}}</view>\n    </view>\n  </view>\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/bluetooth/bluetooth.wxss",
    "content": "\n.devices_summary {\n  padding: 5px;\n  font-size: 15px;\n}\n.device_list {\n  height: 150px;\n  border-radius: 3px;\n  flex: 1;\n}\n.device_item {\n  border-bottom: 1px solid var(--weui-FG-3);\n  padding: 5px;\n  color: var(--weui-FG-HALF);\n}\n.device_item_hover {\n  background-color: rgba(0, 0, 0, .1);\n}\n.connected_info {\n  position: fixed;\n  bottom: 0;\n  width: 100%;\n  background-color: var(--weui-BG-4);\n  padding: 5px;\n  padding-bottom: 10px;\n  margin-bottom: env(safe-area-inset-bottom);\n  font-size: 14px;\n  min-height: 50px;\n  box-shadow: 0px 0px 2px 0px;\n}\n.connected_info .operation {\n  position: absolute;\n  display: inline-block;\n  right: 15px;\n}\n.page-body-info {\n  padding: 15px;\n  box-sizing: border-box;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/bluetooth/slave/slave.js",
    "content": "const uuid3 = '0C76801A-62EB-45E5-96A8-37C8882ABB2B'\nconst serviceId = 'D0611E78-BBB4-4591-A5F8-487910AE4366'\nconst characteristicId = '8667556C-9A37-4C91-84ED-54EE27D90049'\n// 上面需要配置主机的 serviceId 和 characteristicId\n\n// ArrayBuffer转16进制字符串示例\n// function ab2hex(buffer) {\n//   const hexArr = Array.prototype.map.call(\n//     new Uint8Array(buffer),\n//     function (bit) {\n//       return ('00' + bit.toString(16)).slice(-2)\n//     }\n//   )\n//   return hexArr.join('')\n// }\n\nfunction inArray(arr, key, val) {\n  for (let i = 0; i < arr.length; i++) {\n    if (arr[i][key] === val) {\n      return i\n    }\n  }\n  return -1\n}\n\n// slave/slave.js\nPage({\n  onShareAppMessage() {\n    return {\n      title: '蓝牙',\n      path: 'packageAPI/pages/device/slave/slave'\n    }\n  },\n  data: {\n    theme: 'light',\n    connects: [],\n    servers: []\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n    this.data.servers.forEach(() => {\n      // server.close()\n    })\n  },\n\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    wx.onBLEPeripheralConnectionStateChanged(res => {\n      console.log('connect')\n      const connects = this.data.connects\n      const idx = inArray(connects, 'deviceId', res.deviceId)\n      if (idx >= 0) {\n        connects[idx] = res\n      } else {\n        connects.push(res)\n      }\n      this.setData({ connects })\n    })\n  },\n\n  openBluetoothAdapter() {\n    // 初始化蓝牙模块\n    wx.openBluetoothAdapter({\n      mode: 'peripheral',\n      success: (res) => {\n        console.log('openBluetoothAdapter success', res)\n        this.createBLEPeripheralServer()\n      },\n      fail: (res) => {\n        console.log(res)\n        wx.showToast({\n          title: `创建失败 错误码: ${res.errCode}`,\n          icon: 'none'\n        })\n        if (res.errCode === 10001) {\n          wx.onBluetoothAdapterStateChange(function (res) {\n            console.log('onBluetoothAdapterStateChange', res)\n            if (res.available) {\n              this.createBLEPeripheralServer()\n            }\n          })\n        }\n      }\n    })\n  },\n\n  createBLEPeripheralServer() {\n    //\n    wx.createBLEPeripheralServer().then(res => {\n      console.log('createBLEPeripheralServer', res)\n      this.data.servers.push(res.server)\n      this.server = res.server\n      this.setData({\n        serverId: this.server.serverId\n      })\n      wx.showToast({\n        title: '创建 server ',\n      })\n      this.server.onCharacteristicReadRequest(res => {\n        const { serviceId, characteristicId, callbackId } = res\n        const buffer = new ArrayBuffer(1)\n        const dataView = new DataView(buffer)\n        const newValue = Math.ceil(Math.random() * 10)\n        dataView.setUint8(0, newValue)\n        console.log('onCharacteristicReadRequest', res, newValue)\n        this.server.writeCharacteristicValue({\n          serviceId,\n          characteristicId,\n          value: buffer,\n          needNotify: true,\n          callbackId\n        })\n      })\n      // 监听收到数据\n      this.server.onCharacteristicWriteRequest(res => {\n        console.log('onCharacteristicWriteRequest', res)\n        const {\n          serviceId, characteristicId, value, callbackId\n        } = res\n        wx.showToast({\n          title: '收到主机数据'\n        })\n        this.server.writeCharacteristicValue({\n          serviceId,\n          characteristicId,\n          value,\n          needNotify: true,\n          callbackId\n        })\n      })\n      return res\n    }).catch(() => {})\n  },\n  closeServer() {\n    if (this.server) {\n      this.server.close()\n      wx.showToast({\n        title: '关闭 server',\n      })\n    }\n  },\n  chaneMode() {\n    wx.navigateBack()\n  },\n  onConfirm(e) {\n    console.log('onConfirm')\n    const n = e.detail.value * 1\n    const buffer = new ArrayBuffer(1)\n    const dataView = new DataView(buffer)\n    dataView.setUint8(0, n)\n    if (!this.server) {\n      wx.showModal({\n        title: '请先创建server',\n      })\n      return\n    }\n    this.server.writeCharacteristicValue({\n      serviceId,\n      characteristicId,\n      value: buffer,\n      needNotify: true\n    })\n    wx.showModal({\n      title: '写入成功',\n      content: '请在主机查看'\n    })\n  },\n  showInput() {\n    this.setData({\n      input: !this.data.input\n    })\n  },\n  addService() {\n    const buffer = new ArrayBuffer(1)\n    const dataView = new DataView(buffer)\n    dataView.setUint8(0, 2)\n    const descriptorBuffer = new ArrayBuffer(1)\n    const dataView2 = new DataView(descriptorBuffer)\n    dataView2.setInt8(0, 3)\n    const service = {\n      uuid: serviceId,\n      characteristics: [{\n        uuid: characteristicId,\n        properties: {\n          write: true,\n          read: true,\n          notify: true,\n          indicate: true\n        },\n        permission: {\n          readable: true,\n          writeable: true,\n          readEncryptionRequired: true,\n          writeEncryptionRequired: true\n        },\n        value: buffer,\n        descriptors: [{\n          uuid: uuid3,\n          permission: {\n            write: true,\n            read: true\n          },\n          value: descriptorBuffer\n        }]\n      }]\n    }\n    if (!this.server) {\n      wx.showModal({\n        title: '请先创建server',\n      })\n      return\n    }\n    this.server.addService({\n      service\n    }).then(res => {\n      console.log('add Service', res)\n      wx.showToast({\n        title: '创建服务',\n      })\n      return res\n    }, (rej) => {\n      console.log(rej)\n      if (rej.errCode === 10001) {\n        wx.showToast({\n          title: '请打开蓝牙',\n        })\n      } else {\n        wx.showModal({\n          title: '创建失败',\n          content: `错误码: ${rej.errCode}`\n        })\n      }\n    }).catch(() => {})\n  },\n  removeService() {\n    if (!this.server) return\n    this.server.removeService({\n      serviceId\n    }).then(res => {\n      wx.showToast({\n        title: '关闭服务',\n      })\n      console.log('removeService', res)\n      return res\n    }).catch(() => {})\n  },\n  startAdvertising() {\n    if (!this.server) {\n      wx.showModal({\n        title: '请先创建server',\n      })\n      return\n    }\n    const buffer = new ArrayBuffer(1)\n    const dataView = new DataView(buffer)\n    dataView.setInt8(0, 4)\n    this.server.startAdvertising({\n      advertiseRequest: {\n        connectable: true,\n        deviceName: 'sanford',\n        serviceUuids: [serviceId],\n        manufacturerData: [{\n          manufacturerId: 'sanfordsun-pc0',\n          manufacturerSpecificData: buffer\n        }]\n      },\n      powerLevel: 'medium'\n    }).then(res => {\n      console.log('startAdvertising', res)\n      wx.showToast({\n        title: '开启广播',\n      })\n      return res\n    }).catch(() => {})\n  },\n\n  stopAdvertising() {\n    if (!this.server) {\n      wx.showModal({\n        title: '请先创建server',\n      })\n      return\n    }\n    this.server.stopAdvertising()\n    wx.showToast({\n      title: '关闭广播',\n    })\n  },\n\n  closeBluetoothAdapter() {\n    wx.showToast({\n      title: '结束流程',\n    })\n    wx.closeBluetoothAdapter()\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/bluetooth/slave/slave.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/bluetooth/slave/slave.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'bluetooth'}}\"/>\n  <view class=\"page-body\" style=\"display: flex; flex-direction: column\">\n    <text style=\"text-align: center; margin: 16px\">当前 serverId {{serverId}}</text>\n    <view class=\"action-area\">\n      <button type=\"primary\" bindtap=\"openBluetoothAdapter\">创建server</button>\n      <button type=\"primary\" bindtap=\"closeServer\">关闭server</button>\n    </view>\n    <view class=\"action-area\">\n      <button type=\"primary\" bindtap=\"addService\">创建服务</button>\n      <button type=\"primary\" bindtap=\"removeService\">关闭服务</button>\n    </view>\n    <view class=\"action-area\">\n      <button type=\"primary\" bindtap=\"startAdvertising\">开启广播</button>\n      <button type=\"primary\" bindtap=\"stopAdvertising\">关闭广播</button>\n    </view>\n    <view class=\"action-area\">\n      <button type=\"primary\" bindtap=\"showInput\">写数据</button>\n      <button type=\"primary\" bindtap=\"closeBluetoothAdapter\">结束流程</button>\n    </view>\n    <button type=\"primary\" bindtap=\"chaneMode\">返回主机模式</button>\n    <block wx:if=\"{{input}}\">\n      <input style=\"width: 200px;margin: 0 auto;background: var(--weui-BG-2);padding: 5px;\" \n        placeholder=\"写个数字\" \n        bindconfirm=\"onConfirm\"\n      ></input>\n    </block>\n    <view>\n      <view wx:for=\"{{connects}}\" wx:if=\"{{connects.length > 0}}\">\n        <view>\n          <text>{{item.deviceId}} : {{item.serverId}}</text>\n          <text>{{item.connected ? \"已连接\" : \"断开\"}}</text>\n        </view>\n      </view>\n    </view>\n  </view>\n  <template is=\"foot\"></template>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/bluetooth/slave/slave.wxss",
    "content": ".action-area {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-around;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/capture-screen/capture-screen.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '用户截屏事件',\n      path: 'packageAPI/pages/device/capture-screen/capture-screen'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    captured: false,\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    wx.onUserCaptureScreen(() => {\n      this.setData({\n        captured: true\n      })\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/capture-screen/capture-screen.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"用户截屏事件\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/capture-screen/capture-screen.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'onUserCaptureScreen'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-body-info\">\n      <view class=\"page-body-title\">请进行屏幕截屏</view>\n      <text class=\"page-body-text\">截屏事件{{ captured ? \"已\" : \"未\" }}触发</text>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/capture-screen/capture-screen.wxss",
    "content": ".page-body-text {\n  font-size: 20px;\n  font-family: -apple-system-font, Helvetica Neue,Helvetica,sans-serif;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/clipboard-data/clipboard-data.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '剪切板',\n      path: 'packageAPI/pages/device/clipboard-data/clipboard-data'\n    }\n  },\n  onShareTimeline() {\n    return {\n      title: '剪切板'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    value: 'edit and copy me',\n    pasted: '',\n  },\n\n  valueChanged(e) {\n    this.setData({\n      value: e.detail.value\n    })\n  },\n\n  copy() {\n    wx.setClipboardData({\n      data: this.data.value,\n      success() {\n        wx.showToast({\n          title: '复制成功',\n          icon: 'success',\n          duration: 1000\n        })\n      }\n    })\n  },\n\n  paste() {\n    const self = this\n    wx.getClipboardData({\n      success(res) {\n        self.setData({\n          pasted: res.data\n        })\n        wx.showToast({\n          title: '粘贴成功',\n          icon: 'success',\n          duration: 1000\n        })\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/clipboard-data/clipboard-data.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"剪切板\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/clipboard-data/clipboard-data.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'get/set/ClipboardData'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"weui-cells weui-cells_after-title\">\n      <view class=\"weui-cell weui-cell_input\">\n        <view class=\"weui-cell__hd\">\n          <view class=\"weui-label\">Copy</view>\n        </view>\n        <view class=\"weui-cell__bd\">\n          <input class=\"weui-input\" type=\"text\" name=\"key\" value=\"{{value}}\" bindinput=\"valueChanged\"></input>\n        </view>\n      </view>\n      <view class=\"weui-cell weui-cell_input\">\n        <view class=\"weui-cell__hd\">\n          <view class=\"weui-label\">Paste</view>\n        </view>\n        <view class=\"weui-cell__bd\">\n          <input class=\"weui-input\" type=\"text\" value=\"{{pasted}}\"></input>\n        </view>\n      </view>\n    </view>\n\n    <view class=\"btn-area\">\n      <button type=\"primary\" bindtap=\"copy\">复制</button>\n      <button bindtap=\"paste\">粘贴</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/clipboard-data/clipboard-data.wxss",
    "content": "\n\n.page-body-info {\n  padding: 5px;\n  height: 100px;\n  overflow: scroll-y;\n  text-align: left;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/get-battery-info/get-battery-info.js",
    "content": "// miniprogram/page/API/pages/get-battery-info/get-battery-info.js\nPage({\n  onShareAppMessage() {\n    return {\n      title: '获取电池信息',\n      path: 'packageAPI/pages/device/get-battery-info/get-battery-info'\n    }\n  },\n  data: {\n    theme: 'light',\n\n  },\n\n  getBatteryInfo() {\n    wx.getBatteryInfo({\n      complete: (res) => {\n        const msg = res.isCharging ? '充电中' : '使用电池中'\n        this.setData({\n          level: res.level,\n          isCharging: msg,\n        })\n      },\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/get-battery-info/get-battery-info.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"获取手机设备电量\"\n\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/get-battery-info/get-battery-info.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'getBatteryInfo'}}\"/>\n\n  <view class=\"page-body\">\n  \t<view class=\"page-section\">\n    <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">当前电量</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\" placeholder=\"未获取\" value=\"{{level}}\"></input>\n          </view>\n        </view>\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">电池模式</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\" placeholder=\"未获取\" value=\"{{isCharging}}\"></input>\n          </view>\n        </view>\n      </view>\n      <button type=\"primary\" bind:tap=\"getBatteryInfo\" >\n        获取电量信息信息\n      </button>\n    </view>\n  </view>\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/get-battery-info/get-battery-info.wxss",
    "content": "\n\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/get-network-type/get-network-type.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '获取手机网络状态',\n      path: 'packageAPI/pages/device/get-network-type/get-network-type'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    hasNetworkType: false\n  },\n  getNetworkType() {\n    const that = this\n    wx.getNetworkType({\n      success(res) {\n        console.log(res)\n        that.setData({\n          hasNetworkType: true,\n          networkType: res.subtype || res.networkType\n        })\n      }\n    })\n  },\n  clear() {\n    this.setData({\n      hasNetworkType: false,\n      networkType: ''\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/get-network-type/get-network-type.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"获取手机网络状态\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/get-network-type/get-network-type.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'getNetworkType'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info\">\n        <view class=\"page-body-title\">网络状态</view>\n        <block wx:if=\"{{hasNetworkType === false}}\">\n          <text class=\"page-body-text\">未获取</text>\n          <text class=\"page-body-text\">点击绿色按钮可获取网络状态</text>\n        </block>\n        <block wx:if=\"{{hasNetworkType === true}}\">\n          <text class=\"page-body-text-network-type\">{{networkType}}</text>\n        </block>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"getNetworkType\">获取手机网络状态</button>\n        <button bindtap=\"clear\">清空</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/get-network-type/get-network-type.wxss",
    "content": ".page-body-info {\n  height: 100px;\n}\n.page-body-text-network-type {\n  font-size: 40px;\n  font-family: -apple-system-font,Helvetica Neue,Helvetica,sans-serif;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/get-system-info/get-system-info.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '获取手机系统信息',\n      path: 'packageAPI/pages/device/get-system-info/get-system-info'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    systemInfo: {}\n  },\n  getSystemInfo() {\n    const that = this\n    wx.getSystemInfo({\n      success(res) {\n        that.setData({\n          systemInfo: res\n        })\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/get-system-info/get-system-info.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"获取手机系统信息\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/get-system-info/get-system-info.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'getSystemInfo'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">手机品牌</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\" placeholder=\"未获取\" value=\"{{systemInfo.brand}}\"></input>\n          </view>\n        </view>\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">手机型号</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\" placeholder=\"未获取\" value=\"{{systemInfo.model}}\"></input>\n          </view>\n        </view>\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">微信语言</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\" placeholder=\"未获取\" value=\"{{systemInfo.language}}\"></input>\n          </view>\n        </view>\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">微信版本</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\" placeholder=\"未获取\" value=\"{{systemInfo.version}}\"></input>\n          </view>\n        </view>\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">屏幕宽度</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\" placeholder=\"未获取\" value=\"{{systemInfo.windowWidth}}\"></input>\n          </view>\n        </view>\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">屏幕高度</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\" placeholder=\"未获取\" value=\"{{systemInfo.windowHeight}}\"></input>\n          </view>\n        </view>\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">DPR</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\" placeholder=\"未获取\" value=\"{{systemInfo.pixelRatio}}\"></input>\n          </view>\n        </view>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"getSystemInfo\">获取手机系统信息</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/get-system-info/get-system-info.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/device/ibeacon/ibeacon.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'iBeacon',\n      path: 'packageAPI/pages/device/ibeacon/ibeacon'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    uuid: '',\n    beacons: []\n  },\n\n  enterUuid(e) {\n    this.setData({\n      uuid: e.detail.value\n    })\n  },\n\n  startSearch() {\n    if (this._searching) return\n    this._searching = true\n    wx.startBeaconDiscovery({\n      uuids: [this.data.uuid],\n      success: (res) => {\n        console.log(res)\n        wx.onBeaconUpdate(({ beacons }) => {\n          this.setData({\n            beacons\n          })\n        })\n      },\n      fail: (err) => {\n        console.error(err)\n      }\n    })\n  },\n\n  stopSearch() {\n    this._searching = false\n    wx.stopBeaconDiscovery()\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n    this.stopSearch()\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/ibeacon/ibeacon.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"iBeacon\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/ibeacon/ibeacon.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'iBeacon'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">输入iBeacon设备广播的UUID</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <input class=\"weui-input\" bindinput=\"enterUuid\" />\n        </view>\n      </view>\n    </view>\n    <view class=\"btn-area\">\n      <button type=\"primary\" bindtap=\"startSearch\">搜索iBeacon</button>\n      <button bindtap=\"stopSearch\">停止搜索</button>\n    </view>\n    <view class=\"page-body-info\">\n      <view class=\"devices_summary\">已发现 {{beacons.length}} 个外围设备：</view>\n      <scroll-view class=\"device_list\" scroll-y scroll-with-animation>\n        <view wx:for=\"{{beacons}}\" wx:key=\"index\"\n         class=\"device_item\"\n         hover-class=\"device_item_hover\">\n          <view style=\"font-size: 16px; color: #333;\">主ID: {{item.major}} <text style=\"font-size: 12px;\">次ID: {{item.minor}}</text></view>\n          <view style=\"font-size: 10px\">信号强度: {{item.rssi}}dBm</view>\n          <view style=\"font-size: 10px\">UUID: {{item.uuid}}</view>\n          <view style=\"font-size: 10px\">Proximity: {{item.proximity}} Accuracy: {{item.accuracy}}</view>\n        </view>\n      </scroll-view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/ibeacon/ibeacon.wxss",
    "content": "\n\n.page-body-info {\n  margin-top: 25px;\n  padding: 15px 30px;\n  width: auto;\n}\n\n.devices_summary {\n  padding: 5px;\n  font-size: 15px;\n}\n.device_list {\n  height: 150px;\n  border-radius: 3px;\n  flex: 1;\n}\n.device_item {\n  border-bottom: 1px solid var(--weui-FG-3);\n  padding: 5px;\n  color: var(--weui-FG-HALF);\n}\n.device_item_hover {\n  background-color: rgba(0, 0, 0, .1);\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/make-phone-call/make-phone-call.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '打电话',\n      path: 'packageAPI/pages/device/make-phone-call/make-phone-call'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    disabled: true\n  },\n  bindInput(e) {\n    this.inputValue = e.detail.value\n\n    if (this.inputValue.length > 0) {\n      this.setData({\n        disabled: false\n      })\n    } else {\n      this.setData({\n        disabled: true\n      })\n    }\n  },\n  makePhoneCall() {\n    wx.makePhoneCall({\n      phoneNumber: this.inputValue,\n      success() {\n        console.log('成功拨打电话')\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/make-phone-call/make-phone-call.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"打电话\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/make-phone-call/make-phone-call.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'makePhoneCall'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"desc\">请在下方输入电话号码</view>\n      <input class=\"input\" type=\"number\" name=\"input\" bindinput=\"bindInput\" />\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"makePhoneCall\" disabled=\"{{disabled}}\">拨打</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/make-phone-call/make-phone-call.wxss",
    "content": ".page-section{\n  width: auto;\n  margin: 15px;\n  padding: 42px 30px 30px;\n  background-color: var(--weui-BG-2);\n  font-size: 14px;\n}\n.desc{\n  margin-bottom: 10px;\n}\n.input{\n  height: 60px;\n  line-height: 60px;\n  font-size: 39px;\n  border-bottom: 1px solid var(--weui-FG-3);\n}\n.btn-area{\n  padding: 0;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/on-accelerometer-change/on-accelerometer-change.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '监听重力感应数据',\n      path: 'packageAPI/pages/device/on-accelerometer-change/on-accelerometer-change'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    x: 0,\n    y: 0,\n    z: 0,\n    enabled: true\n  },\n  onReady() {\n    this.drawBigBall()\n    const that = this\n\n    this.position = {\n      x: 151,\n      y: 151,\n      vx: 0,\n      vy: 0,\n      ax: 0,\n      ay: 0\n    }\n    wx.onAccelerometerChange(function (res) {\n      that.setData({\n        x: res.x.toFixed(2),\n        y: res.y.toFixed(2),\n        z: res.z.toFixed(2)\n      })\n      that.position.ax = Math.sin((res.x * Math.PI) / 2)\n      that.position.ay = -Math.sin((res.y * Math.PI) / 2)\n      // that.drawSmallBall()\n    })\n\n    this.interval = setInterval(function () {\n      that.drawSmallBall()\n    }, 17)\n  },\n  drawBigBall() {\n    const context = wx.createContext()\n    context.beginPath(0)\n    context.arc(151, 151, 140, 0, Math.PI * 2)\n    context.setFillStyle('#ffffff')\n    context.setStrokeStyle('#aaaaaa')\n    context.fill()\n    // context.stroke()\n    wx.drawCanvas({\n      canvasId: 'big-ball',\n      actions: context.getActions()\n    })\n  },\n  drawSmallBall() {\n    const p = this.position\n    let strokeStyle = 'rgba(1,1,1,0)'\n\n    p.x += p.vx\n    p.y += p.vy\n    p.vx += p.ax\n    p.vy += p.ay\n\n    // eslint-disable-next-line\n    if (Math.sqrt(Math.pow(Math.abs(p.x) - 151, 2) + Math.pow(Math.abs(p.y) - 151, 2)) >= 115) {\n      if (p.x > 151 && p.vx > 0) {\n        p.vx = 0\n      }\n      if (p.x < 151 && p.vx < 0) {\n        p.vx = 0\n      }\n      if (p.y > 151 && p.vy > 0) {\n        p.vy = 0\n      }\n      if (p.y < 151 && p.vy < 0) {\n        p.vy = 0\n      }\n      strokeStyle = '#ff0000'\n    }\n\n    const context = wx.createContext()\n    context.beginPath(0)\n    context.arc(p.x, p.y, 15, 0, Math.PI * 2)\n    context.setFillStyle('#1aad19')\n    context.setStrokeStyle(strokeStyle)\n    context.fill()\n    // context.stroke()\n    wx.drawCanvas({\n      canvasId: 'small-ball',\n      actions: context.getActions()\n    })\n  },\n  startAccelerometer() {\n    if (this.data.enabled) {\n      return\n    }\n    const that = this\n    wx.startAccelerometer({\n      success() {\n        that.setData({\n          enabled: true\n        })\n      }\n    })\n  },\n  stopAccelerometer() {\n    if (!this.data.enabled) {\n      return\n    }\n    const that = this\n    wx.stopAccelerometer({\n      success() {\n        that.setData({\n          enabled: false\n        })\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n    clearInterval(this.interval)\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/on-accelerometer-change/on-accelerometer-change.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"监听重力感应数据\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/on-accelerometer-change/on-accelerometer-change.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'onAccelerometerChange'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section page-section_center\">\n      <text class=\"page-body-text\">倾斜手机即可移动下方小球</text>\n      <view class=\"page-body-canvas\">\n        <canvas class=\"page-body-ball\" show=\"{{true}}\" canvas-id=\"big-ball\"></canvas>\n        <canvas class=\"page-body-ball\" show=\"{{true}}\" canvas-id=\"small-ball\"></canvas>\n      </view>\n      <view class=\"page-body-xyz\">\n        <text class=\"page-body-title\">X: {{x}}</text>\n        <text class=\"page-body-title\">Y: {{y}}</text>\n        <text class=\"page-body-title\">Z: {{z}}</text>\n      </view>\n      <view class=\"page-body-controls\">\n        <button bindtap=\"startAccelerometer\" disabled=\"{{enabled}}\">开始监听</button>\n        <button bindtap=\"stopAccelerometer\" disabled=\"{{!enabled}}\">停止监听</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/on-accelerometer-change/on-accelerometer-change.wxss",
    "content": ".page-body-xyz {\n  display: flex;\n  justify-content: space-between;\n  width: 350px;\n  margin-top: 45px;\n  box-sizing: border-box;\n  text-align: center;\n}\n.page-body-canvas {\n  margin-top: 15px;\n  width: 302px;\n  height: 302px;\n  position: relative;\n}\n.page-body-ball {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 302px;\n  height: 302px;\n}\n.page-body-title {\n  margin-bottom: 0;\n  font-size: 16px;\n  width: 225px;\n}\n.page-body-controls {\n  margin-top: 15px;\n}\n.page-body-controls button {\n  margin-left: 10px;\n  float: left;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/on-compass-change/on-compass-change.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '监听罗盘数据',\n      path: 'packageAPI/pages/device/on-compass-change/on-compass-change'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    enabled: true,\n    direction: 0\n  },\n  onReady() {\n    const that = this\n    wx.onCompassChange(function (res) {\n      that.setData({\n        direction: parseInt(res.direction, 10)\n      })\n    })\n  },\n  startCompass() {\n    if (this.data.enabled) {\n      return\n    }\n    const that = this\n    wx.startCompass({\n      success() {\n        that.setData({\n          enabled: true\n        })\n      }\n    })\n  },\n  stopCompass() {\n    if (!this.data.enabled) {\n      return\n    }\n    const that = this\n    wx.stopCompass({\n      success() {\n        that.setData({\n          enabled: false\n        })\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/on-compass-change/on-compass-change.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"监听罗盘数据\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/on-compass-change/on-compass-change.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'onCompassChange'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section page-section_center\">\n      <text class=\"page-body-text\">旋转手机即可获取方位信息</text>\n      <view class=\"direction\">\n        <view class=\"bg-compass-line\"></view>\n        <image class=\"bg-compass\" src=\"compass.png\" style=\"transform: rotate({{direction}}deg)\"></image>\n        <view class=\"direction-value\">\n          <text>{{direction}}</text>\n          <text class=\"direction-degree\">o</text>\n        </view>\n      </view>\n      <view class=\"controls\">\n        <button bindtap=\"startCompass\" disabled=\"{{enabled}}\">开始监听</button>\n        <button bindtap=\"stopCompass\" disabled=\"{{!enabled}}\">停止监听</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/on-compass-change/on-compass-change.wxss",
    "content": ".direction {\n  position: relative;\n  margin-top: 35px;\n  display: flex;\n  width: 520px;\n  height: 520px;\n  align-items: center;\n  justify-content: center;\n}\n.direction-value {\n  position: relative;\n  font-size: 100px;\n  color: #353535;\n  line-height: 1;\n  z-index: 1;\n}\n.direction-degree {\n  position: absolute;\n  top: 0;\n  right: -20px;\n  font-size: 30px;\n}\n.bg-compass{\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 520px;\n  height: 520px;\n  transition: .1s;\n}\n.bg-compass-line{\n  position: absolute;\n  left: 134px;\n  top: -5px;\n  width: 3px;\n  height: 28px;\n  background-color: #1AAD19;\n  border-radius: 500px;\n  z-index: 1;\n}\n.controls{\n  margin-top: 35px;\n}\n.controls button{\n  margin-left: 10px;\n  float: left;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/on-network-status-change/on-network-status-change.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '监听手机网络变化',\n      path: 'packageAPI/pages/device/on-network-status-change/on-network-status-change'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    isConnected: false,\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    const that = this\n    wx.onNetworkStatusChange(function (res) {\n      that.setData({\n        isConnected: res.isConnected,\n        networkType: res.networkType\n      })\n    })\n  },\n  onShow() {\n    const that = this\n    wx.getNetworkType({\n      success(res) {\n        that.setData({\n          isConnected: res.networkType !== 'none',\n          networkType: res.networkType\n        })\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/on-network-status-change/on-network-status-change.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"监听手机网络变化\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/on-network-status-change/on-network-status-change.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'onNetworkStatusChange'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info\">\n        <view class=\"page-body-title\">网络状态</view>\n        <block wx:if=\"{{isConnected === false}}\">\n          <text class=\"page-body-text\">没有网络连接</text>\n        </block>\n        <block wx:if=\"{{isConnected === true}}\">\n          <text class=\"page-body-text-network-type\">{{networkType}}</text>\n        </block>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/on-network-status-change/on-network-status-change.wxss",
    "content": ".page-body-info {\n  height: 100px;\n}\n.page-body-text-network-type {\n  font-size: 40px;\n  font-family: -apple-system-font,Helvetica Neue,Helvetica,sans-serif;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/scan-code/scan-code.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '扫码',\n      path: 'packageAPI/pages/device/scan-code/scan-code'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    result: ''\n  },\n\n  scanCode() {\n    const that = this\n    wx.scanCode({\n      scanType: ['barCode', 'qrCode', 'datamatrix', 'pdf417'],\n      success(res) {\n        that.setData({\n          result: res.result\n        })\n      },\n      fail(err) {\n        console.log('scanCode fail: ', err)\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/scan-code/scan-code.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"扫码\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/scan-code/scan-code.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'scanCode'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"weui-cells__title\">扫码结果</view>\n    <view class=\"weui-cells weui-cells_after-title\">\n      <view class=\"weui-cell\">\n        <view class=\"weui-cell__bd\">{{result}}</view>\n      </view>\n    </view>\n    <view class=\"btn-area\">\n      <button type=\"primary\" bindtap=\"scanCode\">扫一扫</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/scan-code/scan-code.wxss",
    "content": "\n\n.weui-cell__bd{\n  min-height: 24px;\n  word-break: break-all;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/screen-brightness/screen-brightness.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '屏幕亮度',\n      path: 'packageAPI/pages/device/screen-brightness/screen-brightness'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    screenBrightness: 0\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    this._updateScreenBrightness()\n  },\n\n  changeBrightness(e) {\n    const value = Number.parseFloat(\n      (e.detail.value).toFixed(1)\n    )\n    this.setData({\n      screenBrightness: Number.parseFloat(\n        e.detail.value.toFixed(1)\n      )\n    })\n    wx.setScreenBrightness({\n      value,\n\n    })\n  },\n\n  _updateScreenBrightness() {\n    wx.getScreenBrightness({\n      success: (res) => {\n        console.log(res)\n        this.setData({\n          screenBrightness: Number.parseFloat(\n            res.value.toFixed(1)\n          )\n        })\n      },\n      fail(err) {\n        console.error(err)\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/screen-brightness/screen-brightness.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"屏幕亮度\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/screen-brightness/screen-brightness.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'get/set/ScreenBrightness'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-body-info\">\n      <view class=\"page-body-title\">当前屏幕亮度</view>\n      <text class=\"page-body-text-screen-brightness\">{{screenBrightness}}</text>\n    </view>\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">设置屏幕亮度</view>\n      <view class=\"body-view\">\n        <slider bindchange=\"changeBrightness\" value=\"{{screenBrightness}}\" min=\"0\" max=\"1\" step=\"0.1\"/>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/screen-brightness/screen-brightness.wxss",
    "content": ".page-body-text-screen-brightness {\n  font-size: 40px;\n  font-family: -apple-system-font, Helvetica Neue,Helvetica,sans-serif;\n}\n\n.page-section-gap {\n  padding: 15px;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/vibrate/vibrate.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '振动',\n      path: 'packageAPI/pages/device/vibrate/vibrate'\n    }\n  },\n\n  vibrateShort() {\n    wx.vibrateShort({\n      success(res) {\n        console.log(res)\n      },\n      fail(err) {\n        console.error(err)\n      },\n      complete() {\n        console.log('completed')\n      }\n    })\n  },\n\n  vibrateLong() {\n    wx.vibrateLong({\n      success(res) {\n        console.log(res)\n      },\n      fail(err) {\n        console.error(err)\n      },\n      complete() {\n        console.log('completed')\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/vibrate/vibrate.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"振动\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/vibrate/vibrate.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'vibrate/Long/Short'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"vibrateLong\">长振动</button>\n        <button type=\"default\" bindtap=\"vibrateShort\">短振动</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/vibrate/vibrate.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/device/wifi/wifi.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'Wi-Fi',\n      path: 'packageAPI/pages/device/wifi/wifi'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    wifiList: []\n  },\n\n  startSearch() {\n    const getWifiList = () => {\n      wx.getWifiList({\n        success: () => {\n          wx.onGetWifiList((res) => {\n            const wifiList = res.wifiList\n              .sort((a, b) => b.signalStrength - a.signalStrength)\n              .map(wifi => {\n                const strength = Math.ceil(wifi.signalStrength * 4)\n                return Object.assign(wifi, { strength })\n              })\n            this.setData({\n              wifiList\n            })\n          })\n        },\n        fail(err) {\n          console.error(err)\n        }\n      })\n    }\n\n    const startWifi = () => {\n      wx.startWifi({\n        success: getWifiList,\n        fail(err) {\n          console.error(err)\n        }\n      })\n    }\n\n    wx.getSystemInfo({\n      success(res) {\n        const isIOS = res.platform === 'ios'\n        if (isIOS) {\n          wx.showModal({\n            title: '提示',\n            content: '由于系统限制，iOS用户请手动进入系统WiFi页面，然后返回小程序。',\n            showCancel: false,\n            success() {\n              startWifi()\n            }\n          })\n          return\n        }\n        startWifi()\n      }\n    })\n  },\n\n  stopSearch() {\n    wx.stopWifi({\n      success(res) {\n        console.log(res)\n      },\n      fail(err) {\n        console.error(err)\n      }\n    })\n  },\n  onUnload() {\n    this.stopSearch()\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/wifi/wifi.json",
    "content": "{\n   \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"Wi-Fi\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/wifi/wifi.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'Wi-Fi'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-body-info\">\n      <scroll-view class=\"device-list\" scroll-y>\n        <view class=\"item\" wx:for=\"{{wifiList}}\" wx:key=\"{{index}}\">\n          <view class=\"list\">\n            <text>{{ item.SSID }}</text>\n            <span class=\"wifi-icon\">\n              <span class=\"wifi-1\"></span>\n              <span class=\"wifi-2 {{item.strength < 2 ? 'off' : ''}}\"></span>\n              <span class=\"wifi-3 {{item.strength < 3 ? 'off' : ''}}\"></span>\n              <span class=\"wifi-4 {{item.strength < 4 ? 'off' : ''}}\"></span>\n              <span class=\"lock\" wx:if=\"{{item.secure}}\"></span>\n            </span>\n          </view>\n        </view>\n      </scroll-view>\n    </view>\n    <view class=\"btn-area\">\n      <button type=\"primary\" bindtap=\"startSearch\">搜索Wi-Fi</button>\n      <button bindtap=\"stopSearch\">停止搜索</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/device/wifi/wifi.wxss",
    "content": ".page-body-info {\n  padding: 15px 30px;\n  width: auto;\n}\n\n.device-list {\n  height: 150px;\n  text-align: center;\n}\n\n.item {\n  width: 100%;\n  margin-bottom: 10px;\n}\n\n.list {\n  width: 100%;\n  text-align: left;\n  display:flex;\n  flex-direction:row;\n  align-items:center;\n  justify-content:space-between;\n  font-size: 15px;\n}\n\n.list text {\n  display: inline-block;\n  max-width: 80%;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.strength-ready { color: #26a69a; }\n.strength-no { color: #37474f; }\n.wifi-icon{\n  width: 20px;\n  height:20px;\n  display: inline-block;\n  position: relative;\n  overflow: hidden;\n  margin: 0 10px;\n  float: right;\n}\n.wifi-icon span{\n  display: block;\n  position: absolute;\n  border-radius: 50%;\n}\n.wifi-icon .wifi-1{\n  width: 4px;\n  height: 4px;\n  left: 8px;\n  bottom: 3px;\n  background: currentcolor;\n}\n.wifi-icon .wifi-2,.wifi-icon .wifi-3,.wifi-icon .wifi-4{\n  border: 2px solid;\n  border-color: currentcolor transparent transparent;\n }\n.wifi-icon .wifi-2{\n  width: 12px;\n  height: 12px;\n  left: 2px;\n  bottom: -4px;\n}\n.wifi-icon .wifi-3{\n  width: 20px;\n  height: 20px;\n  left: -2px;\n  bottom: -8px;\n  }\n.wifi-icon .wifi-4{\n  width: 28px;\n  height: 28px;\n  left: -6px;\n  bottom: -12px;\n}\n.wifi-icon span:after{\n  content: \"\";\n  display: block;\n  position: absolute;\n}\n.wifi-icon .lock{\n  width: 6px;\n  height: 5px;\n  background: currentcolor;\n  display: block;\n  right: 1px;\n  bottom: 2px;\n  border-radius: 0;\n}\n.wifi-icon .lock:after{\n  width: 4px;\n  height: 3px;\n  border: 1px solid;\n  border-radius: 100px 100px 0 0;\n  border-bottom: none;\n  left: 0px;\n  bottom: 100%;\n}\n.off {\n  border-color: #b0bec5 transparent transparent !important;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/resizable/resizable.js",
    "content": "// miniprogram/packageAPI/pages/framework/resizable/resizable.js\nPage({\n  onShareAppMessage() {\n    return {\n      title: '屏幕旋转',\n      path: 'packageAPI/pages/framework/resizable/resizable'\n    }\n  },\n  data: {\n    theme: 'light',\n    status: 'lock',\n  },\n  handleStatusChange(e) {\n    this.setData({\n      status: e.currentTarget.dataset.status,\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/resizable/resizable.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"屏幕旋转\",\n  \"pageOrientation\": \"auto\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/resizable/resizable.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<wxs src=\"./resizable.wxs\" module=\"resizable\" />\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: '屏幕旋转'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view style=\"text-align:center\">\n        <!-- 当前屏幕状态：{{resizable.renderResizable(status)}} -->\n        旋转屏幕\n      </view>\n      <image src=\"http://mmbiz.qpic.cn/sz_mmbiz_png/GEWVeJPFkSHALb0g5rCc4Jf5IqDfdwhWJ43I1IvriaV5uFr9fLAuv3uxHR7DQstbIxhNXFoQEcxGzWwzQUDBd6Q/0?wx_fmt=png\" mode=\"aspectFit\" style=\"width: 100%\"></image>\n      <!-- <button type=\"primary\" data-status=\"unlock\" bind:tap=\"handleStatusChange\">打开屏幕旋转</button>\n      <button type=\"primary\" data-status=\"lock\" bind:tap=\"handleStatusChange\">锁定屏幕</button> -->\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/resizable/resizable.wxs",
    "content": "function renderResizable(status) {\n  console.log(status)\n  switch(status) {\n    case \"lock\":\n      return '锁定屏幕中';\n    case \"unlock\":\n      return \"可旋转屏幕\";\n  }\n}\n\nmodule.exports = {\n  renderResizable: renderResizable\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/resizable/resizable.wxss",
    "content": "/* miniprogram/packageAPI/pages/framework/resizable/resizable.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/two-way-bindings/two-way-bindings.js",
    "content": "// miniprogram/page/API/pages/two-way-bindings/two-way-bindings.js\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    theme: 'light',\n    value: '',\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n    return {\n      title: '双向绑定',\n      path: 'packageAPI/pages/framework/make-phone-call/make-phone-call'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/two-way-bindings/two-way-bindings.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"two-way-bindings\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/two-way-bindings/two-way-bindings.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: '双向绑定'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <input class=\"input\" model:value=\"{{value}}\" placeholder=\"请输入\"/>\n      <view class=\"text\">这是你输入的数据：{{value}}</view>\n    </view>\n   \n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/two-way-bindings/two-way-bindings.wxss",
    "content": ".input {\n  margin: 15px auto;\n  width: 80%;\n  /* border-bottom: 1px solid black; */\n}\n.text {\n  margin: 15px auto;\n  width: 80%;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/movable.js",
    "content": "// pages/movable/movable.js\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'movable',\n      path: 'packageAPI/pages/framework/wxs/movable'\n    }\n  },\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    theme: 'light',\n    left: 50,\n    top: 50,\n    taptest: 'taptest',\n    show: true,\n    dataObj: {\n      obj: 1\n    }\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n    setTimeout(() => {\n      this.setData({\n        // show: false,\n      })\n    }, 3000)\n  },\n  taptest() {\n    this.setData({\n      show: false,\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/movable.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"movable\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/movable.wxml",
    "content": "<!--pages/movable/movable.wxml-->\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <wxs module=\"test\" src=\"./movable.wxs\"></wxs> \n  <view wx:if=\"{{show}}\" class=\"area\" style='position:relative;width:100%;height:100%;overflow: hidden'>\n    <view data-index=\"1\" data-obj=\"{{dataObj}}\" bindtouchstart=\"{{test.touchstart}}\" bindtouchmove=\"{{test.touchmove}}\" bindtouchend='{{test.touchmove}}' class=\"movable\" style=\"position:absolute;width:100px;height:100px;border-radius: 50%;background:url('https://res.wx.qq.com/community/dist/community/images/logo_miniprogram_013191.png');background-size: cover;left:{{left}}px;top:{{top}}px\"></view>\n  </view>\n<!-- <view bindtap='{{taptest}}'>testbindtap</view> -->\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/movable.wxs",
    "content": "var startX = 0\nvar startY = 0\nvar lastLeft = lastTop = 50\nfunction touchstart(event, ins) {\n  var touch = event.touches[0] || event.changedTouches[0]\n  startX = touch.pageX\n  startY = touch.pageY\n  ins.callMethod('testCallmethod', {\n    complete: function(res) {\n      console.log('args', res)\n    }\n  })\n}\nfunction touchmove(event, ins) {\n  var touch = event.touches[0] || event.changedTouches[0]\n  var pageX = touch.pageX\n  var pageY = touch.pageY\n  var left = pageX - startX + lastLeft\n  var top = pageY - startY + lastTop\n  startX = pageX\n  startY = pageY\n  lastLeft = left\n  lastTop = top\n  // console.log('idff', pageX - context.startX, left, top)\n  ins.selectComponent('.movable').setStyle({\n    left: left + 'px',\n    top: top + 'px'\n  })\n  // console.log('get data', JSON.stringify(ins.selectComponent('.movable')[0].getData()))\n  // console.log('get data set', JSON.stringify(ins.selectComponent('.movable')[0].getDataset()))\n  // console.log('test select', ins.selectComponent('.movable')[0].selectComponent('.dd'))\n}\nmodule.exports = {\n  touchstart: touchstart,\n  touchmove: touchmove,\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/movable.wxss",
    "content": "/* miniprogram/page/API/pages/wxs/movable.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/nearby.js",
    "content": "const windowWidth = wx.getSystemInfoSync().windowWidth\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'nearby',\n      path: 'packageAPI/pages/framework/wxs/nearby'\n    }\n  },\n  data: {\n    theme: 'light',\n    imgUrls: [\n      'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSEV5QjxLDJaL6ibHLSZ02TIcve0ocPXrdTVqGGbqAmh5Mw9V7504dlEiatSvnyibibHCrVQO2GEYsJicPA/0?wx_fmt=jpeg',\n      'http://mmbiz.qpic.cn/sz_mmbiz_png/GEWVeJPFkSHALb0g5rCc4Jf5IqDfdwhWJ43I1IvriaV5uFr9fLAuv3uxHR7DQstbIxhNXFoQEcxGzWwzQUDBd6Q/0?wx_fmt=png',\n      'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSGqys4ibO2a8L9nnIgH0ibjNXfbicNbZQQYfxxUpmicQglAEYQ2btVXjOhY9gRtSTCxKvAlKFek7sRUFA/0?wx_fmt=jpeg',\n      'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSH2Eic4Lt0HkZeEN08pWXTticVRgyNGgBVHMJwMtRhmB0hE4m4alSuwsBk3uBBOhdCr91bZlSFbYhFg/0?wx_fmt=jpeg'\n    ],\n    imgSize: [{\n      height: 150\n    }, {\n      height: 200\n    }, {\n      height: 150\n    }, {\n      height: 150\n    }],\n    indicatorDots: true,\n    autoplay: false,\n    interval: 3000,\n    duration: 500,\n    left: 0,\n    windowWidth\n  },\n  changeIndicatorDots() {\n    this.setData({\n      indicatorDots: !this.data.indicatorDots\n    })\n  },\n  swiperTransition1(e) {\n    console.log('e.transition', e)\n    this.setData({\n      left: (e.detail.x) / 4\n    })\n  },\n  onReady() {\n  },\n  changeAutoplay() {\n    this.setData({\n      autoplay: !this.data.autoplay\n    })\n  },\n  intervalChange(e) {\n    this.setData({\n      interval: e.detail.value\n    })\n  },\n  durationChange(e) {\n    this.setData({\n      duration: e.detail.value\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/nearby.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"nearby\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/nearby.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n\n  <wxs module=\"test\" src=\"./nearby.wxs\"></wxs>\n\n  <swiper class=\"swiper\" data-width=\"{{windowWidth}}\" data-imgsize=\"{{imgSize}}\" bindchange='{{test.change}}' bindanimationfinish=\"{{test.animationFinish}}\" bindtransition=\"{{test.func}}\" indicator-dots=\"{{indicatorDots}}\"\n    autoplay=\"{{true}}\" interval=\"{{interval}}\" circular='' duration=\"{{duration}}\">\n    <block wx:for=\"{{imgUrls}}\">\n      <swiper-item style=\"height:100%;\">\n        <image src=\"{{item}}\" class=\"slide-image\" style=\"height:100%;width:100%;\" mode=\"center\" height=\"300\" mode='aspectFit'/>\n      </swiper-item>\n    </block>\n  </swiper>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/nearby.wxs",
    "content": "var func = function (e, instance) {\n  var dataset = e.instance.getDataset()\n  var st = e.instance.getState()\n  var current = st.current || 0\n  var imgsize = dataset.imgsize\n  var width = dataset.width\n  var detail = e.detail\n  var dx = e.detail.dx\n  // 相比上次没有任何改变, 直接返回\n  var diff = typeof st.lastx !== 'undefined' ? (dx - st.lastx) : (dx - 0)\n  if (diff === 0) return\n  st.continueCount = st.continueCount || 1\n  // 连续滑动过程中, 且到达下一个swiper-item的transition开始了, 修正一下current值\n  if (Math.abs(dx) > width * st.continueCount && st.tmpcurrent != -1) {\n    console.log('mod is 0 some info', st.tmpcurrent, current)\n    current = st.tmpcurrent\n    st.current = st.tmpcurrent\n    st.tmpcurrent = -1\n    st.continueCount++\n  }\n  // 连续滑动dx的值会比width大，这时候要减去多余的width值\n  var setToWidth = false\n  var dir = dx > 0\n  if (dx !== 0 && Math.abs(dx) >= width) {\n    setToWidth = true\n  }\n  dx = dx - width * parseInt(dx / width)\n  if (dx === 0 && setToWidth) {\n    dx = dir ? width : -width\n  }\n  // 先判断下方向对不对\n  if (current >= imgsize.length - 1 && dx > 0) return\n  if (current <= 0 && dx < 0) return\n  var currentSize = imgsize[current]\n  var nextSize = dx > 0 ? imgsize[current + 1] : imgsize[current - 1]\n  var currentHeight = st.currentHeight || currentSize.height\n  var diffHeight = Math.abs((nextSize.height - currentSize.height) * (dx / width))\n  var realheight = currentSize.height + (nextSize.height - currentSize.height > 0 ? diffHeight : -diffHeight)\n  st.currentHeight = realheight\n  e.instance.setStyle({\n    height: realheight + 'px'\n  })\n  st.lastdir = dx > 0\n  console.log('111', realheight, dx, current, nextSize.height, currentSize.height)\n}\nmodule.exports = {\n  func: func,\n  change: function(e, instance) {\n    var st = e.instance.getState()\n    console.log('=====change detail is', e.detail.current)\n    st.tmpcurrent = e.detail.current\n  },\n  animationFinish: function(e) {\n    var st = e.instance.getState()\n    if (typeof st.tmpcurrent === 'undefined' || st.tmpcurrent === -1) return\n    console.log('====animation finish is', st.tmpcurrent)\n    st.current = st.tmpcurrent\n    st.tmpcurrent = -1\n    st.continueCount = 1\n  }\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/nearby.wxss",
    "content": "/* pages/nearby/nearby.wxss */\n.swiper {\n  width: 100%;\n  max-width: 600px;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/sidebar.js",
    "content": "// page/one/index.js\nPage({\n  data: {\n    theme: 'light',\n    tabs: [],\n    open: false,\n    mark: 0,\n    newmark: 0,\n    startmark: 0,\n    endmark: 0,\n    windowWidth: wx.getSystemInfoSync().windowWidth,\n    staus: 1,\n    translate: ''\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    const tabs = [\n      {\n        title: '技术开发',\n        title2: '小程序开发进阶',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSEV5QjxLDJaL6ibHLSZ02TIcve0ocPXrdTVqGGbqAmh5Mw9V7504dlEiatSvnyibibHCrVQO2GEYsJicPA/0?wx_fmt=jpeg',\n        desc: '本视频系列课程，由腾讯课堂NEXT学院与微信团队联合出品，通过实战案例，深入浅出地进行讲解。',\n      },\n    ]\n    this.setData({ tabs })\n    // setTimeout(() => {\n    // this.initInteraction()\n    // }, 5000)\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/sidebar.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"sidebar\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/sidebar.wxml",
    "content": "<!--page/one/index.wxml-->\n<wxs module=\"test\" src=\"./sidebar.wxs\"></wxs>\n<view class=\"page\">\n  <view class=\"page-bottom\">\n    <view class=\"page-content\">\n      <view class=\"wc\">\n          <text>技术开发</text>\n      </view>\n      <view class=\"wc\">\n          <text>产品解析</text>\n      </view>\n      <view class=\"wc\">\n          <text>运营规范</text>\n      </view>\n      <view class=\"wc\">\n          <text>高校大赛</text>\n      </view>\n    </view>\n  </view> \n  <view data-width=\"{{windowWidth}}\" catch:touchmove=\"{{test.touchmove}}\" bind:touchend=\"{{test.touchend}}\" bind:touchstart=\"{{test.touchstart}}\" class=\"page-top\" >\n    <view style=\"margin: 10px 10px;\"> >>> 右滑出现侧边菜单</view>\n      <block wx:for=\"{{tabs}}\" wx:key=\"title\">\n        <view style=\"display: flex; align-items: center; flex-direction: column;\">\n          <image src=\"{{item.img}}\" mode=\"widthFix\"></image>\n         \n        </view>\n      </block>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/sidebar.wxs",
    "content": "var newmark = startmark = 0\nvar status = 0\nfunction touchstart(e, ins) {\n  var pageX = (e.touches[0] || e.changedTouches[0]).pageX\n  startmark = newmark = pageX\n}\n\nfunction touchmove(e, ins) {\n  var pageX = (e.touches[0] || e.changedTouches[0]).pageX\n  console.log('pageX', pageX);\n  newmark = pageX\n  // var data = ins.getData()\n  var data = {\n    windowWidth: e.target.dataset.width\n  }\n  if (startmark < pageX) {\n    if (data.windowWidth * 0.4 > Math.abs(newmark - startmark)) {\n      console.log('newmark - startmark',newmark - startmark)\n      ins.selectComponent('.page-top').setStyle({\n        transform: 'translateX(' + Math.min(data.windowWidth * 0.4, ((status == 1 ? data.windowWidth * 0.4 : 0) + newmark - startmark)) + 'px)'\n      })\n    }\n  }\n  if (startmark > pageX) {\n    ins.selectComponent('.page-top').setStyle({\n      transform: 'translateX(' + Math.max(0, ((status == 1 ? data.windowWidth * 0.4 : 0) + newmark - startmark)) + 'px)'\n    })\n  }\n}\nfunction touchend(e, ins) {\n  var pageX = (e.touches[0] || e.changedTouches[0]).pageX\n  newmark = pageX\n  // var data = ins.getData()\n  var data = {\n    windowWidth: e.target.dataset.width\n  }\n  if (startmark < pageX) {\n    if (data.windowWidth * 0.2 < Math.abs(newmark - startmark)) {\n      ins.selectComponent('.page-top').setStyle({\n        transform: 'translateX(' + (data.windowWidth * 0.4) + 'px)'\n      })\n      status = 1 // 展开状态\n    } else {\n      ins.selectComponent('.page-top').setStyle({\n        transform: 'translateX(0px)'\n      })\n      status = 0 // 收起状态\n    }\n  }\n  if (startmark > newmark) {\n    ins.selectComponent('.page-top').setStyle({\n      transform: 'translateX(0px)'\n    })\n    status = 0 // 收起状态\n  }\n}\nmodule.exports = {\n  touchstart: touchstart,\n  touchmove: touchmove,\n  touchend: touchend\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/sidebar.wxss",
    "content": ".container {\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: space-between;\n  padding: 100px 0;\n  box-sizing: border-box;\n} \npage,.page {\n  height: 100%;\n  font-family: 'PingFang SC', 'Helvetica Neue', Helvetica, 'Droid Sans Fallback', 'Microsoft Yahei', sans-serif;\n}\n.page-bottom{\n  height: 100%;\n  width: 725px;\n  position: fixed; \n  background-color: #07c160;\n  z-index: 0;\n}\n.wc{\n  color: white;\n  padding: 15px 0 15px 20px;\n}\n.page-content{\n  padding-top: 150px;\n}\n.page-top{\n  height: 100%;\n  position: fixed;\n  width: 725px;\n  background-color: var(--weui-BG-1);\n  z-index: 0;\n  transition: All 0.4s ease; \n  -webkit-transition: All 0.4s ease;\n}\n\n.c-state1{\n  transform: rotate(0deg) scale(1) translate(40%,0%); \n  -webkit-transform: rotate(0deg) scale(1) translate(40%,0%); \n}\n.c-state2{\n  transform: rotate(0deg) scale(.8) translate(40%,0%); \n  -webkit-transform: rotate(0deg) scale(.8) translate(40%,0%); \n}\n\n.item-title {\n  margin: 10px 10px 5px;\n  font-size: 18px;\n  width: 100%;\n}\n.item-desc {\n  margin: 5px 10px 0;\n  width: 100%;\n  color: #00000080\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/stick-top.js",
    "content": "const height = wx.getSystemInfoSync().windowHeight\nconst app = getApp()\nPage({\n  data: {\n    theme: 'light',\n    sticky: false,\n    opacity: 0,\n    height,\n    tabs: [],\n    theme: app.globalData.theme,\n  },\n  // 滚动条监听\n  onPageScroll() {\n    // console.log('page scroll')\n  },\n  onShow() {\n\n  },\n  onReady() {\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    const tabs = [\n      {\n        title: '技术开发',\n        title2: '小程序开发进阶',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSEV5QjxLDJaL6ibHLSZ02TIcve0ocPXrdTVqGGbqAmh5Mw9V7504dlEiatSvnyibibHCrVQO2GEYsJicPA/0?wx_fmt=jpeg',\n        desc: '本视频系列课程，由腾讯课堂NEXT学院与微信团队联合出品，通过实战案例，深入浅出地进行讲解。',\n      },\n      {\n        title: '产品解析',\n        title2: '微信小程序直播',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_png/GEWVeJPFkSHALb0g5rCc4Jf5IqDfdwhWJ43I1IvriaV5uFr9fLAuv3uxHR7DQstbIxhNXFoQEcxGzWwzQUDBd6Q/0?wx_fmt=png',\n        desc: '微信小程序直播系列课程持续更新中，帮助大家更好地理解、应用微信小程序直播功能。',\n      },\n      {\n        title: '运营规范',\n        title2: '常见问题和解决方案',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSGqys4ibO2a8L9nnIgH0ibjNXfbicNbZQQYfxxUpmicQglAEYQ2btVXjOhY9gRtSTCxKvAlKFek7sRUFA/0?wx_fmt=jpeg',\n        desc: '提高审核质量',\n      },\n      {\n        title: '营销经验',\n        title2: '流量主小程序',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSH2Eic4Lt0HkZeEN08pWXTticVRgyNGgBVHMJwMtRhmB0hE4m4alSuwsBk3uBBOhdCr91bZlSFbYhFg/0?wx_fmt=jpeg',\n        desc: '本课程共四节，将分阶段为开发者展示如何开通流量主功能、如何接入广告组件、不同类型小程序接入的建议，以及如何通过工具调优小程序变现效率。',\n      },\n      {\n        title: '高校大赛',\n        title2: '2020中国高校计算机大赛',\n        img: 'http://mmbiz.qpic.cn/mmbiz_jpg/TcDuyasB5T3Eg34AYwjMw7xbEK2n01ekiaicPiaMInEMTkOQtuv1yke5KziaYF4MLia4IAbxlm0m5NxkibicFg4IZ92EA/0?wx_fmt=jpeg',\n        desc: '微信小程序应用开发赛',\n      },\n    ]\n    this.setData({ tabs })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/stick-top.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"stick-top\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/stick-top.wxml",
    "content": "<wxs module=\"test\" src=\"./stick-top.wxs\"></wxs>\n<scroll-view bindscroll=\"{{theme=== 'dark' ? test.funcD :test.funcA}}\" style='height:{{height}}px;' scroll-y>\n  <view class=\"page-banner\">\n    <image class=\"image\" src=\"http://mmbiz.qpic.cn/mmbiz_jpg/TcDuyasB5T3Eg34AYwjMw7xbEK2n01ekiaicPiaMInEMTkOQtuv1yke5KziaYF4MLia4IAbxlm0m5NxkibicFg4IZ92EA/0?wx_fmt=jpeg\" style='width:100%;height:200px' mode=\"aspectFit\"></image>\n  </view>\n  <view class=\"page-group-interaction page-group\">\n    <view class=\"page-nav-list\"><text>抗疫专区</text></view>\n    <view class=\"page-nav-list\"><text>技术开发</text></view>\n    <view class=\"page-nav-list\"><text>运营专区</text></view>\n    <view class=\"page-nav-list\"><text>我的</text></view>\n  </view>\n  <block wx:for=\"{{tabs}}\" wx:key=\"title\">\n    <view class=\"goods-list\" bind:tap=\"handleClick\" >\n      <image src=\"{{item.img}}\" mode=\"widthFix\"></image>\n      <view class=\"item-title\">\n        {{item.title2}}\n      </view>\n      <view class=\"item-desc\">\n        {{item.desc}}\n      </view>\n    </view>\n  </block>\n</scroll-view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/stick-top.wxs",
    "content": "var funcA = function(e, ins) {\n  var scrollTop = e.detail.scrollTop\n  if (scrollTop > 200) {\n    ins.selectComponent('.page-group').setStyle({\n      \"background-color\": 'rgba(235, 235, 235, 1)', \n      'z-index': '999',\n    }).addClass('page-group-position')\n    ins.selectComponent('.page-banner .image').setStyle({\n      opacity: 1 - Math.max(0, (scrollTop) / 200)\n    })\n    ins.selectComponent('.goods-list').setStyle({\n      \"margin-top\": '59px'\n    })\n  } else {\n    ins.selectComponent('.goods-list').setStyle({\n      \"margin-top\": '0'\n    })\n    ins.selectComponent('.page-group').setStyle({\n      \"background-color\": 'rgba(235, 235, 235, ' + Math.max(0, (scrollTop) / 200) + ')',\n    }).removeClass('page-group-position')\n    ins.selectComponent('.page-banner .image').setStyle({\n      opacity: 1 - Math.max(0, (scrollTop) / 200)\n    })\n    console.log(ins)\n   \n  }\n}\n\nvar funcD = function(e, ins) {\n  var scrollTop = e.detail.scrollTop\n  if (scrollTop > 200) {\n    ins.selectComponent('.page-group').setStyle({\n      \"background-color\": 'rgba(95, 95, 95, 1)',\n      'z-index': '999',\n    }).addClass('page-group-position')\n    ins.selectComponent('.page-banner .image').setStyle({\n      opacity: 1 - Math.max(0, (scrollTop) / 200)\n    })\n    ins.selectComponent('.goods-list').setStyle({\n      \"margin-top\": '59px'\n    })\n  } else {\n    ins.selectComponent('.goods-list').setStyle({\n      \"margin-top\": '0'\n    })\n    ins.selectComponent('.page-group').setStyle({\n      \"background-color\": 'rgba(95, 95, 95, ' + Math.max(0, (scrollTop) / 200) + ')',\n    }).removeClass('page-group-position')\n    ins.selectComponent('.page-banner .image').setStyle({\n      opacity: 1 - Math.max(0, (scrollTop) / 200)\n    })\n  }\n}\nmodule.exports = {\n  funcA: funcA,\n  funcD: funcD\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/stick-top.wxss",
    "content": ".page-banner{\n  height:200px;\n  background-color: #fff;\n  color:#fff;\n}\n.page-group{\n  display: table;\n  /* background-color: rgba(00, 00, 00, 1); */\n  width: 100%;\n  table-layout: fixed;\n  position: relative;\n  top: 0;\n  left: 0;\n}\n.page-group-position{\n  position: fixed;\n}\n.page-nav-list{\n  padding:15px 0 ;\n  display: table-cell;\n  text-align: center;\n  color: #07c160;\n}\n.goods-list{\n  height: 300px;\n  background-color: var(--weui-BG-2);\n  padding: 10px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n.item-title {\n  margin: 10px 10px 5px;\n  font-size: 18px;\n  width: 100%;\n}\n.item-desc {\n  margin: 5px 10px 0;\n  width: 100%;\n  color: var(--weui-FG-2)\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/wxs.js",
    "content": "// miniprogram/page/API/pages/wxs/wxs.js\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'wxs',\n      path: 'packageAPI/pages/framework/wxs/wxs'\n    }\n  },\n  handleNavChange(e) {\n    console.log(e)\n    wx.navigateTo({\n      url: `/packageAPI/pages/framework/framework/wxs/${e.currentTarget.dataset.nav}`,\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/wxs.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"WXS\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/wxs.wxml",
    "content": "<import src=\"../../../../common/head.wxml\"/>\n<import src=\"../../../../common/foot.wxml\"/>\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'WXS'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n    <view class=\"btn-area\">\n      <button type=\"primary\" data-nav=\"movable\" bind:tap=\"handleNavChange\">movable</button>\n    </view>\n    <!-- <view class=\"btn-area\"></view>\n    <button type=\"primary\" data-nav=\"sidebar\" bind:tap=\"handleNavChange\">右滑显示侧边栏</button>\n    <view class=\"btn-area\"></view>\n      <button type=\"primary\" data-nav=\"stick-top\" bind:tap=\"handleNavChange\">滚动菜单栏贴顶</button> -->\n    <view class=\"btn-area\">\n      <button type=\"primary\" data-nav=\"nearby\" bind:tap=\"handleNavChange\">跟随 swiper 的图片切换</button>   \n    </view>\n    </view>\n  </view>\n\n  <template is=\"foot\"/>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/framework/wxs/wxs.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/location/choose-location/choose-location.js",
    "content": "const util = require('../../../../util/util.js')\n\nconst formatLocation = util.formatLocation\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '使用原生地图选择位置',\n      path: 'packageAPI/pages/location/choose-location/choose-location'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    hasLocation: false,\n  },\n  chooseLocation() {\n    const that = this\n    wx.chooseLocation({\n      success(res) {\n        console.log(res)\n        that.setData({\n          hasLocation: true,\n          location: formatLocation(res.longitude, res.latitude),\n          locationAddress: res.address\n        })\n      }\n    })\n  },\n  clear() {\n    this.setData({\n      hasLocation: false\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/location/choose-location/choose-location.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"使用原生地图选择位置\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/location/choose-location/choose-location.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'chooseLocation'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info\">\n        <text class=\"page-body-text-small\">当前位置信息</text>\n        <block wx:if=\"{{hasLocation === false}}\">\n          <text class=\"page-body-text\">未选择位置</text>\n        </block>\n        <block wx:if=\"{{hasLocation === true}}\">\n          <text class=\"page-body-text\">{{locationAddress}}</text>\n          <view class=\"page-body-text-location\">\n            <text>E: {{location.longitude[0]}}°{{location.longitude[1]}}′</text>\n            <text>N: {{location.latitude[0]}}°{{location.latitude[1]}}′</text>\n          </view>\n        </block>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"chooseLocation\">选择位置</button>\n        <button bindtap=\"clear\">清空</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/location/choose-location/choose-location.wxss",
    "content": ".page-body-info{\n  padding-bottom: 0;\n  height: 420px;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/location/get-location/get-location.js",
    "content": "const util = require('../../../../util/util.js')\n\nconst formatLocation = util.formatLocation\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '获取位置',\n      path: 'packageAPI/pages/location/get-location/get-location'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    hasLocation: false,\n  },\n  getLocation() {\n    const that = this\n    wx.getLocation({\n      success(res) {\n        console.log(res)\n        that.setData({\n          hasLocation: true,\n          location: formatLocation(res.longitude, res.latitude)\n        })\n      },\n      complete(res) {\n        console.log('getLocation: ', res)\n      }\n    })\n  },\n  clear() {\n    this.setData({\n      hasLocation: false\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/location/get-location/get-location.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"获取位置\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/location/get-location/get-location.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'getLocation'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info\">\n        <text class=\"page-body-text-small\">当前位置经纬度</text>\n        <block wx:if=\"{{hasLocation === false}}\">\n          <text class=\"page-body-text\">未获取</text>\n        </block>\n        <block wx:if=\"{{hasLocation === true}}\">\n          <view class=\"page-body-text-location\">\n            <text>E: {{location.longitude[0]}}°{{location.longitude[1]}}′</text>\n            <text>N: {{location.latitude[0]}}°{{location.latitude[1]}}′</text>\n          </view>\n        </block>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"getLocation\">获取位置</button>\n        <button bindtap=\"clear\">清空</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/location/get-location/get-location.wxss",
    "content": ".page-body-info {\n  height: 225px;\n}\n.page-body-text-small {\n  font-size: 12px;\n  color: var(--weui-FG-0);\n  margin-bottom: 50px;\n}\n.page-body-text-location {\n  display: flex;\n  font-size: 25px;\n}\n.page-body-text-location text {\n  margin: 5px;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/location/open-location/open-location.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '查看位置',\n      path: 'packageAPI/pages/location/open-location/open-location'\n    }\n  },\n\n  openLocation(e) {\n    console.log(e)\n    const value = e.detail.value\n    console.log(value)\n    wx.openLocation({\n      longitude: Number(value.longitude),\n      latitude: Number(value.latitude),\n      name: value.name,\n      address: value.address\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/location/open-location/open-location.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"查看位置\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/location/open-location/open-location.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'openLocation'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <form bindsubmit=\"openLocation\">\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">经度</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\"  value=\"113.324520\" name=\"longitude\"></input>\n            </view>\n          </view>\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">纬度</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\"  value=\"23.099994\" name=\"latitude\"></input>\n            </view>\n          </view>\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">位置名称</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\"  value=\"T.I.T 创意园\" name=\"name\"></input>\n            </view>\n          </view>\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">详细位置</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <input class=\"weui-input\" type=\"text\" disabled=\"{{true}}\"  value=\"广州市海珠区新港中路397号\" name=\"address\"></input>\n            </view>\n          </view>\n        </view>\n        <view class=\"btn-area\">\n          <button type=\"primary\" formType=\"submit\">查看位置</button>\n        </view>\n      </form>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/location/open-location/open-location.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/media/audio/audio.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'Audio',\n      path: 'packageAPI/pages/media/audio/audio'\n    }\n  },\n  onReady() {\n    // 使用 wx.createAudioContext 获取 audio 上下文 context\n    this.audioCtx = wx.createInnerAudioContext()\n    this.audioCtx.src = 'https://dldir1.qq.com/music/release/upload/t_mm_file_publish/2339610.m4a'\n    this.audioCtx.play()\n  },\n  data: {\n    theme: 'light',\n    src: ''\n  },\n  audioPlay() {\n    this.audioCtx.play()\n  },\n  audioPause() {\n    this.audioCtx.pause()\n  },\n  audio14() {\n    this.audioCtx.seek(14)\n  },\n  audioStart() {\n    this.audioCtx.seek(0)\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/audio/audio.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"音频\"\n\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/audio/audio.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <button type=\"primary\" bindtap=\"audioPlay\">播放</button>\n  <button type=\"primary\" bindtap=\"audioPause\">暂停</button>\n  <button type=\"primary\" bindtap=\"audio14\">设置当前播放时间为14秒</button>\n  <button type=\"primary\" bindtap=\"audioStart\">回到开头</button>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/audio/audio.wxss",
    "content": "/* miniprogram/packageAPI/pages/media/audio/audio.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/background-audio/background-audio.js",
    "content": "// const app = getApp()\nconst util = require('../../../../util/util.js')\n\nconst backgroundAudioManager = wx.getBackgroundAudioManager()\nlet updateInterval\nlet draging\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '背景音乐',\n      path: 'packageAPI/pages/media/background-audio/background-audio'\n    }\n  },\n  onShow() {\n    if (!backgroundAudioManager.paused && backgroundAudioManager.paused !== undefined) {\n      this._enableInterval()\n      this.setData({\n        playing: true\n      })\n    }\n  },\n\n  data: {\n    theme: 'light',\n    playing: false, // 播放状态\n    pause: false,\n    playTime: 0, // 播放时长\n    formatedPlayTime: '00:00:00' // 格式化后的播放时长\n  },\n\n  play() {\n    backgroundAudioManager.title = '此时此刻'\n    backgroundAudioManager.epname = '此时此刻'\n    backgroundAudioManager.singer = '许巍'\n    backgroundAudioManager.coverImgUrl = 'http://y.gtimg.cn/music/photo_new/T002R300x300M000003rsKF44GyaSk.jpg?max_age=2592000'\n\n    const that = this\n    if (that.data.pause) {\n      backgroundAudioManager.play()\n      this.setData({\n        playing: true,\n      })\n    } else {\n      that.setData({\n        playing: true,\n      }, () => {\n        // 设置src后会自动播放\n        backgroundAudioManager.src = 'https://dldir1.qq.com/music/release/upload/t_mm_file_publish/2339610.m4a'\n      })\n    }\n  },\n\n  drag(e) {\n    draging = true\n  },\n\n  seek(e) {\n    backgroundAudioManager.seek(e.detail.value)\n  },\n\n  pause() {\n    clearInterval(updateInterval)\n    backgroundAudioManager.pause()\n  },\n\n  stop() {\n    clearInterval(updateInterval)\n    backgroundAudioManager.stop()\n  },\n\n  _enableInterval() {\n    const that = this\n    function update() {\n      if (!draging) {\n        that.setData({\n          playTime: backgroundAudioManager.currentTime + 1,\n          formatedPlayTime: util.formatTime(backgroundAudioManager.currentTime + 1)\n        })\n      }\n    }\n    updateInterval = setInterval(update, 1000)\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n    clearInterval(updateInterval)\n  },\n\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    const that = this\n    // 监听播放事件\n    backgroundAudioManager.onPlay(() => {\n      // 刷新播放时间\n      that._enableInterval()\n      that.setData({\n        pause: false,\n      })\n    })\n\n    // 监听暂停事件\n    backgroundAudioManager.onPause(() => {\n      clearInterval(updateInterval)\n      that.setData({\n        playing: false,\n        pause: true,\n      })\n    })\n\n    // 拖动到指定位置结束，恢复slider滚动\n    backgroundAudioManager.onSeeked((res) => {\n      draging = false\n    })\n\n    backgroundAudioManager.onEnded(() => {\n      clearInterval(updateInterval)\n      that.setData({\n        playing: false,\n        playTime: 0,\n        formatedPlayTime: util.formatTime(0)\n      })\n    })\n\n    backgroundAudioManager.onStop(() => {\n      clearInterval(updateInterval)\n      that.setData({\n        playing: false,\n        playTime: 0,\n        formatedPlayTime: util.formatTime(0)\n      })\n    })\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/background-audio/background-audio.json",
    "content": "{\n   \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"背景音频\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/background-audio/background-audio.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'backgroundAudio'}}\"/>\n\n  <view class=\"page-section\">\n    <view class=\"page-body-info\">\n      <text class=\"time-big\">{{formatedPlayTime}}</text>\n      <slider class=\"slider\" min=\"0\" max=\"269\" step=\"1\" value=\"{{playTime}}\" bindchange=\"seek\" bindchanging=\"drag\"></slider>\n      <view class=\"play-time\">\n        <text>00:00</text>\n        <text>04:29</text>\n      </view>\n    </view>\n    <view class=\"page-body-text tc\">注意：离开当前页面后背景音乐将保持播放，但退出小程序将停止</view>\n    <view class=\"page-body-buttons\">\n      <block wx:if=\"{{playing === true}}\">\n        <view class=\"page-body-button\" bindtap=\"stop\">\n          <image src=\"/image/stop.png\"></image>\n        </view>\n        <view class=\"page-body-button\" bindtap=\"pause\">\n          <image src=\"/image/pause.png\"></image>\n        </view>\n      </block>\n      <block wx:if=\"{{playing === false}}\">\n        <view class=\"page-body-button\"></view>\n        <view class=\"page-body-button\" bindtap=\"play\">\n          <image src=\"/image/play.png\"></image>\n        </view>\n      </block>\n      <view class=\"page-body-button\"></view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/background-audio/background-audio.wxss",
    "content": "image {\n  width: 75px;\n  height: 75px;\n}\n\n.page-body-wrapper {\n  margin-top: 0;\n}\n.page-body-info {\n  padding-bottom: 25px;\n}\n.time-big {\n  font-size: 30px;\n  margin: 10px;\n}\n.slider {\n  width: 90%;\n}\n.play-time {\n  font-size: 14px;\n  width: 350px;\n  padding: 10px 0;\n  display: flex;\n  justify-content: space-between;\n  box-sizing: border-box;\n}\n.page-body-buttons {\n  display: flex;\n  justify-content: space-around;\n  margin-top: 50px;\n}\n.page-body-button {\n  width: 225px;\n  text-align: center;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/file/file.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '文件',\n      path: 'packageAPI/pages/media/file/file'\n    }\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    this.setData({\n      savedFilePath: wx.getStorageSync('savedFilePath')\n    })\n  },\n  data: {\n    theme: 'light',\n    tempFilePath: '',\n    savedFilePath: ''\n  },\n  chooseImage() {\n    const that = this\n    wx.chooseImage({\n      count: 1,\n      success(res) {\n        that.setData({\n          tempFilePath: res.tempFilePaths[0]\n        })\n      }\n    })\n  },\n  saveFile() {\n    if (this.data.tempFilePath.length > 0) {\n      const that = this\n      wx.saveFile({\n        tempFilePath: this.data.tempFilePath,\n        success(res) {\n          that.setData({\n            savedFilePath: res.savedFilePath\n          })\n          wx.setStorageSync('savedFilePath', res.savedFilePath)\n          wx.showModal({\n            title: '保存成功',\n            content: '下次进入应用时，此文件仍可用',\n          })\n        },\n        fail() {\n          wx.showModal({\n            title: '保存失败',\n            content: '应该是有 bug 吧',\n          })\n        }\n      })\n    }\n  },\n  clear() {\n    wx.setStorageSync('savedFilePath', '')\n    this.setData({\n      tempFilePath: '',\n      savedFilePath: ''\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/file/file.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"文件\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/file/file.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'saveFile'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info\">\n        <block wx:if=\"{{tempFilePath != ''}}\">\n          <image src=\"{{tempFilePath}}\" class=\"image\" mode=\"aspectFit\"></image>\n        </block>\n        <block wx:if=\"{{tempFilePath === '' && savedFilePath != ''}}\">\n          <image src=\"{{savedFilePath}}\" class=\"image\" mode=\"aspectFit\"></image>\n        </block>\n        <block wx:if=\"{{tempFilePath === '' && savedFilePath === ''}}\">\n          <view class=\"image-plus image-plus-nb\" bindtap=\"chooseImage\">\n            <view class=\"image-plus-horizontal\"></view>\n            <view class=\"image-plus-vertical\"></view>\n          </view>\n          <view class=\"image-plus-text\">请选择文件</view>\n        </block>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"saveFile\">保存文件</button>\n        <button bindtap=\"clear\">删除文件</button>\n      </view>\n    </view>\n  </view>\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/file/file.wxss",
    "content": ".image {\n  width: 100%;\n  height: 330px;\n}\n.page-body-info {\n  display: flex;\n  box-sizing: border-box;\n  padding: 15px;\n  height: 410px;\n  border-top: 1px solid var(--weui-FG-3);\n  border-bottom: 1px solid var(--weui-FG-3);\n  align-items: center;\n  justify-content: center;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/image/image.js",
    "content": "const sourceType = [['camera'], ['album'], ['camera', 'album']]\nconst sizeType = [['compressed'], ['original'], ['compressed', 'original']]\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '图片',\n      path: 'packageAPI/pages/media/image/image'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    imageList: [],\n    sourceTypeIndex: 2,\n    sourceType: ['拍照', '相册', '拍照或相册'],\n\n    sizeTypeIndex: 2,\n    sizeType: ['压缩', '原图', '压缩或原图'],\n\n    countIndex: 8,\n    count: [1, 2, 3, 4, 5, 6, 7, 8, 9]\n  },\n  sourceTypeChange(e) {\n    this.setData({\n      sourceTypeIndex: e.detail.value\n    })\n  },\n  sizeTypeChange(e) {\n    this.setData({\n      sizeTypeIndex: e.detail.value\n    })\n  },\n  countChange(e) {\n    this.setData({\n      countIndex: e.detail.value\n    })\n  },\n  chooseImage() {\n    const that = this\n    wx.chooseImage({\n      sourceType: sourceType[this.data.sourceTypeIndex],\n      sizeType: sizeType[this.data.sizeTypeIndex],\n      count: this.data.count[this.data.countIndex],\n      success(res) {\n        console.log(res)\n        that.setData({\n          imageList: res.tempFilePaths\n        })\n      }\n    })\n  },\n  previewImage(e) {\n    const current = e.target.dataset.src\n\n    wx.previewImage({\n      current,\n      urls: this.data.imageList\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/image/image.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"图片\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/image/image.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'choose/previewImage'}}\"/>\n\n  <view class=\"page-body\">\n    <form>\n      <view class=\"page-section\">\n\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">图片来源</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <picker range=\"{{sourceType}}\" bindchange=\"sourceTypeChange\" value=\"{{sourceTypeIndex}}\" mode=\"selector\">\n                <view class=\"weui-input\">{{sourceType[sourceTypeIndex]}}</view>\n              </picker>\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">图片质量</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <picker range=\"{{sizeType}}\" bindchange=\"sizeTypeChange\" value=\"{{sizeTypeIndex}}\" mode=\"selector\">\n                <view class=\"weui-input\">{{sizeType[sizeTypeIndex]}}</view>\n              </picker>\n            </view>\n          </view>\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">数量限制</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <picker range=\"{{count}}\" bindchange=\"countChange\" value=\"{{countIndex}}\" mode=\"selector\">\n                <view class=\"weui-input\">{{count[countIndex]}}</view>\n              </picker>\n            </view>\n          </view>\n        </view>\n\n        <view class=\"weui-cells\">\n          <view class=\"weui-cell\">\n            <view class=\"weui-cell__bd\">\n              <view class=\"weui-uploader\">\n                <view class=\"weui-uploader__hd\">\n                  <view class=\"weui-uploader__title\">点击可预览选好的图片</view>\n                  <view class=\"weui-uploader__info\">{{imageList.length}}/{{count[countIndex]}}</view>\n                </view>\n                <view class=\"weui-uploader__bd\">\n                  <view class=\"weui-uploader__files\">\n                    <block wx:for=\"{{imageList}}\" wx:for-item=\"image\">\n                      <view class=\"weui-uploader__file\">\n                        <image class=\"weui-uploader__img\" mode=\"aspectFill\" src=\"{{image}}\" data-src=\"{{image}}\" bindtap=\"previewImage\"></image>\n                      </view>\n                    </block>\n                  </view>\n                  <view class=\"weui-uploader__input-box\">\n                    <view class=\"weui-uploader__input\" bindtap=\"chooseImage\"></view>\n                  </view>\n                </view>\n              </view>\n            </view>\n          </view>\n        </view>\n\n      </view>\n    </form>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/image/image.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/media/load-font-face/load-font-face.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '动态加载字体',\n      path: 'packageAPI/pages/media/load-font-face/load-font-face'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    fontFamily: 'Bitstream Vera Serif Bold',\n    loaded: false,\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    this.setData({\n      loaded: false\n    })\n  },\n\n  loadFontFace() {\n    const self = this\n    wx.loadFontFace({\n      family: this.data.fontFamily,\n      source: 'url(\"https://sungd.github.io/Pacifico.ttf\")',\n      success(res) {\n        console.log(res.status)\n        self.setData({ loaded: true })\n      },\n      fail(res) {\n        console.log(res.status)\n      },\n      complete(res) {\n        console.log(res.status)\n      }\n    })\n  },\n\n  clear() {\n    this.setData({ loaded: false })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/load-font-face/load-font-face.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"动态加载字体\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/load-font-face/load-font-face.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'loadFontFace'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info display-area {{ loaded ? 'font-loaded' : '' }}\">\n        <text wx:if=\"{{!loaded}}\">Load {{ fontFamily }}</text>\n        <text wx:else>{{ fontFamily }} is loaded</text>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"loadFontFace\">加载字体</button>\n        <button type=\"default\" bindtap=\"clear\">清除</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/load-font-face/load-font-face.wxss",
    "content": ".page-body-info {\n  align-items: center;\n  padding: 100px 0;\n}\n\n.font-loaded {\n  font-family: \"Bitstream Vera Serif Bold\";\n}\n\n.display-area {\n  font-size: 20px;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/media-container/media-container.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '音视频合成',\n      path: 'packageAPI/pages/media/media-container/media-container'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    const canIUse = wx.canIUse('wx.createMediaContainer()')\n    if (canIUse) {\n      this.mediaContainer = wx.createMediaContainer()\n    } else {\n      this.setData({\n        canIUse: false,\n      })\n      wx.showModal({\n        title: '微信版本过低，暂不支持本功能',\n      })\n    }\n  },\n  data: {\n    theme: 'light',\n    targetSrc: '',\n    one: '',\n    two: '',\n    canIUse: true,\n  },\n  handleChooseVideo(e) {\n    const that = this\n    wx.chooseVideo({\n      sourceType: ['album', 'camera'],\n      success(res) {\n        console.log(res.tempFilePath)\n        that.setData({\n          [e.currentTarget.dataset.video]: res.tempFilePath\n        })\n        if (e.currentTarget.dataset.video === 'one') {\n          that.mediaContainer.extractDataSource({\n            source: that.data.one,\n            success(mt) {\n              that.mediaTrackOne = mt\n            }\n          })\n        } else {\n          that.mediaContainer.extractDataSource({\n            source: that.data.two,\n            success(mt) {\n              that.mediaTrackTwo = mt\n            }\n          })\n        }\n      }\n    })\n  },\n  handleExport() {\n    if (this.data.one === '' || this.data.two === '') {\n      wx.showToast({\n        title: '请先选择源视频',\n        icon: 'none'\n      })\n    } else {\n      console.log(this.mediaTrackOne, this.mediaTrackTwo)\n      // 获取源视频 1 的视频轨道\n      const [trackMedia] = this.mediaTrackOne.tracks.filter(item => item.kind === 'video')\n      // 获取源视频 2 的音频轨道\n      const [trackAudio] = this.mediaTrackTwo.tracks.filter(item => item.kind === 'audio')\n      console.log(trackMedia, trackAudio)\n      // 添加轨道到目标容器\n      this.mediaContainer.addTrack(\n        trackMedia\n      )\n      this.mediaContainer.addTrack(\n        trackAudio\n      )\n      const that = this\n      // 合成目标视频\n      this.mediaContainer.export({\n        success: (res) => {\n          that.setData({\n            targetSrc: res.tempFilePath\n          })\n        }\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/media-container/media-container.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"音视频合成\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/media-container/media-container.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: '音视频合成'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">\n    \b   源视频\n      </view>\n    </view>\n    <view class=\"page-section\">\n     <button type=\"primary\" bindtap=\"handleChooseVideo\" data-video=\"one\">选择源视频1</button>\n     <video wx:if=\"{{one}}\" src=\"{{one}}\"></video>\n    </view>\n    <view class=\"page-section\">\n      <button type=\"primary\" bindtap=\"handleChooseVideo\" data-video=\"two\">选择源视频2</button>\n      <video wx:if=\"{{two}}\" src=\"{{two}}\"></video>\n    </view>\n    <view class=\"btn-area\">\n      <button disabled=\"{{!canIUse}}\" type=\"primary\" bind:tap=\"handleExport\">合成</button>\n    </view> \n    <block wx:if=\"{{targetSrc}}\">\n      <view class=\"page-section\">\n        <view class=\"page-section-title\">\n        \b   <text>合成视频</text>\n        </view>\n        <view class=\"page-section-title\">\n        \b   <text>合成视频轨道为：源视频1视频轨道 + 源视频2音频轨道</text>\n        </view>\n      </view>\n      <view class=\"page-section\">\n        <video src=\"{{targetSrc}}\">\n        </video>\n      </view>\n    </block>\n  </view>\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/media-container/media-container.wxss",
    "content": ".page-section {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/video/video.js",
    "content": "const sourceType = [['camera'], ['album'], ['camera', 'album']]\nconst camera = [['front'], ['back'], ['front', 'back']]\n\n// eslint-disable-next-line\nconst duration = Array.apply(null, {length: 60}).map(function (n, i) {\n  return i + 1\n})\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '拍摄/选择视频',\n      path: 'packageAPI/pages/media/video/video'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    sourceTypeIndex: 2,\n    sourceType: ['拍摄', '相册', '拍摄或相册'],\n\n    cameraIndex: 2,\n    camera: ['前置', '后置', '前置或后置'],\n\n    durationIndex: 59,\n    duration: duration.map((t) => `${t}秒`),\n\n    src: ''\n  },\n  sourceTypeChange(e) {\n    this.setData({\n      sourceTypeIndex: e.detail.value\n    })\n  },\n  cameraChange(e) {\n    this.setData({\n      cameraIndex: e.detail.value\n    })\n  },\n  durationChange(e) {\n    this.setData({\n      durationIndex: e.detail.value\n    })\n  },\n  chooseVideo() {\n    const that = this\n    wx.chooseVideo({\n      sourceType: sourceType[this.data.sourceTypeIndex],\n      camera: camera[this.data.cameraIndex],\n      maxDuration: duration[this.data.durationIndex],\n      success(res) {\n        that.setData({\n          src: res.tempFilePath\n        })\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/video/video.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"拍摄/选择视频\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/video/video.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'chooseVideo'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">视频来源</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <picker range=\"{{sourceType}}\" bindchange=\"sourceTypeChange\" value=\"{{sourceTypeIndex}}\">\n              <view class=\"weui-input\">{{sourceType[sourceTypeIndex]}}</view>\n            </picker>\n          </view>\n        </view>\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">摄像头</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <picker range=\"{{camera}}\" bindchange=\"cameraChange\" value=\"{{cameraIndex}}\">\n              <view class=\"weui-input\">{{camera[cameraIndex]}}</view>\n            </picker>\n          </view>\n        </view>\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">拍摄长度</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <picker range=\"{{duration}}\" bindchange=\"durationChange\" value=\"{{durationIndex}}\">\n              <view class=\"weui-input\">{{duration[durationIndex]}}</view>\n            </picker>\n          </view>\n        </view>\n      </view>\n\n      <view class=\"page-body-info\">\n        <block wx:if=\"{{src === ''}}\">\n          <view class=\"image-plus image-plus-nb\" bindtap=\"chooseVideo\">\n            <view class=\"image-plus-horizontal\"></view>\n            <view class=\"image-plus-vertical\"></view>\n          </view>\n          <view class=\"image-plus-text\">添加视频</view>\n        </block>\n        <block wx:if=\"{{src != ''}}\">\n          <video src=\"{{src}}\" class=\"video\"></video>\n        </block>\n      </view>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/video/video.wxss",
    "content": "\n\n.page-body-info {\n  display: flex;\n  margin-top: 20px;\n  padding: 0;\n  height: 330px;\n  border-top: 1px solid var(--weui-FG-3);\n  border-bottom: 1px solid var(--weui-FG-3);\n  align-items: center;\n  justify-content: center;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/voice/voice.js",
    "content": "const util = require('../../../../util/util.js')\n\nlet playTimeInterval\nlet recordTimeInterval\nconst recorderManager = wx.getRecorderManager()\nconst innerAudioContext = wx.createInnerAudioContext()\nPage({\n  onShareAppMessage() {\n    return {\n      title: '录音',\n      path: 'packageAPI/pages/media/voice/voice'\n    }\n  },\n  data: {\n    theme: 'light',\n    recording: false, // 录音中\n    playing: false, // 播放中\n    hasRecord: false, // 已经录音\n    recordTime: 0, // 录音时长\n    playTime: 0, // 播放时长\n    formatedRecordTime: '00:00:00', // 录音时间\n    formatedPlayTime: '00:00:00' // 播放时间\n  },\n\n  onHide() {\n    if (this.data.playing) {\n      this.stopVoice()\n    } else if (this.data.recording) {\n      this.stopRecordUnexpectedly()\n    }\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    const that = this\n    // 监听录音开始事件\n    recorderManager.onStart(() => {\n      console.log('recorderManage: onStart')\n      // 录音时长记录 每秒刷新\n      recordTimeInterval = setInterval(() => {\n        that.data.recordTime += 1\n        const recordTime = that.data.recordTime\n        that.setData({\n          formatedRecordTime: util.formatTime(that.data.recordTime),\n          recordTime\n        })\n      }, 1000)\n    })\n\n    // 监听录音停止事件\n    recorderManager.onStop((res) => {\n      console.log('recorderManage: onStop')\n      that.setData({\n        hasRecord: true, // 录音完毕\n        recording: false,\n        tempFilePath: res.tempFilePath,\n        formatedPlayTime: util.formatTime(that.data.playTime),\n      })\n      // 清除录音计时器\n      clearInterval(recordTimeInterval)\n    })\n\n    // 监听播放开始事件\n    innerAudioContext.onPlay(() => {\n      console.log('innerAudioContext: onPlay')\n      playTimeInterval = setInterval(() => {\n        const playTime = that.data.playTime + 1\n        if (that.data.playTime === that.data.recordTime) {\n          that.stopVoice()\n        } else {\n          console.log('update playTime', playTime)\n          that.setData({\n            formatedPlayTime: util.formatTime(playTime),\n            playTime\n          })\n        }\n      }, 1000)\n    })\n\n    innerAudioContext.onStop(() => {\n\n    })\n  },\n\n  startRecord() {\n    this.setData({\n      recording: true // 录音开始\n    })\n    // 设置 Recorder 参数\n    const options = {\n      duration: 10000, // 持续时长\n      sampleRate: 44100,\n      numberOfChannels: 1,\n      encodeBitRate: 192000,\n      format: 'aac',\n      frameSize: 50\n    }\n    recorderManager.start(options) // 开始录音\n  },\n\n  stopRecord() {\n    recorderManager.stop() // 停止录音\n  },\n\n  stopRecordUnexpectedly() {\n    const that = this\n    wx.stopRecord({\n      success() {\n        console.log('stop record success')\n        clearInterval(recordTimeInterval)\n        that.setData({\n          recording: false,\n          hasRecord: false,\n          recordTime: 0,\n          formatedRecordTime: util.formatTime(0)\n        })\n      }\n    })\n  },\n\n  playVoice() {\n    innerAudioContext.src = this.data.tempFilePath\n    this.setData({\n      playing: true,\n\n    }, () => {\n      innerAudioContext.play()\n    })\n  },\n\n  pauseVoice() {\n    clearInterval(playTimeInterval)\n    innerAudioContext.pause()\n    this.setData({\n      playing: false\n    })\n  },\n\n  stopVoice() {\n    clearInterval(playTimeInterval)\n    innerAudioContext.stop()\n    this.setData({\n      playing: false,\n      formatedPlayTime: util.formatTime(0),\n      playTime: 0\n    })\n  },\n\n  clear() {\n    clearInterval(playTimeInterval)\n    innerAudioContext.stop()\n    this.setData({\n      playing: false,\n      hasRecord: false,\n      tempFilePath: '',\n      formatedRecordTime: util.formatTime(0),\n      recordTime: 0,\n      playTime: 0\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/voice/voice.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"录音\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/voice/voice.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: '录音/音频'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <block wx:if=\"{{recording === false && playing === false && hasRecord === false}}\">\n        <view class=\"page-body-time\">\n          <text class=\"time-big\">{{formatedRecordTime}}</text>\n        </view>\n        <view class=\"page-body-buttons\">\n          <view class=\"page-body-button\"></view>\n          <view class=\"page-body-button\" bindtap=\"startRecord\">\n            <image src=\"/image/record.png\"></image>\n          </view>\n          <view class=\"page-body-button\"></view>\n        </view>\n      </block>\n\n      <block wx:if=\"{{recording === true}}\">\n        <view class=\"page-body-time\">\n          <text class=\"time-big\">{{formatedRecordTime}}</text>\n        </view>\n        <view class=\"page-body-buttons\">\n          <view class=\"page-body-button\"></view>\n          <view class=\"page-body-button\" bindtap=\"stopRecord\">\n            <view class=\"button-stop-record\"></view>\n          </view>\n          <view class=\"page-body-button\"></view>\n        </view>\n      </block>\n\n      <block wx:if=\"{{hasRecord === true && playing === false}}\">\n        <view class=\"page-body-time\">\n          <text class=\"time-big\">{{formatedPlayTime}}</text>\n          <text class=\"time-small\">{{formatedRecordTime}}</text>\n        </view>\n        <view class=\"page-body-buttons\">\n          <view class=\"page-body-button\"></view>\n          <view class=\"page-body-button\" bindtap=\"playVoice\">\n            <image src=\"/image/play.png\"></image>\n          </view>\n          <view class=\"page-body-button\" bindtap=\"clear\">\n            <image src=\"/image/trash.png\"></image>\n          </view>\n        </view>\n      </block>\n\n      <block wx:if=\"{{hasRecord === true && playing === true}}\">\n        <view class=\"page-body-time\">\n          <text class=\"time-big\">{{formatedPlayTime}}</text>\n          <text class=\"time-small\">{{formatedRecordTime}}</text>\n        </view>\n        <view class=\"page-body-buttons\">\n          <view class=\"page-body-button\" bindtap=\"stopVoice\">\n            <image src=\"/image/stop.png\"></image>\n          </view>\n          <view class=\"page-body-button\" bindtap=\"pauseVoice\">\n            <image src=\"/image/pause.png\"></image>\n          </view>\n          <view class=\"page-body-button\" bindtap=\"clear\">\n            <image src=\"/image/trash.png\"></image>\n          </view>\n        </view>\n      </block>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/media/voice/voice.wxss",
    "content": "image {\n  width: 75px;\n  height: 75px;\n}\n\n.page-body-wrapper {\n  justify-content: space-between;\n  flex-grow: 1;\n  margin-bottom: 150px;\n}\n.page-body-time {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n.time-big {\n  font-size: 30px;\n  margin: 10px;\n}\n.time-small {\n  font-size: 15px;\n}\n\n.page-body-buttons {\n  margin-top: 30px;\n  display: flex;\n  justify-content: space-around;\n}\n.page-body-button {\n  width: 225px;\n  text-align: center;\n}\n.button-stop-record {\n  width: 15px;\n  height: 15px;\n  border: 10px solid #fff;\n  background-color: #f55c23;\n  border-radius: 115px;\n  margin: 0 auto;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/download-file/download-file.js",
    "content": "const demoImageFileId = require('../../../../config').demoImageFileId\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '下载文件',\n      path: 'packageAPI/pages/network/download-file/download-file'\n    }\n  },\n\n  downloadImage() {\n    const self = this\n\n    wx.cloud.downloadFile({\n      fileID: demoImageFileId, // 文件 ID\n      success: res => {\n        console.log('downloadFile success, res is', res)\n\n        self.setData({\n          imageSrc: res.tempFilePath\n        })\n      },\n      fail: console.error\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/download-file/download-file.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"下载文件\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/download-file/download-file.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'downloadFile'}}\"/>\n\n  <view class=\"page-body\">\n    <image wx:if=\"{{imageSrc}}\" src=\"{{imageSrc}}\" mode=\"center\" />\n    <block wx:else>\n      <view class=\"page-body-wording\">\n        <text class=\"page-body-text\">\n          点击按钮下载服务端示例图片\n        </text>\n      </view>\n      <view class=\"btn-area\">\n        <button bindtap=\"downloadImage\" type=\"primary\">下载</button>\n      </view>\n    </block>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/download-file/download-file.wxss",
    "content": ".page-body image {\n  width: 300px;\n  height: 300px;\n\n  margin: 0 38px;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/mdns/mdns.js",
    "content": "// miniprogram/page/API/pages/mdns/mdns.js\nlet serviceList = []\nlet resolveFailList = []\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'mdns',\n      path: 'packageAPI/pages/network/mdns/mdns'\n    }\n  },\n  daga: {\n    serviceList: [],\n    resolveFailList: [],\n  },\n  onShow() {\n    this.onLocalService()\n  },\n\n  startDiscovery() {\n    wx.startLocalServiceDiscovery({\n      serviceType: '_http._tcp.',\n      success(res) {\n        console.log(res)\n        wx.showToast({\n          title: '开启成功',\n          icon: 'none',\n          duration: 2000\n        })\n      },\n      fail: (err) => {\n        wx.showToast({\n          title: '开启失败',\n          icon: 'none',\n          duration: 2000\n        })\n        console.log(err)\n      },\n      complete: () => {\n        console.log('startDiscovery: complete')\n      }\n    })\n  },\n\n  stopDiscovery() {\n    const that = this\n    wx.stopLocalServiceDiscovery({\n      success: () => {\n        wx.showToast({\n          title: '关闭成功',\n          icon: 'none',\n          duration: 2000\n        })\n        serviceList = []\n        resolveFailList = []\n        that.setData({\n          serviceList: [],\n          resolveFailList: []\n        })\n      },\n      fail: () => {\n        console.log('stopDiscovery: fail')\n        wx.showToast({\n          title: '关闭失败',\n          icon: 'none',\n          duration: 2000\n        })\n      },\n      complete: () => {\n        console.log('stopDIscovery: complete')\n      }\n    })\n  },\n\n  // 监听列表\n  onLocalService() {\n    const that = this\n\n    // 监听服务发现事件\n    wx.onLocalServiceFound(function (obj) {\n      console.log(obj)\n      serviceList.push(obj)\n\n      that.setData({\n        serviceList,\n      })\n    })\n\n    // 监听服务解析失败事件\n    wx.onLocalServiceResolveFail(function (obj) {\n      console.log(obj)\n      resolveFailList.push(obj)\n      that.setData({\n        resolveFailList\n      })\n    })\n\n    // 监听服务离开\n    wx.onLocalServiceLost(function (obj) {\n      console.log(obj)\n    })\n\n    // 监听搜索停止\n    wx.onLocalServiceDiscoveryStop(function () {\n      console.log('监听到搜索停止事件')\n    })\n  },\n  // 取消监听\n  offLocalService() {\n    console.log('是否执行此部分数据')\n    // 取消监听服务发现事件\n    wx.offLocalServiceFound(function () {\n      console.log('取消监听服务发现事件 成功')\n    })\n\n    // 取消监听服务解析失败事件\n    wx.offLocalServiceResolveFail(function () {\n      console.log('取消监听 mDNS 服务解析失败的事件 成功')\n    })\n\n    // 取消监听服务离开\n    wx.offLocalServiceLost(function () {\n      console.log('取消监听服务离开事件 成功')\n    })\n\n    // 取消监听搜索停止\n    wx.offLocalServiceDiscoveryStop(function () {\n      console.log('取消监听 mDNS 服务停止搜索的事件 成功')\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/mdns/mdns.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"mDNS\"\n\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/mdns/mdns.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'mDNS'}}\"/>\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <button type=\"primary\" bind:tap=\"startDiscovery\">\n        开始搜索 mDNS\n      </button>\n      <button type=\"primary\" bind:tap=\"stopDiscovery\">\n        停止搜索 mDNS\n      </button>\n      <view>\n        <view wx:for=\"{{serviceList}}\" wx:key=\"{{index}}\" class='row'>\n          <text>设备服务名：{{item.serviceName}}</text>\n          <text>ip地址：{{item.ip}}:{{item.port}}</text>\n          <text>当前服务类型：{{item.serviceType}}</text>\n        </view>\n      </view>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/mdns/mdns.wxss",
    "content": "/* miniprogram/page/API/pages/mdns/mdns.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/request/request.js",
    "content": "const requestUrl = require('../../../../config').requestUrl\n\nconst duration = 2000\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '网络请求',\n      path: 'packageAPI/pages/network/request/request'\n    }\n  },\n\n  makeRequest() {\n    const self = this\n\n    self.setData({\n      loading: true\n    })\n\n    wx.request({\n      url: requestUrl,\n      data: {\n        theme: 'light',\n        noncestr: Date.now()\n      },\n      success(result) {\n        wx.showToast({\n          title: '请求成功',\n          icon: 'success',\n          mask: true,\n          duration,\n        })\n        self.setData({\n          loading: false\n        })\n        console.log('request success', result)\n      },\n\n      fail({ errMsg }) {\n        console.log('request fail', errMsg)\n        self.setData({\n          loading: false\n        })\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/request/request.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"网络请求\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/request/request.wxml",
    "content": "<import src=\"../../../../common/head.wxml\"/>\n<import src=\"../../../../common/foot.wxml\"/>\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'request'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-body-wording\">\n      <text class=\"page-body-text\">\n        点击向服务器发起请求\n      </text>\n    </view>\n    <view class=\"btn-area\">\n      <button bindtap=\"makeRequest\" type=\"primary\" disabled=\"{{buttonDisabled}}\" loading=\"{{loading}}\">request</button>\n    </view>\n  </view>\n\n  <template is=\"foot\"/>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/request/request.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/network/udp-socket/udp-socket.js",
    "content": "const AB2String = (arrayBuffer) => {\n  const unit8Arr = new Uint8Array(arrayBuffer)\n  const encodedString = String.fromCharCode.apply(null, unit8Arr)\n  const decodedString = decodeURIComponent(escape((encodedString)))// 没有这一步中文会乱码\n  return decodedString\n}\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'UDPSocket',\n      path: 'packageAPI/pages/network/udp-socket/udp-socket'\n    }\n  },\n  data: {\n    theme: 'light',\n    port: undefined,\n    remote_port: undefined,\n    startUDP: false,\n    mode: 'local',\n    address: 'localhost',\n    canIUse: true,\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    const canIUse = wx.canIUse('createUDPSocket')\n    if (!canIUse) {\n      wx.showModal({\n        title: '微信版本过低，暂不支持本功能'\n      })\n      this.setData({\n        canIUse,\n      })\n    }\n  },\n  handleCreateUDPTap() {\n    this.UDPSocket = wx.createUDPSocket()\n    this.remoteUDPSocket = wx.createUDPSocket()\n    this.port = this.UDPSocket.bind()\n    this.remote_port = this.remoteUDPSocket.bind()\n    this.setData({\n      port: this.port,\n      remote_port: this.remote_port,\n      startUDP: true,\n    })\n    this.remoteUDPSocket.onMessage((res) => {\n      const { remoteInfo } = res\n      console.log(res)\n      wx.showModal({\n        title: `IP:${remoteInfo.address}发来的信息`,\n        content: AB2String(res.message),\n      })\n    })\n  },\n\n  handleCloseUDPTap() {\n    this.setData({\n      startUDP: false,\n      mode: 'local',\n    })\n    console.log(this.data)\n    this.UDPSocket.close()\n    this.remoteUDPSocket.close()\n  },\n  handleSendRemoteMessage() {\n    this.UDPSocket.send({\n      address: this.data.address || 'localhost', // 可以是任意 ip 和域名\n      port: this.remote_port,\n      message: `port[${this.port}] 向 remote-port[${this.remote_port}] 发送信息: Hello Wechat!`,\n    })\n  },\n  changeMode() {\n    this.setData({\n      mode: 'remote',\n    })\n  },\n  handleInputChange(e) {\n    this.setData({\n      address: e.detail.value,\n    })\n  },\n  handleSendMessage() {\n    this.UDPSocket.send({\n      address: 'localhost', // 可以是任意 ip 和域名\n      port: this.remote_port,\n      message: `port[${this.port}] 向 remote-port[${this.remote_port}] 发送信息: Hello Wechat!`,\n    })\n  },\n\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/udp-socket/udp-socket.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"UDPSocket\"\n\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/udp-socket/udp-socket.wxml",
    "content": "<import src=\"../../../../common/head.wxml\"/>\n<import src=\"../../../../common/foot.wxml\"/>\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'startSoterAuthentication'}}\"/>\n\n  <view class=\"page-body\">\n    <view wx:if=\"{{startUDP}}\" style=\"text-align: center\">\n        本机port: {{port}} 模拟远程port: {{remote_port}}\n    </view>\n    <view wx:if=\"{{!startUDP}}\" class=\"btn-area\">\n      <button type=\"primary\" \n        disabled=\"{{!canIUse}}\"\n      bind:tap=\"handleCreateUDPTap\">\n        开启 UDPSocket\n      </button>\n    </view>\n    <block wx:else>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bind:tap=\"handleSendMessage\">\n          本机发送测试\n        </button>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bind:tap=\"changeMode\">\n          远程发送测试\n        </button>\n      </view>\n      <block wx:if=\"{{mode === 'remote'}}\">\n        <input placeholder=\"请输入目标主机 IP 地址 默认: 127.0.0.1\" bind:input=\"handleInputChange\"></input>\n        <view class=\"btn-area\">\n          <button type=\"primary\" bind:tap=\"handleSendRemoteMessage\">\n            发送\n          </button>\n        </view>\n      </block>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bind:tap=\"handleCloseUDPTap\">\n          关闭 UDPSocket\n        </button>\n      </view>\n    </block>\n  </view>\n\n  <template is=\"foot\"/>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/udp-socket/udp-socket.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/network/upload-file/upload-file.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '上传文件',\n      path: 'packageAPI/pages/network/upload-file/upload-file'\n    }\n  },\n\n  chooseImage() {\n    const self = this\n\n    wx.chooseImage({\n      count: 1,\n      sizeType: ['compressed'],\n      sourceType: ['album'],\n      async success(res) {\n        const imageSrc = res.tempFilePaths[0]\n        const r = await wx.cloud.callFunction({\n          name: 'login',\n          data: {\n            action: 'openid'\n          },\n        })\n        const openId = r.result.openid\n        const cloudPath = `upload/${openId}.png`\n        wx.cloud.uploadFile({\n          cloudPath, // 上传至云端的路径\n          filePath: imageSrc, // 小程序临时文件路径\n          config: {\n            env: 'release-b86096'\n          },\n          success: res => {\n            // 返回文件 ID\n            console.log(res.fileID)\n            console.log('uploadImage success, res is:', res)\n            wx.showToast({\n              title: '上传成功',\n              icon: 'success',\n              duration: 1000\n            })\n\n            self.setData({\n              imageSrc,\n              fileID: res.fileID,\n            })\n          },\n          fail({ errMsg }) {\n            console.log('uploadImage fail, errMsg is', errMsg)\n          }\n        })\n      },\n\n      fail: res => {\n        wx.showToast({\n          icon: 'none',\n          title: '上传失败',\n        })\n        console.log('uploadImage fail, errMsg is', res.errMsg)\n      }\n    })\n  },\n\n  onUnload() {\n    if (this.data.fileID) {\n      wx.cloud.deleteFile({\n        fileList: [this.data.fileID]\n      })\n    }\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/upload-file/upload-file.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"上传文件\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/upload-file/upload-file.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'uploadFile'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info\">\n\n        <block wx:if=\"{{imageSrc}}\">\n          <image src=\"{{imageSrc}}\" class=\"image\" mode=\"aspectFit\"></image>\n        </block>\n\n        <block wx:else>\n          <view class=\"image-plus image-plus-nb\" bindtap=\"chooseImage\">\n            <view class=\"image-plus-horizontal\"></view>\n            <view class=\"image-plus-vertical\"></view>\n          </view>\n          <view class=\"image-plus-text\">选择图片</view>\n        </block>\n\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/upload-file/upload-file.wxss",
    "content": ".image {\n  width: 100%;\n  height: 330px;\n}\n.page-body-info {\n  display: flex;\n  box-sizing: border-box;\n  padding: 15px;\n  height: 410px;\n  border-top: 1px solid var(--weui-FG-3);\n  border-bottom: 1px solid var(--weui-FG-3);\n  align-items: center;\n  justify-content: center;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/web-socket/web-socket.js",
    "content": "function showModal(title, content) {\n  wx.showModal({\n    title,\n    content,\n    showCancel: false\n  })\n}\n\nfunction showSuccess(title) {\n  wx.showToast({\n    title,\n    icon: 'success',\n    duration: 1000\n  })\n}\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'Web Socket',\n      path: 'packageAPI/pages/network/web-socket/web-socket'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    socketStatus: 'closed'\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n    this.closeSocket()\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    const self = this\n    self.setData({\n      hasLogin: true\n    })\n    // qcloud.setLoginUrl(loginUrl)\n\n    // qcloud.login({\n    //   success: function(result) {\n    //     console.log('登录成功', result)\n    //     self.setData({\n    //       hasLogin: true\n    //     })\n    //   },\n\n    //   fail: function(error) {\n    //     console.log('登录失败', error)\n    //   }\n    // })\n  },\n\n  toggleSocket(e) {\n    const turnedOn = e.detail.value\n\n    if (turnedOn && this.data.socketStatus === 'closed') {\n      this.openSocket()\n    } else if (!turnedOn && this.data.socketStatus === 'connected') {\n      const showSuccess = true\n      this.closeSocket(showSuccess)\n    }\n  },\n\n  openSocket() {\n    // var socket = this.socket = new qcloud.Tunnel(tunnelUrl)\n\n    wx.onSocketOpen(() => {\n      console.log('WebSocket 已连接')\n      showSuccess('Socket已连接')\n      this.setData({\n        socketStatus: 'connected'\n      })\n    })\n\n    wx.onSocketClose(() => {\n      console.log('WebSocket 已断开')\n      this.setData({ socketStatus: 'closed' })\n    })\n\n    wx.onSocketError(error => {\n      showModal('发生错误', JSON.stringify(error))\n      console.error('socket error:', error)\n      this.setData({\n        loading: false\n      })\n    })\n\n    // 监听服务器推送消息\n    wx.onSocketMessage(message => {\n      showSuccess('收到信道消息')\n      console.log('socket message:', message)\n      this.setData({\n        loading: false\n      })\n    })\n\n    // 打开信道\n    wx.connectSocket({\n      url: 'wss://echo.websocket.org',\n    })\n  },\n\n  closeSocket() {\n    if (this.data.socketStatus === 'connected') {\n      wx.closeSocket({\n        success: () => {\n          showSuccess('Socket已断开')\n          this.setData({ socketStatus: 'closed' })\n        }\n      })\n    }\n  },\n\n  sendMessage() {\n    if (this.data.socketStatus === 'connected') {\n      wx.sendSocketMessage({\n        data: 'Hello, Miniprogram!'\n      })\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/web-socket/web-socket.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"Web Socket\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/web-socket/web-socket.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'WebSocket'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_switch\">\n          <view class=\"weui-cell__bd\">Socket状态</view>\n          <view class=\"weui-cell__ft\">\n            <switch bindchange=\"toggleSocket\" disabled=\"{{!hasLogin}}\"/>\n          </view>\n        </view>\n        <view class=\"weui-cell\">\n          <view class=\"weui-cell__bd\">消息</view>\n          <view class=\"weui-cell__ft\">\n            Hello, 小程序!\n          </view>\n        </view>\n      </view>\n    </view>\n    <view class=\"btn-area\">\n      <button type=\"primary\" size=\"40\" bindtap=\"sendMessage\" disabled=\"{{socketStatus != 'connected'}}\" loading=\"{{loading}}\">点我发送</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/network/web-socket/web-socket.wxss",
    "content": "\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/nouse/custom-service/custom-service.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '联系客服',\n      path: 'packageAPI/pages/custom-service/custom-service'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/nouse/custom-service/custom-service.json",
    "content": "{\n    \"navigationBarTitleText\": \"客服消息\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/nouse/custom-service/custom-service.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'scanCode'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"btn-area\">\n      <button type=\"primary\">联系客服</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/nouse/custom-service/custom-service.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/nouse/doc-web-view/doc-web-view.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '小程序接口文档',\n      path: 'packageAPI/pages/doc-web-view/doc-web-view'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/nouse/doc-web-view/doc-web-view.json",
    "content": "{\n  \"navigationBarTitleText\": \"小程序接口文档\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/nouse/doc-web-view/doc-web-view.wxml",
    "content": "<web-view src=\"https://developers.weixin.qq.com/miniprogram/dev/api/\"></web-view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/nouse/doc-web-view/doc-web-view.wxss",
    "content": "/* miniprogram/page/API/pages/doc-web-view/doc-web-view.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/nouse/sendMessage/sendMessage.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'sendMessage',\n      path: 'packageAPI/pages/sendMessage/sendMessage'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/nouse/sendMessage/sendMessage.json",
    "content": "{\n    \"navigationBarTitleText\": \"发送模板消息\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/nouse/sendMessage/sendMessage.wxml",
    "content": "<import src=\"../../../../common/head.wxml\"/>\n<import src=\"../../../../common/foot.wxml\"/>\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'sendMessage'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"weui-cells__title\">发送内容（以下字段可自由适配）</view>\n    <view class=\"weui-cells weui-cells_after-title\">\n      <view class=\"weui-cell weui-cell_input\">\n        <view class=\"weui-cell__hd\">\n          <view class=\"weui-label\">实例字段</view>\n        </view>\n        <view class=\"weui-cell__bd\">\n          <input class=\"weui-input\" type=\"text\" placeholder=\"请输入\"></input>\n        </view>\n      </view>\n      <view class=\"weui-cell weui-cell_input\">\n        <view class=\"weui-cell__hd\">\n          <view class=\"weui-label\">实例字段</view>\n        </view>\n        <view class=\"weui-cell__bd\">\n          <input class=\"weui-input\" type=\"text\" placeholder=\"请输入\"></input>\n        </view>\n      </view>\n    </view>\n\n    <view class=\"weui-cells\">\n      <view class=\"weui-cell weui-cell_input\">\n        <view class=\"weui-cell__hd\">\n          <view class=\"weui-label\">跳转链接</view>\n        </view>\n        <view class=\"weui-cell__bd\">\n          <input class=\"weui-input\" type=\"text\" placeholder=\"请输入\" value=\"{{shareData.path}}\"></input>\n        </view>\n      </view>\n    </view>\n    <view class=\"btn-area\">\n      <button type=\"primary\">发送模板消息</button>\n    </view>\n  </view>\n\n  <template is=\"foot\"/>\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/nouse/sendMessage/sendMessage.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/page/action-sheet/action-sheet.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '操作菜单',\n      path: 'packageAPI/pages/page/action-sheet/action-sheet'\n    }\n  },\n\n  actionSheetTap() {\n    wx.showActionSheet({\n      itemList: ['item1', 'item2', 'item3', 'item4'],\n      success(e) {\n        console.log(e.tapIndex)\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/action-sheet/action-sheet.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"操作菜单\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/action-sheet/action-sheet.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'action-sheet'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"btn-area\">\n      <button type=\"default\" bindtap=\"actionSheetTap\">弹出action sheet</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/action-sheet/action-sheet.wxss",
    "content": "/*\n.cancel {\n  color: white;\n  background: #303F9F;\n}\n.item {\n  color: black;\n  background: #C5CAE9;\n}*/\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/animation/animation.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '动画',\n      path: 'packageAPI/pages/page/animation/animation',\n      containerStyle1: '',\n\n    }\n  },\n  data: {\n    theme: 'light',\n    canIUse: true,\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    const canIUse = this.animate !== undefined\n    if (!canIUse) {\n      wx.showModal({\n        title: '微信版本过低，暂不支持本功能',\n      })\n      this.setData({\n        canIUse,\n      })\n    }\n  },\n\n  change() {\n    this.animate('#container1', [\n      { opacity: 1.0, rotate: 0, backgroundColor: '#FF0000' },\n      {\n        opacity: 0.5, rotate: 45, backgroundColor: '#00FF00', offset: 0.9\n      },\n      { opacity: 0.0, rotate: 90, backgroundColor: '#FF0000' },\n    ], 5000, function () {\n      this.clearAnimation('#container1', { opacity: true, rotate: true }, function () {\n        console.log('清除了#container上的动画属性')\n      })\n    }.bind(this))\n    this.animate('.block1', [\n      { scale: [1, 1], rotate: 0, ease: 'ease-out' },\n      {\n        scale: [1.5, 1.5], rotate: 45, ease: 'ease-in', offset: 0.9\n      },\n      { scale: [2, 2], rotate: 90 },\n    ], 5000, function () {\n      this.clearAnimation('.block1', { scale: true, rotate: true }, function () {\n        console.log('清除了.block1上的动画属性')\n      })\n    }.bind(this))\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/animation/animation.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"动画\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/animation/animation.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: '关键帧动画'}}\"/>\n\n  <view class=\"page-body\">\n  <view class=\"page-section\">\n    <view class=\"page-section-title\">\n      <text>关键帧动画\\n\\n从小程序基础库 2.9.0 开始支持一种更友好的动画创建方式，用于代替旧的 wx.createAnimation</text>\n    </view>  \n    <view id=\"container1\" style=\"{{containerStyle1}}\">\n      <button class=\"block1\" style=\"width: 150px; margin: 50px auto;\">示例按钮</button>\n      <a class=\"block1\" style=\"display: block; margin: 50px auto; width: 150px; text-align: center;\">示例超链接</a>\n      <text class=\"block1\" style=\"display: block; margin: 50px auto; width: 150px; text-align: center;\">示例文本</text>\n    </view>\n    <button disabled=\"{{!canIUse}}\" type=\"primary\" bindtap=\"change\">开启动画</button>\n  </view>\n  </view>\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/animation/animation.wxss",
    "content": ".animation-element-wrapper {\n  display: flex;\n  width: 100%;\n  padding-top: 75px;\n  padding-bottom: 75px;\n  justify-content: center;\n  overflow: hidden;\n  background-color: #ffffff;\n}\n.animation-element {\n  width: 100px;\n  height: 100px;\n  background-color: #1AAD19;\n}\n.animation-buttons {\n  padding: 15px 25px 5px;\n  width: 100%;\n  height: 330px;\n  box-sizing: border-box;\n}\n.animation-button {\n  float: left;\n  line-height: 2;\n  width: 150px;\n  margin: 8px 11px;\n}\n\n.animation-button-reset {\n  width: 610px;\n}\n\n.btn-row {\n  display: flex;\n  justify-content: space-between;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/canvas/canvas.js",
    "content": "const example = require('./example.js')\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '创建画布',\n      path: 'packageAPI/pages/page/canvas/canvas'\n    }\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    this.context = wx.createContext()\n\n    const methods = Object.keys(example)\n    this.setData({\n      methods\n    })\n\n    const that = this\n    methods.forEach(function (method) {\n      that[method] = function () {\n        example[method](that.context)\n        const actions = that.context.getActions()\n\n        wx.drawCanvas({\n          canvasId: 'canvas',\n          actions\n        })\n      }\n    })\n  },\n\n  toTempFilePath() {\n    wx.canvasToTempFilePath({\n      canvasId: 'canvas',\n      success(res) {\n        console.log(res)\n      },\n\n      fail(res) {\n        console.log(res)\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/canvas/canvas.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"创建画布\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/canvas/canvas.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'createContext'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <canvas class=\"canvas-element\" canvas-id=\"canvas\"></canvas>\n      <scroll-view class=\"canvas-buttons\" scroll-y=\"true\">\n        <block wx:for=\"{{methods}}\" wx:for-item=\"method\">\n          <button class=\"canvas-button\" bindtap=\"{{method}}\">{{method}}</button>\n        </block>\n        <button class=\"canvas-button\" bindtap=\"toTempFilePath\" type=\"primary\">toTempFilePath</button>\n      </scroll-view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/canvas/canvas.wxss",
    "content": ".canvas-element-wrapper {\n  display: block;\n  margin-bottom: 50px;\n}\n.canvas-element {\n  width: 100%;\n  height: 250px;\n  background-color: #ffffff;\n}\n.canvas-buttons {\n  padding: 15px 25px 5px;\n  width: 100%;\n  height: 330px;\n  box-sizing: border-box;\n}\n.canvas-button {\n  float: left;\n  line-height: 2;\n  width: 150px;\n  margin: 8px 11px;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/canvas/example.js",
    "content": "const example = {}\n\nexample.rotate = function (context) {\n  context.beginPath()\n  context.rotate((10 * Math.PI) / 180)\n  context.rect(225, 75, 20, 10)\n  context.fill()\n}\n\nexample.scale = function (context) {\n  context.beginPath()\n  context.rect(25, 25, 50, 50)\n  context.stroke()\n\n  context.scale(2, 2)\n\n  context.beginPath()\n  context.rect(25, 25, 50, 50)\n  context.stroke()\n}\n\nexample.reset = function (context) {\n  context.beginPath()\n\n  context.setFillStyle('#000000')\n  context.setStrokeStyle('#000000')\n  context.setFontSize(10)\n\n  context.setShadow(0, 0, 0, 'rgba(0, 0, 0, 0)')\n\n  context.setLineCap('butt')\n  context.setLineJoin('miter')\n  context.setLineWidth(1)\n  context.setMiterLimit(10)\n}\n\nexample.translate = function (context) {\n  context.beginPath()\n  context.rect(10, 10, 100, 50)\n  context.fill()\n\n  context.translate(70, 70)\n\n  context.beginPath()\n  context.fill()\n}\n\nexample.save = function (context) {\n  context.beginPath()\n  context.setStrokeStyle('#00ff00')\n  context.save()\n\n  context.scale(2, 2)\n  context.setStrokeStyle('#ff0000')\n  context.rect(0, 0, 100, 100)\n  context.stroke()\n  context.restore()\n\n  context.rect(0, 0, 50, 50)\n  context.stroke()\n}\n\nexample.restore = function (context) {\n  [3, 2, 1].forEach(function (item) {\n    context.beginPath()\n    context.save()\n    context.scale(item, item)\n    context.rect(10, 10, 100, 100)\n    context.stroke()\n    context.restore()\n  })\n}\n\nexample.drawImage = function (context) {\n  context.drawImage('/image/wechat.png', 0, 0)\n}\n\nexample.fillText = function (context) {\n  context.setStrokeStyle('#ff0000')\n\n  context.beginPath()\n  context.moveTo(0, 10)\n  context.lineTo(300, 10)\n  context.stroke()\n\n  // context.save()\n  // context.scale(1.5, 1.5)\n  // context.translate(20, 20)\n  context.setFontSize(10)\n  context.fillText('Hello World', 0, 30)\n  context.setFontSize(20)\n  context.fillText('Hello World', 100, 30)\n\n  // context.restore()\n\n  context.beginPath()\n  context.moveTo(0, 30)\n  context.lineTo(300, 30)\n  context.stroke()\n}\n\nexample.fill = function (context) {\n  context.beginPath()\n  context.rect(20, 20, 150, 100)\n  context.setStrokeStyle('#00ff00')\n  context.fill()\n}\n\nexample.stroke = function (context) {\n  context.beginPath()\n  context.moveTo(20, 20)\n  context.lineTo(20, 100)\n  context.lineTo(70, 100)\n  context.setStrokeStyle('#00ff00')\n  context.stroke()\n}\n\nexample.clearRect = function (context) {\n  context.setFillStyle('#ff0000')\n  context.beginPath()\n  context.rect(0, 0, 300, 150)\n  context.fill()\n  context.clearRect(20, 20, 100, 50)\n}\n\nexample.beginPath = function (context) {\n  context.beginPath()\n  context.setLineWidth(5)\n  context.setStrokeStyle('#ff0000')\n  context.moveTo(0, 75)\n  context.lineTo(250, 75)\n  context.stroke()\n\n  context.beginPath()\n  context.setStrokeStyle('#0000ff')\n  context.moveTo(50, 0)\n  context.lineTo(150, 130)\n  context.stroke()\n}\n\nexample.closePath = function (context) {\n  context.beginPath()\n  context.moveTo(20, 20)\n  context.lineTo(20, 100)\n  context.lineTo(70, 100)\n  context.closePath()\n  context.stroke()\n}\n\nexample.moveTo = function (context) {\n  context.beginPath()\n  context.moveTo(0, 0)\n  context.lineTo(300, 150)\n  context.stroke()\n}\n\nexample.lineTo = function (context) {\n  context.beginPath()\n  context.moveTo(20, 20)\n  context.lineTo(20, 100)\n  context.lineTo(70, 100)\n  context.stroke()\n}\n\nexample.rect = function (context) {\n  context.beginPath()\n  context.rect(20, 20, 150, 100)\n  context.stroke()\n}\n\nexample.arc = function (context) {\n  context.beginPath()\n  context.arc(75, 75, 50, 0, Math.PI * 2, true)\n  context.moveTo(110, 75)\n  context.arc(75, 75, 35, 0, Math.PI, false)\n  context.moveTo(65, 65)\n  context.arc(60, 65, 5, 0, Math.PI * 2, true)\n  context.moveTo(95, 65)\n  context.arc(90, 65, 5, 0, Math.PI * 2, true)\n  context.stroke()\n}\n\nexample.quadraticCurveTo = function (context) {\n  context.beginPath()\n  context.moveTo(20, 20)\n  context.quadraticCurveTo(20, 100, 200, 20)\n  context.stroke()\n}\n\nexample.bezierCurveTo = function (context) {\n  context.beginPath()\n  context.moveTo(20, 20)\n  context.bezierCurveTo(20, 100, 200, 100, 200, 20)\n  context.stroke()\n}\n\nexample.setFillStyle = function (context) {\n  ['#fef957', 'rgb(242,159,63)', 'rgb(242,117,63)', '#e87e51'].forEach(function (item, index) {\n    context.setFillStyle(item)\n    context.beginPath()\n    context.rect(0 + 75 * index, 0, 50, 50)\n    context.fill()\n  })\n}\n\nexample.setStrokeStyle = function (context) {\n  ['#fef957', 'rgb(242,159,63)', 'rgb(242,117,63)', '#e87e51'].forEach(function (item, index) {\n    context.setStrokeStyle(item)\n    context.beginPath()\n    context.rect(0 + 75 * index, 0, 50, 50)\n    context.stroke()\n  })\n}\n\nexample.setGlobalAlpha = function (context) {\n  context.setFillStyle('#000000');\n  [1, 0.5, 0.1].forEach(function (item, index) {\n    context.setGlobalAlpha(item)\n    context.beginPath()\n    context.rect(0 + 75 * index, 0, 50, 50)\n    context.fill()\n  })\n}\n\nexample.setShadow = function (context) {\n  context.beginPath()\n  context.setShadow(10, 10, 10, 'rgba(0, 0, 0, 199)')\n  context.rect(10, 10, 100, 100)\n  context.fill()\n}\n\nexample.setFontSize = function (context) {\n  [10, 20, 30, 40].forEach(function (item, index) {\n    context.setFontSize(item)\n    context.fillText('Hello, world', 20, 20 + 40 * index)\n  })\n}\n\nexample.setLineCap = function (context) {\n  context.setLineWidth(10);\n  ['butt', 'round', 'square'].forEach(function (item, index) {\n    context.beginPath()\n    context.setLineCap(item)\n    context.moveTo(20, 20 + 20 * index)\n    context.lineTo(100, 20 + 20 * index)\n    context.stroke()\n  })\n}\n\nexample.setLineJoin = function (context) {\n  context.setLineWidth(10);\n  ['bevel', 'round', 'miter'].forEach(function (item, index) {\n    context.beginPath()\n\n    context.setLineJoin(item)\n    context.moveTo(20 + 80 * index, 20)\n    context.lineTo(100 + 80 * index, 50)\n    context.lineTo(20 + 80 * index, 100)\n    context.stroke()\n  })\n}\n\nexample.setLineWidth = function (context) {\n  [2, 4, 6, 8, 10].forEach(function (item, index) {\n    context.beginPath()\n    context.setLineWidth(item)\n    context.moveTo(20, 20 + 20 * index)\n    context.lineTo(100, 20 + 20 * index)\n    context.stroke()\n  })\n}\n\nexample.setMiterLimit = function (context) {\n  context.setLineWidth(4);\n\n  [2, 4, 6, 8, 10].forEach(function (item, index) {\n    context.beginPath()\n    context.setMiterLimit(item)\n    context.moveTo(20 + 80 * index, 20)\n    context.lineTo(100 + 80 * index, 50)\n    context.lineTo(20 + 80 * index, 100)\n    context.stroke()\n  })\n}\n\nmodule.exports = example\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/get-wxml-node-info/get-wxml-node-info.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '获取WXML节点信息',\n      path: 'packageAPI/pages/page/get-wxml-node-info/get-wxml-node-info'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    metrics: []\n  },\n\n  onReady() {\n    this.getNodeInfo()\n  },\n\n  getNodeInfo() {\n    const $ = wx.createSelectorQuery()\n    const target = $.select('.target')\n    target.boundingClientRect()\n\n    $.exec((res) => {\n      const rect = res[0]\n      if (rect) {\n        const metrics = []\n        // eslint-disable-next-line\n        for (const key in rect) {\n          if (key !== 'id' && key !== 'dataset') {\n            const val = rect[key]\n            metrics.push({ key, val })\n          }\n        }\n\n        this.setData({ metrics })\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/get-wxml-node-info/get-wxml-node-info.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"获取WXML节点信息\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/get-wxml-node-info/get-wxml-node-info.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'createSelectorQuery'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <movable-area>\n        <movable-view class=\"target\" x=\"{{x}}\" y=\"{{y}}\" direction=\"all\" bindchange=\"getNodeInfo\">\n          Drag\n        </movable-view>\n      </movable-area>\n    </view>\n\n    <view class=\"page-section\">\n      <view class=\"metric\">\n        <view wx:for=\"{{ metrics }}\" wx:key=\"{{item.key}}\">\n          <text class=\"b\">{{ item.key }}</text>\n          <text class=\"span\">{{ item.val }}</text>\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/get-wxml-node-info/get-wxml-node-info.wxss",
    "content": "movable-view {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  height: 50px;\n  width: 50px;\n  background: #1AAD19;\n  color: #fff;  \n}\n\nmovable-area {\n  height: 200px;\n  width: 200px;\n  background-color: #ccc;\n  overflow: hidden;\n}\n\n.page-section {\n  display: flex;\n  justify-content: center;\n}\n\n.page-body {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.metric {\n  width: 200px;\n  display: flex;\n  justify-content: center;\n  flex-direction:column;\n  align-items:center;\n}\n\n.b {\n  display: inline-block;\n  width: 75px;\n  font-weight: bold;\n}\n\n.span {\n  display: inline-block;\n  width: 50px;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/intersection-observer/intersection-observer.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'WXML节点布局相交状态',\n      path: 'packageAPI/pages/page/intersection-observer/intersection-observer'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    appear: false\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n    if (this._observer) this._observer.disconnect()\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    this._observer = wx.createIntersectionObserver(this)\n    this._observer\n      .relativeTo('.scroll-view')\n      .observe('.ball', (res) => {\n        console.log(res)\n        this.setData({\n          appear: res.intersectionRatio > 0\n        })\n      })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/intersection-observer/intersection-observer.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"WXML节点布局相交状态\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/intersection-observer/intersection-observer.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'intersectionObserver'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section message\">\n      <text wx:if=\"{{appear}}\">\n        小球出现\n      </text>\n      <text wx:else>\n        小球消失\n      </text>\n    </view>\n    <view class=\"page-section\">\n      <scroll-view class=\"scroll-view\" scroll-y>\n        <view class=\"scroll-area\" style=\"{{appear ? 'background: #ccc' : ''}}\">\n          <text class=\"notice\">向下滚动让小球出现</text>\n          <view class=\"filling\"></view>\n          <view class=\"ball\"></view>\n        </view>\n      </scroll-view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/intersection-observer/intersection-observer.wxss",
    "content": ".scroll-view {\n  height: 200px;\n  background: var(--weui-BG-2);\n}\n\n.scroll-area {\n  height: 1150px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  transition: .5s;\n}\n\n.notice {\n  margin-top: 75px;\n}\n\n.ball {\n  width: 100px;\n  height: 100px;\n  background: #1AAD19;\n  border-radius: 50%;\n}\n\n.filling {\n  height: 200px;\n}\n\n.message {\n  width: 100%;\n  display: flex;\n  justify-content: center;\n}\n\n.message text {\n  font-size: 20px;\n  font-family: -apple-system-font, Helvetica Neue,Helvetica,sans-serif;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/modal/modal.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '模态弹窗',\n      path: 'packageAPI/pages/page/modal/modal'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    modalHidden: true,\n    modalHidden2: true\n  },\n  modalTap() {\n    wx.showModal({\n      title: '弹窗标题',\n      content: '弹窗内容，告知当前状态、信息和解决方法，描述文字尽量控制在三行内',\n      showCancel: false,\n      confirmText: '确定'\n    })\n  },\n  noTitlemodalTap() {\n    wx.showModal({\n      content: '弹窗内容，告知当前状态、信息和解决方法，描述文字尽量控制在三行内',\n      confirmText: '确定',\n      cancelText: '取消'\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/modal/modal.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"模态弹窗\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/modal/modal.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'modal'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"btn-area\">\n      <button type=\"default\" bindtap=\"modalTap\">有标题的modal</button>\n      <button type=\"default\" bindtap=\"noTitlemodalTap\">无标题的modal</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/modal/modal.wxss",
    "content": "/* page/API/pages/modal/modal.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/navigation-bar-loading/navigation-bar-loading.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '标题栏加载动画',\n      path: 'packageAPI/pages/page/navigation-bar-loading/navigation-bar-loading'\n    }\n  },\n\n  showNavigationBarLoading() {\n    wx.showNavigationBarLoading()\n  },\n  hideNavigationBarLoading() {\n    wx.hideNavigationBarLoading()\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/navigation-bar-loading/navigation-bar-loading.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"标题栏加载动画\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/navigation-bar-loading/navigation-bar-loading.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'navigationBarLoading'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"btn-area\">\n      <button type=\"primary\" bindtap=\"showNavigationBarLoading\">显示加载动画</button>\n      <button bindtap=\"hideNavigationBarLoading\">隐藏加载动画</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/navigation-bar-loading/navigation-bar-loading.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/page/navigator/navigator.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '页面跳转',\n      path: 'packageAPI/pages/page/navigator/navigator'\n    }\n  },\n\n  navigateTo() {\n    wx.navigateTo({ url: './navigator' })\n  },\n\n  navigateBack() {\n    wx.navigateBack()\n  },\n\n  redirectTo() {\n    wx.redirectTo({ url: './navigator' })\n  },\n\n  switchTab() {\n    wx.switchTab({ url: '/page/component/index' })\n  },\n\n  reLaunch() {\n    wx.reLaunch({ url: '/page/component/index' })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/navigator/navigator.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"页面跳转\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/navigator/navigator.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'navigateTo/Back, redirectTo'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"btn-area\">\n      <button bindtap=\"navigateTo\">跳转新页面</button>\n      <button bindtap=\"navigateBack\">返回上一页</button>\n      <button bindtap=\"redirectTo\">在当前页面打开</button>\n      <button bindtap=\"switchTab\">跳转到组件Tab页</button>\n      <button bindtap=\"reLaunch\">关闭所有页面并跳转</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/navigator/navigator.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/page/page-scroll/page-scroll.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '页面滚动',\n      path: 'packageAPI/pages/page/page-scroll/page-scroll'\n    }\n  },\n\n  scrollToTop() {\n    wx.pageScrollTo({\n      scrollTop: 0,\n      duration: 300\n    })\n  },\n\n  scrollToBottom() {\n    wx.pageScrollTo({\n      scrollTop: 3000,\n      duration: 300\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/page-scroll/page-scroll.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"页面滚动\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/page-scroll/page-scroll.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'pageScrollTo'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"scrollToBottom\">滚动到页面底部</button>\n      </view>\n      <view class=\"filling-area\"></view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"scrollToTop\">返回顶部</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/page-scroll/page-scroll.wxss",
    "content": ".rect {\n  width: 50px;\n  height: 50px;\n  background-color: #ccc;\n}\n\n.filling-area {\n  height: 1250px;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/pull-down-refresh/pull-down-refresh.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '下拉刷新',\n      path: 'packageAPI/pages/page/pull-down-refresh/pull-down-refresh'\n    }\n  },\n\n  onPullDownRefresh() {\n    wx.showToast({\n      title: 'loading...',\n      icon: 'loading'\n    })\n    console.log('onPullDownRefresh', new Date())\n  },\n\n  stopPullDownRefresh() {\n    wx.stopPullDownRefresh({\n      complete(res) {\n        wx.hideToast()\n        console.log(res, new Date())\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/pull-down-refresh/pull-down-refresh.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"下拉刷新\",\n    \"enablePullDownRefresh\": true,\n    \"backgroundTextStyle\": \"@backgroundTextStyle\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/pull-down-refresh/pull-down-refresh.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'on/stopPullDownRefresh'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info\">\n        <text class=\"page-body-text\">下滑页面即可刷新</text>\n      </view>\n      <view class=\"btn-area\">\n        <button bindtap=\"stopPullDownRefresh\">停止刷新</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/pull-down-refresh/pull-down-refresh.wxss",
    "content": ".page-body-info {\n  background-color: transparent;\n}\n.btn-area{\n  margin-top: 150px;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/set-navigation-bar-title/set-navigation-bar-title.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '设置页面标题',\n      path: 'packageAPI/pages/page/set-navigation-bar-title/set-navigation-bar-title'\n    }\n  },\n\n  setNaivgationBarTitle(e) {\n    const title = e.detail.value.title\n    console.log(title)\n    wx.setNavigationBarTitle({\n      title,\n      success() {\n        console.log('setNavigationBarTitle success')\n      },\n      fail(err) {\n        console.log('setNavigationBarTitle fail, err is', err)\n      }\n    })\n\n    return false\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/set-navigation-bar-title/set-navigation-bar-title.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"设置页面标题\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/set-navigation-bar-title/set-navigation-bar-title.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'setNaivgationBarTitle'}}\"/>\n\n  <form class=\"page-body\" bindsubmit=\"setNaivgationBarTitle\">\n    <view class=\"weui-cells weui-cells_after-title\">\n      <view class=\"weui-cell weui-cell_input\">\n        <view class=\"weui-cell__hd\">\n          <view class=\"weui-label\">页面标题</view>\n        </view>\n        <view class=\"weui-cell__bd\">\n          <input class=\"weui-input\" type=\"text\" placeholder=\"请输入页面标题并点击设置即可\" name=\"title\"></input>\n        </view>\n      </view>\n    </view>\n    <view class=\"btn-area\">\n      <button type=\"primary\" formType=\"submit\">设置</button>\n    </view>\n  </form>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/set-navigation-bar-title/set-navigation-bar-title.wxss",
    "content": "/* @import \"../../../common/lib/weui.wxss\"; */\n\n.weui-label{\n  width: 5em;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/toast/toast.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '消息提示框',\n      path: 'packageAPI/pages/page/toast/toast'\n    }\n  },\n\n  toast1Tap() {\n    wx.showToast({\n      title: '默认'\n    })\n  },\n\n  toast2Tap() {\n    wx.showToast({\n      title: 'duration 3000',\n      duration: 3000\n    })\n  },\n\n  toast3Tap() {\n    wx.showToast({\n      title: 'loading',\n      icon: 'loading',\n      duration: 5000\n    })\n  },\n\n  hideToast() {\n    wx.hideToast()\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/toast/toast.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"消息提示框\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/toast/toast.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'toast'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"btn-area\">\n      <view class=\"body-view\">\n        <button type=\"default\" bindtap=\"toast1Tap\">点击弹出默认toast</button>\n      </view>\n      <view class=\"body-view\">\n        <button type=\"default\" bindtap=\"toast2Tap\">点击弹出设置duration的toast</button>\n      </view>\n      <view class=\"body-view\">\n        <button type=\"default\" bindtap=\"toast3Tap\">点击弹出显示loading的toast</button>\n      </view>\n      <view class=\"body-view\">\n        <button type=\"default\" bindtap=\"hideToast\">点击隐藏toast</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/page/toast/toast.wxss",
    "content": "/* page/API/pages/toast/toast.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/performance/get-performance/get-performance.js",
    "content": "// miniprogram/page/API/pages/get-performance/get-performance.js\n\nconst util = require('./util')\n\nconst performance = wx.getPerformance ? wx.getPerformance() : {}\nconst performanceObserver = performance.createObserver ? performance.createObserver() : null\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '周期性缓存',\n      path: 'packageAPI/pages/performance/get-performance/get-performance'\n    }\n  },\n  data: {\n    theme: 'light',\n    array: [],\n    support: false,\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    console.log('canIUse:getPerformance:', wx.canIUse('getPerformance'))\n    let canIUse = false\n    if (wx.getPerformance) {\n      canIUse = true\n    }\n    this.setData({\n      support: canIUse,\n    })\n  },\n  getPerformanceInfo() {\n    const EntryList = performance.getEntries()\n    const array = []\n    EntryList.forEach((item) => {\n      array.push({\n        entryType: util.renderEntryType(item.entryType),\n        name: util.renderName(item.name),\n        duration: util.renderDuration(item.duration),\n        startTime: util.renderStartTime(item.startTime),\n      })\n    })\n    this.setData({\n      array,\n    })\n  },\n\n  startObserver() {\n    // 监听需要的性能指标\n    performanceObserver.observe({ entryTypes: ['render', 'script', 'navigation'] })\n  },\n\n  stopObserver() {\n    // 结束监听\n    performanceObserver.disconnect()\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/performance/get-performance/get-performance.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"性能数据\"\n\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/performance/get-performance/get-performance.wxml",
    "content": "\n<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'getPerformance'}}\"/>\n  <block wx:if=\"{{support}}\">\n    <button type=\"primary\" bind:tap=\"getPerformanceInfo\">\n      获取性能数据\n    </button>\n    <view class=\"page-section\">\n      <view wx:for=\"{{array}}\" class=\"performance-list\">\n        <view class=\"performance-item\">\n          <view>{{item.entryType}}：{{item.name}}</view>\n          <view wx:if=\"{{item.duration}}\">耗时：{{item.duration}}</view>\n          <view wx:if=\"{{item.startTime}}\">时间：{{item.startTime}}</view>\n        </view>\n      </view>\n    </view>\n  </block>\n  <view style=\"text-align: center\" wx:else>\n    微信版本过低，暂不支持本功能\n  </view>\n\n  <template is=\"foot\"/>\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/performance/get-performance/get-performance.wxss",
    "content": ".container {\n  display: block;\n}\n.performance-list {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  align-items: center;\n}\n.performance-item {\n  margin: 15px 0;\n  width: 80%;\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/performance/get-performance/util.js",
    "content": "const util = {}\n\n// const { formatDateTime } = require('../../../../util/util')\nDate.prototype.Format = function (fmt) {\n  const o = {\n    'M+': this.getMonth() + 1, // 月份\n    'd+': this.getDate(), // 日\n    'h+': this.getHours(), // 小时\n    'm+': this.getMinutes(), // 分\n    's+': this.getSeconds(), // 秒\n    'q+': Math.floor((this.getMonth() + 3) / 3), // 季度\n    S: this.getMilliseconds() // 毫秒\n  }\n\n  if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length))\n  for (const k in o) {\n    if (new RegExp('(' + k + ')').test(fmt)) {\n      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))\n    }\n  }\n\n  return fmt\n}\n\nutil.renderName = (name) => {\n  switch (name) {\n    case 'appLaunch':\n      return '小程序启动'\n      break\n    case 'firstRender':\n      return '页面首次渲染'\n      break\n    case 'route':\n      return '路由性能'\n      break\n    case 'evaluateScript':\n      return '注入脚本'\n      break\n  }\n}\n\nutil.renderEntryType = (entryType) => {\n  switch (entryType) {\n    case 'navigation':\n      return '路由'\n      break\n    case 'render':\n      return '渲染'\n      break\n    case 'script':\n      return '脚本'\n      break\n  }\n}\n\nutil.renderDuration = (duration) => (duration ? duration + 'ms' : '')\n\nutil.renderStartTime = (startTime) => {\n  if (!startTime) return ''\n\n  const date = new Date(startTime)\n  return date.Format('yyyy-MM-dd hh:mm:ss')\n}\n\nmodule.exports = util\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/storage/get-background-fetch-data/get-background-fetch-data.js",
    "content": "// 使用周期性数据的时候，需要先调用setBackgroundFetchToken, 可在 app.js 中查看具体例子\nPage({\n  onShareAppMessage() {\n    return {\n      title: '周期性缓存',\n      path: 'packageAPI/pages/storage/get-background-fetch-data/get-background-fetch-data'\n    }\n  },\n  onShow() {\n    // 获取缓存的周期性更新数据\n    this.getBackgroundFetchData()\n  },\n  data: {\n    theme: 'light',\n    openid: '',\n    appid: '',\n    canIUse: true,\n  },\n  getBackgroundFetchData() {\n    console.log('读取周期性更新数据')\n    const that = this\n    if (wx.getBackgroundFetchData) {\n      wx.getBackgroundFetchData({\n        // 当type = 'periodic' 微信客户端会每隔 12 小时向服务器请求一次数据。\n        fetchType: 'periodic',\n        success(res) {\n          console.log(res)\n          const { fetchedData } = res\n          const result = JSON.parse(fetchedData)\n          that.setData({\n            appid: result.appid,\n            openid: result.openid,\n          })\n          console.log('读取周期性更新数据成功')\n        },\n        fail() {\n          console.log('读取周期性更新数据失败')\n          wx.showToast({\n            title: '无缓存数据',\n            icon: 'none'\n          })\n        },\n        complete() {\n          console.log('结束读取')\n        }\n      })\n    } else {\n      this.setData({\n        canIUse: false\n      })\n      wx.showModal({\n        title: '微信版本过低，暂不支持本功能',\n      })\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/storage/get-background-fetch-data/get-background-fetch-data.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"周期性更新数据\"\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/storage/get-background-fetch-data/get-background-fetch-data.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'getBackgroundFetchData'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <block wx:if=\"{{canIUse}}\">\n        <view class=\"page-body-info\">\n          <view class=\"page-body-title\">周期性缓存数据</view>\n          <block wx:if=\"{{appid}}\">\n            <block>\n              <text class=\"page-body-text\">OpenID</text>\n              <text class=\"context-value\">{{openid}}</text>\n            </block>\n            <block>\n              <text class=\"page-body-text\">AppID</text>\n              <text class=\"context-value\">{{appid}}</text>\n            </block>\n          </block>\n          <block>\n            <text class=\"page-body-text\">微信客户端每隔 12 个小时才会发起一次请求</text>\n            <text class=\"page-body-text\">为了方便调试周期性数据，可以在 工具 -> 拉取周期性缓存数据 开启</text>\n          </block>\n        </view>\n      </block>\n    </view>\n  </view>\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/storage/get-background-fetch-data/get-background-fetch-data.wxss",
    "content": ".page-body-info {\n  padding-bottom: 0;\n  height: 300px;\n}\n.page-body-text {\n  padding: 0 15px;\n  text-align: center;\n}\n.page-body-title {\n  margin-bottom: 20px;\n}\n.context-value {\n  font-size: 19px;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/storage/get-background-prefetch-data/get-background-prefetch-data.js",
    "content": "const app = getApp()\n// 使用预缓存数据的时候，需要先调用setBackgroundFetchToken, 可在 app.js 中查看具体例子\n\nDate.prototype.Format = function (fmt) {\n  const o = {\n    'M+': this.getMonth() + 1, // 月份\n    'd+': this.getDate(), // 日\n    'h+': this.getHours(), // 小时\n    'm+': this.getMinutes(), // 分\n    's+': this.getSeconds(), // 秒\n    'q+': Math.floor((this.getMonth() + 3) / 3), // 季度\n    S: this.getMilliseconds() // 毫秒\n  }\n\n  if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear().toString()).substr(4 - RegExp.$1.length))\n  for (const k in o) {\n    if (new RegExp(`(${k})`).test(fmt)) {\n      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : ((`00${o[k]}`).substr((o[k].toString()).length)))\n    }\n  }\n\n  return fmt\n}\n\nPage({\n  onShow() {\n    // 获取缓存的预拉取数据\n    this.getBackgroundFetchData()\n  },\n  onShareAppMessage() {\n    return {\n      title: '预拉取',\n      path: 'packageAPI/pages/storage/get-background-prefetch-data/get-background-prefetch-data'\n    }\n  },\n  data: {\n    theme: 'light',\n    openid: '',\n    appid: '',\n    getDataTime: '',\n    canIUse: true,\n  },\n  getBackgroundFetchData() {\n    if (wx.getBackgroundFetchData) {\n      console.log('读取预拉取数据')\n      const res = app.globalData.backgroundFetchData\n      const { fetchedData } = res\n      const result = JSON.parse(fetchedData)\n      const systemInfo = wx.getSystemInfoSync()\n      const timeStamp = systemInfo.brand === 'iPhone' ? res.timeStamp * 1000 : res.timeStamp\n      const time = new Date(timeStamp).Format('yyyy-MM-dd hh:mm:ss')\n      this.setData({\n        appid: result.appid,\n        openid: result.openid,\n        getDataTime: time,\n\n      })\n    } else {\n      this.setData({\n        canIUse: false,\n      })\n      wx.showModal({\n        title: '微信版本过低，暂不支持本功能',\n      })\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/storage/get-background-prefetch-data/get-background-prefetch-data.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"数据预拉取\"\n\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/storage/get-background-prefetch-data/get-background-prefetch-data.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<view class=\"container page\" data-weui-theme=\"{{ theme }}\">\n\t<template is=\"head\" data=\"{{ title: 'getBackgroundFetchData' }}\" />\n\t<view class=\"page-body\">\n\t\t<view class=\"page-section\">\n\t\t\t<view wx:if=\"{{ canIUse }}\" class=\"page-body-info\">\n\t\t\t\t<view class=\"page-body-title\">数据预拉取</view>\n\t\t\t\t<block wx:if=\"{{ appid }}\">\n\t\t\t\t\t<block>\n\t\t\t\t\t\t<text class=\"page-body-text\">OpenID</text>\n\t\t\t\t\t\t<text class=\"context-value\">{{openid}}</text>\n\t\t\t\t\t</block>\n\t\t\t\t\t<block>\n\t\t\t\t\t\t<text class=\"page-body-text\">AppID</text>\n\t\t\t\t\t\t<text class=\"context-value\">{{appid}}</text>\n\t\t\t\t\t</block>\n\t\t\t\t\t<block>\n\t\t\t\t\t\t<text class=\"page-body-text\">数据缓存的时间</text>\n\t\t\t\t\t\t<text class=\"context-value\">{{getDataTime}}</text>\n\t\t\t\t\t</block>\n\t\t\t\t</block>\n\t\t\t\t<block>\n\t\t\t\t\t<text class=\"page-body-text\">用户启动小程序时，调用 wx.getBackgroundFetchData() 获取已缓存到本地的数据。\n          </text>\n\t\t\t\t</block>\n\t\t\t</view>\n\t\t</view>\n\t</view>\n\t<template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageAPI/pages/storage/get-background-prefetch-data/get-background-prefetch-data.wxss",
    "content": ".page-body-info {\n  padding-bottom: 0;\n  height: 340px;\n}\n.page-body-title {\n  margin-bottom: 20px;\n}\n.page-body-text {\n  padding: 0 15px;\n  text-align: center;\n}\n.context-value {\n  font-size: 19px;\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/storage/storage/storage.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '数据存储',\n      path: 'packageAPI/pages/storage/storage/storage'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    key: '',\n    data: '',\n    dialog: {\n      title: '',\n      content: '',\n      hidden: true\n    }\n  },\n\n  keyChange(e) {\n    this.data.key = e.detail.value\n  },\n\n  dataChange(e) {\n    this.data.data = e.detail.value\n  },\n\n  getStorage() {\n    const { key, data } = this.data\n    let storageData\n\n    if (key.length === 0) {\n      this.setData({\n        key,\n        data,\n      })\n      wx.showModal({\n        title: '读取数据失败',\n        content: 'key 不能为空'\n      })\n    } else {\n      storageData = wx.getStorageSync(key)\n      console.log(storageData)\n      if (storageData === '') {\n        this.setData({\n          key,\n          data: storageData\n        })\n        wx.showModal({\n          title: '读取数据失败',\n          content: '找不到 key 对应的数据'\n        })\n      } else {\n        this.setData({\n          key,\n          data: storageData\n        })\n        wx.showModal({\n          title: '读取数据成功',\n          content: storageData,\n        })\n      }\n    }\n  },\n\n  setStorage() {\n    const { key, data } = this.data\n    if (key.length === 0) {\n      this.setData({\n        key,\n        data,\n      })\n      wx.showModal({\n        title: '保存数据失败',\n        content: 'key 不能为空'\n      })\n    } else {\n      wx.setStorageSync(key, data)\n      this.setData({\n        key,\n        data,\n\n      })\n      wx.showModal({\n        title: '存储数据成功'\n      })\n    }\n  },\n\n  clearStorage() {\n    wx.clearStorageSync()\n    this.setData({\n      key: '',\n      data: '',\n    })\n    wx.showModal({\n      title: '清除数据成功'\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/storage/storage/storage.json",
    "content": "{\n    \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"数据存储\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/storage/storage/storage.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'get/set/clearStorage'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">key</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" type=\"text\" placeholder=\"请输入key\" name=\"key\" value=\"{{key}}\" bindinput=\"keyChange\"></input>\n          </view>\n        </view>\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">value</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" type=\"text\" placeholder=\"请输入value\" name=\"data\" value=\"{{data}}\" bindinput=\"dataChange\"></input>\n          </view>\n        </view>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"setStorage\">存储数据</button>\n        <button bindtap=\"getStorage\">读取数据</button>\n        <button bindtap=\"clearStorage\">清理数据</button>\n      </view>\n    </view>\n  </view>\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/storage/storage/storage.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageAPI/pages/worker/worker/worker/worker.js",
    "content": "// packageAPI/pages/worker/worker/worker/worker.js\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    theme: 'light',\n\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad(options) {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/worker/worker/worker/worker.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageAPI/pages/worker/worker/worker/worker.wxml",
    "content": "<!--packageAPI/pages/worker/worker/worker/worker.wxml-->\n<text>packageAPI/pages/worker/worker/worker/worker.wxml</text>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/worker/worker/worker/worker.wxss",
    "content": "/* packageAPI/pages/worker/worker/worker/worker.wxss */"
  },
  {
    "path": "miniprogram/packageAPI/pages/worker/worker/worker.js",
    "content": "const { fib } = require('../../../../util/util.js')\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '多线程Worker',\n      path: 'packageAPI/pages/worker/worker/worker'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    res: '',\n    input: 35,\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n    clearInterval(this.interval)\n    if (this._worker) this._worker.terminate()\n  },\n\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    this._worker = wx.createWorker('workers/fib/index.js')\n  },\n\n  bindInput(e) {\n    const val = Number(e.detail.value)\n    if (val > 40) return { value: 40 }\n    if (Number.isNaN(val)) return { value: 33 }\n    this.setData({\n      input: val\n    })\n    return undefined\n  },\n\n  reset() {\n    this.setData({ res: '' })\n  },\n\n  compute() {\n    this.reset()\n    wx.showLoading({\n      title: '计算中...'\n    })\n    const t0 = +Date.now()\n    const res = fib(this.data.input)\n    const t1 = +Date.now()\n    wx.hideLoading()\n    this.setData({\n      res,\n      time: t1 - t0\n    })\n  },\n\n  multiThreadCompute() {\n    this.reset()\n    wx.showLoading({\n      title: '计算中...'\n    })\n\n    const t0 = +Date.now()\n    this._worker.postMessage({\n      type: 'execFunc_fib',\n      params: [this.data.input]\n    })\n    this._worker.onMessage((res) => {\n      if (res.type === 'execFunc_fib') {\n        wx.hideLoading()\n        const t1 = +Date.now()\n        this.setData({\n          res: res.result,\n          time: t1 - t0\n        })\n      }\n    })\n  },\n\n  onReady() {\n    this.position = {\n      x: 150,\n      y: 150,\n      vx: 2,\n      vy: 2\n    }\n\n    this.drawBall()\n    this.interval = setInterval(this.drawBall, 17)\n  },\n\n  drawBall() {\n    const p = this.position\n    p.x += p.vx\n    p.y += p.vy\n    if (p.x >= 300) {\n      p.vx = -2\n    }\n    if (p.x <= 7) {\n      p.vx = 2\n    }\n    if (p.y >= 300) {\n      p.vy = -2\n    }\n    if (p.y <= 7) {\n      p.vy = 2\n    }\n\n    const context = wx.createContext()\n\n    function ball(x, y) {\n      context.beginPath(0)\n      context.arc(x, y, 5, 0, Math.PI * 2)\n      context.setFillStyle('#1aad19')\n      context.setStrokeStyle('rgba(1,1,1,0)')\n      context.fill()\n      context.stroke()\n    }\n\n    ball(p.x, 150)\n    ball(150, p.y)\n    ball(300 - p.x, 150)\n    ball(150, 300 - p.y)\n    ball(p.x, p.y)\n    ball(300 - p.x, 300 - p.y)\n    ball(p.x, 300 - p.y)\n    ball(300 - p.x, p.y)\n\n    wx.drawCanvas({\n      canvasId: 'canvas',\n      actions: context.getActions()\n    })\n  },\n\n})\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/worker/worker/worker.json",
    "content": "{\n   \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"多线程Worker\"\n}\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/worker/worker/worker.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'Worker'}}\"/>\n  \n  <view class=\"page-body\">\n    <view class=\"page-body-wrapper\">\n      <canvas canvas-id=\"canvas\" class=\"canvas\"></canvas>\n    </view>\n  </view>\n\n  <view class=\"page-section\">\n    <view class=\"weui-cells__title\">计算斐波那契数</view>\n    <view class=\"weui-cells weui-cells_after-title\">\n      <view class=\"weui-cell weui-cell_input\">\n        <input class=\"weui-input\" type=\"number\" value=\"{{input}}\" bindinput=\"bindInput\" />\n      </view>\n    </view>\n    <view class=\"weui-cells__title\">结果</view>\n    <view class=\"weui-cells weui-cells_after-title\">\n      <view class=\"weui-cell weui-cell_input\">\n        <view class=\"weui-input\">{{res}}</view>\n        <view class=\"weui-input\">耗时：{{time}}</view>\n      </view>\n    </view>\n     <view class=\"page-section-title\">提示：使用单线程进行计算时，动画会出现明显的卡顿现象。使用 Worker 线程进行计算，则可以保证动画的流畅。</view>\n    <view class=\"btn-area\">\n      <button bindtap=\"compute\">单线程计算</button>\n      <button type=\"primary\" bindtap=\"multiThreadCompute\">利用 Worker 线程计算</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageAPI/pages/worker/worker/worker.wxss",
    "content": "\n\n.canvas {\n  width: 305px;\n  height: 305px;\n  background-color: #fff;\n}\n\n.page-section-title {\n  margin-top: 15px;\n}"
  },
  {
    "path": "miniprogram/packageChatTool/components/apiCategory/index.js",
    "content": "// components/apiCategory/index.js\nComponent({\n\n  properties: {\n\n  },\n\n  /**\n   * Component initial data\n   */\n  data: {\n    apiCategory: '',\n  },\n\n  methods: {\n\n  },\n\n  pageLifetimes: {\n    show() {\n      const apiCategory = wx.getApiCategory()\n      this.setData({ apiCategory })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/apiCategory/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageChatTool/components/apiCategory/index.wxml",
    "content": "<!--components/apiCategory/index.wxml-->\n<view class=\"ribbon\">\n  <view>{{apiCategory === 'chatTool' ? '聊天工具模式' : '普通模式'}}</view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/apiCategory/index.wxss",
    "content": "/* components/apiCategory/index.wxss */\n\n.ribbon {\n  position: fixed;\n  top: 0;\n  right: 0;\n  z-index: 10000;\n  overflow: hidden;\n  width: 100px;\n  height: 100px;\n  transform-origin: center;\n  overflow: visible;\n}\n\n.ribbon view {\n  display: block;\n  width: 200px;\n  padding: 7px 0;\n  background-color: rgb(90, 171, 110);\n  color: #fff;\n  font-size: 14px;\n  font-weight: bold;\n  text-align: center;\n  transform: translate(-50%, -50%) rotate(45deg);\n  position: relative;\n  top: 50%;\n  left: 50%;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/.wechatide.ib.json",
    "content": "{\n  \"key\": \"TDesign\",\n  \"label\": \"Tdesign\",\n  \"components\": {\n    \"t-action-sheet\": {\n      \"key\": \"t-action-sheet\",\n      \"label\": \"动作面板\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-actionsheet.png\",\n      \"properties\": [\n        {\n          \"key\": \"cancelText\",\n          \"type\": [\"String\"],\n          \"desc\": \"设置取消按钮的文本\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"count\",\n          \"type\": [\"Number\"],\n          \"desc\": \"设置每页展示菜单的数量，仅当 type=grid 时有效\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"items\",\n          \"type\": [\"Array\"],\n          \"desc\": \"菜单项\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"showCancel\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示取消按钮\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"theme\",\n          \"type\": [\"String\"],\n          \"desc\": \"展示类型，列表和表格形式展示\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"visible\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"显示与隐藏\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:cancel\",\n          \"desc\": \"点击取消按钮时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:close\",\n          \"desc\": \"关闭时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:selected\",\n          \"desc\": \"选择菜单项时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-action-sheet id=\\\"t-action-sheet-imperative\\\" visible=\\\"{{false}}\\\"></t-action-sheet>\",\n      \"path\": \"./action-sheet/action-sheet\"\n    },\n    \"t-avatar-group\": {\n      \"key\": \"t-avatar-group\",\n      \"label\": \"头像组\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-avatar.png\",\n      \"properties\": [\n        {\n          \"key\": \"cascading\",\n          \"type\": [\"String\"],\n          \"desc\": \"图片之间的层叠关系，可选值：左侧图片在上和右侧图片在上\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"collapseAvatar\",\n          \"type\": [\"String\"],\n          \"desc\": \"头像数量超出时，会出现一个头像折叠元素。该元素内容可自定义。默认为 `+N`。示例：`+5`，`...`, `更多`\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"max\",\n          \"type\": [\"Number\"],\n          \"desc\": \"能够同时显示的最多头像数量\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"size\",\n          \"type\": [\"String\"],\n          \"desc\": \"尺寸，示例值：small/medium/large/24px/38px 等。优先级低于 Avatar.size\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-image\", \"t-class-content\"],\n      \"tpl\": \"<t-avatar-group max=\\\"2\\\" collapseAvatar=\\\"+5\\\"><t-avatar wx:for=\\\"{{['https://cdn-we-retail.ym.tencent.com/retail-ui/components-exp/avatar/avatar-v2/1.png','https://cdn-we-retail.ym.tencent.com/retail-ui/components-exp/avatar/avatar-v2/2.png','https://cdn-we-retail.ym.tencent.com/retail-ui/components-exp/avatar/avatar-v2/3.png']}}\\\" wx:key=\\\"index\\\" image=\\\"{{item}}\\\" style=\\\"margin-right: -16rpx\\\" /></t-avatar-group>\",\n      \"require\": {\n        \"t-avatar\": \"./avatar/avatar\"\n      },\n      \"path\": \"./avatar/avatar-group\"\n    },\n    \"t-avatar\": {\n      \"key\": \"t-avatar\",\n      \"label\": \"头像\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-avatar.png\",\n      \"properties\": [\n        {\n          \"key\": \"alt\",\n          \"type\": [\"String\"],\n          \"desc\": \"头像替换文本，仅当图片加载失败时有效\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"badgeProps\",\n          \"type\": [\"Object\"],\n          \"desc\": \"头像右上角提示信息，继承 Badge 组件的全部特性。如：小红点，或者数字\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"hideOnLoadFailed\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"加载失败时隐藏图片\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"String\"],\n          \"desc\": \"图标\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"image\",\n          \"type\": [\"String\"],\n          \"desc\": \"图片地址\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"shape\",\n          \"type\": [\"String\"],\n          \"desc\": \"形状\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"size\",\n          \"type\": [\"String\"],\n          \"desc\": \"尺寸，示例值：small/medium/large/24px/38px 等，默认为 large\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\"],\n      \"events\": [\n        {\n          \"key\": \"bind:error\",\n          \"desc\": \"图片加载失败时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-avatar icon=\\\"user\\\" alt=\\\"avatar\\\"/>\",\n      \"path\": \"./avatar/avatar\"\n    },\n    \"t-back-top\": {\n      \"key\": \"t-back-top\",\n      \"label\": \"回到顶部\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-backtop.png\",\n      \"properties\": [\n        {\n          \"key\": \"fixed\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否绝对定位固定到屏幕右下方\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"String\"],\n          \"desc\": \"图标\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"text\",\n          \"type\": [\"String\"],\n          \"desc\": \"文案\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"theme\",\n          \"type\": [\"String\"],\n          \"desc\": \"预设的样式类型\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-icon\", \"t-class-text\"],\n      \"events\": [\n        {\n          \"key\": \"bind:to-top\",\n          \"desc\": \"点击触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-back-top />\",\n      \"path\": \"./back-top/back-top\"\n    },\n    \"t-badge\": {\n      \"key\": \"t-badge\",\n      \"label\": \"徽标数\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-badge.png\",\n      \"properties\": [\n        {\n          \"key\": \"color\",\n          \"type\": [\"String\"],\n          \"desc\": \"颜色\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"content\",\n          \"type\": [\"String\"],\n          \"desc\": \"徽标内容，示例：`content='自定义内容'`。也可以使用默认插槽定义\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"count\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"徽标右上角内容。可以是数字，也可以是文字。如：'new'/3/99+。特殊：值为空表示使用插槽渲染\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"dot\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否为红点\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"maxCount\",\n          \"type\": [\"Number\"],\n          \"desc\": \"封顶的数字值\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"offset\",\n          \"type\": [\"Array\"],\n          \"desc\": \"设置状态点的位置偏移，示例：[-10, 20] 或 ['10em', '8rem']\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"shape\",\n          \"type\": [\"String\"],\n          \"desc\": \"形状\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"showZero\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"当数值为 0 时，是否展示徽标\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"size\",\n          \"type\": [\"String\"],\n          \"desc\": \"尺寸\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-content\", \"t-class-count\"],\n      \"tpl\": \"<t-badge content=\\\"消息\\\" dot />\",\n      \"path\": \"./badge/badge\"\n    },\n    \"t-button\": {\n      \"key\": \"t-button\",\n      \"label\": \"按钮\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-button.png\",\n      \"properties\": [\n        {\n          \"key\": \"block\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否为块级元素\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"content\",\n          \"type\": [\"String\"],\n          \"desc\": \"按钮内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"customDataset\",\n          \"type\": [\"Object\"],\n          \"desc\": \"自定义 dataset，可通过 event.currentTarget.dataset.custom 获取\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用按钮\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"ghost\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否为幽灵按钮（镂空按钮）\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"String\"],\n          \"desc\": \"图标名称\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"loading\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示为加载状态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"shape\",\n          \"type\": [\"String\"],\n          \"desc\": \"按钮形状，有 4 种：长方形、正方形、圆角长方形、圆形\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"size\",\n          \"type\": [\"String\"],\n          \"desc\": \"组件尺寸\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"theme\",\n          \"type\": [\"String\"],\n          \"desc\": \"组件风格，依次为品牌色、危险色\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"type\",\n          \"type\": [\"String\"],\n          \"desc\": \"同小程序的 formType\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"variant\",\n          \"type\": [\"String\"],\n          \"desc\": \"按钮形式，基础、线框、文字\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-icon\"],\n      \"events\": [\n        {\n          \"key\": \"bind:click\",\n          \"desc\": \"点击时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-button theme=\\\"primary\\\" block content=\\\"强按钮\\\"></t-button>\",\n      \"path\": \"./button/button\"\n    },\n    \"t-cell-group\": {\n      \"key\": \"t-cell-group\",\n      \"label\": \"单元格组\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-cell.png\",\n      \"properties\": [\n        {\n          \"key\": \"bordered\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示组边框\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"title\",\n          \"type\": [\"String\"],\n          \"desc\": \"单元格组标题\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\"],\n      \"tpl\": \"<t-cell-group title=\\\"01 基础用法\\\"><t-cell title=\\\"单行标题\\\" required /><t-cell title=\\\"单行标题\\\" hover note=\\\"辅助信息\\\" /><t-cell title=\\\"单行标题\\\" hover arrow /><t-cell title=\\\"单行标题\\\" hover note=\\\"辅助信息\\\" arrow /></t-cell-group>\",\n      \"require\": {\n        \"t-cell\": \"./cell/cell\"\n      },\n      \"path\": \"./cell-group/cell-group\"\n    },\n    \"t-cell\": {\n      \"key\": \"t-cell\",\n      \"label\": \"单元格\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-cell.png\",\n      \"properties\": [\n        {\n          \"key\": \"align\",\n          \"type\": [\"String\"],\n          \"desc\": \"内容的对齐方式，默认居中对齐\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"arrow\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示右侧箭头\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bordered\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示下边框\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"description\",\n          \"type\": [\"String\"],\n          \"desc\": \"下方内容描述\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"hover\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否开启点击反馈\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"image\",\n          \"type\": [\"String\"],\n          \"desc\": \"主图\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"jumpType\",\n          \"type\": [\"String\"],\n          \"desc\": \"链接跳转类型\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"leftIcon\",\n          \"type\": [\"String\"],\n          \"desc\": \"左侧图标，出现在单元格标题的左侧\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"note\",\n          \"type\": [\"String\"],\n          \"desc\": \"和标题同行的说明文字\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"required\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示表单必填星号\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"rightIcon\",\n          \"type\": [\"String\"],\n          \"desc\": \"最右侧图标\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"title\",\n          \"type\": [\"String\"],\n          \"desc\": \"标题\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"url\",\n          \"type\": [\"String\"],\n          \"desc\": \"点击后跳转链接地址。如果值为空，则表示不需要跳转\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\n        \"t-class\",\n        \"t-class-title\",\n        \"t-class-note\",\n        \"t-class-description\",\n        \"t-class-thumb\",\n        \"t-class-hover\",\n        \"t-class-left\",\n        \"t-class-right\"\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:click\",\n          \"desc\": \"右侧内容\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-cell title=\\\"单行标题\\\" hover />\",\n      \"path\": \"./cell/cell\"\n    },\n    \"t-check-tag\": {\n      \"key\": \"t-check-tag\",\n      \"label\": \"可选标签\",\n      \"icon\": \"\",\n      \"properties\": [\n        {\n          \"key\": \"checked\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"标签选中的状态，默认风格（theme=default）才有选中态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"closable\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"标签是否可关闭\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"content\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"组件子元素\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"标签禁用态，失效标签不能触发事件。默认风格（theme=default）才有禁用态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"String\"],\n          \"desc\": \"标签中的图标，可自定义图标呈现\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"shape\",\n          \"type\": [\"String\"],\n          \"desc\": \"标签类型，有三种：方形、圆角方形、标记型\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"size\",\n          \"type\": [\"String\"],\n          \"desc\": \"标签尺寸\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"组件子元素\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:click\",\n          \"desc\": \"点击标签时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-check-tag>check tag</t-check-tag>\",\n      \"path\": \"./check-tag/check-tag\"\n    },\n    \"t-checkbox-group\": {\n      \"key\": \"t-checkbox-group\",\n      \"label\": \"多选框组\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-checkbox.png\",\n      \"properties\": [\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用组件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"max\",\n          \"type\": [\"Number\"],\n          \"desc\": \"支持最多选中的数量\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"name\",\n          \"type\": [\"String\"],\n          \"desc\": \"统一设置内部复选框 HTML 属性\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"options\",\n          \"type\": [\"Array\"],\n          \"desc\": \"以配置形式设置子元素。示例1：`['北京', '上海']` ，示例2: `[{ label: '全选', checkAll: true }, { label: '上海', value: 'shanghai' }]`。checkAll 值为 true 表示当前选项为「全选选项」\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"Array\"],\n          \"desc\": \"选中值\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"值变化时触发。`context.current` 表示当前变化的数据项，如果是全选则为空；`context.type` 表示引起选中数据变化的是选中或是取消选中，`context.option` 表示当前变化的数据项\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-checkbox-group value=\\\"{{['checkbox1']}}\\\"><t-checkbox value=\\\"checkbox1\\\" label=\\\"多选\\\" /><t-checkbox value=\\\"checkbox2\\\" label=\\\"多选\\\" /><t-checkbox value=\\\"checkbox3\\\" label=\\\"多选\\\" /></t-checkbox-group>\",\n      \"require\": {\n        \"t-checkbox\": \"./checkbox/checkbox\"\n      },\n      \"path\": \"./checkbox-group/checkbox-group\"\n    },\n    \"t-checkbox\": {\n      \"key\": \"t-checkbox\",\n      \"label\": \"多选框\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-checkbox.png\",\n      \"properties\": [\n        {\n          \"key\": \"align\",\n          \"type\": [\"String\"],\n          \"desc\": \"多选框和内容相对位置\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"checkAll\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"用于标识是否为「全选选项」。单独使用无效，需在 CheckboxGroup 中使用\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"checked\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否选中\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"color\",\n          \"type\": [\"String\"],\n          \"desc\": \"多选框颜色\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"content\",\n          \"type\": [\"String\"],\n          \"desc\": \"多选框内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"contentDisabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用组件内容（content）触发选中\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用组件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"Array\"],\n          \"desc\": \"自定义选中图标和非选中图标。示例：[选中态图标地址，非选中态图标地址]\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"indeterminate\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否为半选\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"label\",\n          \"type\": [\"String\"],\n          \"desc\": \"主文案\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"maxContentRow\",\n          \"type\": [\"Number\"],\n          \"desc\": \"内容最大行数限制\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"maxLabelRow\",\n          \"type\": [\"Number\"],\n          \"desc\": \"主文案最大行数限制\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"name\",\n          \"type\": [\"String\"],\n          \"desc\": \"HTML 元素原生属性\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"readonly\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"只读状态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"多选框的值\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-icon\", \"t-class-label\", \"t-class-content\", \"t-class-border\"],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"值变化时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-checkbox label=\\\"多选框\\\" checked=\\\"{{true}}\\\"></t-checkbox>\",\n      \"path\": \"./checkbox/checkbox\"\n    },\n    \"t-collapse-panel\": {\n      \"key\": \"t-collapse-panel\",\n      \"label\": \"折叠面板\",\n      \"icon\": \"\",\n      \"properties\": [\n        {\n          \"key\": \"content\",\n          \"type\": [\"String\"],\n          \"desc\": \"折叠面板内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"禁止当前面板展开，优先级大于 Collapse 的同名属性\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"expandIcon\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"当前折叠面板展开图标，优先级大于 Collapse 的同名属性\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"header\",\n          \"type\": [\"String\"],\n          \"desc\": \"面板头内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"headerRightContent\",\n          \"type\": [\"String\"],\n          \"desc\": \"面板头的右侧区域，一般用于呈现面板操作\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"当前面板唯一标识，如果值为空则取当前面下标兜底作为唯一标识\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-collapse-panel header=\\\"折叠面板标题\\\" value=\\\"{{0}}\\\">此处可自定义内容</t-collapse-panel>\",\n      \"path\": \"./collapse/collapse-panel\"\n    },\n    \"t-collapse\": {\n      \"key\": \"t-collapse\",\n      \"label\": \"折叠\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-collapse.png\",\n      \"properties\": [\n        {\n          \"key\": \"defaultExpandAll\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"默认是否展开全部\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用面板展开/收起操作\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"expandIcon\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"展开图标。值为 undefined 或 false 则不显示展开图标；值为 true 显示默认图标；值类型为函数，则表示完全自定义展开图标\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"expandMutex\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"每个面板互斥展开，每次只展开一个面板\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"Array\"],\n          \"desc\": \"展开的面板集合\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"切换面板时触发，返回变化的值\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-collapse value=\\\"{{[0]}}\\\"><t-collapse-panel header=\\\"折叠面板标题\\\" value=\\\"{{0}}\\\">此处可自定义内容</t-collapse-panel></t-collapse>\",\n      \"require\": {\n        \"t-collapse-panel\": \"./collapse/collapse-panel\"\n      },\n      \"path\": \"./collapse/collapse\"\n    },\n    \"t-date-time-picker\": {\n      \"key\": \"t-date-time-picker\",\n      \"label\": \"日期时间选择器\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-datetimepicker.png\",\n      \"properties\": [\n        {\n          \"key\": \"cancelBtn\",\n          \"type\": [\"String\"],\n          \"desc\": \"取消按钮文字\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"confirmBtn\",\n          \"type\": [\"String\"],\n          \"desc\": \"确定按钮文字\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"end\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"选择器的结束时间\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"footer\",\n          \"type\": [\"String\"],\n          \"desc\": \"底部内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"format\",\n          \"type\": [\"String\"],\n          \"desc\": \"用于格式化日期，[详细文档](https://day.js.org/docs/en/display/format)\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"header\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"头部内容。值为 true 显示空白头部，值为 false 不显示任何内容，值类型为 TNode 表示自定义头部内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"mode\",\n          \"type\": [\"String\", \"Array\"],\n          \"desc\": \"选择器模式，用于表示可以选择到哪一个层级。【示例一】year 或者 ['year'] 表示纯日期选择器，只能选择到年份，只显示年份。【示例二】'hour' 或 ['hour'] 表示纯时间选择器，只能选择到小时维度。【示例三】['year', 'month', 'date', 'hour', 'minute'] 表示，日期和时间 混合选择器，可以选择到具体哪一分钟，显示全部时间：年/月/日/时/分\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"showWeek\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"【开发中】是否在日期旁边显示周几（如周一，周二，周日等）\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"start\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"选择器的开始时间\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"title\",\n          \"type\": [\"String\"],\n          \"desc\": \"标题\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"选中值\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"visible\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-confirm\", \"t-class-cancel\", \"t-class-title\"],\n      \"events\": [\n        {\n          \"key\": \"bind:cancel\",\n          \"desc\": \"取消按钮点击时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"选中值发生变化时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:column-change\",\n          \"desc\": \"每一列选中数据变化时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:confirm\",\n          \"desc\": \"确认按钮点击时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-date-time-picker title=\\\"选择日期\\\" visible=\\\"{{true}}\\\" mode=\\\"{{['date']}}\\\" format=\\\"YYYY-MM-DD\\\"></t-date-time-picker>\",\n      \"path\": \"./date-time-picker/date-time-picker\"\n    },\n    \"t-dialog\": {\n      \"key\": \"t-dialog\",\n      \"label\": \"对话框\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-dialog.png\",\n      \"properties\": [\n        {\n          \"key\": \"actions\",\n          \"type\": [\"Array\"],\n          \"desc\": \"操作栏\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"buttonLayout\",\n          \"type\": [\"String\"],\n          \"desc\": \"多按钮排列方式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"cancelBtn\",\n          \"type\": [\"String\", \"Object\"],\n          \"desc\": \"取消按钮，可自定义。值为 null 则不显示取消按钮。值类型为字符串，则表示自定义按钮文本，值类型为 Object 则表示透传 Button 组件属性。使用 TNode 自定义按钮时，需自行控制取消事件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"closeOnOverlayClick\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"点击蒙层时是否触发关闭事件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"confirmBtn\",\n          \"type\": [\"String\", \"Object\"],\n          \"desc\": \"确认按钮。值为 null 则不显示确认按钮。值类型为字符串，则表示自定义按钮文本，值类型为 Object 则表示透传 Button 组件属性。使用 TNode 自定义按钮时，需自行控制确认事件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"content\",\n          \"type\": [\"String\"],\n          \"desc\": \"内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"preventScrollThrough\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"防止滚动穿透\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"showInAttachedElement\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"【开发中】仅在挂载元素中显示抽屉，默认在浏览器可视区域显示。父元素需要有定位属性，如：position: relative\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"showOverlay\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示遮罩层\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"title\",\n          \"type\": [\"String\"],\n          \"desc\": \"标题\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"visible\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"控制对话框是否显示\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"zIndex\",\n          \"type\": [\"Number\"],\n          \"desc\": \"对话框层级，Web 侧样式默认为 2500，移动端和小程序样式默认为 1500\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-content\", \"t-class-confirm\", \"t-class-cancel\"],\n      \"events\": [\n        {\n          \"key\": \"bind:cancel\",\n          \"desc\": \"如果“取消”按钮存在，则点击“取消”按钮时触发，同时触发关闭事件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:close\",\n          \"desc\": \"关闭事件，点击 取消按钮 或 点击蒙层 时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:overlay-click\",\n          \"desc\": \"如果蒙层存在，点击蒙层时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-dialog visible=\\\"{{true}}\\\" title=\\\"对话框标题\\\" content=\\\"告知当前状态、信息和解决方法，等内容。描述文案尽可能控制在三行内\\\" confirm-btn=\\\"我知道了\\\" />\",\n      \"path\": \"./dialog/dialog\"\n    },\n    \"t-divider\": {\n      \"key\": \"t-divider\",\n      \"label\": \"分割线\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-divider.png\",\n      \"properties\": [\n        {\n          \"key\": \"align\",\n          \"type\": [\"String\"],\n          \"desc\": \"文本位置（仅在水平分割线有效）\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"content\",\n          \"type\": [\"String\"],\n          \"desc\": \"子元素\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"dashed\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否虚线（仅在水平分割线有效）\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"layout\",\n          \"type\": [\"String\"],\n          \"desc\": \"分隔线类型有两种：水平和垂直\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"lineColor\",\n          \"type\": [\"String\"],\n          \"desc\": \"分隔线颜色\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-line\", \"t-class-content\"],\n      \"tpl\": \"<t-divider />\",\n      \"path\": \"./divider/divider\"\n    },\n    \"t-drawer\": {\n      \"key\": \"t-drawer\",\n      \"label\": \"模态抽屉\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-drawer.png\",\n      \"properties\": [\n        {\n          \"key\": \"closeOnOverlayClick\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"点击蒙层时是否触发抽屉关闭事件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"destroyOnClose\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"抽屉关闭时是否销毁节点\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"items\",\n          \"type\": [\"Array\"],\n          \"desc\": \"抽屉里的列表项\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"placement\",\n          \"type\": [\"String\"],\n          \"desc\": \"抽屉方向\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"showOverlay\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示遮罩层\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"visible\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"组件是否可见\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"zIndex\",\n          \"type\": [\"Number\"],\n          \"desc\": \"抽屉层级，样式默认为 1500\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:close\",\n          \"desc\": \"关闭事件，取消按钮点击时、关闭按钮点击时、点击蒙层时均会触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:item-click\",\n          \"desc\": \"点击抽屉里的列表项\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:overlay-click\",\n          \"desc\": \"如果蒙层存在，点击蒙层时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-drawer visible=\\\"{{true}}\\\" placement=\\\"left\\\" items=\\\"{{[{title: '菜单一'},{title: '菜单二'}]}}\\\"></t-drawer>\",\n      \"path\": \"./drawer/drawer\"\n    },\n    \"t-dropdown-item\": {\n      \"key\": \"t-dropdown-item\",\n      \"label\": \"下拉菜单子项\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-dropdownmenu.png\",\n      \"properties\": [\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"label\",\n          \"type\": [\"String\"],\n          \"desc\": \"标题\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"multiple\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否多选\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"options\",\n          \"type\": [\"Array\"],\n          \"desc\": \"选项数据\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-dropdown-item label=\\\"菜单\\\" options=\\\"{{[{label:'选项一',value:'option_1',disabled:false},{label:'选项二',value:'option_2',disabled:false},{label:'选项三',value:'option_3',disabled:false}]}}\\\" defaultValue=\\\"option_3\\\" /><t-dropdown-item label=\\\"菜单\\\" options=\\\"{{[{label:'选项一',value:'option_1',disabled:false},{label:'选项二',value:'option_2',disabled:false},{label:'选项三',value:'option_3',disabled:false}]}}\\\" defaultValue=\\\"option_3\\\" />\",\n      \"path\": \"./dropdown-menu/dropdown-item\"\n    },\n    \"t-dropdown-menu\": {\n      \"key\": \"t-dropdown-menu\",\n      \"label\": \"下拉菜单\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-dropdownmenu.png\",\n      \"properties\": [\n        {\n          \"key\": \"activeColor\",\n          \"type\": [\"String\"],\n          \"desc\": \"【讨论中】菜单标题和选项的选中态颜色\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"closeOnClickOverlay\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否在点击遮罩层后关闭菜单\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"duration\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"动画时长\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"showOverlay\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示遮罩层\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"zIndex\",\n          \"type\": [\"Number\"],\n          \"desc\": \"菜单栏 z-index 层级\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-dropdown-menu><t-dropdown-item label=\\\"菜单\\\" options=\\\"{{[{label:'选项一',value:'option_1',disabled:false},{label:'选项二',value:'option_2',disabled:false},{label:'选项三',value:'option_3',disabled:false}]}}\\\" defaultValue=\\\"option_3\\\" /><t-dropdown-item label=\\\"菜单\\\" options=\\\"{{[{label:'选项一',value:'option_1',disabled:false},{label:'选项二',value:'option_2',disabled:false},{label:'选项三',value:'option_3',disabled:false}]}}\\\" defaultValue=\\\"option_3\\\" /></t-dropdown-menu>\",\n      \"require\": {\n        \"t-dropdown-item\": \"./dropdown-menu/dropdown-item\"\n      },\n      \"path\": \"./dropdown-menu/dropdown-menu\"\n    },\n    \"t-empty\": {\n      \"key\": \"t-empty\",\n      \"label\": \"空状态\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-empty.png\",\n      \"properties\": [\n        {\n          \"key\": \"action\",\n          \"type\": [\"String\"],\n          \"desc\": \"操作按钮\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"description\",\n          \"type\": [\"String\"],\n          \"desc\": \"描述文字\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"String\"],\n          \"desc\": \"图标名称\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"image\",\n          \"type\": [\"String\"],\n          \"desc\": \"图片地址\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-description\", \"t-class-image\", \"t-class-actions\"],\n      \"tpl\": \"<t-empty icon=\\\"info-circle-filled\\\" />\",\n      \"path\": \"./empty/empty\"\n    },\n    \"t-fab\": {\n      \"key\": \"t-fab\",\n      \"label\": \"悬浮按钮\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-fab.png\",\n      \"properties\": [\n        {\n          \"key\": \"buttonProps\",\n          \"type\": [\"Object\"],\n          \"desc\": \"透传至 Button 组件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"String\"],\n          \"desc\": \"图标\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"style\",\n          \"type\": [\"String\"],\n          \"desc\": \"悬浮按钮的样式，常用于调整位置\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"text\",\n          \"type\": [\"String\"],\n          \"desc\": \"文本内容\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:click\",\n          \"desc\": \"悬浮按钮点击事件\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-fab icon=\\\"add\\\" />\",\n      \"path\": \"./fab/fab\"\n    },\n    \"t-footer\": {\n      \"key\": \"t-footer\",\n      \"label\": \"布局-底部内容\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-footer.png\",\n      \"properties\": [\n        {\n          \"key\": \"copyright\",\n          \"type\": [\"String\"],\n          \"desc\": \"版权信息，type 为`text`生效\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"logo\",\n          \"type\": [\"Object\"],\n          \"desc\": \"图标配置，type 为`logo`生效。`logo.icon` 表示图标链接地址，`logo.title` 表示标题文本，`logo.url` 表示链接跳转地址\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"textLinkList\",\n          \"type\": [\"Array\"],\n          \"desc\": \"链接列表，type 为`text`生效。name 表示链接名称， url 表示链接 page 路径，目前只支持小程序内部跳转，openType 表示跳转方式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"theme\",\n          \"type\": [\"String\"],\n          \"desc\": \"页脚展示类型\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-footer theme=\\\"text\\\" copyright=\\\"Copyright © 2021-2031 TD.All Rights Reserved.\\\" />\",\n      \"path\": \"./footer/footer\"\n    },\n    \"t-grid-item\": {\n      \"key\": \"t-grid-item\",\n      \"label\": \"宫格子项\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-grid.png\",\n      \"properties\": [\n        {\n          \"key\": \"badgeProps\",\n          \"type\": [\"Object\"],\n          \"desc\": \"头像右上角提示信息，继承 Badge 组件的全部特性。如：小红点，或者数字\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"description\",\n          \"type\": [\"String\"],\n          \"desc\": \"文本以外的更多描述，辅助信息。可以通过 Props 传入文本，也可以自定义标题节点\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"image\",\n          \"type\": [\"String\"],\n          \"desc\": \"图片，可以是图片地址，也可以自定义图片节点\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"jumpType\",\n          \"type\": [\"String\"],\n          \"desc\": \"链接跳转类型\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"layout\",\n          \"type\": [\"String\"],\n          \"desc\": \"内容布局方式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"text\",\n          \"type\": [\"String\"],\n          \"desc\": \"文本，可以通过 Props 传入文本，也可以自定义标题节点\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"url\",\n          \"type\": [\"String\"],\n          \"desc\": \"点击后的跳转链接\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-image\", \"t-class-text\", \"t-class-description\"],\n      \"tpl\": \"<t-grid-item text=\\\"标题文字\\\"><image style=\\\"width: 96rpx; height: 96rpx\\\" src=\\\"https://tdesign.gtimg.com/mobile/%E5%9B%BE%E7%89%87.png\\\" slot=\\\"image\\\" /></t-grid-item>\",\n      \"path\": \"./grid-item/grid-item\"\n    },\n    \"t-grid\": {\n      \"key\": \"t-grid\",\n      \"label\": \"栅格\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-grid.png\",\n      \"properties\": [\n        {\n          \"key\": \"align\",\n          \"type\": [\"String\"],\n          \"desc\": \"内容对齐方式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"border\",\n          \"type\": [\"Boolean\", \"Object\"],\n          \"desc\": \"边框，默认不显示。值为 true 则显示默认边框，值类型为 object 则表示自定义边框样式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"column\",\n          \"type\": [\"Number\"],\n          \"desc\": \"每一行的列数量\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"gutter\",\n          \"type\": [\"Number\"],\n          \"desc\": \"间隔大小\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"hover\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否开启点击反馈\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\"],\n      \"tpl\": \"<t-grid column=\\\"{{2}}\\\"><t-grid-item text=\\\"标题文字\\\"><image style=\\\"width: 96rpx; height: 96rpx\\\" src=\\\"https://tdesign.gtimg.com/mobile/%E5%9B%BE%E7%89%87.png\\\" slot=\\\"image\\\" /></t-grid-item><t-grid-item text=\\\"标题文字\\\"><image style=\\\"width: 96rpx; height: 96rpx\\\" src=\\\"https://tdesign.gtimg.com/mobile/%E5%9B%BE%E7%89%87.png\\\" slot=\\\"image\\\" /></t-grid-item></t-grid>\",\n      \"require\": {\n        \"t-grid-item\": \"./grid-item/grid-item\"\n      },\n      \"path\": \"./grid/grid\"\n    },\n    \"t-icon\": {\n      \"key\": \"t-icon\",\n      \"label\": \"图标\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-icon.png\",\n      \"properties\": [\n        {\n          \"key\": \"classPrefix\",\n          \"type\": [\"String\"],\n          \"desc\": \"自定义icon前缀\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"color\",\n          \"type\": [\"String\"],\n          \"desc\": \"图标颜色\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"style\",\n          \"type\": [\"String\"],\n          \"desc\": \"自定义样式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"name\",\n          \"type\": [\"String\"],\n          \"desc\": \"图标名称\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"size\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"图标名称\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-icon name=\\\"add-circle\\\" />\",\n      \"path\": \"./icon/icon\"\n    },\n    \"t-image\": {\n      \"key\": \"t-image\",\n      \"label\": \"图片\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-image.png\",\n      \"properties\": [\n        {\n          \"key\": \"error\",\n          \"type\": [\"String\"],\n          \"desc\": \"加载失败时显示的内容。值为 `default` 则表示使用默认加载失败风格；值为空或者 `slot` 表示使用插槽渲染，插槽名称为 `error`；值为其他则表示普通文本内容，如“加载失败”\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"lazy\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否开启图片懒加载\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"loading\",\n          \"type\": [\"String\"],\n          \"desc\": \"加载态内容。值为 `default` 则表示使用默认加载中风格；值为空或者 `slot` 表示使用插槽渲染，插槽名称为 `loading`；值为其他则表示普通文本内容，如“加载中”\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"shape\",\n          \"type\": [\"String\"],\n          \"desc\": \"图片圆角类型\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"src\",\n          \"type\": [\"String\"],\n          \"desc\": \"图片链接\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-load\"],\n      \"events\": [\n        {\n          \"key\": \"bind:error\",\n          \"desc\": \"图片加载失败时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:load\",\n          \"desc\": \"图片加载完成时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-image src=\\\"https://tdesign.gtimg.com/mobile/%E5%9B%BE%E7%89%87.png\\\" mode=\\\"aspectFill\\\"></t-image>\",\n      \"path\": \"./image/image\"\n    },\n    \"t-indexes\": {\n      \"key\": \"t-indexes\",\n      \"label\": \"索引\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-indexes.png\",\n      \"properties\": [\n        {\n          \"key\": \"height\",\n          \"type\": [\"Number\"],\n          \"desc\": \"列表高度，未设置默认占满设备高度\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"list\",\n          \"type\": [\"Array\"],\n          \"desc\": \"索引列表的列表数据。每个元素包含三个子元素，index(string)：索引值，例如1，2，3，...或A，B，C等；title(string): 索引标题，可不填将默认设为索引值；children(Array<{title: string}>): 子元素列表，title为子元素的展示文案。\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"sticky\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"索引是否吸顶，默认为true\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:select\",\n          \"desc\": \"点击行元素时触发事件\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-indexes id=\\\"bar\\\" list=\\\"{{ [{ title: 'A开头', index: 'A', children: [{ title: '阿坝' }]},{ title: 'B开头', index: 'B', children: [{ title: '北京' }]}] }}\\\" />\",\n      \"path\": \"./indexes/indexes\"\n    },\n    \"t-input\": {\n      \"key\": \"t-input\",\n      \"label\": \"输入框\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-input.png\",\n      \"properties\": [\n        {\n          \"key\": \"align\",\n          \"type\": [\"String\"],\n          \"desc\": \"文本内容位置，居左/居中/居右\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"borderless\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"【讨论中】是否开启无边框模式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"clearable\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否可清空\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用输入框\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"errorMessage\",\n          \"type\": [\"String\"],\n          \"desc\": \"错误提示文本，值为空不显示（废弃属性，如果需要，请更为使用 status 和 tips）\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"format\",\n          \"type\": [\"String\"],\n          \"desc\": \"【开发中】指定输入框展示值的格式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"label\",\n          \"type\": [\"String\"],\n          \"desc\": \"左侧文本\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"maxcharacter\",\n          \"type\": [\"Number\"],\n          \"desc\": \"用户最多可以输入的字符个数，一个中文汉字表示两个字符长度。`maxcharacter` 和 `maxlength` 二选一使用\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"maxlength\",\n          \"type\": [\"Number\"],\n          \"desc\": \"用户最多可以输入的文本长度，一个中文等于一个计数长度。值小于等于 0 的时候，则表示不限制输入长度。`maxcharacter` 和 `maxlength` 二选一使用\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"placeholder\",\n          \"type\": [\"String\"],\n          \"desc\": \"占位符\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"prefixIcon\",\n          \"type\": [\"String\"],\n          \"desc\": \"组件前置图标，值为字符串则表示图标名称\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"readonly\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"只读状态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"size\",\n          \"type\": [\"String\"],\n          \"desc\": \"输入框尺寸\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"status\",\n          \"type\": [\"String\"],\n          \"desc\": \"输入框状态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"suffix\",\n          \"type\": [\"String\"],\n          \"desc\": \"后置图标前的后置内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"suffixIcon\",\n          \"type\": [\"String\"],\n          \"desc\": \"后置文本内容，值为字符串则表示图标名称\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"tips\",\n          \"type\": [\"String\"],\n          \"desc\": \"输入框下方提示文本，会根据不同的 `status` 呈现不同的样式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"输入框的值\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-input\", \"t-class-placeholder\", \"t-class-error-msg\"],\n      \"events\": [\n        {\n          \"key\": \"bind:blur\",\n          \"desc\": \"失去焦点时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"输入框值发生变化时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:clear\",\n          \"desc\": \"清空按钮点击时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:enter\",\n          \"desc\": \"回车键按下时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:focus\",\n          \"desc\": \"获得焦点时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-input placeholder=\\\"请输入文字\\\" />\",\n      \"path\": \"./input/input\"\n    },\n    \"t-loading\": {\n      \"key\": \"t-loading\",\n      \"label\": \"加载中\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-loading.png\",\n      \"properties\": [\n        {\n          \"key\": \"delay\",\n          \"type\": [\"Number\"],\n          \"desc\": \"延迟显示加载效果的时间，用于防止请求速度过快引起的加载闪烁，单位：毫秒\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"duration\",\n          \"type\": [\"Number\"],\n          \"desc\": \"加载动画执行完成一次的时间，单位：毫秒\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"indicator\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示加载指示符\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"inheritColor\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否继承父元素颜色\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"layout\",\n          \"type\": [\"String\"],\n          \"desc\": \"对齐方式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"loading\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否处于加载状态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"pause\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否暂停动画\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"progress\",\n          \"type\": [\"Number\"],\n          \"desc\": \"加载进度\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"reverse\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"加载动画是否反向\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"size\",\n          \"type\": [\"String\"],\n          \"desc\": \"尺寸，示例：40rpx/20px\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"text\",\n          \"type\": [\"String\"],\n          \"desc\": \"加载提示文案\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"theme\",\n          \"type\": [\"String\"],\n          \"desc\": \"加载组件类型\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-text\", \"t-class-indicator\"],\n      \"tpl\": \"<t-loading theme=\\\"circular\\\" size=\\\"40rpx\\\"></t-loading>\",\n      \"path\": \"./loading/loading\"\n    },\n    \"t-message\": {\n      \"key\": \"t-message\",\n      \"label\": \"全局提醒\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-message.png\",\n      \"properties\": [\n        {\n          \"key\": \"action\",\n          \"type\": [\"String\"],\n          \"desc\": \"操作\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"align\",\n          \"type\": [\"String\"],\n          \"desc\": \"文本对齐方式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"closeBtn\",\n          \"type\": [\"String\", \"Boolean\"],\n          \"desc\": \"关闭按钮，可以自定义。值为 true 显示默认关闭按钮，值为 false 不显示关闭按钮。值类型为 string 则直接显示值，如：“关闭”。也可以完全自定义按钮\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"content\",\n          \"type\": [\"String\"],\n          \"desc\": \"用于自定义消息弹出内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"duration\",\n          \"type\": [\"Number\"],\n          \"desc\": \"消息内置计时器，计时到达时会触发 duration-end 事件。单位：毫秒。值为 0 则表示没有计时器。\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"String\", \"Boolean\"],\n          \"desc\": \"消息提醒前面的图标。值为 true 则根据 theme 显示对应的图标，值为 false 则不显示图标。值为 'info' 或 'bell' 则显示组件内置图标。也可以完全自定义图标节点\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"marquee\",\n          \"type\": [\"Boolean\", \"Object\"],\n          \"desc\": \"跑马灯效果。speed 指速度控制；loop 指循环播放次数，值为 -1 表示循环播放，值为 0 表示不循环播放；delay 表示延迟多久开始播放\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"offset\",\n          \"type\": [\"Array\"],\n          \"desc\": \"相对于 placement 的偏移量，示例：[-10, 20] 或 ['10rpx', '8rpx']\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"theme\",\n          \"type\": [\"String\"],\n          \"desc\": \"消息组件风格\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"visible\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示，隐藏时默认销毁组件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"zIndex\",\n          \"type\": [\"Number\"],\n          \"desc\": \"元素层级，样式默认为 5000\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-content\", \"t-class-icon\", \"t-class-action\", \"t-class-close-btn\"],\n      \"events\": [\n        {\n          \"key\": \"bind:action-btn-click\",\n          \"desc\": \"当操作按钮存在时，用户点击操作按钮时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:close-btn-click\",\n          \"desc\": \"当关闭按钮存在时，用户点击关闭按钮触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:duration-end\",\n          \"desc\": \"计时结束后触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-message id=\\\"t-message\\\" />\",\n      \"path\": \"./message/message\"\n    },\n    \"t-navbar\": {\n      \"key\": \"t-navbar\",\n      \"label\": \"导航条\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-navbar.png\",\n      \"properties\": [\n        {\n          \"key\": \"animation\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否添加动画效果\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"background\",\n          \"type\": [\"String\"],\n          \"desc\": \"背景\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"delta\",\n          \"type\": [\"Number\"],\n          \"desc\": \"后退按钮后退层数，含义参考 [wx.navigateBack](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateBack.html)，特殊的，传入 0 不会发生执行 wx.navigateBack，只会触发一个 goback 事件供自行处理。\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"fixed\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否固定在顶部\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"homeIcon\",\n          \"type\": [\"String\"],\n          \"desc\": \"首页图标地址。值为 '' 或者 undefiend 则表示不显示返回图标，值为 'circle' 表示显示默认图标，值为 'slot' 表示使用插槽渲染，值为其他则表示图标地址\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"leftIcon\",\n          \"type\": [\"String\"],\n          \"desc\": \"左侧图标地址，值为 '' 或者 undefiend 则表示不显示返回图标，值为 'arrow-left' 表示显示返回图标，值为 'slot' 表示使用插槽渲染，值为其他则表示图标地址\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"title\",\n          \"type\": [\"String\"],\n          \"desc\": \"页面标题\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"titleMaxLength\",\n          \"type\": [\"Number\"],\n          \"desc\": \"标题文字最大长度，超出的范围使用 `...` 表示\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"visible\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-title\", \"t-class-left-icon\", \"t-class-home-icon\", \"t-class-capsule\"],\n      \"events\": [\n        {\n          \"key\": \"bind:complete\",\n          \"desc\": \"navigateBack 执行完成后触发（失败或成功均会触发）\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:fail\",\n          \"desc\": \"navigateBack 执行失败后触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:go-back\",\n          \"desc\": \"delta 值为 0 时，点击返回，触发该事件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:go-home\",\n          \"desc\": \"点击 Home 触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:success\",\n          \"desc\": \"navigateBack 执行成功后触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-navbar title=\\\"标题\\\" />\",\n      \"path\": \"./navbar/navbar\"\n    },\n    \"t-picker-item\": {\n      \"key\": \"t-picker-item\",\n      \"label\": \"选择器子项\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-picker.png\",\n      \"properties\": [\n        {\n          \"key\": \"format\",\n          \"type\": [\"String\"],\n          \"desc\": \"格式化标签\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"options\",\n          \"type\": [\"Array\"],\n          \"desc\": \"数据源\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-picker-item options=\\\"{{[{ label: '上海', value: '上海' },{ label: '广州', value: '广州' },{ label: '深圳', value: '深圳' }]}}\\\" value=\\\"广州\\\"></t-picker-item>\",\n      \"path\": \"./picker-item/picker-item\"\n    },\n    \"t-picker\": {\n      \"key\": \"t-picker\",\n      \"label\": \"选择器\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-picker.png\",\n      \"properties\": [\n        {\n          \"key\": \"cancelBtn\",\n          \"type\": [\"String\", \"Object\"],\n          \"desc\": \"取消按钮文字\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"confirmBtn\",\n          \"type\": [\"String\", \"Object\"],\n          \"desc\": \"确定按钮文字\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"footer\",\n          \"type\": [\"String\"],\n          \"desc\": \"底部内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"header\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"头部内容。值为 true 显示空白头部，值为 false 不显示任何内容，值类型为 TNode 表示自定义头部内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"title\",\n          \"type\": [\"String\"],\n          \"desc\": \"标题\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"Array\"],\n          \"desc\": \"选中值\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"visible\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:cancel\",\n          \"desc\": \"点击取消按钮时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"选中变化时候触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:pick\",\n          \"desc\": \"任何一列选中都会触发，不同的列参数不同。`context.column` 表示第几列变化，`context.index` 表示变化那一列的选中项下标\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-picker visible=\\\"{{true}}\\\" cancelBtn=\\\"取消\\\" confirmBtn=\\\"确认\\\"><t-picker-item options=\\\"{{[{ label: '上海', value: '上海' },{ label: '广州', value: '广州' },{ label: '深圳', value: '深圳' }]}}\\\" value=\\\"广州\\\"></t-picker-item></t-picker>\",\n      \"require\": {\n        \"t-picker-item\": \"./picker-item/picker-item\"\n      },\n      \"path\": \"./picker/picker\"\n    },\n    \"t-popup\": {\n      \"key\": \"t-popup\",\n      \"label\": \"气泡框\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-popup.png\",\n      \"properties\": [\n        {\n          \"key\": \"closeBtn\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"关闭按钮，值类型为 Boolean 时表示是否显示关闭按钮。也可以自定义关闭按钮\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"closeOnOverlayClick\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"点击遮罩层是否关闭\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"content\",\n          \"type\": [\"String\"],\n          \"desc\": \"浮层里面的内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"placement\",\n          \"type\": [\"String\"],\n          \"desc\": \"浮层出现位置\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"preventScrollThrough\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"防止滚动穿透\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"showOverlay\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示遮罩层\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"transitionProps\",\n          \"type\": [\"Object\"],\n          \"desc\": \"动画效果定义\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"visible\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示浮层\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"zIndex\",\n          \"type\": [\"Number\"],\n          \"desc\": \"组件层级，Web 侧样式默认为 5500，移动端和小程序样式默认为 1500\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-overlay\", \"t-class-content\"],\n      \"events\": [\n        {\n          \"key\": \"bind:visible-change\",\n          \"desc\": \"当浮层隐藏或显示时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-popup visible=\\\"{{true}}\\\" placement=\\\"top\\\"><view style=\\\"width: 100vw; height: 35vh; background: #fff\\\" /></t-popup>\",\n      \"path\": \"./popup/popup\"\n    },\n    \"t-progress\": {\n      \"key\": \"t-progress\",\n      \"label\": \"进度条\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-progress.png\",\n      \"properties\": [\n        {\n          \"key\": \"color\",\n          \"type\": [\"String\", \"Object\", \"Array\"],\n          \"desc\": \"进度条颜色。示例：'#ED7B2F' 或 'orange' 或 `['#f00', '#0ff', '#f0f']` 或 `{ '0%': '#f00', '100%': '#0ff' }` 或  `{ from: '#000', to: '#000' }` 等\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"label\",\n          \"type\": [\"String\", \"Boolean\"],\n          \"desc\": \"进度百分比，可自定义\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"percentage\",\n          \"type\": [\"Number\"],\n          \"desc\": \"进度条百分比\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"size\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"进度条尺寸，示例：small/medium/large/240。small 值为 72； medium 值为 112；large 值为 160\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"status\",\n          \"type\": [\"String\"],\n          \"desc\": \"进度条状态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"strokeWidth\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"进度条线宽。宽度数值不能超过 size 的一半，否则不能输出环形进度\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"theme\",\n          \"type\": [\"String\"],\n          \"desc\": \"进度条风格。值为 line，标签（label）显示在进度条右侧；值为 plump，标签（label）显示在进度条里面；值为 circle，标签（label）显示在进度条正中间\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"trackColor\",\n          \"type\": [\"String\"],\n          \"desc\": \"进度条未完成部分颜色\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-progress></t-progress>\",\n      \"path\": \"./progress/progress\"\n    },\n    \"t-pull-down-refresh\": {\n      \"key\": \"t-pull-down-refresh\",\n      \"label\": \"下拉刷新\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-pulldownrefresh.png\",\n      \"properties\": [\n        {\n          \"key\": \"loadingBarHeight\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"加载中下拉高度，如果值为数字则单位是：'px'\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"loadingProps\",\n          \"type\": [\"Object\"],\n          \"desc\": \"加载loading样式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"loadingTexts\",\n          \"type\": [\"Array\"],\n          \"desc\": \"提示语，组件内部默认值为 ['下拉刷新', '松手刷新', '正在刷新', '刷新完成']\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"maxBarHeight\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"最大下拉高度，如果值为数字则单位是：'px'\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"refreshTimeout\",\n          \"type\": [\"Number\"],\n          \"desc\": \"刷新超时时间\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"组件状态，值为 `true` 表示下拉状态，值为 `false` 表示收起状态\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-loading\", \"t-class-text\", \"t-class-indicator\"],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"下拉或收起时触发，用户手势往下滑动触发下拉状态，手势松开触发收起状态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:refresh\",\n          \"desc\": \"结束下拉时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:timeout\",\n          \"desc\": \"刷新超时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-pull-down-refresh id=\\\"pull-down-refresh\\\" loadingTexts=\\\"{{['继续拉哦', '该松手啦', '努力刷新中', '完成~']}}\\\"><view style=\\\"height: 300rpx; background: #fff; text-align: center\\\">拖拽该区域演示 中间下拉刷新</view></t-pull-down-refresh>\",\n      \"path\": \"./pull-down-refresh/pull-down-refresh\"\n    },\n    \"t-radio-group\": {\n      \"key\": \"t-radio-group\",\n      \"label\": \"单选框组\",\n      \"icon\": \"\",\n      \"properties\": [\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用全部子单选框\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"name\",\n          \"type\": [\"String\"],\n          \"desc\": \"HTML 元素原生属性\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"options\",\n          \"type\": [\"Array\"],\n          \"desc\": \"单选组件按钮形式。RadioOption 数据类型为 string 或 number 时，表示 label 和 value 值相同\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\", \"Number\", \"Boolean\"],\n          \"desc\": \"选中的值\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"选中值发生变化时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-radio-group defaultValue=\\\"radio1\\\"><t-radio value=\\\"radio1\\\" label=\\\"单选\\\" /><t-radio value=\\\"radio2\\\" label=\\\"单选\\\" /></t-radio-group>\",\n      \"require\": {\n        \"t-radio\": \"./radio/radio\"\n      },\n      \"path\": \"./radio-group/radio-group\"\n    },\n    \"t-radio\": {\n      \"key\": \"t-radio\",\n      \"label\": \"单选框\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-radio.png\",\n      \"properties\": [\n        {\n          \"key\": \"align\",\n          \"type\": [\"String\"],\n          \"desc\": \"复选框和内容相对位置\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"allowUncheck\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否允许取消选中\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"checked\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否选中\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"color\",\n          \"type\": [\"String\"],\n          \"desc\": \"单选按钮颜色\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"content\",\n          \"type\": [\"String\"],\n          \"desc\": \"单选内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"contentDisabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用组件内容（content）触发选中\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否为禁用态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"String\", \"Array\"],\n          \"desc\": \"自定义选中图标和非选中图标。示例：[选中态图标，非选中态图标]。值为 fill-circle 表示图标为填充型图标，值为 stroke-line 表示图标为描边型图标\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"label\",\n          \"type\": [\"String\"],\n          \"desc\": \"主文案\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"maxContentRow\",\n          \"type\": [\"Number\"],\n          \"desc\": \"内容最大行数限制\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"maxLabelRow\",\n          \"type\": [\"Number\"],\n          \"desc\": \"主文案最大行数限制\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"name\",\n          \"type\": [\"String\"],\n          \"desc\": \"HTML 元素原生属性\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\", \"Number\", \"Boolean\"],\n          \"desc\": \"单选按钮的值\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-icon\", \"t-class-label\", \"t-class-content\", \"t-class-border\"],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"值变化时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-radio value=\\\"radio\\\" label=\\\"单选\\\" />\",\n      \"path\": \"./radio/radio\"\n    },\n    \"t-rate\": {\n      \"key\": \"t-rate\",\n      \"label\": \"评分\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-rate.png\",\n      \"properties\": [\n        {\n          \"key\": \"allowHalf\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否允许半选\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"color\",\n          \"type\": [\"String\", \"Array\"],\n          \"desc\": \"评分图标的颜色，样式中默认为 #ED7B2F。一个值表示设置选中高亮的五角星颜色，示例：[选中颜色]。数组则表示分别设置 选中高亮的五角星颜色 和 未选中暗灰的五角星颜色，[选中颜色，未选中颜色]。示例：['#ED7B2F', '#E3E6EB']\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"count\",\n          \"type\": [\"Number\"],\n          \"desc\": \"评分的数量\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用评分\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"gap\",\n          \"type\": [\"Number\"],\n          \"desc\": \"评分图标的间距\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"showText\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示对应的辅助文字\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"size\",\n          \"type\": [\"String\"],\n          \"desc\": \"评分图标的大小，示例：`20`\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"texts\",\n          \"type\": [\"Array\"],\n          \"desc\": \"评分等级对应的辅助文字。组件内置默认值为：['极差', '失望', '一般', '满意', '惊喜']。自定义值示例：['1分', '2分', '3分', '4分', '5分']\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"Number\"],\n          \"desc\": \"选择评分的值\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"variant\",\n          \"type\": [\"String\"],\n          \"desc\": \"形状类型，有描边类型和填充类型两种\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"评分数改变时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-rate defaultValue=\\\"{{4}}\\\" variant=\\\"filled\\\"></t-rate>\",\n      \"path\": \"./rate/rate\"\n    },\n    \"t-search\": {\n      \"key\": \"t-search\",\n      \"label\": \"搜索\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-search.png\",\n      \"properties\": [\n        {\n          \"key\": \"action\",\n          \"type\": [\"String\"],\n          \"desc\": \"自定义右侧操作按钮文字\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"center\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否居中\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"focus\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否聚焦\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"label\",\n          \"type\": [\"String\"],\n          \"desc\": \"左侧文本\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"leftIcon\",\n          \"type\": [\"String\"],\n          \"desc\": \"左侧图标\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"placeholder\",\n          \"type\": [\"String\"],\n          \"desc\": \"占位符\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"rightIcon\",\n          \"type\": [\"String\"],\n          \"desc\": \"右侧图标\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"shape\",\n          \"type\": [\"String\"],\n          \"desc\": \"搜索框形状\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\"],\n          \"desc\": \"值\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\n        \"t-class\",\n        \"t-class-input\",\n        \"t-class-input-container\",\n        \"t-class-cancel\",\n        \"t-class-left\",\n        \"t-class-right\"\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:action-click\",\n          \"desc\": \"点击右侧操作按钮文字时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:blur\",\n          \"desc\": \"失去焦点时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"值发生变化时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:clear\",\n          \"desc\": \"点击清除时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:focus\",\n          \"desc\": \"聚焦时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:submit\",\n          \"desc\": \"提交时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-search></t-search>\",\n      \"path\": \"./search/search\"\n    },\n    \"t-skeleton\": {\n      \"key\": \"t-skeleton\",\n      \"label\": \"骨架屏\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-skeleton.png\",\n      \"properties\": [\n        {\n          \"key\": \"animation\",\n          \"type\": [\"String\"],\n          \"desc\": \"动画效果，有「渐变加载动画」和「闪烁加载动画」两种。值为 'none' 则表示没有动画\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"delay\",\n          \"type\": [\"Number\"],\n          \"desc\": \"【开发中】延迟显示加载效果的时间，用于防止请求速度过快引起的加载闪烁，单位：毫秒\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"loading\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否为加载状态，如果是则显示骨架图，如果不是则显示加载完成的内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"rowCol\",\n          \"type\": [\"Array\"],\n          \"desc\": \"用于设置行列数量、宽度高度、间距等。【示例一】，`[1, 1, 2]` 表示输出三行骨架图，第一行一列，第二行一列，第三行两列。【示例二】，`[1, 1, { width: '100px' }]` 表示自定义第三行的宽度为 `100px`。【示例三】，`[1, 2, [{ width, height }, { width, height, marginLeft }]]` 表示第三行有两列，且自定义宽度、高度和间距\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"theme\",\n          \"type\": [\"String\"],\n          \"desc\": \"骨架图风格，有基础、头像组合等两大类\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-avatar\", \"t-class-image\", \"t-class-text\"],\n      \"tpl\": \"<t-skeleton rowCol=\\\"{{ [{ width: '686rpx', height: '32rpx' }, 1, 1, { width: '380rpx', height: '32rpx' }]}}\\\" loading></t-skeleton>\",\n      \"path\": \"./skeleton/skeleton\"\n    },\n    \"t-slider\": {\n      \"key\": \"t-slider\",\n      \"label\": \"滑块\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-slider.png\",\n      \"properties\": [\n        {\n          \"key\": \"colors\",\n          \"type\": [\"Array\"],\n          \"desc\": \"颜色，[已选择, 未选择]\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用组件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabledColor\",\n          \"type\": [\"Array\"],\n          \"desc\": \"禁用状态滑动条的颜色，[已选, 未选]\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"label\",\n          \"type\": [\"String\", \"Boolean\"],\n          \"desc\": \"滑块当前值文本。<br />值为 true 显示默认文案；值为 false 不显示滑块当前值文本；<br />值为 `${value}%` 则表示组件会根据占位符渲染文案；<br />值类型为函数时，参数 `value` 标识滑块值，参数 `position=start` 表示范围滑块的起始值，参数 `position=end` 表示范围滑块的终点值\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"marks\",\n          \"type\": [\"Object\", \"Array\"],\n          \"desc\": \"刻度标记，示例：`[0, 10, 40, 200]` 或者 `{ 5:  '5¥', 10: '10%' }`\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"max\",\n          \"type\": [\"Number\"],\n          \"desc\": \"滑块范围最大值\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"min\",\n          \"type\": [\"Number\"],\n          \"desc\": \"滑块范围最小值\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"range\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"双游标滑块\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"showExtremeValue\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否边界值\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"step\",\n          \"type\": [\"Number\"],\n          \"desc\": \"步长\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"Number\", \"Array\"],\n          \"desc\": \"滑块值\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-bar\", \"t-class-bar-active\", \"t-class-bar-disabled\", \"t-class-cursor\"],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"滑块值变化时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:dragend\",\n          \"desc\": \"结束拖动时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:dragstart\",\n          \"desc\": \"开始拖动时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-slider />\",\n      \"path\": \"./slider/slider\"\n    },\n    \"t-step-item\": {\n      \"key\": \"t-step-item\",\n      \"label\": \"步骤\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-steps.png\",\n      \"properties\": [\n        {\n          \"key\": \"content\",\n          \"type\": [\"String\"],\n          \"desc\": \"步骤描述\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"String\"],\n          \"desc\": \"图标。传入 slot 代表使用插槽，其他字符串代表使用内置图标\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"status\",\n          \"type\": [\"String\"],\n          \"desc\": \"当前步骤的状态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"subStepItems\",\n          \"type\": [\"Array\"],\n          \"desc\": \"子步骤条，仅支持 layout  = 'vertical' 时\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"title\",\n          \"type\": [\"String\"],\n          \"desc\": \"标题\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-content\", \"t-class-title\", \"t-class-description\", \"t-class-extra\"],\n      \"tpl\": \"<t-step-item title=\\\"步骤描述\\\"></t-step-item>\",\n      \"path\": \"./step-item/step-item\"\n    },\n    \"t-stepper\": {\n      \"key\": \"t-stepper\",\n      \"label\": \"步进器\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-stepper.png\",\n      \"properties\": [\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"禁用全部操作\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disableInput\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"禁用输入框\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"inputWidth\",\n          \"type\": [\"Number\"],\n          \"desc\": \"输入框宽度\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"max\",\n          \"type\": [\"Number\"],\n          \"desc\": \"最大值\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"min\",\n          \"type\": [\"Number\"],\n          \"desc\": \"最小值\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"step\",\n          \"type\": [\"Number\"],\n          \"desc\": \"步长\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"theme\",\n          \"type\": [\"String\"],\n          \"desc\": \"组件风格\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"值\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-input\", \"t-class-add\", \"t-class-minus\"],\n      \"events\": [\n        {\n          \"key\": \"bind:blur\",\n          \"desc\": \"输入框失去焦点时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"数值发生变更时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:overlimit\",\n          \"desc\": \"数值超出限制时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-stepper />\",\n      \"path\": \"./stepper/stepper\"\n    },\n    \"t-steps\": {\n      \"key\": \"t-steps\",\n      \"label\": \"步骤条\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-steps.png\",\n      \"properties\": [\n        {\n          \"key\": \"current\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"当前步骤，即整个步骤条进度。默认根据步骤下标判断步骤的完成状态，当前步骤为进行中，当前步骤之前的步骤为已完成，当前步骤之后的步骤为未开始。如果每个步骤没有设置 value，current 值为步骤长度则表示所有步骤已完成。如果每个步骤设置了自定义 value，则 current = 'FINISH' 表示所有状态完成\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"currentStatus\",\n          \"type\": [\"String\"],\n          \"desc\": \"用于控制 current 指向的步骤条的状态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"layout\",\n          \"type\": [\"String\"],\n          \"desc\": \"步骤条方向，有两种：横向和纵向\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"readonly\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"只读状态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"separator\",\n          \"type\": [\"String\"],\n          \"desc\": \"步骤条分割符\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"theme\",\n          \"type\": [\"String\"],\n          \"desc\": \"步骤条风格\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\"],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"当前步骤发生变化时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-steps><t-step-item title=\\\"步骤描述1\\\" /><t-step-item title=\\\"步骤描述2\\\" /></t-steps>\",\n      \"require\": {\n        \"t-step-item\": \"./step-item/step-item\"\n      },\n      \"path\": \"./steps/steps\"\n    },\n    \"t-sticky\": {\n      \"key\": \"t-sticky\",\n      \"label\": \"吸顶容器\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-sticky.png\",\n      \"properties\": [\n        {\n          \"key\": \"container\",\n          \"type\": [\"String\"],\n          \"desc\": \"函数返回容器对应的 NodesRef 节点，将对应节点指定为组件的外部容器，滚动时组件会始终保持在容器范围内，当组件即将超出容器底部时，会返回原位置。\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用组件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"offsetTop\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"吸顶时与顶部的距离，单位`px`\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"zIndex\",\n          \"type\": [\"Number\"],\n          \"desc\": \"吸顶时的 z-index\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\"],\n      \"events\": [\n        {\n          \"key\": \"bind:scroll\",\n          \"desc\": \"滚动时触发，scrollTop: 距离顶部位置，isFixed: 是否吸顶\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-sticky></t-sticky>\",\n      \"path\": \"./sticky/sticky\"\n    },\n    \"t-swipe-cell\": {\n      \"key\": \"t-swipe-cell\",\n      \"label\": \"滑动操作\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-swipecell.png\",\n      \"properties\": [\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用滑动\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"expanded\",\n          \"type\": [\"String\"],\n          \"desc\": \"操作项是否呈现为打开态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"left\",\n          \"type\": [\"Array\"],\n          \"desc\": \"左侧滑动操作项。所有行为同 `right`\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"right\",\n          \"type\": [\"Array\"],\n          \"desc\": \"右侧滑动操作项。有两种定义方式，一种是使用数组，二种是使用插槽。`right.text` 表示操作文本，`right.className` 表示操作项类名，`right.style` 表示操作项样式，`right.onClick` 表示点击操作项后执行的回调函数。示例：`[{ text: '删除', style: 'background-color: red', onClick: () => {} }]`\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:click\",\n          \"desc\": \"操作项点击时触发（插槽写法组件不触发，业务侧自定义内容和事件）\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-swipe-cell><t-cell title=\\\"列表-左滑单操作\\\" note=\\\"辅助信息\\\" /><view slot=\\\"right\\\">删除</view></t-swipe-cell>\",\n      \"require\": {\n        \"t-cell\": \"./cell/cell\"\n      },\n      \"path\": \"./swipe-cell/swipe-cell\"\n    },\n    \"t-swiper\": {\n      \"key\": \"t-swiper\",\n      \"label\": \"轮播\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-swiper.png\",\n      \"properties\": [\n        {\n          \"key\": \"animation\",\n          \"type\": [\"String\"],\n          \"desc\": \"轮播切换动画效果类型\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"autoplay\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否自动播放\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"current\",\n          \"type\": [\"Number\"],\n          \"desc\": \"当前轮播在哪一项（下标）\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"direction\",\n          \"type\": [\"String\"],\n          \"desc\": \"轮播滑动方向，包括横向滑动和纵向滑动两个方向\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"duration\",\n          \"type\": [\"Number\"],\n          \"desc\": \"滑动动画时长\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"height\",\n          \"type\": [\"Number\"],\n          \"desc\": \"当使用垂直方向滚动时的高度\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"interval\",\n          \"type\": [\"Number\"],\n          \"desc\": \"轮播间隔时间\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"loop\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否循环播放\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"navigation\",\n          \"type\": [\"Object\"],\n          \"desc\": \"导航器全部配置\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"轮播切换时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-swiper current=\\\"{{1}}\\\" autoplay=\\\"{{true}}\\\" duration=\\\"{{500}}\\\" interval=\\\"{{5000}}\\\" navigation><t-swiper-item wx:for=\\\"{{[{image: 'https://tdesign.gtimg.com/site/swiper/01.png'},{image: 'https://tdesign.gtimg.com/site/swiper/02.png'}]}}\\\" wx:key=\\\"index\\\"><image src=\\\"{{item.image}}\\\" style=\\\"width: 100%; height: 100%\\\" /></t-swiper-item></t-swiper>\",\n      \"require\": {\n        \"t-swiper-item\": \"./swiper/swiper-item\"\n      },\n      \"path\": \"./swiper/swiper\"\n    },\n    \"t-switch\": {\n      \"key\": \"t-switch\",\n      \"label\": \"开关\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-switch.png\",\n      \"properties\": [\n        {\n          \"key\": \"colors\",\n          \"type\": [\"Array\"],\n          \"desc\": \"自定义颜色，[打开时的颜色，关闭时的颜色]。组件默认颜色为 ['#0052d9', 'rgba(0, 0, 0, .26']。示例：[blue, gray]\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"customValue\",\n          \"type\": [\"Array\"],\n          \"desc\": \"开关内容，[打开时的值，关闭时的值]。默认为 [true, false]。示例：[1, 0]\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用组件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"label\",\n          \"type\": [\"String\"],\n          \"desc\": \"开关的标签\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"loading\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否处于加载中状态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"size\",\n          \"type\": [\"String\"],\n          \"desc\": \"开关尺寸\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\", \"Number\", \"Boolean\"],\n          \"desc\": \"开关值\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"数据发生变化时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-switch defaultValue=\\\"{{true}}\\\" />\",\n      \"path\": \"./switch/switch\"\n    },\n    \"t-tab-bar-item\": {\n      \"key\": \"t-tab-bar-item\",\n      \"label\": \"标签栏选项\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-tabbar.png\",\n      \"properties\": [\n        {\n          \"key\": \"badgeProps\",\n          \"type\": [\"Object\"],\n          \"desc\": \"图标右上角提示信息\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"String\"],\n          \"desc\": \"图标名称\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"subTabBar\",\n          \"type\": [\"Array\"],\n          \"desc\": \"二级菜单\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"标识符\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-tab-bar-item wx:for=\\\"{{[{value: 'label_1',label: '标签栏一',icon: 'app'},{value: 'label_2',label: '标签栏二',icon: 'app'}]}}\\\" wx:for-item=\\\"item\\\" wx:for-index=\\\"index\\\" wx:key=\\\"index\\\" value=\\\"{{item.value}}\\\">{{item.label}}</t-tab-bar-item>\",\n      \"path\": \"./tab-bar-item/tab-bar-item\"\n    },\n    \"t-tab-bar\": {\n      \"key\": \"t-tab-bar\",\n      \"label\": \"标签栏\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-tabbar.png\",\n      \"properties\": [\n        {\n          \"key\": \"bordered\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示外边框\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"color\",\n          \"type\": [\"Array\"],\n          \"desc\": \"标签颜色设置。示例：[选中标签的颜色, 未选中的标签颜色]\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"fixed\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否固定在底部\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"safeAreaInsetBottom\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否为 iPhoneX 留出底部安全距离\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"split\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否需要分割线\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\", \"Number\", \"Array\"],\n          \"desc\": \"当前选中标签的索引\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\"],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"选中标签切换时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-tab-bar value=\\\"label_1\\\"><t-tab-bar-item wx:for=\\\"{{[{value: 'label_1',label: '标签栏一',icon: 'app'},{value: 'label_2',label: '标签栏二',icon: 'app'}]}}\\\" wx:for-item=\\\"item\\\" wx:for-index=\\\"index\\\" wx:key=\\\"index\\\" value=\\\"{{item.value}}\\\">{{item.label}}</t-tab-bar-item></t-tab-bar>\",\n      \"require\": {\n        \"t-tab-bar-item\": \"./tab-bar-item/tab-bar-item\"\n      },\n      \"path\": \"./tab-bar/tab-bar\"\n    },\n    \"t-tab-panel\": {\n      \"key\": \"t-tab-panel\",\n      \"label\": \"选项卡面板\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-tabs.png\",\n      \"properties\": [\n        {\n          \"key\": \"destroyOnHide\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"选项卡内容隐藏时是否销毁\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用当前选项卡\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"label\",\n          \"type\": [\"String\"],\n          \"desc\": \"选项卡名称\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"panel\",\n          \"type\": [\"String\"],\n          \"desc\": \"用于自定义选项卡面板内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"选项卡的值，唯一标识\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-tab-panel label=\\\"标签页一\\\" value=\\\"0\\\">标签一内容</t-tab-panel>\",\n      \"path\": \"./tab-panel/tab-panel\"\n    },\n    \"t-tabs\": {\n      \"key\": \"t-tabs\",\n      \"label\": \"选项卡\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-tabs.png\",\n      \"properties\": [\n        {\n          \"key\": \"animation\",\n          \"type\": [\"Object\"],\n          \"desc\": \"动画效果设置。其中 duration 表示动画时长\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"placement\",\n          \"type\": [\"String\"],\n          \"desc\": \"选项卡位置\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"showBottomLine\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否展示底部激活线条\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"stickyProps\",\n          \"type\": [\"Object\"],\n          \"desc\": \"是否支持吸顶\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"激活的选项卡值\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-item\", \"t-class-active\", \"t-class-track\"],\n      \"events\": [\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"激活的选项卡发生变化时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-tabs defaultValue=\\\"{{0}}\\\"><t-tab-panel label=\\\"标签页一\\\" value=\\\"0\\\">标签一内容</t-tab-panel><t-tab-panel label=\\\"标签页二\\\" value=\\\"1\\\">标签二内容</t-tab-panel></t-tabs>\",\n      \"require\": {\n        \"t-tab-panel\": \"./tab-panel/tab-panel\"\n      },\n      \"path\": \"./tabs/tabs\"\n    },\n    \"t-tag\": {\n      \"key\": \"t-tag\",\n      \"label\": \"标签\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-tag.png\",\n      \"properties\": [\n        {\n          \"key\": \"closable\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"标签是否可关闭\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"标签禁用态，失效标签不能触发事件。默认风格（theme=default）才有禁用态\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"String\"],\n          \"desc\": \"标签中的图标，可自定义图标呈现\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"maxWidth\",\n          \"type\": [\"String\", \"Number\"],\n          \"desc\": \"标签最大宽度，宽度超出后会出现省略号。示例：'50px' / 80\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"shape\",\n          \"type\": [\"String\"],\n          \"desc\": \"标签类型，有三种：方形、圆角方形、标记型\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"size\",\n          \"type\": [\"String\"],\n          \"desc\": \"标签尺寸\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"theme\",\n          \"type\": [\"String\"],\n          \"desc\": \"组件风格，用于描述组件不同的应用场景\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"variant\",\n          \"type\": [\"String\"],\n          \"desc\": \"标签风格变体\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\"],\n      \"events\": [\n        {\n          \"key\": \"bind:click\",\n          \"desc\": \"点击时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:close\",\n          \"desc\": \"如果关闭按钮存在，点击关闭按钮时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-tag theme=\\\"primary\\\">重要</t-tag>\",\n      \"path\": \"./tag/tag\"\n    },\n    \"t-textarea\": {\n      \"key\": \"t-textarea\",\n      \"label\": \"文本输入框\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-textarea.png\",\n      \"properties\": [\n        {\n          \"key\": \"adjustPosition\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"键盘弹起时，是否自动上推页面\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"autofocus\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"自动聚焦，拉起键盘\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"autosize\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否自动增高，值为 autosize 时，style.height 不生效\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"confirmHold\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"点击键盘右下角按钮时是否保持键盘不收起点\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"confirmType\",\n          \"type\": [\"String\"],\n          \"desc\": \"设置键盘右下角按钮的文字，仅在 type='text'时生效\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"disabled\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否禁用文本框\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"focus\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"自动聚焦\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"label\",\n          \"type\": [\"String\"],\n          \"desc\": \"左侧文本\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"maxcharacter\",\n          \"type\": [\"Number\"],\n          \"desc\": \"用户最多可以输入的字符个数，一个中文汉字表示两个字符长度\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"maxlength\",\n          \"type\": [\"Number\"],\n          \"desc\": \"用户最多可以输入的字符个数\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"placeholder\",\n          \"type\": [\"String\"],\n          \"desc\": \"占位符\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"value\",\n          \"type\": [\"String\"],\n          \"desc\": \"文本框值\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\", \"t-class-textarea\", \"t-class-placeholder\", \"t-class-name\"],\n      \"events\": [\n        {\n          \"key\": \"bind:blur\",\n          \"desc\": \"失去焦点时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:change\",\n          \"desc\": \"输入内容变化时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:enter\",\n          \"desc\": \"点击完成时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:focus\",\n          \"desc\": \"获得焦点时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:line-change\",\n          \"desc\": \"行高发生变化时触发\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-textarea />\",\n      \"path\": \"./textarea/textarea\"\n    },\n    \"t-toast\": {\n      \"key\": \"t-toast\",\n      \"label\": \"轻提示\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-toast.png\",\n      \"properties\": [\n        {\n          \"key\": \"direction\",\n          \"type\": [\"String\"],\n          \"desc\": \"图标排列方式\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"duration\",\n          \"type\": [\"Number\"],\n          \"desc\": \"弹窗显示毫秒数\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"icon\",\n          \"type\": [\"String\"],\n          \"desc\": \"自定义图标\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"message\",\n          \"type\": [\"String\"],\n          \"desc\": \"弹窗显示文字\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"overlayProps\",\n          \"type\": [\"Object\"],\n          \"desc\": \"遮罩层属性，透传至 Overlay\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"placement\",\n          \"type\": [\"String\"],\n          \"desc\": \"弹窗展示位置\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"preventScrollThrough\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"防止滚动穿透，即不允许点击和滚动\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"showOverlay\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示遮罩层\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"theme\",\n          \"type\": [\"String\"],\n          \"desc\": \"提示类型\",\n          \"label\": \"\"\n        }\n      ],\n      \"externalClasses\": [\"t-class\"],\n      \"tpl\": \"<t-toast id=\\\"t-toast\\\" />\",\n      \"path\": \"./toast/toast\"\n    },\n    \"t-transition\": {\n      \"key\": \"t-transition\",\n      \"label\": \"动画\",\n      \"icon\": \"\",\n      \"properties\": [\n        {\n          \"key\": \"appear\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"首次出现是否展示动画\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"customClass\",\n          \"type\": [\"String\"],\n          \"desc\": \"自定义容器类名\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"destoryOnClose\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"隐藏时是否销毁内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"duration\",\n          \"type\": [\"Number\"],\n          \"desc\": \"指定过渡时间\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"name\",\n          \"type\": [\"String\"],\n          \"desc\": \"过渡类名\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"visible\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否显示\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-transition visible appear></t-transition>\",\n      \"path\": \"./transition/transition\"\n    },\n    \"t-upload\": {\n      \"key\": \"t-upload\",\n      \"label\": \"上传\",\n      \"icon\": \"https://tdesign.gtimg.com/site/miniprogram-doc/doc-upload.png\",\n      \"properties\": [\n        {\n          \"key\": \"addContent\",\n          \"type\": [\"String\"],\n          \"desc\": \"添加按钮内容。值为空，使用默认图标渲染；值为 slot 则表示使用插槽渲染；其他值无效。\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"allowUploadDuplicateFile\",\n          \"type\": [\"Boolean\"],\n          \"desc\": \"是否允许重复上传相同文件名的文件\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"config\",\n          \"type\": [\"Object\"],\n          \"desc\": \"图片上传配置，视频上传配置，文件上传配置等，包含图片尺寸、图片来源、视频来源、视频拍摄最长时间等。更多细节查看小程序官网。[图片上传](https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.chooseImage.html)。[视频上传](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseVideo.html)\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"deleteBtn\",\n          \"type\": [\"String\"],\n          \"desc\": \"删除图标。值为空，使用默认图标渲染；值为 slot 则表示使用插槽渲染；其他值无效。\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"fileListDisplay\",\n          \"type\": [\"String\"],\n          \"desc\": \"用于完全自定义文件列表内容\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"files\",\n          \"type\": [\"Array\"],\n          \"desc\": \"已上传文件列表\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"gridConfig\",\n          \"type\": [\"Object\"],\n          \"desc\": \"upload组件每行上传图片列数以及图片的宽度和高度\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"gutter\",\n          \"type\": [\"Number\"],\n          \"desc\": \"预览窗格的 `gutter` 大小，单位 rpx\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"imageProps\",\n          \"type\": [\"Object\"],\n          \"desc\": \"透传 Image 组件全部属性\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"max\",\n          \"type\": [\"Number\"],\n          \"desc\": \"用于控制文件上传数量，值为 0 则不限制\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"mediaType\",\n          \"type\": [\"Array\"],\n          \"desc\": \"支持上传的文件类型，图片或视频\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"requestMethod\",\n          \"type\": [\"String\"],\n          \"desc\": \"自定义上传方法\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"sizeLimit\",\n          \"type\": [\"Number\", \"Object\"],\n          \"desc\": \"图片文件大小限制，单位 KB。可选单位有：`'B' | 'KB' | 'MB' | 'GB'`。示例一：`1000`。示例二：`{ size: 2, unit: 'MB', message: '图片大小不超过 {sizeLimit} MB' }`\",\n          \"label\": \"\"\n        }\n      ],\n      \"events\": [\n        {\n          \"key\": \"bind:add\",\n          \"desc\": \"上传成功后触发，仅包含本次选择的照片；`url` 表示选定视频的临时文件路径 (本地路径)。`duration` 表示选定视频的时间长度。`size`选定视频的数据量大小。更多描述参考 wx.chooseMedia 小程序官网描述\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:complete\",\n          \"desc\": \"上传成功或失败后触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:fail\",\n          \"desc\": \"上传失败后触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:remove\",\n          \"desc\": \"移除文件时触发\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:select-change\",\n          \"desc\": \"选择文件或图片之后，上传之前，触发该事件。<br />`files` 表示之前已经上传完成的文件列表。<br />`currentSelectedFiles` 表示本次上传选中的文件列表\",\n          \"label\": \"\"\n        },\n        {\n          \"key\": \"bind:success\",\n          \"desc\": \"上传成功后触发，包含所有上传的文件；`url` 表示选定视频的临时文件路径 (本地路径)。`duration` 表示选定视频的时间长度。`size`选定视频的数据量大小。更多描述参考 wx.chooseMedia 小程序官网描述\",\n          \"label\": \"\"\n        }\n      ],\n      \"tpl\": \"<t-upload />\",\n      \"path\": \"./upload/upload\"\n    }\n  },\n  \"common\": {\n    \"properties\": {},\n    \"events\": {}\n  },\n  \"menu\": [\n    {\n      \"key\": \"menu-basic\",\n      \"label\": \"基础\",\n      \"submenu\": [\n        {\n          \"key\": \"subMenu-button\",\n          \"label\": \"Button 按钮\",\n          \"components\": [\"t-button\"]\n        },\n        {\n          \"key\": \"subMenu-divider\",\n          \"label\": \"Divider 分割线\",\n          \"components\": [\"t-divider\"]\n        },\n        {\n          \"key\": \"subMenu-fab\",\n          \"label\": \"Fab 悬浮按钮\",\n          \"components\": [\"t-fab\"]\n        },\n        {\n          \"key\": \"subMenu-icon\",\n          \"label\": \"Icon 图标\",\n          \"components\": [\"t-icon\"]\n        }\n      ]\n    },\n    {\n      \"key\": \"menu-nav\",\n      \"label\": \"导航\",\n      \"submenu\": [\n        {\n          \"key\": \"subMenu-drawer\",\n          \"label\": \"Drawer 抽屉\",\n          \"components\": [\"t-drawer\"]\n        },\n        {\n          \"key\": \"subMenu-indexes\",\n          \"label\": \"Indexes 索引\",\n          \"components\": [\"t-indexes\"]\n        },\n        {\n          \"key\": \"subMenu-navbar\",\n          \"label\": \"Navbar 导航条\",\n          \"components\": [\"t-navbar\"]\n        },\n        {\n          \"key\": \"subMenu-steps\",\n          \"label\": \"Steps 步骤条\",\n          \"components\": [\"t-steps\"]\n        },\n        {\n          \"key\": \"subMenu-tabbar\",\n          \"label\": \"TabBar 标签栏\",\n          \"components\": [\"t-tab-bar\"]\n        },\n        {\n          \"key\": \"subMenu-tabs\",\n          \"label\": \"Tabs 选项卡\",\n          \"components\": [\"t-tabs\"]\n        }\n      ]\n    },\n    {\n      \"key\": \"menu-input\",\n      \"label\": \"输入\",\n      \"submenu\": [\n        {\n          \"key\": \"subMenu-checkbox\",\n          \"label\": \"CheckBox 复选框\",\n          \"components\": [\"t-checkbox\"]\n        },\n        {\n          \"key\": \"subMenu-dateTimePicker\",\n          \"label\": \"DateTimePicker 时间选择器\",\n          \"components\": [\"t-date-time-picker\"]\n        },\n        {\n          \"key\": \"subMenu-input\",\n          \"label\": \"Input 输入框\",\n          \"components\": [\"t-input\"]\n        },\n        {\n          \"key\": \"subMenu-picker\",\n          \"label\": \"Picker 选择器\",\n          \"components\": [\"t-picker\"]\n        },\n        {\n          \"key\": \"subMenu-radio\",\n          \"label\": \"Radio 单选框\",\n          \"components\": [\"t-radio\"]\n        },\n        {\n          \"key\": \"subMenu-rate\",\n          \"label\": \"Rate 评分\",\n          \"components\": [\"t-rate\"]\n        },\n        {\n          \"key\": \"subMenu-search\",\n          \"label\": \"Search 搜索框\",\n          \"components\": [\"t-search\"]\n        },\n        {\n          \"key\": \"subMenu-slider\",\n          \"label\": \"Slider 滑动选择器\",\n          \"components\": [\"t-slider\"]\n        },\n        {\n          \"key\": \"subMenu-stepper\",\n          \"label\": \"Stepper 步进器\",\n          \"components\": [\"t-stepper\"]\n        },\n        {\n          \"key\": \"subMenu-switch\",\n          \"label\": \"Switch 开关\",\n          \"components\": [\"t-switch\"]\n        },\n        {\n          \"key\": \"subMenu-textarea\",\n          \"label\": \"Textarea 多行文本框\",\n          \"components\": [\"t-textarea\"]\n        },\n        {\n          \"key\": \"subMenu-upload\",\n          \"label\": \"UpLoad 上传\",\n          \"components\": [\"t-upload\"]\n        }\n      ]\n    },\n    {\n      \"key\": \"menu-data\",\n      \"label\": \"数据展示\",\n      \"submenu\": [\n        {\n          \"key\": \"subMenu-avatar\",\n          \"label\": \"Avatar 头像\",\n          \"components\": [\"t-avatar\"]\n        },\n        {\n          \"key\": \"subMenu-badge\",\n          \"label\": \"Badge 徽标\",\n          \"components\": [\"t-badge\"]\n        },\n        {\n          \"key\": \"subMenu-cell\",\n          \"label\": \"Cell 单元格\",\n          \"components\": [\"t-cell\"]\n        },\n        {\n          \"key\": \"subMenu-collapse\",\n          \"label\": \"Collapse 折叠面板\",\n          \"components\": [\"t-collapse\"]\n        },\n        {\n          \"key\": \"subMenu-dropdown-menu\",\n          \"label\": \"DropdownMenu 下拉菜单\",\n          \"components\": [\"t-dropdown-menu\"]\n        },\n        {\n          \"key\": \"subMenu-empty\",\n          \"label\": \"Empty 空状态\",\n          \"components\": [\"t-empty\"]\n        },\n        {\n          \"key\": \"subMenu-footer\",\n          \"label\": \"Footer 页脚\",\n          \"components\": [\"t-footer\"]\n        },\n        {\n          \"key\": \"subMenu-grid\",\n          \"label\": \"Grid 宫格\",\n          \"components\": [\"t-grid\"]\n        },\n        {\n          \"key\": \"subMenu-image\",\n          \"label\": \"Image 图片\",\n          \"components\": [\"t-image\"]\n        },\n        {\n          \"key\": \"subMenu-skeleton\",\n          \"label\": \"Skeleton 骨架屏\",\n          \"components\": [\"t-skeleton\"]\n        },\n        {\n          \"key\": \"subMenu-sticky\",\n          \"label\": \"Sticky 吸顶容器\",\n          \"components\": [\"t-sticky\"]\n        },\n        {\n          \"key\": \"subMenu-swiper\",\n          \"label\": \"Swiper 轮播图\",\n          \"components\": [\"t-swiper\"]\n        },\n        {\n          \"key\": \"subMenu-tag\",\n          \"label\": \"Tag 标签\",\n          \"components\": [\"t-tag\"]\n        }\n      ]\n    },\n    {\n      \"key\": \"menu-info\",\n      \"label\": \"消息提醒\",\n      \"submenu\": [\n        {\n          \"key\": \"subMenu-actionsheet\",\n          \"label\": \"ActionSheet 动作面板\",\n          \"components\": [\"t-action-sheet\"]\n        },\n        {\n          \"key\": \"subMenu-back-top\",\n          \"label\": \"BackTop 返回顶部\",\n          \"components\": [\"t-back-top\"]\n        },\n        {\n          \"key\": \"subMenu-dialog\",\n          \"label\": \"Dialog 弹出框\",\n          \"components\": [\"t-dialog\"]\n        },\n        {\n          \"key\": \"subMenu-loading\",\n          \"label\": \"Loading 加载\",\n          \"components\": [\"t-loading\"]\n        },\n        {\n          \"key\": \"subMenu-message\",\n          \"label\": \"Message 消息通知\",\n          \"components\": [\"t-message\"]\n        },\n        {\n          \"key\": \"subMenu-popup\",\n          \"label\": \"Popup 弹出层\",\n          \"components\": [\"t-popup\"]\n        },\n        {\n          \"key\": \"subMenu-progress\",\n          \"label\": \"Progress 进度条\",\n          \"components\": [\"t-progress\"]\n        },\n        {\n          \"key\": \"subMenu-pullDownRefresh\",\n          \"label\": \"PullDownRefresh 下拉刷新\",\n          \"components\": [\"t-pull-down-refresh\"]\n        },\n        {\n          \"key\": \"subMenu-swipeCell\",\n          \"label\": \"SwipeCell 滑动操作\",\n          \"components\": [\"t-swipe-cell\"]\n        },\n        {\n          \"key\": \"subMenu-toast\",\n          \"label\": \"Toast 轻提示\",\n          \"components\": [\"t-toast\"]\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Badge Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ncolor | String | - | \\- | N\ncontent | String | - | \\- | N\ncount | String / Number / Slot | 0 | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndot | Boolean | false | \\- | N\nmax-count | Number | 99 | \\- | N\noffset | Array | - | Typescript：`Array<string \\| number>` | N\nshape | String | circle | options: circle/square/bubble/ribbon | N\nshow-zero | Boolean | false | \\- | N\nsize | String | medium | options: medium/large | N\n### Badge External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-content | \\-\nt-class-count | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-badge-basic-height | 32rpx | - \n--td-badge-basic-padding | 8rpx | - \n--td-badge-basic-width | 32rpx | - \n--td-badge-bg-color | @error-color | - \n--td-badge-border-radius | 4rpx | - \n--td-badge-bubble-border-radius | 20rpx 20rpx 20rpx 1px | - \n--td-badge-dot-size | 16rpx | - \n--td-badge-font-size | @font-size-xs | - \n--td-badge-font-weight | 600 | - \n--td-badge-large-font-size | @font-size-s | - \n--td-badge-large-height | 40rpx | - \n--td-badge-large-padding | 10rpx | - \n--td-badge-text-color | @font-white-1 | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/README.md",
    "content": "---\ntitle: Badge 徽标\ndescription: 用于告知用户，该区域的状态变化或者待处理任务的数量。\nspline: data\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-100%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-badge\": \"tdesign-miniprogram/badge/badge\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/TgaeQimG73SD\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 组件类型\n\n{{ base }}\n\n### 组件样式\n\n{{ theme }}\n\n### 组件尺寸\n\n{{ size }}\n\n## FAQ\n\n### 如何处理由 ribbon 徽标溢出导致页面出现横向滚动？\n角标溢出问题建议从父容器组件处理。如 <a href=\"https://github.com/Tencent/tdesign-miniprogram/issues/3063\" title=\"如 #3063 \" target=\"_blank\" rel=\"noopener noreferrer\"> #3063 </a>，可以给父容器 `cell` 组件添加 `overflow: hidden`，处理溢出造成页面出现横向滚动的问题。\n\n## API\n\n### Badge Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ncolor | String | - | 颜色 | N\ncontent | String | - | 徽标内容，示例：`content='自定义内容'`。也可以使用默认插槽定义 | N\ncount | String / Number / Slot | 0 | 徽标右上角内容。可以是数字，也可以是文字。如：'new'/3/99+。特殊：值为空表示使用插槽渲染。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndot | Boolean | false | 是否为红点 | N\nmax-count | Number | 99 | 封顶的数字值 | N\noffset | Array | - | 设置状态点的位置偏移，示例：[-10, 20] 或 ['10em', '8rem']。TS 类型：`Array<string \\| number>` | N\nshape | String | circle | 形状。可选项：circle/square/bubble/ribbon | N\nshow-zero | Boolean | false | 当数值为 0 时，是否展示徽标 | N\nsize | String | medium | 尺寸。可选项：medium/large | N\n### Badge External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-content | 内容样式类\nt-class-count | 计数样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-badge-basic-height | 32rpx | - \n--td-badge-basic-padding | 8rpx | - \n--td-badge-basic-width | 32rpx | - \n--td-badge-bg-color | @error-color | - \n--td-badge-border-radius | 4rpx | - \n--td-badge-bubble-border-radius | 20rpx 20rpx 20rpx 1px | - \n--td-badge-dot-size | 16rpx | - \n--td-badge-font-size | @font-size-xs | - \n--td-badge-font-weight | 600 | - \n--td-badge-large-font-size | @font-size-s | - \n--td-badge-large-height | 40rpx | - \n--td-badge-large-padding | 10rpx | - \n--td-badge-text-color | @font-white-1 | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/badge.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nimport type { TdBadgeProps } from './type';\nexport interface BadgeProps extends TdBadgeProps {\n}\nexport default class Badge extends SuperComponent {\n    options: {\n        multipleSlots: boolean;\n    };\n    externalClasses: string[];\n    properties: TdBadgeProps;\n    data: {\n        prefix: string;\n        classPrefix: string;\n        value: string;\n        labelID: string;\n        descriptionID: string;\n    };\n    lifetimes: {\n        ready(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/badge.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport { uniqueFactory } from '../common/utils';\nconst { prefix } = config;\nconst name = `${prefix}-badge`;\nconst getUniqueID = uniqueFactory('badge');\nlet Badge = class Badge extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.options = {\n            multipleSlots: true,\n        };\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-count`, `${prefix}-class-content`];\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n            value: '',\n            labelID: '',\n            descriptionID: '',\n        };\n        this.lifetimes = {\n            ready() {\n                const uniqueID = getUniqueID();\n                this.setData({\n                    labelID: `${uniqueID}_label`,\n                    descriptionID: `${uniqueID}_description`,\n                });\n            },\n        };\n    }\n};\nBadge = __decorate([\n    wxComponent()\n], Badge);\nexport default Badge;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/badge.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/badge.wxml",
    "content": "<wxs src=\"./badge.wxs\" module=\"this\" />\n<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<!--\n  1. labelID 用于描述当前元素的文本\n  2. descriptionID 用于描述badge消息的文本\n  3. role=option一般用于多个内容合并焦点连续朗读\n-->\n\n<view\n  style=\"{{_._style([style, customStyle])}}\"\n  class=\"{{this.getBadgeOuterClass({shape})}} class {{prefix}}-class\"\n  aria-labelledby=\"{{labelID}}\"\n  aria-describedby=\"{{descriptionID}}\"\n  aria-role=\"{{ ariaRole || 'option'}}\"\n>\n  <view id=\"{{labelID}}\" class=\"{{classPrefix}}__content {{prefix}}-class-content\" aria-hidden=\"true\">\n    <slot wx:if=\"{{!content}}\" class=\"{{classPrefix}}__content-slot\" />\n    <text wx:else class=\"{{classPrefix}}__content-text\">{{content}}</text>\n  </view>\n  <view\n    aria-hidden=\"true\"\n    aria-label=\"{{ ariaLabel || _.getBadgeAriaLabel({dot, count, maxCount}) }}\"\n    wx:if=\"{{this.isShowBadge({dot,count,showZero})}}\"\n    id=\"{{descriptionID}}\"\n    class=\"{{this.getBadgeInnerClass({dot, size, shape, count})}} {{prefix}}-has-count {{prefix}}-class-count\"\n    style=\"{{_._style([this.getBadgeStyles({color, offset})])}}\"\n    aria-hidden=\"true\"\n    aria-label=\"{{ ariaLabel || _.getBadgeAriaLabel({dot, count, maxCount}) }}\"\n  >\n    {{ this.getBadgeValue({dot, count, maxCount}) }}\n  </view>\n  <slot name=\"count\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/badge.wxs",
    "content": "var getBadgeValue = function (props) {\n  if (props.dot) {\n    return '';\n  }\n  if (isNaN(props.count) || isNaN(props.maxCount)) {\n    return props.count;\n  }\n  return parseInt(props.count) > props.maxCount ? props.maxCount + '+' : props.count;\n};\n\nvar hasUnit = function (unit) {\n  return (\n    unit.indexOf('px') > 0 ||\n    unit.indexOf('rpx') > 0 ||\n    unit.indexOf('em') > 0 ||\n    unit.indexOf('rem') > 0 ||\n    unit.indexOf('%') > 0 ||\n    unit.indexOf('vh') > 0 ||\n    unit.indexOf('vm') > 0\n  );\n};\n\nvar getBadgeStyles = function (props) {\n  var styleStr = '';\n  if (props.color) {\n    styleStr += 'background:' + props.color + ';';\n  }\n  if (props.offset[0]) {\n    styleStr +=\n      'left: calc(100% + ' + (hasUnit(props.offset[0].toString()) ? props.offset[0] : props.offset[0] + 'px') + ');';\n  }\n  if (props.offset[1]) {\n    styleStr += 'top:' + (hasUnit(props.offset[1].toString()) ? props.offset[1] : props.offset[1] + 'px') + ';';\n  }\n  return styleStr;\n};\n\nvar getBadgeOuterClass = function (props) {\n  var baseClass = 't-badge';\n  var classNames = [baseClass, props.shape === 'ribbon' ? baseClass + '__ribbon-outer' : ''];\n  return classNames.join(' ');\n};\n\nvar getBadgeInnerClass = function (props) {\n  var baseClass = 't-badge';\n  var classNames = [\n    baseClass + '--basic',\n    props.dot ? baseClass + '--dot' : '',\n    baseClass + '--' + props.size,\n    baseClass + '--' + props.shape,\n    !props.dot && props.count ? baseClass + '--count' : '',\n  ];\n  return classNames.join(' ');\n};\n\nvar isShowBadge = function (props) {\n  if (props.dot) {\n    return true;\n  }\n  if (!props.showZero && !isNaN(props.count) && parseInt(props.count) === 0) {\n    return false;\n  }\n  if (props.count == null) return false;\n  return true;\n};\n\nmodule.exports.getBadgeValue = getBadgeValue;\nmodule.exports.getBadgeStyles = getBadgeStyles;\nmodule.exports.getBadgeOuterClass = getBadgeOuterClass;\nmodule.exports.getBadgeInnerClass = getBadgeInnerClass;\nmodule.exports.isShowBadge = isShowBadge;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/badge.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-badge {\n  position: relative;\n  display: inline-flex;\n  align-items: start;\n}\n.t-badge--basic {\n  z-index: 100;\n  padding: 0 var(--td-badge-basic-padding, 8rpx);\n  font-size: var(--td-badge-font-size, var(--td-font-size-xs, var(--td-font-size, 20rpx)));\n  color: var(--td-badge-text-color, var(--td-text-color-anti, var(--td-font-white-1, #ffffff)));\n  background-color: var(--td-badge-bg-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n  text-align: center;\n  height: var(--td-badge-basic-height, 32rpx);\n  line-height: var(--td-badge-basic-height, 32rpx);\n  font-weight: var(--td-badge-font-weight, 600);\n  border-radius: var(--td-badge-border-radius, 4rpx);\n}\n.t-badge--dot {\n  height: var(--td-badge-dot-size, 16rpx);\n  border-radius: 50%;\n  min-width: var(--td-badge-dot-size, 16rpx);\n  padding: 0;\n}\n.t-badge--count {\n  min-width: var(--td-badge-basic-width, 32rpx);\n  white-space: nowrap;\n  box-sizing: border-box;\n}\n.t-badge--circle {\n  border-radius: calc(var(--td-badge-basic-height, 32rpx) / 2);\n}\n.t-badge__ribbon-outer {\n  position: absolute;\n  top: 0;\n  right: 0;\n}\n.t-badge--ribbon {\n  position: relative;\n  display: inline-block;\n  transform-origin: center center;\n  transform: translate(calc(50% - var(--td-badge-basic-height, 32rpx) + 1rpx), calc(-50% + var(--td-badge-basic-height, 32rpx) - 1rpx)) rotate(45deg);\n  border-radius: 0;\n}\n.t-badge--ribbon::before,\n.t-badge--ribbon::after {\n  content: '';\n  position: absolute;\n  width: 0;\n  height: 0;\n  bottom: 0;\n  border-bottom: var(--td-badge-basic-height, 32rpx) solid var(--td-badge-bg-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n  font-size: 0;\n}\n.t-badge--ribbon::before {\n  left: calc(-1 * var(--td-badge-basic-height, 32rpx) + 1rpx);\n  border-left: var(--td-badge-basic-height, 32rpx) solid transparent;\n}\n.t-badge--ribbon::after {\n  right: calc(-1 * var(--td-badge-basic-height, 32rpx) + 1rpx);\n  border-right: var(--td-badge-basic-height, 32rpx) solid transparent;\n}\n.t-badge--bubble {\n  border-radius: var(--td-badge-bubble-border-radius, 20rpx 20rpx 20rpx 1px);\n}\n.t-badge--large {\n  font-size: var(--td-badge-large-font-size, var(--td-font-size-s, 24rpx));\n  height: var(--td-badge-large-height, 40rpx);\n  min-width: var(--td-badge-large-height, 40rpx);\n  line-height: var(--td-badge-large-height, 40rpx);\n  padding: 0 var(--td-badge-large-padding, 10rpx);\n}\n.t-badge--large.t-badge--circle {\n  border-radius: calc(var(--td-badge-large-height, 40rpx) / 2);\n}\n.t-badge__content:not(:empty) + .t-has-count {\n  transform-origin: center center;\n  transform: translate(-50%, -50%);\n  position: absolute;\n  left: 100%;\n  top: 0;\n}\n.t-badge__content-text {\n  display: block;\n  line-height: 48rpx;\n  color: var(--td-badge-content-text-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/index.d.ts",
    "content": "export * from './type';\nexport * from './props';\nexport * from './badge';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/index.js",
    "content": "export * from './type';\nexport * from './props';\nexport * from './badge';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/props.d.ts",
    "content": "import { TdBadgeProps } from './type';\ndeclare const props: TdBadgeProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/props.js",
    "content": "const props = {\n    color: {\n        type: String,\n        value: '',\n    },\n    content: {\n        type: String,\n        value: '',\n    },\n    count: {\n        type: null,\n        value: 0,\n    },\n    dot: {\n        type: Boolean,\n        value: false,\n    },\n    externalClasses: {\n        type: Array,\n    },\n    maxCount: {\n        type: Number,\n        value: 99,\n    },\n    offset: {\n        type: Array,\n    },\n    shape: {\n        type: String,\n        value: 'circle',\n    },\n    showZero: {\n        type: Boolean,\n        value: false,\n    },\n    size: {\n        type: String,\n        value: 'medium',\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/type.d.ts",
    "content": "export interface TdBadgeProps {\n    color?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    content?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    count?: {\n        type: null;\n        value?: string | number;\n    };\n    dot?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    externalClasses?: {\n        type: ArrayConstructor;\n        value?: ['t-class', 't-class-content', 't-class-count'];\n    };\n    maxCount?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    offset?: {\n        type: ArrayConstructor;\n        value?: Array<string | number>;\n    };\n    shape?: {\n        type: StringConstructor;\n        value?: 'circle' | 'square' | 'bubble' | 'ribbon';\n    };\n    showZero?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    size?: {\n        type: StringConstructor;\n        value?: 'medium' | 'large';\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/badge/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/README.en-US.md",
    "content": "---\ntitle: Button\ndescription: Buttons are used to open a closed-loop task, such as \"delete\" an object, \"buy\" an item, etc.\nspline: base\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-83%25-blue\" /></span>\n\n\n## Usage\n\nFor global import, configure it in `app.json` in the root directory of the miniprogram. For local import, configure it in `index.json` of the page or component that needs to be imported.\n\n```json\n\"usingComponents\": {\n  \"t-button\": \"tdesign-miniprogram/button/button\"\n}\n```\n\n\n## Code Demo\n\n### 01 Component Type\n\n#### Basic Buttons\n\n{{ base }}\n\n#### Icon Button\n\n{{ icon-btn }}\n\n#### Ghost Button\n\n{{ ghost-btn }}\n\n#### Combination Button\n\n{{ group-btn }}\n\n#### Banner Button\n\n{{ block-btn }}\n\n### 02 Component State\n\n#### Buttons for different states\n\n{{ disabled }}\n\n### 03 Component Style\n\n#### Different sizes of buttons\n\n{{ size }}\n\n#### Different shaped buttons\n\n{{ shape }}\n\n#### Different color theme buttons\n\n{{ theme }}\n\n\n\n## API\n\n### Button Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\napp-parameter | String | - | \\- | N\nblock | Boolean | false | make button to be a block-level element | N\ncontent | String / Slot | - | button's children elements。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ncustom-dataset | any | - | \\- | N\ndisabled | Boolean | undefined | disable the button, make it can not be clicked | N\nghost | Boolean | false | make background-color to be transparent | N\nhover-class | String | - | \\- | N\nhover-start-time | Number | 20 | \\- | N\nhover-stay-time | Number | 70 | \\- | N\nhover-stop-propagation | Boolean | false | \\- | N\nicon | String / Object | - | icon name | N\nlang | String | - | message language。options: en/zh_CN/zh_TW | N\nloading | Boolean | false | set button to be loading state | N\nloading-props | Object | - | Typescript：`LoadingProps`，[Loading API Documents](./loading?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/button/type.ts) | N\nopen-type | String | - | open type of button, [Miniprogram Button](https://developers.weixin.qq.com/miniprogram/dev/component/button.html)。options: contact/share/getPhoneNumber/getUserInfo/launchApp/openSetting/feedback/chooseAvatar/agreePrivacyAuthorization | N\nphone-number-no-quota-toast | Boolean | true | \\- | N\nsend-message-img | String | 截图 | \\- | N\nsend-message-path | String | 当前分享路径 | \\- | N\nsend-message-title | String | 当前标题 | \\- | N\nsession-from | String | - | \\- | N\nshape | String | rectangle | button shape。options: rectangle/square/round/circle | N\nshow-message-card | Boolean | false | \\- | N\nsize | String | medium | a button has four size。options: extra-small/small/medium/large | N\nsuffix | Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nt-id | String | - | id | N\ntheme | String | default | button theme。options: default/primary/danger/light | N\ntype | String | - | type of button element, same as formType of Miniprogram。options: submit/reset | N\nvariant | String | base | variant of button。options: base/outline/dashed/text | N\n\n### Button Events\n\nname | params | description\n-- | -- | --\nagreeprivacyauthorization | \\- | \\-\nchooseavatar | \\- | \\-\ncontact | \\- | \\-\ncreateliveactivity | \\- | \\-\nerror | \\- | \\-\ngetphonenumber | \\- | \\-\ngetrealtimephonenumber | \\- | \\-\ngetuserinfo | \\- | \\-\nlaunchapp | \\- | \\-\nopensetting | \\- | \\-\ntap | `event` | \\-\n\n### Button External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-icon | class name of icon\nt-class-loading | class name of loading\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-button-border-radius | @radius-default | - \n--td-button-border-width | 4rpx | - \n--td-button-danger-active-bg-color | @error-color-active | - \n--td-button-danger-active-border-color | @error-color-active | - \n--td-button-danger-bg-color | @error-color | - \n--td-button-danger-border-color | @error-color | - \n--td-button-danger-color | @text-color-anti | - \n--td-button-danger-dashed-border-color | @button-danger-dashed-color | - \n--td-button-danger-dashed-color | @error-color | - \n--td-button-danger-dashed-disabled-color | @button-danger-disabled-color | - \n--td-button-danger-disabled-bg | @error-color-3 | - \n--td-button-danger-disabled-border-color | @error-color-3 | - \n--td-button-danger-disabled-color | @font-white-1 | - \n--td-button-danger-outline-active-bg-color | @bg-color-container-active | - \n--td-button-danger-outline-active-border-color | @error-color-active | - \n--td-button-danger-outline-border-color | @button-danger-outline-color | - \n--td-button-danger-outline-color | @error-color | - \n--td-button-danger-outline-disabled-color | @error-color-3 | - \n--td-button-danger-text-active-bg-color | @bg-color-container-active | - \n--td-button-danger-text-color | @error-color | - \n--td-button-danger-text-disabled-color | @button-danger-disabled-color | - \n--td-button-default-active-bg-color | @bg-color-component-active | - \n--td-button-default-active-border-color | @bg-color-component-active | - \n--td-button-default-bg-color | @bg-color-component | - \n--td-button-default-border-color | @bg-color-component | - \n--td-button-default-color | @text-color-primary | - \n--td-button-default-disabled-bg | @bg-color-component-disabled | - \n--td-button-default-disabled-border-color | @bg-color-component-disabled | - \n--td-button-default-disabled-color | @text-color-disabled | - \n--td-button-default-outline-active-bg-color | @bg-color-container-active | - \n--td-button-default-outline-active-border-color | @component-border | - \n--td-button-default-outline-border-color | @component-border | - \n--td-button-default-outline-color | @text-color-primary | - \n--td-button-default-outline-disabled-color | @component-border | - \n--td-button-default-text-active-bg-color | @bg-color-container-active | - \n--td-button-extra-small-font-size | @font-size-base | - \n--td-button-extra-small-height | 56rpx | - \n--td-button-extra-small-icon-font-size | 36rpx | - \n--td-button-extra-small-padding-horizontal | 16rpx | - \n--td-button-font-weight | 600 | - \n--td-button-ghost-border-color | @button-ghost-color | - \n--td-button-ghost-color | @text-color-anti | - \n--td-button-ghost-danger-border-color | @error-color | - \n--td-button-ghost-danger-color | @error-color | - \n--td-button-ghost-danger-hover-color | @error-color-active | - \n--td-button-ghost-disabled-color | @font-white-4 | - \n--td-button-ghost-hover-color | @font-white-2 | - \n--td-button-ghost-primary-border-color | @brand-color | - \n--td-button-ghost-primary-color | @brand-color | - \n--td-button-ghost-primary-hover-color | @brand-color-active | - \n--td-button-icon-border-radius | 8rpx | - \n--td-button-icon-spacer | @spacer | - \n--td-button-large-font-size | @font-size-m | - \n--td-button-large-height | 96rpx | - \n--td-button-large-icon-font-size | 48rpx | - \n--td-button-large-padding-horizontal | 40rpx | - \n--td-button-light-active-bg-color | @brand-color-light-active | - \n--td-button-light-active-border-color | @brand-color-light-active | - \n--td-button-light-bg-color | @brand-color-light | - \n--td-button-light-border-color | @brand-color-light | - \n--td-button-light-color | @brand-color | - \n--td-button-light-disabled-bg | @brand-color-light | - \n--td-button-light-disabled-border-color | @brand-color-light | - \n--td-button-light-disabled-color | @brand-color-disabled | - \n--td-button-light-outline-active-bg-color | @brand-color-light-active | - \n--td-button-light-outline-active-border-color | @brand-color-active | - \n--td-button-light-outline-bg-color | @brand-color-light | - \n--td-button-light-outline-border-color | @button-light-outline-color | - \n--td-button-light-outline-color | @brand-color | - \n--td-button-light-outline-disabled-color | @brand-color-disabled | - \n--td-button-light-text-active-bg-color | @bg-color-container-active | - \n--td-button-light-text-color | @brand-color | - \n--td-button-medium-font-size | @font-size-m | - \n--td-button-medium-height | 80rpx | - \n--td-button-medium-icon-font-size | 40rpx | - \n--td-button-medium-padding-horizontal | 32rpx | - \n--td-button-primary-active-bg-color | @brand-color-active | - \n--td-button-primary-active-border-color | @brand-color-active | - \n--td-button-primary-bg-color | @brand-color | - \n--td-button-primary-border-color | @brand-color | - \n--td-button-primary-color | @text-color-anti | - \n--td-button-primary-dashed-border-color | @button-primary-dashed-color | - \n--td-button-primary-dashed-color | @brand-color | - \n--td-button-primary-dashed-disabled-color | @brand-color-disabled | - \n--td-button-primary-disabled-bg | @brand-color-disabled | - \n--td-button-primary-disabled-border-color | @brand-color-disabled | - \n--td-button-primary-disabled-color | @text-color-anti | - \n--td-button-primary-outline-active-bg-color | @bg-color-container-active | - \n--td-button-primary-outline-active-border-color | @brand-color-active | - \n--td-button-primary-outline-border-color | @button-primary-outline-color | - \n--td-button-primary-outline-color | @brand-color | - \n--td-button-primary-outline-disabled-color | @brand-color-disabled | - \n--td-button-primary-text-active-bg-color | @bg-color-container-active | - \n--td-button-primary-text-color | @brand-color | - \n--td-button-primary-text-disabled-color | @brand-color-disabled | - \n--td-button-small-font-size | @font-size-base | - \n--td-button-small-height | 64rpx | - \n--td-button-small-icon-font-size | 36rpx | - \n--td-button-small-padding-horizontal | 24rpx | - \n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/README.md",
    "content": "---\ntitle: Button 按钮\ndescription: 用于开启一个闭环的操作任务，如“删除”对象、“购买”商品等。\nspline: base\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-83%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-button\": \"tdesign-miniprogram/button/button\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/F1cSo7mm75SS\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n\n### 01 组件类型\n\n#### 基础按钮\n\n{{ base }}\n\n#### 图标按钮\n\n{{ icon-btn }}\n\n#### 幽灵按钮\n\n{{ ghost-btn }}\n\n#### 组合按钮\n\n{{ group-btn }}\n\n#### 通栏按钮\n\n{{ block-btn }}\n\n### 02 组件状态\n\n#### 按钮禁用态\n\n{{ disabled }}\n\n### 03 组件样式\n\n#### 按钮尺寸\n\n{{ size }}\n\n#### 按钮形状\n\n{{ shape }}\n\n#### 按钮主题\n\n{{ theme }}\n\n## API\n\n### Button Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\napp-parameter | String | - | 打开 APP 时，向 APP 传递的参数，open-type=launchApp时有效 | N\nblock | Boolean | false | 是否为块级元素 | N\ncontent | String / Slot | - | 按钮内容。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ncustom-dataset | any | - | 自定义 dataset，可通过 event.currentTarget.dataset.custom 获取 | N\ndisabled | Boolean | undefined | 禁用状态。优先级：Button.disabled > Form.disabled | N\nghost | Boolean | false | 是否为幽灵按钮（镂空按钮） | N\nhover-class | String | - | 指定按钮按下去的样式类，按钮不为加载或禁用状态时有效。当 `hover-class=\"none\"` 时，没有点击态效果 | N\nhover-start-time | Number | 20 | 按住后多久出现点击态，单位毫秒 | N\nhover-stay-time | Number | 70 | 手指松开后点击态保留时间，单位毫秒 | N\nhover-stop-propagation | Boolean | false | 指定是否阻止本节点的祖先节点出现点击态 | N\nicon | String / Object | - | 图标名称。值为字符串表示图标名称，值为 `Object` 类型，表示透传至 `icon`。 | N\nlang | String | - | 指定返回用户信息的语言，zh_CN 简体中文，zh_TW 繁体中文，en 英文。。<br />具体释义：<br />`en` 英文；<br />`zh_CN` 简体中文；<br />`zh_TW` 繁体中文。<br />[小程序官方文档](https://developers.weixin.qq.com/miniprogram/dev/component/button.html)。。可选项：en/zh_CN/zh_TW | N\nloading | Boolean | false | 是否显示为加载状态 | N\nloading-props | Object | - | 透传 Loading 组件全部属性。TS 类型：`LoadingProps`，[Loading API Documents](./loading?tab=api)。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/button/type.ts) | N\nopen-type | String | - | 微信开放能力。<br />具体释义：<br />`contact` 打开客服会话，如果用户在会话中点击消息卡片后返回小程序，可以从 bindcontact 回调中获得具体信息，<a href=\"https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/customer-message/customer-message.html\">具体说明</a> （*小程序插件中不能使用*）；<br />`share` 触发用户转发，使用前建议先阅读<a href=\"https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html#使用指引\">使用指引</a>；<br />`getPhoneNumber` 获取用户手机号，可以从 bindgetphonenumber 回调中获取到用户信息，<a href=\"https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html\">具体说明</a> （*小程序插件中不能使用*）；<br />`getUserInfo` 获取用户信息，可以从 bindgetuserinfo 回调中获取到用户信息 （*小程序插件中不能使用*）；<br />`launchApp` 打开APP，可以通过 app-parameter 属性设定向 APP 传的参数<a href=\"https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/launchApp.html\">具体说明</a>；<br />`openSetting` 打开授权设置页；<br />`feedback` 打开“意见反馈”页面，用户可提交反馈内容并上传<a href=\"https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/wx.getLogManager.html\">日志</a>，开发者可以登录<a href=\"https://mp.weixin.qq.com/\">小程序管理后台</a>后进入左侧菜单“客服反馈”页面获取到反馈内容；<br />`chooseAvatar` 获取用户头像，可以从 bindchooseavatar 回调中获取到头像信息；<br />`agreePrivacyAuthorization`用户同意隐私协议按钮。用户点击一次此按钮后，所有隐私接口可以正常调用。可通过`bindagreeprivacyauthorization`监听用户同意隐私协议事件。隐私合规开发指南详情可见《<a href=\"https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html\">小程序隐私协议开发指南</a>》。<br />[小程序官方文档](https://developers.weixin.qq.com/miniprogram/dev/component/button.html)。。可选项：contact/share/getPhoneNumber/getUserInfo/launchApp/openSetting/feedback/chooseAvatar/agreePrivacyAuthorization | N\nphone-number-no-quota-toast | Boolean | true | 原生按钮属性，当手机号快速验证或手机号实时验证额度用尽时，是否对用户展示“申请获取你的手机号，但该功能使用次数已达当前小程序上限，暂时无法使用”的提示，默认展示，open-type=\"getPhoneNumber\" 或 open-type=\"getRealtimePhoneNumber\" 时有效 | N\nsend-message-img | String | 截图 | 会话内消息卡片图片，open-type=\"contact\"时有效 | N\nsend-message-path | String | 当前分享路径 | 会话内消息卡片点击跳转小程序路径，open-type=\"contact\"时有效 | N\nsend-message-title | String | 当前标题 | 会话内消息卡片标题，open-type=\"contact\"时有效 | N\nsession-from | String | - | 会话来源，open-type=\"contact\"时有效 | N\nshape | String | rectangle | 按钮形状，有 4 种：长方形、正方形、圆角长方形、圆形。可选项：rectangle/square/round/circle | N\nshow-message-card | Boolean | false | 是否显示会话内消息卡片，设置此参数为 true，用户进入客服会话会在右下角显示\"可能要发送的小程序\"提示，用户点击后可以快速发送小程序消息，open-type=\"contact\"时有效 | N\nsize | String | medium | 组件尺寸。可选项：extra-small/small/medium/large | N\nsuffix | Slot | - | 右侧内容，可用于定义右侧图标。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nt-id | String | - | 按钮标签id | N\ntheme | String | default | 组件风格，依次为品牌色、危险色。可选项：default/primary/danger/light | N\ntype | String | - | 同小程序的 formType。可选项：submit/reset | N\nvariant | String | base | 按钮形式，基础、线框、虚线、文字。可选项：base/outline/dashed/text | N\n\n### Button Events\n\n名称 | 参数 | 描述\n-- | -- | --\nagreeprivacyauthorization | \\- | 原生按钮属性，用户同意隐私协议事件回调，open-type=agreePrivacyAuthorization时有效 （Tips: 如果使用 onNeedPrivacyAuthorization 接口，需要在 bindagreeprivacyauthorization 触发后再调用 resolve({ event: \"agree\", buttonId })）\nchooseavatar | \\- | 原生按钮属性，获取用户头像回调，`open-type=chooseAvatar` 时有效。返回 `e.detail.avatarUrl` 为头像临时文件链接\ncontact | \\- | 原生按钮属性，客服消息回调，`open-type=\"contact\"` 时有效\ncreateliveactivity | \\- | 新的一次性订阅消息下发机制回调，`open-type=liveActivity` 时有效\nerror | \\- | 原生按钮属性，当使用开放能力时，发生错误的回调，`open-type=launchApp` 时有效\ngetphonenumber | \\- | 原生按钮属性，手机号快速验证回调，open-type=getPhoneNumber时有效。Tips：在触发 bindgetphonenumber 回调后应立即隐藏手机号按钮组件，或置为 disabled 状态，避免用户重复授权手机号产生额外费用\ngetrealtimephonenumber | \\- | 原生按钮属性，手机号实时验证回调，open-type=getRealtimePhoneNumber 时有效。Tips：在触发 bindgetrealtimephonenumber 回调后应立即隐藏手机号按钮组件，或置为 disabled 状态，避免用户重复授权手机号产生额外费用\ngetuserinfo | \\- | 原生按钮属性，用户点击该按钮时，会返回获取到的用户信息，回调的detail数据与wx.getUserInfo返回的一致，open-type=\"getUserInfo\"时有效\nlaunchapp | \\- | 打开 APP 成功的回调，`open-type=launchApp` 时有效\nopensetting | \\- | 原生按钮属性，在打开授权设置页后回调，open-type=openSetting时有效\ntap | `event` | 点击按钮，当按钮不为加载或禁用状态时触发\n\n### Button External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-icon | 图标样式类\nt-class-loading | 加载样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-button-border-radius | @radius-default | - \n--td-button-border-width | 4rpx | - \n--td-button-danger-active-bg-color | @error-color-active | - \n--td-button-danger-active-border-color | @error-color-active | - \n--td-button-danger-bg-color | @error-color | - \n--td-button-danger-border-color | @error-color | - \n--td-button-danger-color | @text-color-anti | - \n--td-button-danger-dashed-border-color | @button-danger-dashed-color | - \n--td-button-danger-dashed-color | @error-color | - \n--td-button-danger-dashed-disabled-color | @button-danger-disabled-color | - \n--td-button-danger-disabled-bg | @error-color-3 | - \n--td-button-danger-disabled-border-color | @error-color-3 | - \n--td-button-danger-disabled-color | @font-white-1 | - \n--td-button-danger-outline-active-bg-color | @bg-color-container-active | - \n--td-button-danger-outline-active-border-color | @error-color-active | - \n--td-button-danger-outline-border-color | @button-danger-outline-color | - \n--td-button-danger-outline-color | @error-color | - \n--td-button-danger-outline-disabled-color | @error-color-3 | - \n--td-button-danger-text-active-bg-color | @bg-color-container-active | - \n--td-button-danger-text-color | @error-color | - \n--td-button-danger-text-disabled-color | @button-danger-disabled-color | - \n--td-button-default-active-bg-color | @bg-color-component-active | - \n--td-button-default-active-border-color | @bg-color-component-active | - \n--td-button-default-bg-color | @bg-color-component | - \n--td-button-default-border-color | @bg-color-component | - \n--td-button-default-color | @text-color-primary | - \n--td-button-default-disabled-bg | @bg-color-component-disabled | - \n--td-button-default-disabled-border-color | @bg-color-component-disabled | - \n--td-button-default-disabled-color | @text-color-disabled | - \n--td-button-default-outline-active-bg-color | @bg-color-container-active | - \n--td-button-default-outline-active-border-color | @component-border | - \n--td-button-default-outline-border-color | @component-border | - \n--td-button-default-outline-color | @text-color-primary | - \n--td-button-default-outline-disabled-color | @component-border | - \n--td-button-default-text-active-bg-color | @bg-color-container-active | - \n--td-button-extra-small-font-size | @font-size-base | - \n--td-button-extra-small-height | 56rpx | - \n--td-button-extra-small-icon-font-size | 36rpx | - \n--td-button-extra-small-padding-horizontal | 16rpx | - \n--td-button-font-weight | 600 | - \n--td-button-ghost-border-color | @button-ghost-color | - \n--td-button-ghost-color | @text-color-anti | - \n--td-button-ghost-danger-border-color | @error-color | - \n--td-button-ghost-danger-color | @error-color | - \n--td-button-ghost-danger-hover-color | @error-color-active | - \n--td-button-ghost-disabled-color | @font-white-4 | - \n--td-button-ghost-hover-color | @font-white-2 | - \n--td-button-ghost-primary-border-color | @brand-color | - \n--td-button-ghost-primary-color | @brand-color | - \n--td-button-ghost-primary-hover-color | @brand-color-active | - \n--td-button-icon-border-radius | 8rpx | - \n--td-button-icon-spacer | @spacer | - \n--td-button-large-font-size | @font-size-m | - \n--td-button-large-height | 96rpx | - \n--td-button-large-icon-font-size | 48rpx | - \n--td-button-large-padding-horizontal | 40rpx | - \n--td-button-light-active-bg-color | @brand-color-light-active | - \n--td-button-light-active-border-color | @brand-color-light-active | - \n--td-button-light-bg-color | @brand-color-light | - \n--td-button-light-border-color | @brand-color-light | - \n--td-button-light-color | @brand-color | - \n--td-button-light-disabled-bg | @brand-color-light | - \n--td-button-light-disabled-border-color | @brand-color-light | - \n--td-button-light-disabled-color | @brand-color-disabled | - \n--td-button-light-outline-active-bg-color | @brand-color-light-active | - \n--td-button-light-outline-active-border-color | @brand-color-active | - \n--td-button-light-outline-bg-color | @brand-color-light | - \n--td-button-light-outline-border-color | @button-light-outline-color | - \n--td-button-light-outline-color | @brand-color | - \n--td-button-light-outline-disabled-color | @brand-color-disabled | - \n--td-button-light-text-active-bg-color | @bg-color-container-active | - \n--td-button-light-text-color | @brand-color | - \n--td-button-medium-font-size | @font-size-m | - \n--td-button-medium-height | 80rpx | - \n--td-button-medium-icon-font-size | 40rpx | - \n--td-button-medium-padding-horizontal | 32rpx | - \n--td-button-primary-active-bg-color | @brand-color-active | - \n--td-button-primary-active-border-color | @brand-color-active | - \n--td-button-primary-bg-color | @brand-color | - \n--td-button-primary-border-color | @brand-color | - \n--td-button-primary-color | @text-color-anti | - \n--td-button-primary-dashed-border-color | @button-primary-dashed-color | - \n--td-button-primary-dashed-color | @brand-color | - \n--td-button-primary-dashed-disabled-color | @brand-color-disabled | - \n--td-button-primary-disabled-bg | @brand-color-disabled | - \n--td-button-primary-disabled-border-color | @brand-color-disabled | - \n--td-button-primary-disabled-color | @text-color-anti | - \n--td-button-primary-outline-active-bg-color | @bg-color-container-active | - \n--td-button-primary-outline-active-border-color | @brand-color-active | - \n--td-button-primary-outline-border-color | @button-primary-outline-color | - \n--td-button-primary-outline-color | @brand-color | - \n--td-button-primary-outline-disabled-color | @brand-color-disabled | - \n--td-button-primary-text-active-bg-color | @bg-color-container-active | - \n--td-button-primary-text-color | @brand-color | - \n--td-button-primary-text-disabled-color | @brand-color-disabled | - \n--td-button-small-font-size | @font-size-base | - \n--td-button-small-height | 64rpx | - \n--td-button-small-icon-font-size | 36rpx | - \n--td-button-small-padding-horizontal | 24rpx | - \n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/button.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nimport type { TdButtonProps } from './type';\nexport interface ButtonProps extends TdButtonProps {\n}\nexport default class Button extends SuperComponent {\n    externalClasses: string[];\n    behaviors: string[];\n    properties: TdButtonProps;\n    options: {\n        multipleSlots: boolean;\n    };\n    data: {\n        prefix: string;\n        className: string;\n        classPrefix: string;\n    };\n    observers: {\n        'theme, size, plain, block, shape, disabled, loading, variant'(): void;\n        icon(icon: any): void;\n    };\n    lifetimes: {\n        attached(): void;\n    };\n    methods: {\n        setClass(): void;\n        getuserinfo(e: any): void;\n        contact(e: any): void;\n        getphonenumber(e: any): void;\n        error(e: any): void;\n        opensetting(e: any): void;\n        launchapp(e: any): void;\n        chooseavatar(e: any): void;\n        agreeprivacyauthorization(e: any): void;\n        handleTap(e: any): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/button.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport { canIUseFormFieldButton } from '../common/version';\nimport { calcIcon } from '../common/utils';\nconst { prefix } = config;\nconst name = `${prefix}-button`;\nlet Button = class Button extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-icon`, `${prefix}-class-loading`];\n        this.behaviors = canIUseFormFieldButton() ? ['wx://form-field-button'] : [];\n        this.properties = props;\n        this.options = {\n            multipleSlots: true,\n        };\n        this.data = {\n            prefix,\n            className: '',\n            classPrefix: name,\n        };\n        this.observers = {\n            'theme, size, plain, block, shape, disabled, loading, variant'() {\n                this.setClass();\n            },\n            icon(icon) {\n                this.setData({\n                    _icon: calcIcon(icon, ''),\n                });\n            },\n        };\n        this.lifetimes = {\n            attached() {\n                this.setClass();\n            },\n        };\n        this.methods = {\n            setClass() {\n                const classList = [\n                    name,\n                    `${prefix}-class`,\n                    `${name}--${this.data.variant || 'base'}`,\n                    `${name}--${this.data.theme || 'default'}`,\n                    `${name}--${this.data.shape || 'rectangle'}`,\n                    `${name}--size-${this.data.size || 'medium'}`,\n                ];\n                if (this.data.block) {\n                    classList.push(`${name}--block`);\n                }\n                if (this.data.disabled) {\n                    classList.push(`${name}--disabled`);\n                }\n                if (this.data.ghost) {\n                    classList.push(`${name}--ghost`);\n                }\n                this.setData({\n                    className: classList.join(' '),\n                });\n            },\n            getuserinfo(e) {\n                this.triggerEvent('getuserinfo', e.detail);\n            },\n            contact(e) {\n                this.triggerEvent('contact', e.detail);\n            },\n            getphonenumber(e) {\n                this.triggerEvent('getphonenumber', e.detail);\n            },\n            error(e) {\n                this.triggerEvent('error', e.detail);\n            },\n            opensetting(e) {\n                this.triggerEvent('opensetting', e.detail);\n            },\n            launchapp(e) {\n                this.triggerEvent('launchapp', e.detail);\n            },\n            chooseavatar(e) {\n                this.triggerEvent('chooseavatar', e.detail);\n            },\n            agreeprivacyauthorization(e) {\n                this.triggerEvent('agreeprivacyauthorization', e.detail);\n            },\n            handleTap(e) {\n                if (this.data.disabled || this.data.loading)\n                    return;\n                this.triggerEvent('tap', e);\n            },\n        };\n    }\n};\nButton = __decorate([\n    wxComponent()\n], Button);\nexport default Button;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/button.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\",\n    \"t-loading\": \"../loading/loading\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/button.wxml",
    "content": "<import src=\"../common/template/icon.wxml\" />\n<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<button\n  id=\"{{tId}}\"\n  style=\"{{_._style([style, customStyle])}}\"\n  data-custom=\"{{ customDataset }}\"\n  class=\"class {{className}}\"\n  form-type=\"{{disabled || loading ? '' : type}}\"\n  open-type=\"{{disabled || loading ? '' : openType}}\"\n  hover-stop-propagation=\"{{hoverStopPropagation}}\"\n  hover-start-time=\"{{hoverStartTime}}\"\n  hover-stay-time=\"{{hoverStayTime}}\"\n  lang=\"{{lang}}\"\n  session-from=\"{{sessionFrom}}\"\n  hover-class=\"{{disabled || loading ? '' : (hoverClass || classPrefix + '--hover')}}\"\n  send-message-title=\"{{sendMessageTitle}}\"\n  send-message-path=\"{{sendMessagePath}}\"\n  send-message-img=\"{{sendMessageImg}}\"\n  app-parameter=\"{{appParameter}}\"\n  show-message-card=\"{{showMessageCard}}\"\n  catch:tap=\"handleTap\"\n  bind:getuserinfo=\"getuserinfo\"\n  bind:contact=\"contact\"\n  bind:getphonenumber=\"getphonenumber\"\n  bind:error=\"error\"\n  bind:opensetting=\"opensetting\"\n  bind:launchapp=\"launchapp\"\n  bind:chooseavatar=\"chooseavatar\"\n  bind:agreeprivacyauthorization=\"agreeprivacyauthorization\"\n  aria-label=\"{{ariaLabel}}\"\n>\n  <template\n    wx:if=\"{{_icon}}\"\n    is=\"icon\"\n    data=\"{{tClass: classPrefix + '__icon ' + prefix + '-class-icon', ariaHidden: true, name: iconName, ..._icon}}\"\n  />\n  <t-loading\n    wx:if=\"{{loading}}\"\n    delay=\"{{loadingProps.delay || 0}}\"\n    duration=\"{{loadingProps.duration || 800}}\"\n    indicator=\"{{loadingProps.indicator || true}}\"\n    inheritColor=\"{{loadingProps.inheritColor || true}}\"\n    layout=\"{{loadingProps.layout || 'horizontal'}}\"\n    pause=\"{{loadingProps.pause || false}}\"\n    progress=\"{{loadingProps.progress || 0}}\"\n    reverse=\"{{loadingProps.reverse || false}}\"\n    size=\"{{loadingProps.size || '40rpx'}}\"\n    text=\"{{loadingProps.text || '' }}\"\n    theme=\"{{loadingProps.theme || 'circular'}}\"\n    loading\n    t-class=\"{{classPrefix}}__loading {{classPrefix}}__loading--wrapper\"\n    t-class-indicator=\"{{classPrefix}}__loading--indicator {{prefix}}-class-loading\"\n  />\n  <view class=\"{{classPrefix}}__content\">\n    <slot name=\"content\" />\n    <block wx:if=\"{{content}}\">{{content}}</block>\n    <slot />\n  </view>\n  <slot name=\"suffix\" />\n</button>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/button.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-button--size-extra-small {\n  font-size: var(--td-button-extra-small-font-size, var(--td-font-size-base, 28rpx));\n  padding-left: var(--td-button-extra-small-padding-horizontal, 16rpx);\n  padding-right: var(--td-button-extra-small-padding-horizontal, 16rpx);\n  height: var(--td-button-extra-small-height, 56rpx);\n  line-height: var(--td-button-extra-small-height, 56rpx);\n}\n.t-button--size-extra-small .t-button__icon {\n  font-size: var(--td-button-extra-small-icon-font-size, 36rpx);\n}\n.t-button--size-small {\n  font-size: var(--td-button-small-font-size, var(--td-font-size-base, 28rpx));\n  padding-left: var(--td-button-small-padding-horizontal, 24rpx);\n  padding-right: var(--td-button-small-padding-horizontal, 24rpx);\n  height: var(--td-button-small-height, 64rpx);\n  line-height: var(--td-button-small-height, 64rpx);\n}\n.t-button--size-small .t-button__icon {\n  font-size: var(--td-button-small-icon-font-size, 36rpx);\n}\n.t-button--size-medium {\n  font-size: var(--td-button-medium-font-size, var(--td-font-size-m, 32rpx));\n  padding-left: var(--td-button-medium-padding-horizontal, 32rpx);\n  padding-right: var(--td-button-medium-padding-horizontal, 32rpx);\n  height: var(--td-button-medium-height, 80rpx);\n  line-height: var(--td-button-medium-height, 80rpx);\n}\n.t-button--size-medium .t-button__icon {\n  font-size: var(--td-button-medium-icon-font-size, 40rpx);\n}\n.t-button--size-large {\n  font-size: var(--td-button-large-font-size, var(--td-font-size-m, 32rpx));\n  padding-left: var(--td-button-large-padding-horizontal, 40rpx);\n  padding-right: var(--td-button-large-padding-horizontal, 40rpx);\n  height: var(--td-button-large-height, 96rpx);\n  line-height: var(--td-button-large-height, 96rpx);\n}\n.t-button--size-large .t-button__icon {\n  font-size: var(--td-button-large-icon-font-size, 48rpx);\n}\n.t-button--default {\n  color: var(--td-button-default-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  background-color: var(--td-button-default-bg-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  border-color: var(--td-button-default-border-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-button--default::after {\n  border-width: var(--td-button-border-width, 4rpx);\n  border-color: var(--td-button-default-border-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-button--default.t-button--hover {\n  z-index: 0;\n}\n.t-button--default.t-button--hover,\n.t-button--default.t-button--hover::after {\n  background-color: var(--td-button-default-active-bg-color, var(--td-bg-color-component-active, var(--td-gray-color-6, #a6a6a6)));\n  border-color: var(--td-button-default-active-border-color, var(--td-bg-color-component-active, var(--td-gray-color-6, #a6a6a6)));\n}\n.t-button--default.t-button--disabled {\n  color: var(--td-button-default-disabled-color, var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26))));\n  background-color: var(--td-button-default-disabled-bg, var(--td-bg-color-component-disabled, var(--td-gray-color-2, #eeeeee)));\n}\n.t-button--default.t-button--disabled,\n.t-button--default.t-button--disabled::after {\n  border-color: var(--td-button-default-disabled-border-color, var(--td-bg-color-component-disabled, var(--td-gray-color-2, #eeeeee)));\n}\n.t-button--primary {\n  color: var(--td-button-primary-color, var(--td-text-color-anti, var(--td-font-white-1, #ffffff)));\n  background-color: var(--td-button-primary-bg-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  border-color: var(--td-button-primary-border-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-button--primary::after {\n  border-width: var(--td-button-border-width, 4rpx);\n  border-color: var(--td-button-primary-border-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-button--primary.t-button--hover {\n  z-index: 0;\n}\n.t-button--primary.t-button--hover,\n.t-button--primary.t-button--hover::after {\n  background-color: var(--td-button-primary-active-bg-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));\n  border-color: var(--td-button-primary-active-border-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));\n}\n.t-button--primary.t-button--disabled {\n  color: var(--td-button-primary-disabled-color, var(--td-text-color-anti, var(--td-font-white-1, #ffffff)));\n  background-color: var(--td-button-primary-disabled-bg, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-button--primary.t-button--disabled,\n.t-button--primary.t-button--disabled::after {\n  border-color: var(--td-button-primary-disabled-border-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-button--light {\n  color: var(--td-button-light-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  background-color: var(--td-button-light-bg-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n  border-color: var(--td-button-light-border-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n}\n.t-button--light::after {\n  border-width: var(--td-button-border-width, 4rpx);\n  border-color: var(--td-button-light-border-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n}\n.t-button--light.t-button--hover {\n  z-index: 0;\n}\n.t-button--light.t-button--hover,\n.t-button--light.t-button--hover::after {\n  background-color: var(--td-button-light-active-bg-color, var(--td-brand-color-light-active, var(--td-primary-color-2, #d9e1ff)));\n  border-color: var(--td-button-light-active-border-color, var(--td-brand-color-light-active, var(--td-primary-color-2, #d9e1ff)));\n}\n.t-button--light.t-button--disabled {\n  color: var(--td-button-light-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n  background-color: var(--td-button-light-disabled-bg, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n}\n.t-button--light.t-button--disabled,\n.t-button--light.t-button--disabled::after {\n  border-color: var(--td-button-light-disabled-border-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n}\n.t-button--danger {\n  color: var(--td-button-danger-color, var(--td-text-color-anti, var(--td-font-white-1, #ffffff)));\n  background-color: var(--td-button-danger-bg-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n  border-color: var(--td-button-danger-border-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n}\n.t-button--danger::after {\n  border-width: var(--td-button-border-width, 4rpx);\n  border-color: var(--td-button-danger-border-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n}\n.t-button--danger.t-button--hover {\n  z-index: 0;\n}\n.t-button--danger.t-button--hover,\n.t-button--danger.t-button--hover::after {\n  background-color: var(--td-button-danger-active-bg-color, var(--td-error-color-active, var(--td-error-color-7, #ad352f)));\n  border-color: var(--td-button-danger-active-border-color, var(--td-error-color-active, var(--td-error-color-7, #ad352f)));\n}\n.t-button--danger.t-button--disabled {\n  color: var(--td-button-danger-disabled-color, var(--td-font-white-1, #ffffff));\n  background-color: var(--td-button-danger-disabled-bg, var(--td-error-color-3, #ffb9b0));\n}\n.t-button--danger.t-button--disabled,\n.t-button--danger.t-button--disabled::after {\n  border-color: var(--td-button-danger-disabled-border-color, var(--td-error-color-3, #ffb9b0));\n}\n.t-button {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  position: relative;\n  white-space: nowrap;\n  text-align: center;\n  background-image: none;\n  transition: all 0.3s;\n  touch-action: manipulation;\n  border-radius: var(--td-button-border-radius, var(--td-radius-default, 12rpx));\n  outline: none;\n  font-family: PingFang SC, Microsoft YaHei, Arial Regular;\n  font-weight: var(--td-button-font-weight, 600);\n  vertical-align: top;\n  box-sizing: border-box;\n  cursor: pointer;\n  -webkit-tap-highlight-color: transparent;\n  -webkit-user-select: none;\n  user-select: none;\n  /* stylelint-disable-next-line */\n  -webkit-appearance: none;\n}\n.t-button::after {\n  border-radius: calc(var(--td-button-border-radius, var(--td-radius-default, 12rpx)) * 2);\n}\n.t-button--text {\n  color: var(--td-button-default-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  background-color: transparent;\n}\n.t-button--text,\n.t-button--text::after {\n  border: 0;\n}\n.t-button--text.t-button--hover,\n.t-button--text.t-button--hover::after {\n  background-color: var(--td-button-default-text-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-button--text.t-button--primary {\n  color: var(--td-button-primary-text-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  background-color: transparent;\n}\n.t-button--text.t-button--primary.t-button--hover,\n.t-button--text.t-button--primary.t-button--hover::after {\n  background-color: var(--td-button-primary-text-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-button--text.t-button--primary.t-button--disabled {\n  color: var(--td-button-primary-text-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n  background-color: var(--td-bg-color-container, var(--td-font-white-1, #ffffff));\n}\n.t-button--text.t-button--danger {\n  color: var(--td-button-danger-text-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n  background-color: transparent;\n}\n.t-button--text.t-button--danger.t-button--hover,\n.t-button--text.t-button--danger.t-button--hover::after {\n  background-color: var(--td-button-danger-text-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-button--text.t-button--danger.t-button--disabled {\n  color: var(--td-button-danger-text-disabled-color, var(--td-button-danger-disabled-color, var(--td-font-white-1, #ffffff)));\n  background-color: var(--td-bg-color-container, var(--td-font-white-1, #ffffff));\n}\n.t-button--text.t-button--light {\n  color: var(--td-button-light-text-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  background-color: transparent;\n}\n.t-button--text.t-button--light.t-button--hover,\n.t-button--text.t-button--light.t-button--hover::after {\n  background-color: var(--td-button-light-text-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-button--text.t-button--disabled {\n  color: var(--td-button-default-disabled-color, var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26))));\n}\n.t-button--outline {\n  color: var(--td-button-default-outline-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  background-color: var(--td-bg-color-container, var(--td-font-white-1, #ffffff));\n}\n.t-button--outline,\n.t-button--outline::after {\n  border-color: var(--td-button-default-outline-border-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));\n}\n.t-button--outline.t-button--hover,\n.t-button--outline.t-button--hover::after {\n  background-color: var(--td-button-default-outline-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));\n  border-color: var(--td-button-default-outline-active-border-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));\n}\n.t-button--outline.t-button--disabled {\n  color: var(--td-button-default-outline-disabled-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));\n}\n.t-button--outline.t-button--disabled,\n.t-button--outline.t-button--disabled::after {\n  border-color: var(--td-button-default-outline-disabled-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));\n}\n.t-button--outline.t-button--primary {\n  color: var(--td-button-primary-outline-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-button--outline.t-button--primary,\n.t-button--outline.t-button--primary::after {\n  border-color: var(--td-button-primary-outline-border-color, var(--td-button-primary-outline-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9))));\n}\n.t-button--outline.t-button--primary.t-button--hover {\n  color: var(--td-button-primary-outline-active-border-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));\n}\n.t-button--outline.t-button--primary.t-button--hover::after {\n  background-color: var(--td-button-primary-outline-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));\n  border-color: var(--td-button-primary-outline-active-border-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));\n}\n.t-button--outline.t-button--primary.t-button--disabled {\n  background-color: transparent;\n  color: var(--td-button-primary-outline-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-button--outline.t-button--primary.t-button--disabled,\n.t-button--outline.t-button--primary.t-button--disabled::after {\n  border-color: var(--td-button-primary-outline-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-button--outline.t-button--danger {\n  color: var(--td-button-danger-outline-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n}\n.t-button--outline.t-button--danger,\n.t-button--outline.t-button--danger::after {\n  border-color: var(--td-button-danger-outline-border-color, var(--td-button-danger-outline-color, var(--td-error-color, var(--td-error-color-6, #d54941))));\n}\n.t-button--outline.t-button--danger.t-button--hover {\n  color: var(--td-button-danger-outline-active-border-color, var(--td-error-color-active, var(--td-error-color-7, #ad352f)));\n}\n.t-button--outline.t-button--danger.t-button--hover::after {\n  background-color: var(--td-button-danger-outline-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));\n  border-color: var(--td-button-danger-outline-active-border-color, var(--td-error-color-active, var(--td-error-color-7, #ad352f)));\n}\n.t-button--outline.t-button--danger.t-button--disabled {\n  background-color: var(--td-bg-color-container, var(--td-font-white-1, #ffffff));\n  color: var(--td-button-danger-outline-disabled-color, var(--td-error-color-3, #ffb9b0));\n}\n.t-button--outline.t-button--danger.t-button--disabled,\n.t-button--outline.t-button--danger.t-button--disabled::after {\n  border-color: var(--td-button-danger-outline-disabled-color, var(--td-error-color-3, #ffb9b0));\n}\n.t-button--outline.t-button--light {\n  color: var(--td-button-light-outline-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  background-color: var(--td-button-light-outline-bg-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n}\n.t-button--outline.t-button--light,\n.t-button--outline.t-button--light::after {\n  border-color: var(--td-button-light-outline-border-color, var(--td-button-light-outline-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9))));\n}\n.t-button--outline.t-button--light.t-button--hover {\n  color: var(--td-button-light-outline-active-border-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));\n}\n.t-button--outline.t-button--light.t-button--hover,\n.t-button--outline.t-button--light.t-button--hover::after {\n  background-color: var(--td-button-light-outline-active-bg-color, var(--td-brand-color-light-active, var(--td-primary-color-2, #d9e1ff)));\n  border-color: var(--td-button-light-outline-active-border-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));\n}\n.t-button--outline.t-button--light.t-button--disabled {\n  background-color: var(--td-bg-color-container, var(--td-font-white-1, #ffffff));\n  color: var(--td-button-light-outline-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-button--outline.t-button--light.t-button--disabled,\n.t-button--outline.t-button--light.t-button--disabled::after {\n  border-color: var(--td-button-light-outline-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-button--dashed {\n  background-color: var(--td-bg-color-container, var(--td-font-white-1, #ffffff));\n  border-style: dashed;\n  border-width: 2rpx;\n}\n.t-button--dashed::after {\n  border: 0;\n}\n.t-button--dashed.t-button--hover,\n.t-button--dashed.t-button--hover::after {\n  background-color: var(--td-button-default-outline-active-bg-color, var(--td-bg-color-container-active, var(--td-gray-color-3, #e7e7e7)));\n  border-color: var(--td-button-default-outline-active-border-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));\n}\n.t-button--dashed.t-button--primary {\n  color: var(--td-button-primary-dashed-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-button--dashed.t-button--primary,\n.t-button--dashed.t-button--primary::after {\n  border-color: var(--td-button-primary-dashed-border-color, var(--td-button-primary-dashed-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9))));\n}\n.t-button--dashed.t-button--primary.t-button--disabled {\n  background-color: var(--td-bg-color-container, var(--td-font-white-1, #ffffff));\n  color: var(--td-button-primary-dashed-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-button--dashed.t-button--primary.t-button--disabled,\n.t-button--dashed.t-button--primary.t-button--disabled::after {\n  border-color: var(--td-button-primary-dashed-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-button--dashed.t-button--danger {\n  color: var(--td-button-danger-dashed-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n}\n.t-button--dashed.t-button--danger,\n.t-button--dashed.t-button--danger::after {\n  border-color: var(--td-button-danger-dashed-border-color, var(--td-button-danger-dashed-color, var(--td-error-color, var(--td-error-color-6, #d54941))));\n}\n.t-button--dashed.t-button--danger.t-button--disabled {\n  background-color: transparent;\n  color: var(--td-button-danger-dashed-disabled-color, var(--td-button-danger-disabled-color, var(--td-font-white-1, #ffffff)));\n}\n.t-button--dashed.t-button--danger.t-button--disabled::after {\n  border-color: var(--td-button-danger-dashed-disabled-color, var(--td-button-danger-disabled-color, var(--td-font-white-1, #ffffff)));\n}\n.t-button--ghost {\n  background-color: transparent;\n  color: var(--td-button-ghost-color, var(--td-text-color-anti, var(--td-font-white-1, #ffffff)));\n}\n.t-button--ghost,\n.t-button--ghost::after {\n  border-color: var(--td-button-ghost-border-color, var(--td-button-ghost-color, var(--td-text-color-anti, var(--td-font-white-1, #ffffff))));\n}\n.t-button--ghost.t-button--default.t-button--hover {\n  color: var(--td-button-ghost-hover-color, var(--td-font-white-2, rgba(255, 255, 255, 0.55)));\n}\n.t-button--ghost.t-button--default.t-button--hover,\n.t-button--ghost.t-button--default.t-button--hover::after {\n  background-color: transparent;\n  border-color: var(--td-button-ghost-hover-color, var(--td-font-white-2, rgba(255, 255, 255, 0.55)));\n}\n.t-button--ghost.t-button--primary {\n  color: var(--td-button-ghost-primary-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-button--ghost.t-button--primary,\n.t-button--ghost.t-button--primary::after {\n  border-color: var(--td-button-ghost-primary-border-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-button--ghost.t-button--primary.t-button--hover {\n  color: var(--td-button-ghost-primary-hover-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));\n}\n.t-button--ghost.t-button--primary.t-button--hover,\n.t-button--ghost.t-button--primary.t-button--hover::after {\n  background-color: transparent;\n  border-color: var(--td-button-ghost-primary-hover-color, var(--td-brand-color-active, var(--td-primary-color-8, #003cab)));\n}\n.t-button--ghost.t-button--primary.t-button--text.t-button--hover,\n.t-button--ghost.t-button--primary.t-button--text.t-button--hover::after {\n  background-color: var(--td-gray-color-10, #4b4b4b);\n}\n.t-button--ghost.t-button--primary.t-button--disabled {\n  background-color: transparent;\n  color: var(--td-button-ghost-disabled-color, var(--td-font-white-4, rgba(255, 255, 255, 0.22)));\n}\n.t-button--ghost.t-button--primary.t-button--disabled,\n.t-button--ghost.t-button--primary.t-button--disabled::after {\n  border-color: var(--td-button-ghost-disabled-color, var(--td-font-white-4, rgba(255, 255, 255, 0.22)));\n}\n.t-button--ghost.t-button--danger {\n  color: var(--td-button-ghost-danger-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n}\n.t-button--ghost.t-button--danger,\n.t-button--ghost.t-button--danger::after {\n  border-color: var(--td-button-ghost-danger-border-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n}\n.t-button--ghost.t-button--danger.t-button--hover {\n  color: var(--td-button-ghost-danger-hover-color, var(--td-error-color-active, var(--td-error-color-7, #ad352f)));\n}\n.t-button--ghost.t-button--danger.t-button--hover,\n.t-button--ghost.t-button--danger.t-button--hover::after {\n  background-color: transparent;\n  border-color: var(--td-button-ghost-danger-hover-color, var(--td-error-color-active, var(--td-error-color-7, #ad352f)));\n}\n.t-button--ghost.t-button--danger.t-button--text.t-button--hover,\n.t-button--ghost.t-button--danger.t-button--text.t-button--hover::after {\n  background-color: var(--td-gray-color-10, #4b4b4b);\n}\n.t-button--ghost.t-button--danger.t-button--disabled {\n  background-color: transparent;\n  color: var(--td-button-ghost-disabled-color, var(--td-font-white-4, rgba(255, 255, 255, 0.22)));\n}\n.t-button--ghost.t-button--danger.t-button--disabled,\n.t-button--ghost.t-button--danger.t-button--disabled::after {\n  border-color: var(--td-button-ghost-disabled-color, var(--td-font-white-4, rgba(255, 255, 255, 0.22)));\n}\n.t-button--ghost.t-button--default.t-button--text.t-button--hover,\n.t-button--ghost.t-button--default.t-button--text.t-button--hover::after {\n  background-color: var(--td-gray-color-10, #4b4b4b);\n}\n.t-button--ghost.t-button--default.t-button--disabled {\n  background-color: transparent;\n  color: var(--td-button-ghost-disabled-color, var(--td-font-white-4, rgba(255, 255, 255, 0.22)));\n}\n.t-button--ghost.t-button--default.t-button--disabled,\n.t-button--ghost.t-button--default.t-button--disabled::after {\n  border-color: var(--td-button-ghost-disabled-color, var(--td-font-white-4, rgba(255, 255, 255, 0.22)));\n}\n.t-button__loading + .t-button__content:not(:empty),\n.t-button__icon + .t-button__content:not(:empty) {\n  margin-left: 8rpx;\n}\n.t-button__icon {\n  border-radius: var(--td-button-icon-border-radius, 8rpx);\n}\n.t-button--round.t-button--size-large {\n  border-radius: calc(var(--td-button-large-height, 96rpx) / 2);\n}\n.t-button--round.t-button--size-large::after {\n  border-radius: var(--td-button-large-height, 96rpx);\n}\n.t-button--round.t-button--size-medium {\n  border-radius: calc(var(--td-button-medium-height, 80rpx) / 2);\n}\n.t-button--round.t-button--size-medium::after {\n  border-radius: var(--td-button-medium-height, 80rpx);\n}\n.t-button--round.t-button--size-small {\n  border-radius: calc(var(--td-button-small-height, 64rpx) / 2);\n}\n.t-button--round.t-button--size-small::after {\n  border-radius: var(--td-button-small-height, 64rpx);\n}\n.t-button--round.t-button--size-extra-small {\n  border-radius: calc(var(--td-button-extra-small-height, 56rpx) / 2);\n}\n.t-button--round.t-button--size-extra-small::after {\n  border-radius: var(--td-button-extra-small-height, 56rpx);\n}\n.t-button--square {\n  padding: 0;\n}\n.t-button--square.t-button--size-large {\n  width: var(--td-button-large-height, 96rpx);\n}\n.t-button--square.t-button--size-medium {\n  width: var(--td-button-medium-height, 80rpx);\n}\n.t-button--square.t-button--size-small {\n  width: var(--td-button-small-height, 64rpx);\n}\n.t-button--square.t-button--size-extra-small {\n  width: var(--td-button-extra-small-height, 56rpx);\n}\n.t-button--circle {\n  padding: 0;\n  border-radius: 50%;\n}\n.t-button--circle.t-button--size-large {\n  width: var(--td-button-large-height, 96rpx);\n}\n.t-button--circle.t-button--size-large::after {\n  border-radius: 50%;\n}\n.t-button--circle.t-button--size-medium {\n  width: var(--td-button-medium-height, 80rpx);\n}\n.t-button--circle.t-button--size-medium::after {\n  border-radius: 50%;\n}\n.t-button--circle.t-button--size-small {\n  width: var(--td-button-small-height, 64rpx);\n}\n.t-button--circle.t-button--size-small::after {\n  border-radius: 50%;\n}\n.t-button--circle.t-button--size-extra-small {\n  width: var(--td-button-extra-small-height, 56rpx);\n}\n.t-button--circle.t-button--size-extra-small::after {\n  border-radius: 50%;\n}\n.t-button--block {\n  display: flex;\n  width: 100%;\n}\n.t-button--disabled {\n  cursor: not-allowed;\n}\n.t-button__loading--wrapper {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.t-button.t-button--hover::after {\n  z-index: -1;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/index.d.ts",
    "content": "export * from './props';\nexport * from './type';\nexport * from './button';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/index.js",
    "content": "export * from './props';\nexport * from './type';\nexport * from './button';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/props.d.ts",
    "content": "import { TdButtonProps } from './type';\ndeclare const props: TdButtonProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/props.js",
    "content": "const props = {\n    appParameter: {\n        type: String,\n        value: '',\n    },\n    block: {\n        type: Boolean,\n        value: false,\n    },\n    content: {\n        type: String,\n    },\n    customDataset: {\n        type: null,\n    },\n    disabled: {\n        type: null,\n        value: undefined,\n    },\n    ghost: {\n        type: Boolean,\n        value: false,\n    },\n    hoverClass: {\n        type: String,\n        value: '',\n    },\n    hoverStartTime: {\n        type: Number,\n        value: 20,\n    },\n    hoverStayTime: {\n        type: Number,\n        value: 70,\n    },\n    hoverStopPropagation: {\n        type: Boolean,\n        value: false,\n    },\n    icon: {\n        type: null,\n    },\n    lang: {\n        type: String,\n    },\n    loading: {\n        type: Boolean,\n        value: false,\n    },\n    loadingProps: {\n        type: Object,\n    },\n    openType: {\n        type: String,\n    },\n    phoneNumberNoQuotaToast: {\n        type: Boolean,\n        value: true,\n    },\n    sendMessageImg: {\n        type: String,\n        value: '截图',\n    },\n    sendMessagePath: {\n        type: String,\n        value: '当前分享路径',\n    },\n    sendMessageTitle: {\n        type: String,\n        value: '当前标题',\n    },\n    sessionFrom: {\n        type: String,\n        value: '',\n    },\n    shape: {\n        type: String,\n        value: 'rectangle',\n    },\n    showMessageCard: {\n        type: Boolean,\n        value: false,\n    },\n    size: {\n        type: String,\n        value: 'medium',\n    },\n    style: {\n        type: String,\n        value: '',\n    },\n    tId: {\n        type: String,\n        value: '',\n    },\n    theme: {\n        type: String,\n        value: 'default',\n    },\n    type: {\n        type: String,\n    },\n    variant: {\n        type: String,\n        value: 'base',\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/type.d.ts",
    "content": "import { LoadingProps } from '../loading/index';\nexport interface TdButtonProps {\n    appParameter?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    block?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    content?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    customDataset?: {\n        type: null;\n        value?: null;\n    };\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    ghost?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    hoverClass?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    hoverStartTime?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    hoverStayTime?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    hoverStopPropagation?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    icon?: {\n        type: null;\n        value?: string | object;\n    };\n    lang?: {\n        type: StringConstructor;\n        value?: 'en' | 'zh_CN' | 'zh_TW';\n    };\n    loading?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    loadingProps?: {\n        type: ObjectConstructor;\n        value?: LoadingProps;\n    };\n    openType?: {\n        type: StringConstructor;\n        value?: 'contact' | 'share' | 'getPhoneNumber' | 'getUserInfo' | 'launchApp' | 'openSetting' | 'feedback' | 'chooseAvatar' | 'agreePrivacyAuthorization';\n    };\n    phoneNumberNoQuotaToast?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    sendMessageImg?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    sendMessagePath?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    sendMessageTitle?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    sessionFrom?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    shape?: {\n        type: StringConstructor;\n        value?: 'rectangle' | 'square' | 'round' | 'circle';\n    };\n    showMessageCard?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    size?: {\n        type: StringConstructor;\n        value?: 'extra-small' | 'small' | 'medium' | 'large';\n    };\n    style?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    tId?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    theme?: {\n        type: StringConstructor;\n        value?: 'default' | 'primary' | 'danger' | 'light';\n    };\n    type?: {\n        type: StringConstructor;\n        value?: 'submit' | 'reset';\n    };\n    variant?: {\n        type: StringConstructor;\n        value?: 'base' | 'outline' | 'dashed' | 'text';\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/button/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Cell Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nalign | String | middle | options: top/middle/bottom | N\narrow | Boolean / Object | false | \\- | N\nbordered | Boolean | true | \\- | N\ndescription | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nhover | Boolean | - | \\- | N\nimage | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\njump-type | String | navigateTo | options: switchTab/reLaunch/redirectTo/navigateTo | N\nleft-icon | String / Object / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nnote | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nrequired | Boolean | false | \\- | N\nright-icon | String / Object / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ntitle | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nurl | String | - | \\- | N\n\n### Cell Events\n\nname | params | description\n-- | -- | --\nclick | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts)\n### Cell External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-center | \\-\nt-class-description | \\-\nt-class-hover | \\-\nt-class-image | \\-\nt-class-left | \\-\nt-class-left-icon | \\-\nt-class-note | \\-\nt-class-right | \\-\nt-class-right-icon | \\-\nt-class-title | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-cell-group-border-color | @component-stroke | - \n--td-cell-group-title-bg-color | @bg-color-secondarycontainer | - \n--td-cell-group-title-color | @text-color-placeholder | - \n--td-cell-group-title-font-size | 28rpx | - \n--td-cell-group-title-line-height | 90rpx | - \n--td-cell-group-title-padding-left | 32rpx | - \n--td-cell-bg-color | @bg-color-container | - \n--td-cell-border-color | @component-stroke | - \n--td-cell-border-left-space | @cell-horizontal-padding | - \n--td-cell-border-right-space | 0 | - \n--td-cell-border-width | 1px | - \n--td-cell-description-color | @text-color-secondary | - \n--td-cell-description-font-size | @font-size-base | - \n--td-cell-description-line-height | 44rpx | - \n--td-cell-height | auto | - \n--td-cell-horizontal-padding | 32rpx | - \n--td-cell-hover-color | @bg-color-secondarycontainer | - \n--td-cell-image-height | 96rpx | - \n--td-cell-image-width | 96rpx | - \n--td-cell-left-icon-color | @brand-color | - \n--td-cell-left-icon-font-size | 48rpx | - \n--td-cell-line-height | 48rpx | - \n--td-cell-note-color | @text-color-placeholder | - \n--td-cell-note-font-size | @font-size-m | - \n--td-cell-required-color | @error-color | - \n--td-cell-required-font-size | @font-size-m | - \n--td-cell-right-icon-color | @text-color-placeholder | - \n--td-cell-right-icon-font-size | 48rpx | - \n--td-cell-title-color | @text-color-primary | - \n--td-cell-title-font-size | @font-size-m | - \n--td-cell-vertical-padding | 32rpx | - \n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell/README.md",
    "content": "---\ntitle: Cell 单元格\ndescription: 用于各个类别行的信息展示。\nspline: data\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-100%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-cell\": \"tdesign-miniprogram/cell/cell\",\n  \"t-cell-group\": \"tdesign-miniprogram/cell-group/cell-group\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/bz7aGimL72S2\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 类型\n\n单行单元格\n\n<img src=\"https://tdesign.gtimg.com/miniprogram/readme/cell-1.png\" width=\"375px\" height=\"50%\">\n\n{{ base }}\n\n多行单元格\n\n<img src=\"https://tdesign.gtimg.com/miniprogram/readme/cell-2.png\" width=\"375px\" height=\"50%\">\n\n{{ multiple }}\n\n### 样式\n\n卡片单元格\n\n{{ theme }}\n\n## API\n\n### Cell Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nalign | String | middle | 内容的对齐方式，默认居中对齐。可选项：top/middle/bottom | N\narrow | Boolean / Object | false | 是否显示右侧箭头 | N\nbordered | Boolean | true | 是否显示下边框 | N\ndescription | String / Slot | - | 下方内容描述。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nhover | Boolean | - | 是否开启点击反馈 | N\nimage | String / Slot | - | 主图。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\njump-type | String | navigateTo | 链接跳转类型。可选项：switchTab/reLaunch/redirectTo/navigateTo | N\nleft-icon | String / Object / Slot | - | 左侧图标，出现在单元格标题的左侧。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nnote | String / Slot | - | 和标题同行的说明文字。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nrequired | Boolean | false | 是否显示表单必填星号 | N\nright-icon | String / Object / Slot | - | 最右侧图标。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ntitle | String / Slot | - | 标题。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nurl | String | - | 点击后跳转链接地址。如果值为空，则表示不需要跳转 | N\n\n### Cell Events\n\n名称 | 参数 | 描述\n-- | -- | --\nclick | - | 右侧内容。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts)\n### Cell External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-center | 中间（`title`, `description`）内容样式类\nt-class-description | 下方描述内容样式类\nt-class-hover | 悬停样式类\nt-class-image | 图片样式类\nt-class-left | 左侧内容样式类\nt-class-left-icon | 左侧图标样式类\nt-class-note | 右侧说明文字样式类\nt-class-right | 右侧内容样式类\nt-class-right-icon | 右侧图标样式类\nt-class-title | 标题样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-cell-group-border-color | @component-stroke | - \n--td-cell-group-title-bg-color | @bg-color-secondarycontainer | - \n--td-cell-group-title-color | @text-color-placeholder | - \n--td-cell-group-title-font-size | 28rpx | - \n--td-cell-group-title-line-height | 90rpx | - \n--td-cell-group-title-padding-left | 32rpx | - \n--td-cell-bg-color | @bg-color-container | - \n--td-cell-border-color | @component-stroke | - \n--td-cell-border-left-space | @cell-horizontal-padding | - \n--td-cell-border-right-space | 0 | - \n--td-cell-border-width | 1px | - \n--td-cell-description-color | @text-color-secondary | - \n--td-cell-description-font-size | @font-size-base | - \n--td-cell-description-line-height | 44rpx | - \n--td-cell-height | auto | - \n--td-cell-horizontal-padding | 32rpx | - \n--td-cell-hover-color | @bg-color-secondarycontainer | - \n--td-cell-image-height | 96rpx | - \n--td-cell-image-width | 96rpx | - \n--td-cell-left-icon-color | @brand-color | - \n--td-cell-left-icon-font-size | 48rpx | - \n--td-cell-line-height | 48rpx | - \n--td-cell-note-color | @text-color-placeholder | - \n--td-cell-note-font-size | @font-size-m | - \n--td-cell-required-color | @error-color | - \n--td-cell-required-font-size | @font-size-m | - \n--td-cell-right-icon-color | @text-color-placeholder | - \n--td-cell-right-icon-font-size | 48rpx | - \n--td-cell-title-color | @text-color-primary | - \n--td-cell-title-font-size | @font-size-m | - \n--td-cell-vertical-padding | 32rpx | - \n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell/cell.d.ts",
    "content": "import { SuperComponent, RelationsOptions } from '../common/src/index';\nexport default class Cell extends SuperComponent {\n    externalClasses: string[];\n    relations: RelationsOptions;\n    options: {\n        multipleSlots: boolean;\n    };\n    properties: import(\"./type\").TdCellProps;\n    data: {\n        prefix: string;\n        classPrefix: string;\n        isLastChild: boolean;\n    };\n    observers: {\n        leftIcon(v: any): void;\n        rightIcon(v: any): void;\n        arrow(v: any): void;\n    };\n    setIcon(name: any, value: any, defaultValue: any): void;\n    onClick(e: any): void;\n    jumpLink(urlKey?: string, link?: string): void;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell/cell.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport { calcIcon } from '../common/utils';\nconst { prefix } = config;\nconst name = `${prefix}-cell`;\nlet Cell = class Cell extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [\n            `${prefix}-class`,\n            `${prefix}-class-title`,\n            `${prefix}-class-description`,\n            `${prefix}-class-note`,\n            `${prefix}-class-hover`,\n            `${prefix}-class-image`,\n            `${prefix}-class-left`,\n            `${prefix}-class-left-icon`,\n            `${prefix}-class-center`,\n            `${prefix}-class-right`,\n            `${prefix}-class-right-icon`,\n        ];\n        this.relations = {\n            '../cell-group/cell-group': {\n                type: 'parent',\n            },\n        };\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n            isLastChild: false,\n        };\n        this.observers = {\n            leftIcon(v) {\n                this.setIcon('_leftIcon', v, '');\n            },\n            rightIcon(v) {\n                this.setIcon('_rightIcon', v, '');\n            },\n            arrow(v) {\n                this.setIcon('_arrow', v, 'chevron-right');\n            },\n        };\n    }\n    setIcon(name, value, defaultValue) {\n        this.setData({\n            [name]: calcIcon(value, defaultValue),\n        });\n    }\n    onClick(e) {\n        this.triggerEvent('click', e.detail);\n        this.jumpLink();\n    }\n    jumpLink(urlKey = 'url', link = 'jumpType') {\n        const url = this.data[urlKey];\n        const jumpType = this.data[link];\n        if (url) {\n            wx[jumpType]({ url });\n        }\n    }\n};\nCell = __decorate([\n    wxComponent()\n], Cell);\nexport default Cell;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell/cell.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\",\n    \"t-image\": \"../image/image\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell/cell.wxml",
    "content": "<import src=\"../common/template/icon.wxml\" />\n<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  style=\"{{_._style([style, customStyle])}}\"\n  class=\"class {{prefix}}-class {{_.cls(classPrefix, [['borderless', !bordered || isLastChild], align])}}\"\n  hover-class=\"{{ hover ? classPrefix + '--hover' : ''}}\"\n  hover-stay-time=\"70\"\n  bind:tap=\"onClick\"\n  aria-role=\"{{ariaRole || (arrow ? 'button' : '')}}\"\n  aria-label=\"{{ariaLabel}}\"\n>\n  <view class=\"{{classPrefix}}__left {{prefix}}-class-left\">\n    <template\n      wx:if=\"{{_leftIcon}}\"\n      is=\"icon\"\n      data=\"{{tClass: classPrefix + '__left-icon ' + prefix + '-class-left-icon', ..._leftIcon }}\"\n    />\n    <slot name=\"left-icon\" />\n    <t-image\n      wx:if=\"{{ image }}\"\n      shape=\"round\"\n      t-class=\"{{classPrefix}}__left-image {{prefix}}-class-image\"\n      src=\"{{ image }}\"\n    />\n    <slot name=\"image\" />\n  </view>\n  <view class=\"{{classPrefix}}__title {{prefix}}-class-center\">\n    <view class=\"{{classPrefix}}__title-text {{prefix}}-class-title\">\n      <block wx:if=\"{{ title }}\"> {{ title}} </block>\n      <slot name=\"title\" />\n      <block wx:if=\"{{required}}\">\n        <text decode class=\"{{classPrefix}}--required\">&nbsp;*</text>\n      </block>\n    </view>\n\n    <view class=\"{{classPrefix}}__description {{prefix}}-class-description\">\n      <view wx:if=\"{{ description }}\" class=\"{{classPrefix}}__description-text\">{{description}}</view>\n      <slot name=\"description\" />\n    </view>\n  </view>\n\n  <view class=\"{{classPrefix}}__note {{prefix}}-class-note\">\n    <text wx:if=\"{{ note }}\">{{note}}</text>\n    <slot name=\"note\" />\n  </view>\n\n  <view class=\"{{classPrefix}}__right {{prefix}}-class-right\">\n    <template\n      wx:if=\"{{_arrow}}\"\n      is=\"icon\"\n      data=\"{{tClass: classPrefix + '__right-icon ' + prefix + '-class-right-icon', ..._arrow }}\"\n    />\n    <block wx:else>\n      <template\n        wx:if=\"{{_rightIcon}}\"\n        is=\"icon\"\n        data=\"{{tClass: classPrefix + '__right-icon ' + prefix + '-class-right-icon', ..._rightIcon }}\"\n      />\n      <slot name=\"right-icon\" />\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell/cell.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-cell {\n  position: relative;\n  display: flex;\n  box-sizing: border-box;\n  width: 100%;\n  padding: var(--td-cell-vertical-padding, 32rpx) var(--td-cell-horizontal-padding, 32rpx);\n  line-height: var(--td-cell-line-height, 48rpx);\n  height: var(--td-cell-height, auto);\n  background-color: var(--td-cell-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n}\n.t-cell::after {\n  position: absolute;\n  box-sizing: border-box;\n  content: ' ';\n  pointer-events: none;\n  right: 0;\n  left: 0;\n  bottom: 0;\n  border-bottom: var(--td-cell-border-width, 1px) solid var(--td-cell-border-color, var(--td-component-stroke, var(--td-gray-color-3, #e7e7e7)));\n  transform: scaleY(0.5);\n  transform-origin: bottom;\n  left: var(--td-cell-border-left-space, var(--td-cell-horizontal-padding, 32rpx));\n  right: var(--td-cell-border-right-space, 0);\n}\n.t-cell--borderless::after {\n  display: none;\n}\n.t-cell__description {\n  font-size: var(--td-cell-description-font-size, var(--td-font-size-base, 28rpx));\n  line-height: var(--td-cell-description-line-height, 44rpx);\n  color: var(--td-cell-description-color, var(--td-text-color-secondary, var(--td-font-gray-2, rgba(0, 0, 0, 0.6))));\n}\n.t-cell__description-text {\n  margin-top: calc(var(--td-spacer, 16rpx) / 2);\n}\n.t-cell__note {\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  color: var(--td-cell-note-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n  font-size: var(--td-cell-note-font-size, var(--td-font-size-m, 32rpx));\n}\n.t-cell__title,\n.t-cell__note {\n  flex: 1 1 auto;\n}\n.t-cell__title:empty,\n.t-cell__note:empty {\n  display: none;\n}\n.t-cell__title-text {\n  display: flex;\n  font-size: var(--td-cell-title-font-size, var(--td-font-size-m, 32rpx));\n  color: var(--td-cell-title-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  font-weight: 400;\n}\n.t-cell__left,\n.t-cell__right {\n  display: flex;\n  align-items: center;\n}\n.t-cell__left:not(:empty) {\n  margin-right: var(--td-spacer, 16rpx);\n}\n.t-cell__left-icon {\n  color: var(--td-cell-left-icon-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  font-size: var(--td-cell-left-icon-font-size, 48rpx);\n}\n.t-cell__left-image {\n  height: var(--td-cell-image-height, 96rpx);\n  width: var(--td-cell-image-width, 96rpx);\n}\n.t-cell__right {\n  margin-left: calc(var(--td-spacer, 16rpx) / 2);\n}\n.t-cell__right-icon {\n  color: var(--td-cell-right-icon-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n  font-size: var(--td-cell-right-icon-font-size, 48rpx);\n}\n.t-cell--hover {\n  background-color: var(--td-cell-hover-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n}\n.t-cell--required {\n  font-size: var(--td-cell-required-font-size, var(--td-font-size-m, 32rpx));\n  color: var(--td-cell-required-color, var(--td-error-color, var(--td-error-color-6, #d54941)));\n}\n.t-cell--middle {\n  align-items: center;\n}\n.t-cell--top {\n  align-items: flex-start;\n}\n.t-cell--bottom {\n  align-items: flex-end;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell/props.d.ts",
    "content": "import { TdCellProps } from './type';\ndeclare const props: TdCellProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell/props.js",
    "content": "const props = {\n    align: {\n        type: String,\n        value: 'middle',\n    },\n    arrow: {\n        type: null,\n        value: false,\n    },\n    bordered: {\n        type: Boolean,\n        value: true,\n    },\n    description: {\n        type: String,\n    },\n    hover: {\n        type: Boolean,\n    },\n    image: {\n        type: String,\n    },\n    jumpType: {\n        type: String,\n        value: 'navigateTo',\n    },\n    leftIcon: {\n        type: null,\n    },\n    note: {\n        type: String,\n    },\n    required: {\n        type: Boolean,\n        value: false,\n    },\n    rightIcon: {\n        type: null,\n    },\n    title: {\n        type: String,\n    },\n    url: {\n        type: String,\n        value: '',\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell/type.d.ts",
    "content": "export interface TdCellProps {\n    align?: {\n        type: StringConstructor;\n        value?: 'top' | 'middle' | 'bottom';\n    };\n    arrow?: {\n        type: null;\n        value?: boolean | object;\n    };\n    bordered?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    description?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    hover?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    image?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    jumpType?: {\n        type: StringConstructor;\n        value?: 'switchTab' | 'reLaunch' | 'redirectTo' | 'navigateTo';\n    };\n    leftIcon?: {\n        type: null;\n        value?: string | object;\n    };\n    note?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    required?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    rightIcon?: {\n        type: null;\n        value?: string | object;\n    };\n    title?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    url?: {\n        type: StringConstructor;\n        value?: string;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell-group/cell-group.d.ts",
    "content": "import { SuperComponent, RelationsOptions } from '../common/src/index';\nexport default class CellGroup extends SuperComponent {\n    externalClasses: string[];\n    relations: RelationsOptions;\n    properties: import(\"./type\").TdCellGroupProps;\n    data: {\n        prefix: string;\n        classPrefix: string;\n    };\n    methods: {\n        updateLastChid(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell-group/cell-group.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-cell-group`;\nlet CellGroup = class CellGroup extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-title`];\n        this.relations = {\n            '../cell/cell': {\n                type: 'child',\n                linked() {\n                    this.updateLastChid();\n                },\n                unlinked() {\n                    this.updateLastChid();\n                },\n            },\n        };\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n        };\n        this.methods = {\n            updateLastChid() {\n                const items = this.$children;\n                items.forEach((child, index) => child.setData({ isLastChild: index === items.length - 1 }));\n            },\n        };\n    }\n};\nCellGroup = __decorate([\n    wxComponent()\n], CellGroup);\nexport default CellGroup;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell-group/cell-group.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell-group/cell-group.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view wx:if=\"{{ title }}\" class=\"class {{ classPrefix }}__title {{prefix}}-class-title\"> {{ title }} </view>\n<view\n  style=\"{{_._style([style, customStyle])}}\"\n  class=\"{{_.cls(classPrefix, [['bordered', bordered], theme])}} class {{prefix}}-class\"\n>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell-group/cell-group.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-cell-group {\n  position: relative;\n}\n.t-cell-group__title {\n  font-family: PingFangSC-Regular;\n  font-size: var(--td-cell-group-title-font-size, 28rpx);\n  color: var(--td-cell-group-title-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n  text-align: left;\n  line-height: var(--td-cell-group-title-line-height, 90rpx);\n  background-color: var(--td-cell-group-title-bg-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n  padding-left: var(--td-cell-group-title-padding-left, 32rpx);\n}\n.t-cell-group--bordered::before {\n  position: absolute;\n  box-sizing: border-box;\n  content: ' ';\n  pointer-events: none;\n  right: 0;\n  left: 0;\n  top: 0;\n  border-top: 1px solid var(--td-cell-group-border-color, var(--td-component-stroke, var(--td-gray-color-3, #e7e7e7)));\n  transform: scaleY(0.5);\n  transform-origin: 0 0;\n  transform-origin: top;\n  z-index: 1;\n}\n.t-cell-group--bordered::after {\n  position: absolute;\n  box-sizing: border-box;\n  content: ' ';\n  pointer-events: none;\n  right: 0;\n  left: 0;\n  bottom: 0;\n  border-bottom: 1px solid var(--td-cell-group-border-color, var(--td-component-stroke, var(--td-gray-color-3, #e7e7e7)));\n  transform: scaleY(0.5);\n  transform-origin: bottom;\n  z-index: 1;\n}\n.t-cell-group--card {\n  margin: 0 32rpx;\n  border-radius: var(--td-radius-large, 18rpx);\n  overflow: hidden;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell-group/props.d.ts",
    "content": "import { TdCellGroupProps } from './type';\ndeclare const props: TdCellGroupProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell-group/props.js",
    "content": "const props = {\n    bordered: {\n        type: Boolean,\n    },\n    externalClasses: {\n        type: Array,\n    },\n    theme: {\n        type: String,\n        value: 'default',\n    },\n    title: {\n        type: String,\n        value: '',\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell-group/type.d.ts",
    "content": "export interface TdCellGroupProps {\n    bordered?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    style?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    externalClasses?: {\n        type: ArrayConstructor;\n        value?: ['t-class'];\n    };\n    theme?: {\n        type: StringConstructor;\n        value?: 'default' | 'card';\n    };\n    title?: {\n        type: StringConstructor;\n        value?: string;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/cell-group/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Checkbox Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nblock | Boolean | true | \\- | N\nborderless | Boolean | false | \\- | N\ncheck-all | Boolean | false | \\- | N\nchecked | Boolean | false | \\- | N\ndefault-checked | Boolean | undefined | uncontrolled property | N\ncontent | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ncontent-disabled | Boolean | - | \\- | N\ndisabled | Boolean | undefined | \\- | N\nicon | String / Array | 'circle' | Typescript：`'circle' \\| 'line' \\| 'rectangle' \\| string[]` | N\nindeterminate | Boolean | false | \\- | N\nlabel | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmax-content-row | Number | 5 | \\- | N\nmax-label-row | Number | 3 | \\- | N\nname | String | - | \\- | N\nplacement | String | left | options: left/right | N\nreadonly | Boolean | false | \\- | N\nvalue | String / Number / Boolean | - | value of checkbox。Typescript：`string \\| number \\| boolean` | N\n\n### Checkbox Events\n\nname | params | description\n-- | -- | --\nchange | `(checked: boolean, context: { value: boolean\\|number\\|string, label: boolean\\|number\\|string })` | \\-\n\n### Checkbox External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-border | \\-\nt-class-content | \\-\nt-class-icon | \\-\nt-class-label | \\-\n\n\n### CheckboxGroup Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nborderless | Boolean | false | \\- | N\ndisabled | Boolean | undefined | \\- | N\nkeys | Object | - | Typescript：`KeysType`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmax | Number | undefined | \\- | N\nname | String | - | \\- | N\noptions | Array | [] | Typescript：`Array<CheckboxOption>` `type CheckboxOption = string \\| number \\| CheckboxOptionObj` `interface CheckboxOptionObj { label?: string; value?: string \\| number; disabled?: boolean; checkAll?: true }`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/checkbox-group/type.ts) | N\nvalue | Array | [] | Typescript：`T` `type CheckboxGroupValue = Array<string \\| number \\| boolean>`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/checkbox-group/type.ts) | N\ndefault-value | Array | undefined | uncontrolled property。Typescript：`T` `type CheckboxGroupValue = Array<string \\| number \\| boolean>`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/checkbox-group/type.ts) | N\n\n### CheckboxGroup Events\n\nname | params | description\n-- | -- | --\nchange | `(value: CheckboxGroupValue, context: { value: boolean\\|number\\|string, label: boolean\\|number\\|string })` | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-checkbox-bg-color | @bg-color-container | - \n--td-checkbox-border-color | @component-stroke | - \n--td-checkbox-description-color | @text-color-secondary | - \n--td-checkbox-description-disabled-color | @text-color-disabled | - \n--td-checkbox-description-line-height | 44rpx | - \n--td-checkbox-font-size | 32rpx | - \n--td-checkbox-icon-checked-color | @brand-color | - \n--td-checkbox-icon-color | @component-border | - \n--td-checkbox-icon-disabled-bg-color | @bg-color-component-disabled | - \n--td-checkbox-icon-disabled-color | @brand-color-disabled | - \n--td-checkbox-icon-size | 48rpx | - \n--td-checkbox-tag-active-bg-color | @brand-color-light | - \n--td-checkbox-tag-active-color | @brand-color | - \n--td-checkbox-title-color | @text-color-primary | - \n--td-checkbox-title-disabled-color | @text-color-disabled | - \n--td-checkbox-title-line-height | 48rpx | - \n--td-checkbox-vertical-padding | 32rpx | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox/README.md",
    "content": "---\ntitle: Checkbox 多选框\ndescription: 用于预设的一组选项中执行多项选择，并呈现选择结果。\nspline: form\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-85%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-87%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-86%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-76%25-red\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-checkbox\": \"tdesign-miniprogram/checkbox/checkbox\",\n  \"t-checkbox-group\": \"tdesign-miniprogram/checkbox-group/checkbox-group\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/2M5mxim27YSp\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 组件类型\n\n纵向多选框\n\n{{ base }}\n\n横向多选框\n\n{{ horizontal }}\n\n带全选多选框\n\n{{ all }}\n\n### 组件状态\n\n多选框状态\n\n{{ status }}\n\n### 组件样式\n\n勾选样式\n\n{{ type }}\n\n勾选显示位置\n\n{{ right }}\n\n非通栏多选样式\n\n{{ card }}\n\n### 组件规格\n\n多选框尺寸规格\n\n{{ special }}\n\n## API\n\n### Checkbox Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nblock | Boolean | true | 是否为块级元素 | N\nborderless | Boolean | false | 是否开启无边框模式 | N\ncheck-all | Boolean | false | 用于标识是否为「全选选项」。单独使用无效，需在 CheckboxGroup 中使用 | N\nchecked | Boolean | false | 是否选中 | N\ndefault-checked | Boolean | undefined | 是否选中。非受控属性 | N\ncontent | String / Slot | - | 多选框内容。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ncontent-disabled | Boolean | - | 是否禁用组件内容（content）触发选中 | N\ndisabled | Boolean | undefined | 是否禁用组件。如果父组件存在 CheckboxGroup，默认值由 CheckboxGroup.disabled 控制。优先级：Checkbox.disabled > CheckboxGroup.disabled > Form.disabled | N\nicon | String / Array | 'circle' | 自定义选中图标和非选中图标。使用 Array 时表示：`[选中态图标，非选中态图标，半选中态图标]`。使用 String 时，值为 circle 表示填充圆形图标、值为 line 表示描边型图标、值为 rectangle 表示填充矩形图标。TS 类型：`'circle' \\| 'line' \\| 'rectangle' \\| string[]` | N\nindeterminate | Boolean | false | 是否为半选 | N\nlabel | String / Slot | - | 主文案。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmax-content-row | Number | 5 | 内容最大行数限制 | N\nmax-label-row | Number | 3 | 主文案最大行数限制 | N\nname | String | - | HTML 元素原生属性 | N\nplacement | String | left | 多选框和内容相对位置。可选项：left/right | N\nreadonly | Boolean | false | 只读状态 | N\nvalue | String / Number / Boolean | - | 多选框的值。TS 类型：`string \\| number \\| boolean` | N\n\n### Checkbox Events\n\n名称 | 参数 | 描述\n-- | -- | --\nchange | `(checked: boolean, context: { value: boolean\\|number\\|string, label: boolean\\|number\\|string })` | 值变化时触发。`context` 表示当前点击项内容。\n\n### Checkbox External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-border | 边框样式类\nt-class-content | 内容样式类\nt-class-icon | 图标样式类\nt-class-label | 标签样式类\n\n\n### CheckboxGroup Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nborderless | Boolean | false | 是否开启无边框模式 | N\ndisabled | Boolean | undefined | 是否禁用组件。优先级：Form.disabled < CheckboxGroup.disabled < Checkbox.disabled | N\nkeys | Object | - | 用来定义 value / label 在 `options` 中对应的字段别名。TS 类型：`KeysType`。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmax | Number | undefined | 支持最多选中的数量 | N\nname | String | - | 统一设置内部复选框 HTML 属性 | N\noptions | Array | [] | 以配置形式设置子元素。示例1：`['北京', '上海']` ，示例2: `[{ label: '全选', checkAll: true }, { label: '上海', value: 'shanghai' }]`。checkAll 值为 true 表示当前选项为「全选选项」。TS 类型：`Array<CheckboxOption>` `type CheckboxOption = string \\| number \\| CheckboxOptionObj` `interface CheckboxOptionObj { label?: string; value?: string \\| number; disabled?: boolean; checkAll?: true }`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/checkbox-group/type.ts) | N\nvalue | Array | [] | 选中值。TS 类型：`T` `type CheckboxGroupValue = Array<string \\| number \\| boolean>`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/checkbox-group/type.ts) | N\ndefault-value | Array | undefined | 选中值。非受控属性。TS 类型：`T` `type CheckboxGroupValue = Array<string \\| number \\| boolean>`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/checkbox-group/type.ts) | N\n\n### CheckboxGroup Events\n\n名称 | 参数 | 描述\n-- | -- | --\nchange | `(value: CheckboxGroupValue, context: { value: boolean\\|number\\|string, label: boolean\\|number\\|string })` | 值变化时触发。`context` 表示当前点击项内容。\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-checkbox-bg-color | @bg-color-container | - \n--td-checkbox-border-color | @component-stroke | - \n--td-checkbox-description-color | @text-color-secondary | - \n--td-checkbox-description-disabled-color | @text-color-disabled | - \n--td-checkbox-description-line-height | 44rpx | - \n--td-checkbox-font-size | 32rpx | - \n--td-checkbox-icon-checked-color | @brand-color | - \n--td-checkbox-icon-color | @component-border | - \n--td-checkbox-icon-disabled-bg-color | @bg-color-component-disabled | - \n--td-checkbox-icon-disabled-color | @brand-color-disabled | - \n--td-checkbox-icon-size | 48rpx | - \n--td-checkbox-tag-active-bg-color | @brand-color-light | - \n--td-checkbox-tag-active-color | @brand-color | - \n--td-checkbox-title-color | @text-color-primary | - \n--td-checkbox-title-disabled-color | @text-color-disabled | - \n--td-checkbox-title-line-height | 48rpx | - \n--td-checkbox-vertical-padding | 32rpx | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox/checkbox.d.ts",
    "content": "import { SuperComponent, ComponentsOptionsType, RelationsOptions } from '../common/src/index';\nexport default class CheckBox extends SuperComponent {\n    externalClasses: string[];\n    behaviors: string[];\n    relations: RelationsOptions;\n    options: ComponentsOptionsType;\n    properties: {\n        theme: {\n            type: StringConstructor;\n            value: string;\n        };\n        tId: {\n            type: StringConstructor;\n        };\n        block?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        borderless?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        checkAll?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        checked?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        defaultChecked?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        content?: {\n            type: StringConstructor;\n            value?: string;\n        };\n        contentDisabled?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        disabled?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        icon?: {\n            type: null;\n            value?: string[] | \"rectangle\" | \"circle\" | \"line\";\n        };\n        indeterminate?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        label?: {\n            type: StringConstructor;\n            value?: string;\n        };\n        maxContentRow?: {\n            type: NumberConstructor;\n            value?: number;\n        };\n        maxLabelRow?: {\n            type: NumberConstructor;\n            value?: number;\n        };\n        name?: {\n            type: StringConstructor;\n            value?: string;\n        };\n        placement?: {\n            type: StringConstructor;\n            value?: \"left\" | \"right\";\n        };\n        readonly?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        value?: {\n            type: null;\n            value?: string | number | boolean;\n        };\n    };\n    data: {\n        prefix: string;\n        classPrefix: string;\n        _disabled: boolean;\n    };\n    observers: {\n        disabled(v: any): void;\n    };\n    controlledProps: {\n        key: string;\n        event: string;\n    }[];\n    methods: {\n        handleTap(e: WechatMiniprogram.TouchEvent): void;\n        setDisabled(disabled: Boolean): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox/checkbox.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport Props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-checkbox`;\nlet CheckBox = class CheckBox extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [\n            `${prefix}-class`,\n            `${prefix}-class-label`,\n            `${prefix}-class-icon`,\n            `${prefix}-class-content`,\n            `${prefix}-class-border`,\n        ];\n        this.behaviors = ['wx://form-field'];\n        this.relations = {\n            '../checkbox-group/checkbox-group': {\n                type: 'ancestor',\n                linked(parent) {\n                    const { value, disabled, borderless } = parent.data;\n                    const valueSet = new Set(value);\n                    const checkedFromParent = valueSet.has(this.data.value);\n                    const data = {\n                        _disabled: this.data.disabled == null ? disabled : this.data.disabled,\n                    };\n                    if (borderless) {\n                        data.borderless = true;\n                    }\n                    data.checked = this.data.checked || checkedFromParent;\n                    if (this.data.checked) {\n                        parent.updateValue(this.data);\n                    }\n                    if (this.data.checkAll) {\n                        data.checked = valueSet.size > 0;\n                    }\n                    this.setData(data);\n                },\n            },\n        };\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = Object.assign(Object.assign({}, Props), { theme: {\n                type: String,\n                value: 'default',\n            }, tId: {\n                type: String,\n            } });\n        this.data = {\n            prefix,\n            classPrefix: name,\n            _disabled: false,\n        };\n        this.observers = {\n            disabled(v) {\n                this.setData({ _disabled: v });\n            },\n        };\n        this.controlledProps = [\n            {\n                key: 'checked',\n                event: 'change',\n            },\n        ];\n        this.methods = {\n            handleTap(e) {\n                const { _disabled, readonly, contentDisabled } = this.data;\n                const { target } = e.currentTarget.dataset;\n                if (_disabled || readonly || (target === 'text' && contentDisabled))\n                    return;\n                const { value, label } = this.data;\n                const checked = !this.data.checked;\n                const parent = this.$parent;\n                if (parent) {\n                    parent.updateValue(Object.assign(Object.assign({}, this.data), { checked, item: { label, value, checked } }));\n                }\n                else {\n                    this._trigger('change', { context: { value, label }, checked });\n                }\n            },\n            setDisabled(disabled) {\n                this.setData({\n                    _disabled: this.data.disabled || disabled,\n                });\n            },\n        };\n    }\n};\nCheckBox = __decorate([\n    wxComponent()\n], CheckBox);\nexport default CheckBox;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox/checkbox.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox/checkbox.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  id=\"{{tId}}\"\n  style=\"{{_._style([style, customStyle])}}\"\n  class=\"{{_.cls(classPrefix, [placement, theme, ['checked', checked], ['block', block]])}} class {{prefix}}-class\"\n  aria-role=\"checkbox\"\n  aria-checked=\"{{checked ? (indeterminate ? 'mixed' : true) : false}}\"\n  aria-disabled=\"{{_disabled ? true : false}}\"\n  mut-bind:tap=\"handleTap\"\n  tabindex=\"{{tabindex}}\"\n>\n  <view\n    wx:if=\"{{theme == 'default'}}\"\n    class=\"{{_.cls(classPrefix + '__icon', [placement, ['checked', checked], ['disabled', _disabled]])}} {{prefix}}-class-icon\"\n  >\n    <slot name=\"icon\" wx:if=\"{{icon === 'slot'}}\" />\n    <view wx:elif=\"{{_.isArray(icon)}}\" class=\"{{classPrefix}}__icon\">\n      <image\n        src=\"{{checked ? indeterminate && icon[2] ? icon[2] : icon[0] : icon[1]}}\"\n        class=\"{{classPrefix}}__icon-image\"\n        webp\n      />\n    </view>\n    <block wx:else>\n      <t-icon\n        wx:if=\"{{checked && (icon == 'circle' || icon == 'rectangle')}}\"\n        name=\"{{indeterminate ? ('minus-' + icon + '-filled') : ('check-' + icon + '-filled')}}\"\n        class=\"{{_.cls(classPrefix + '__icon-wrapper', [])}}\"\n      />\n      <t-icon\n        wx:if=\"{{checked && icon == 'line'}}\"\n        name=\"{{indeterminate ? ('minus-' + icon + '-filled') : 'check'}}\"\n        class=\"{{_.cls(classPrefix + '__icon-wrapper', [])}}\"\n      />\n      <view\n        wx:elif=\"{{!checked && (icon == 'circle' || icon == 'rectangle')}}\"\n        class=\"{{_.cls(classPrefix + '__icon-' + icon, [['disabled', _disabled]])}}\"\n      />\n      <view wx:if=\"{{!checked && icon == 'line'}}\" class=\"placeholder\"></view>\n    </block>\n  </view>\n  <view class=\"{{classPrefix}}__content\" data-target=\"text\" mut-bind:tap=\"handleTap\">\n    <view\n      class=\"{{_.cls(classPrefix + '__title', [['disabled', _disabled], ['checked', checked]])}} {{prefix}}-class-label\"\n      style=\"-webkit-line-clamp:{{maxLabelRow}}\"\n    >\n      <block wx:if=\"{{label}}\">{{label}}</block>\n      <slot />\n      <slot name=\"label\" />\n    </view>\n    <view\n      class=\"{{_.cls(classPrefix + '__description', [['disabled', _disabled]])}} {{prefix}}-class-content \"\n      style=\"-webkit-line-clamp:{{maxContentRow}}\"\n    >\n      <block wx:if=\"{{content}}\">{{content}}</block>\n      <slot name=\"content\" />\n    </view>\n  </view>\n  <view\n    wx:if=\"{{theme == 'default' && !borderless}}\"\n    class=\"{{_.cls(classPrefix + '__border', [placement])}} {{prefix}}-class-border\"\n  />\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox/checkbox.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-checkbox {\n  display: inline-flex;\n  vertical-align: middle;\n  position: relative;\n  font-size: var(--td-checkbox-font-size, 32rpx);\n  background: var(--td-checkbox-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n}\n.t-checkbox:focus {\n  outline: 0;\n}\n.t-checkbox--block {\n  display: flex;\n  padding: var(--td-checkbox-vertical-padding, 32rpx);\n}\n.t-checkbox--right {\n  flex-direction: row-reverse;\n}\n.t-checkbox .limit-title-row {\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  overflow: hidden;\n}\n.t-checkbox .image-center {\n  position: absolute;\n  top: 50%;\n  transform: translateY(-50%);\n}\n.t-checkbox__icon-left {\n  margin-right: 20rpx;\n  width: 40rpx;\n}\n.t-checkbox__icon-right {\n  right: 0px;\n  display: contents;\n  position: absolute;\n  top: 50%;\n  transform: translateY(-50%);\n}\n.t-checkbox__icon-image {\n  width: var(--td-checkbox-icon-size, 48rpx);\n  height: var(--td-checkbox-icon-size, 48rpx);\n  vertical-align: top;\n}\n.t-checkbox__icon {\n  position: relative;\n  display: block;\n  width: var(--td-checkbox-icon-size, 48rpx);\n  height: var(--td-checkbox-icon-size, 48rpx);\n  color: var(--td-checkbox-icon-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));\n  font-size: var(--td-checkbox-icon-size, 48rpx);\n  margin-top: calc((var(--td-checkbox-title-line-height, 48rpx) - var(--td-checkbox-icon-size, 48rpx)) / 2);\n}\n.t-checkbox__icon:empty {\n  display: none;\n}\n.t-checkbox__icon--checked {\n  color: var(--td-checkbox-icon-checked-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-checkbox__icon--disabled {\n  cursor: not-allowed;\n  color: var(--td-checkbox-icon-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-checkbox__icon--left {\n  margin-right: 16rpx;\n}\n.t-checkbox__icon-circle {\n  width: calc((var(--td-checkbox-icon-size, 48rpx) - 4rpx) * 2);\n  height: calc((var(--td-checkbox-icon-size, 48rpx) - 4rpx) * 2);\n  border: calc(4rpx * 2) solid var(--td-checkbox-icon-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));\n  border-radius: 50%;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%) scale(0.5);\n  box-sizing: border-box;\n}\n.t-checkbox__icon-circle--disabled {\n  background: var(--td-checkbox-icon-disabled-bg-color, var(--td-bg-color-component-disabled, var(--td-gray-color-2, #eeeeee)));\n}\n.t-checkbox__icon-rectangle {\n  width: calc((var(--td-checkbox-icon-size, 48rpx) - 4rpx * 2) * 2);\n  height: calc((var(--td-checkbox-icon-size, 48rpx) - 4rpx * 2) * 2);\n  border: calc(4rpx * 2) solid var(--td-checkbox-icon-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%) scale(0.5);\n  box-sizing: border-box;\n}\n.t-checkbox__icon-rectangle--disabled {\n  background: var(--td-checkbox-icon-disabled-bg-color, var(--td-bg-color-component-disabled, var(--td-gray-color-2, #eeeeee)));\n}\n.t-checkbox__icon-line::before,\n.t-checkbox__icon-line::after {\n  content: '';\n  display: block;\n  position: absolute;\n  width: 5rpx;\n  border-radius: 2rpx;\n  background: var(--td-checkbox-icon-checked-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  transform-origin: top center;\n}\n.t-checkbox__icon-line::before {\n  height: 16rpx;\n  left: 8rpx;\n  top: 22rpx;\n  transform: rotate(-45deg);\n}\n.t-checkbox__icon-line::after {\n  height: 26rpx;\n  right: 8rpx;\n  top: 14rpx;\n  transform: rotate(45deg);\n}\n.t-checkbox__icon-line--disabled::before,\n.t-checkbox__icon-line--disabled::after {\n  background: var(--td-checkbox-icon-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-checkbox__content {\n  flex: 1;\n}\n.t-checkbox__title {\n  color: var(--td-checkbox-title-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  line-height: var(--td-checkbox-title-line-height, 48rpx);\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  overflow: hidden;\n}\n.t-checkbox__title--disabled {\n  color: var(--td-checkbox-title-disabled-color, var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26))));\n}\n.t-checkbox__description {\n  color: var(--td-checkbox-description-color, var(--td-text-color-secondary, var(--td-font-gray-2, rgba(0, 0, 0, 0.6))));\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  overflow: hidden;\n  font-size: 28rpx;\n  line-height: var(--td-checkbox-description-line-height, 44rpx);\n}\n.t-checkbox__description--disabled {\n  color: var(--td-checkbox-description-disabled-color, var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26))));\n}\n.t-checkbox__title + .t-checkbox__description:not(:empty) {\n  margin-top: 8rpx;\n}\n.t-checkbox__border {\n  position: absolute;\n  bottom: 0;\n  left: 96rpx;\n  right: 0;\n  height: 1px;\n  background: var(--td-checkbox-border-color, var(--td-component-stroke, var(--td-gray-color-3, #e7e7e7)));\n  transform: scaleY(0.5);\n}\n.t-checkbox__border--right {\n  left: 32rpx;\n}\n.t-checkbox--tag {\n  font-size: 28rpx;\n  padding-top: 16rpx;\n  padding-bottom: 16rpx;\n  text-align: center;\n  background-color: var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3));\n  border-radius: 12rpx;\n}\n.t-checkbox--tag.t-checkbox--checked {\n  color: var(--td-checkbox-tag-active-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  background-color: var(--td-checkbox-tag-active-bg-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n}\n.t-checkbox--tag .t-checkbox__title--checked {\n  color: var(--td-checkbox-tag-active-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-checkbox--tag .t-checkbox__content {\n  margin-right: 0;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox/props.d.ts",
    "content": "import { TdCheckboxProps } from './type';\ndeclare const props: TdCheckboxProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox/props.js",
    "content": "const props = {\n    block: {\n        type: Boolean,\n        value: true,\n    },\n    borderless: {\n        type: Boolean,\n        value: false,\n    },\n    checkAll: {\n        type: Boolean,\n        value: false,\n    },\n    checked: {\n        type: Boolean,\n        value: null,\n    },\n    defaultChecked: {\n        type: Boolean,\n        value: false,\n    },\n    content: {\n        type: String,\n    },\n    contentDisabled: {\n        type: Boolean,\n    },\n    disabled: {\n        type: null,\n        value: undefined,\n    },\n    icon: {\n        type: null,\n        value: 'circle',\n    },\n    indeterminate: {\n        type: Boolean,\n        value: false,\n    },\n    label: {\n        type: String,\n    },\n    maxContentRow: {\n        type: Number,\n        value: 5,\n    },\n    maxLabelRow: {\n        type: Number,\n        value: 3,\n    },\n    name: {\n        type: String,\n        value: '',\n    },\n    placement: {\n        type: String,\n        value: 'left',\n    },\n    readonly: {\n        type: Boolean,\n        value: false,\n    },\n    value: {\n        type: null,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox/type.d.ts",
    "content": "export interface TdCheckboxProps {\n    block?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    borderless?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    checkAll?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    checked?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    defaultChecked?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    content?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    contentDisabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    icon?: {\n        type: null;\n        value?: 'circle' | 'line' | 'rectangle' | string[];\n    };\n    indeterminate?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    label?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    maxContentRow?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    maxLabelRow?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    name?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    placement?: {\n        type: StringConstructor;\n        value?: 'left' | 'right';\n    };\n    readonly?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    value?: {\n        type: null;\n        value?: string | number | boolean;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox-group/checkbox-group.d.ts",
    "content": "import { SuperComponent, RelationsOptions } from '../common/src/index';\nexport default class CheckBoxGroup extends SuperComponent {\n    externalClasses: string[];\n    relations: RelationsOptions;\n    data: {\n        prefix: string;\n        classPrefix: string;\n        checkboxOptions: any[];\n    };\n    properties: import(\"./type\").TdCheckboxGroupProps<import(\"./type\").CheckboxGroupValue>;\n    observers: {\n        value(): void;\n        options(): void;\n        disabled(v: any): void;\n    };\n    lifetimes: {\n        ready(): void;\n    };\n    controlledProps: {\n        key: string;\n        event: string;\n    }[];\n    $checkAll: any;\n    methods: {\n        getChildren(): any;\n        updateChildren(): void;\n        updateValue({ value, checked, checkAll, item, indeterminate }: {\n            value: any;\n            checked: any;\n            checkAll: any;\n            item: any;\n            indeterminate: any;\n        }): void;\n        initWithOptions(): void;\n        handleInnerChildChange(e: any): void;\n        setCheckall(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox-group/checkbox-group.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-checkbox-group`;\nlet CheckBoxGroup = class CheckBoxGroup extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`];\n        this.relations = {\n            '../checkbox/checkbox': {\n                type: 'descendant',\n            },\n        };\n        this.data = {\n            prefix,\n            classPrefix: name,\n            checkboxOptions: [],\n        };\n        this.properties = props;\n        this.observers = {\n            value() {\n                this.updateChildren();\n            },\n            options() {\n                this.initWithOptions();\n            },\n            disabled(v) {\n                var _a;\n                if ((_a = this.data.options) === null || _a === void 0 ? void 0 : _a.length) {\n                    this.initWithOptions();\n                    return;\n                }\n                this.getChildren().forEach((item) => {\n                    item.setDisabled(v);\n                });\n            },\n        };\n        this.lifetimes = {\n            ready() {\n                this.setCheckall();\n            },\n        };\n        this.controlledProps = [\n            {\n                key: 'value',\n                event: 'change',\n            },\n        ];\n        this.$checkAll = null;\n        this.methods = {\n            getChildren() {\n                let items = this.$children;\n                if (!items.length) {\n                    items = this.selectAllComponents(`.${prefix}-checkbox-option`);\n                }\n                return items || [];\n            },\n            updateChildren() {\n                const items = this.getChildren();\n                const { value } = this.data;\n                if (items.length > 0) {\n                    items.forEach((item) => {\n                        !item.data.checkAll &&\n                            item.setData({\n                                checked: value === null || value === void 0 ? void 0 : value.includes(item.data.value),\n                            });\n                    });\n                    if (items.some((item) => item.data.checkAll)) {\n                        this.setCheckall();\n                    }\n                }\n            },\n            updateValue({ value, checked, checkAll, item, indeterminate }) {\n                let { value: newValue } = this.data;\n                const { max } = this.data;\n                const keySet = new Set(this.getChildren().map((item) => item.data.value));\n                newValue = newValue.filter((value) => keySet.has(value));\n                if (max && checked && newValue.length === max)\n                    return;\n                if (checkAll) {\n                    const items = this.getChildren();\n                    newValue =\n                        !checked && indeterminate\n                            ? items\n                                .filter(({ data }) => !(data.disabled && !newValue.includes(data.value)))\n                                .map((item) => item.data.value)\n                            : items\n                                .filter(({ data }) => {\n                                if (data.disabled) {\n                                    return newValue.includes(data.value);\n                                }\n                                return checked && !data.checkAll;\n                            })\n                                .map(({ data }) => data.value);\n                }\n                else if (checked) {\n                    newValue = newValue.concat(value);\n                }\n                else {\n                    const index = newValue.findIndex((v) => v === value);\n                    newValue.splice(index, 1);\n                }\n                this._trigger('change', { value: newValue, context: item });\n            },\n            initWithOptions() {\n                const { options, value, keys } = this.data;\n                if (!(options === null || options === void 0 ? void 0 : options.length) || !Array.isArray(options))\n                    return;\n                const checkboxOptions = options.map((item) => {\n                    var _a, _b, _c;\n                    const isLabel = ['number', 'string'].includes(typeof item);\n                    return isLabel\n                        ? {\n                            label: `${item}`,\n                            value: item,\n                            checked: value === null || value === void 0 ? void 0 : value.includes(item),\n                        }\n                        : Object.assign(Object.assign({}, item), { label: item[(_a = keys === null || keys === void 0 ? void 0 : keys.label) !== null && _a !== void 0 ? _a : 'label'], value: item[(_b = keys === null || keys === void 0 ? void 0 : keys.value) !== null && _b !== void 0 ? _b : 'value'], checked: value === null || value === void 0 ? void 0 : value.includes(item[(_c = keys === null || keys === void 0 ? void 0 : keys.value) !== null && _c !== void 0 ? _c : 'value']) });\n                });\n                this.setData({\n                    checkboxOptions,\n                });\n            },\n            handleInnerChildChange(e) {\n                var _a;\n                const { item } = e.target.dataset;\n                const { checked } = e.detail;\n                const rect = {};\n                if (item.checkAll) {\n                    rect.indeterminate = (_a = this.$checkAll) === null || _a === void 0 ? void 0 : _a.data.indeterminate;\n                }\n                this.updateValue(Object.assign(Object.assign(Object.assign({}, item), { checked, item }), rect));\n            },\n            setCheckall() {\n                const items = this.getChildren();\n                if (!this.$checkAll) {\n                    this.$checkAll = items.find((item) => item.data.checkAll);\n                }\n                if (!this.$checkAll)\n                    return;\n                const { value } = this.data;\n                const valueSet = new Set(value === null || value === void 0 ? void 0 : value.filter((val) => val !== this.$checkAll.data.value));\n                const isCheckall = items.every((item) => (item.data.checkAll ? true : valueSet.has(item.data.value)));\n                this.$checkAll.setData({\n                    checked: valueSet.size > 0,\n                    indeterminate: !isCheckall,\n                });\n            },\n        };\n    }\n};\nCheckBoxGroup = __decorate([\n    wxComponent()\n], CheckBoxGroup);\nexport default CheckBoxGroup;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox-group/checkbox-group.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-checkbox\": \"../checkbox/checkbox\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox-group/checkbox-group.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view class=\"{{ classPrefix }} class {{prefix}}-class\" style=\"{{_._style([style, customStyle])}}\">\n  <slot />\n  <block wx:for=\"{{checkboxOptions}}\" wx:key=\"value\">\n    <t-checkbox\n      class=\"{{prefix}}-checkbox-option\"\n      data-item=\"{{item}}\"\n      label=\"{{item.label || item.text || ''}}\"\n      value=\"{{item.value == null ? '' : item.value}}\"\n      block=\"{{item.block || true}}\"\n      check-all=\"{{item.checkAll || false}}\"\n      checked=\"{{item.checked || false}}\"\n      content=\"{{item.content || ''}}\"\n      content-disabled=\"{{item.contentDisabled || false}}\"\n      icon=\"{{item.icon || 'circle'}}\"\n      indeterminate=\"{{item.indeterminate || false}}\"\n      disabled=\"{{ item.disabled == null ? disabled : item.disabled }}\"\n      max-content-row=\"{{item.maxContentRow || 5}}\"\n      max-label-row=\"{{item.maxLabelRow || 3}}\"\n      name=\"{{item.name || ''}}\"\n      borderless=\"{{borderless}}\"\n      readonly=\"{{item.readonly || false}}\"\n      bind:change=\"handleInnerChildChange\"\n      placement=\"{{item.placement || 'left'}}\"\n    />\n  </block>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox-group/checkbox-group.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox-group/props.d.ts",
    "content": "import { TdCheckboxGroupProps } from './type';\ndeclare const props: TdCheckboxGroupProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox-group/props.js",
    "content": "const props = {\n    borderless: {\n        type: Boolean,\n        value: false,\n    },\n    disabled: {\n        type: null,\n        value: undefined,\n    },\n    keys: {\n        type: Object,\n    },\n    max: {\n        type: Number,\n        value: undefined,\n    },\n    name: {\n        type: String,\n        value: '',\n    },\n    options: {\n        type: Array,\n        value: [],\n    },\n    value: {\n        type: Array,\n        value: null,\n    },\n    defaultValue: {\n        type: Array,\n        value: [],\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox-group/type.d.ts",
    "content": "import { KeysType } from '../common/common';\nexport interface TdCheckboxGroupProps<T = CheckboxGroupValue> {\n    borderless?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    keys?: {\n        type: ObjectConstructor;\n        value?: KeysType;\n    };\n    max?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    name?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    options?: {\n        type: ArrayConstructor;\n        value?: Array<CheckboxOption>;\n    };\n    value?: {\n        type: ArrayConstructor;\n        value?: T;\n    };\n    defaultValue?: {\n        type: ArrayConstructor;\n        value?: T;\n    };\n}\nexport declare type CheckboxOption = string | number | CheckboxOptionObj;\nexport interface CheckboxOptionObj {\n    label?: string;\n    value?: string | number;\n    disabled?: boolean;\n    checkAll?: true;\n}\nexport declare type CheckboxGroupValue = Array<string | number | boolean>;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/checkbox-group/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/bus.d.ts",
    "content": "export default class Bus {\n    listeners: Map<string, any>;\n    emitted: Set<string>;\n    constructor();\n    on(evtName: string, listener: any): void;\n    emit(evtName: string): void;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/bus.js",
    "content": "export default class Bus {\n    constructor() {\n        this.listeners = new Map();\n        this.emitted = new Set();\n    }\n    on(evtName, listener) {\n        if (this.emitted.has(evtName)) {\n            listener();\n            return;\n        }\n        const target = this.listeners.get(evtName) || [];\n        target.push(listener);\n        this.listeners.set(evtName, target);\n    }\n    emit(evtName) {\n        const listeners = this.listeners.get(evtName);\n        if (listeners) {\n            listeners.forEach((func) => func());\n        }\n        this.emitted.add(evtName);\n    }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/common.d.ts",
    "content": "export declare type Classes = Array<string>;\nexport interface Styles {\n    [css: string]: string | number;\n}\nexport declare type ImageEvent = any;\nexport declare type PlainObject = {\n    [key: string]: any;\n};\nexport declare type OptionData = {\n    label?: string;\n    value?: string | number;\n} & PlainObject;\nexport declare type TreeOptionData<T = string | number> = {\n    children?: Array<TreeOptionData<T>> | boolean;\n    label?: string;\n    text?: string;\n    value?: T;\n    content?: string;\n} & PlainObject;\nexport declare type SizeEnum = 'small' | 'medium' | 'large';\nexport declare type ShapeEnum = 'circle' | 'round';\nexport declare type HorizontalAlignEnum = 'left' | 'center' | 'right';\nexport declare type VerticalAlignEnum = 'top' | 'middle' | 'bottom';\nexport declare type LayoutEnum = 'vertical' | 'horizontal';\nexport declare type ClassName = {\n    [className: string]: any;\n} | ClassName[] | string;\nexport declare type CSSSelector = string;\nexport interface KeysType {\n    value?: string;\n    label?: string;\n    disabled?: string;\n}\nexport interface TreeKeysType extends KeysType {\n    children?: string;\n}\nexport interface HTMLElementAttributes {\n    [attribute: string]: string;\n}\nexport interface TScroll {\n    bufferSize?: number;\n    isFixedRowHeight?: boolean;\n    rowHeight?: number;\n    threshold?: number;\n    type: 'lazy' | 'virtual';\n}\nexport declare type InfinityScroll = TScroll;\nexport interface ScrollToElementParams {\n    index?: number;\n    top?: number;\n    time?: number;\n    behavior?: 'auto' | 'smooth';\n}\nexport interface ComponentScrollToElementParams extends ScrollToElementParams {\n    key?: string | number;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/common.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/component.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\ndeclare const TComponent: typeof Component;\nexport default TComponent;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/component.js",
    "content": "const TComponent = (options) => {\n    options.options = Object.assign({ multipleSlots: true, addGlobalClass: true }, options.options);\n    return Component(options);\n};\nexport default TComponent;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/config.d.ts",
    "content": "declare const _default: {\n    prefix: string;\n};\nexport default _default;\nexport declare const prefix = \"t\";\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/config.js",
    "content": "export default {\n    prefix: \"t\",\n};\nexport const prefix = \"t\";\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/index.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/calendar/index.d.ts",
    "content": "import type { TDate, TCalendarType, TCalendarValue } from './type';\nexport default class TCalendar {\n    firstDayOfWeek: number;\n    value: TCalendarValue | TCalendarValue[];\n    type: TCalendarType;\n    minDate: Date;\n    maxDate: Date;\n    format: (day: TDate) => TDate;\n    constructor(options?: {});\n    getTrimValue(): Date | Date[];\n    getDays(weekdays: string[]): any[];\n    getMonths(): any[];\n    select({ cellType, year, month, date }: {\n        cellType: any;\n        year: any;\n        month: any;\n        date: any;\n    }): Date | TCalendarValue[];\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/calendar/index.js",
    "content": "import { getDateRect, isSameDate, getMonthDateRect, isValidDate, getDate } from '../date';\nexport default class TCalendar {\n    constructor(options = {}) {\n        this.type = 'single';\n        Object.assign(this, options);\n        if (!this.minDate)\n            this.minDate = getDate();\n        if (!this.maxDate)\n            this.maxDate = getDate(6);\n    }\n    getTrimValue() {\n        const { value, type } = this;\n        const format = (val) => {\n            if (val instanceof Date)\n                return val;\n            if (typeof val === 'number')\n                return new Date(val);\n            return new Date();\n        };\n        if (type === 'single' && isValidDate(value))\n            return format(value);\n        if (type === 'multiple' || type === 'range') {\n            if (Array.isArray(value)) {\n                const isValid = value.every((item) => isValidDate(item));\n                return isValid ? value.map((item) => format(item)) : [];\n            }\n            return [];\n        }\n    }\n    getDays(weekdays) {\n        const ans = [];\n        let i = this.firstDayOfWeek % 7;\n        while (ans.length < 7) {\n            ans.push(weekdays[i]);\n            i = (i + 1) % 7;\n        }\n        return ans;\n    }\n    getMonths() {\n        const ans = [];\n        const selectedDate = this.getTrimValue();\n        const { minDate, maxDate, type, format } = this;\n        let { year: minYear, month: minMonth, time: minTime } = getDateRect(minDate);\n        const { year: maxYear, month: maxMonth, time: maxTime } = getDateRect(maxDate);\n        const calcType = (year, month, date) => {\n            const curDate = new Date(year, month, date, 23, 59, 59);\n            if (type === 'single' && selectedDate) {\n                if (isSameDate({ year, month, date }, selectedDate))\n                    return 'selected';\n            }\n            if (type === 'multiple' && selectedDate) {\n                const hit = selectedDate.some((item) => isSameDate({ year, month, date }, item));\n                if (hit) {\n                    return 'selected';\n                }\n            }\n            if (type === 'range' && selectedDate) {\n                if (Array.isArray(selectedDate)) {\n                    const [startDate, endDate] = selectedDate;\n                    if (startDate && isSameDate({ year, month, date }, startDate))\n                        return 'start';\n                    if (endDate && isSameDate({ year, month, date }, endDate))\n                        return 'end';\n                    if (startDate && endDate && curDate.getTime() > startDate.getTime() && curDate.getTime() < endDate.getTime())\n                        return 'centre';\n                }\n            }\n            const minCurDate = new Date(year, month, date, 0, 0, 0);\n            if (curDate.getTime() < minTime || minCurDate.getTime() > maxTime) {\n                return 'disabled';\n            }\n            return '';\n        };\n        while (minYear < maxYear || (minYear === maxYear && minMonth <= maxMonth)) {\n            const target = getMonthDateRect(new Date(minYear, minMonth, 1));\n            const months = [];\n            for (let i = 1; i <= 31; i++) {\n                if (i > target.lastDate)\n                    break;\n                const dateObj = {\n                    date: new Date(minYear, minMonth, i),\n                    day: i,\n                    type: calcType(minYear, minMonth, i),\n                };\n                months.push(format ? format(dateObj) : dateObj);\n            }\n            ans.push({\n                year: minYear,\n                month: minMonth,\n                months,\n                weekdayOfFirstDay: target.weekdayOfFirstDay,\n            });\n            const curDate = getDateRect(new Date(minYear, minMonth + 1, 1));\n            minYear = curDate.year;\n            minMonth = curDate.month;\n        }\n        return ans;\n    }\n    select({ cellType, year, month, date }) {\n        const { type } = this;\n        const selectedDate = this.getTrimValue();\n        if (cellType === 'disabled')\n            return;\n        const selected = new Date(year, month, date);\n        this.value = selected;\n        if (type === 'range' && Array.isArray(selectedDate)) {\n            if (selectedDate.length === 1 && selected > selectedDate[0]) {\n                this.value = [selectedDate[0], selected];\n            }\n            else {\n                this.value = [selected];\n            }\n        }\n        else if (type === 'multiple' && Array.isArray(selectedDate)) {\n            const newVal = [...selectedDate];\n            const index = selectedDate.findIndex((item) => isSameDate(item, selected));\n            if (index > -1) {\n                newVal.splice(index, 1);\n            }\n            else {\n                newVal.push(selected);\n            }\n            this.value = newVal;\n        }\n        return this.value;\n    }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/calendar/type.d.ts",
    "content": "export interface TDate {\n    date: Date;\n    day: number;\n    type: TDateType;\n    className?: string;\n    prefix?: string;\n    suffix?: string;\n}\nexport declare type TCalendarValue = number | Date;\nexport declare type TDateType = 'selected' | 'disabled' | 'start' | 'centre' | 'end' | '';\nexport declare type TCalendarType = 'single' | 'multiple' | 'range';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/calendar/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/color-picker/cmyk.d.ts",
    "content": "export declare const rgb2cmyk: (red: number, green: number, blue: number) => number[];\nexport declare const cmyk2rgb: (cyan: number, magenta: number, yellow: number, black: number) => {\n    r: number;\n    g: number;\n    b: number;\n};\nexport declare const cmykInputToColor: (input: string) => string;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/color-picker/cmyk.js",
    "content": "export const rgb2cmyk = (red, green, blue) => {\n    let computedC = 0;\n    let computedM = 0;\n    let computedY = 0;\n    let computedK = 0;\n    const r = parseInt(`${red}`.replace(/\\s/g, ''), 10);\n    const g = parseInt(`${green}`.replace(/\\s/g, ''), 10);\n    const b = parseInt(`${blue}`.replace(/\\s/g, ''), 10);\n    if (r === 0 && g === 0 && b === 0) {\n        computedK = 1;\n        return [0, 0, 0, 1];\n    }\n    computedC = 1 - r / 255;\n    computedM = 1 - g / 255;\n    computedY = 1 - b / 255;\n    const minCMY = Math.min(computedC, Math.min(computedM, computedY));\n    computedC = (computedC - minCMY) / (1 - minCMY);\n    computedM = (computedM - minCMY) / (1 - minCMY);\n    computedY = (computedY - minCMY) / (1 - minCMY);\n    computedK = minCMY;\n    return [computedC, computedM, computedY, computedK];\n};\nexport const cmyk2rgb = (cyan, magenta, yellow, black) => {\n    let c = cyan / 100;\n    let m = magenta / 100;\n    let y = yellow / 100;\n    const k = black / 100;\n    c = c * (1 - k) + k;\n    m = m * (1 - k) + k;\n    y = y * (1 - k) + k;\n    let r = 1 - c;\n    let g = 1 - m;\n    let b = 1 - y;\n    r = Math.round(255 * r);\n    g = Math.round(255 * g);\n    b = Math.round(255 * b);\n    return {\n        r,\n        g,\n        b,\n    };\n};\nconst REG_CMYK_STRING = /cmyk\\((\\d+%?),(\\d+%?),(\\d+%?),(\\d+%?)\\)/;\nconst toNumber = (str) => Math.max(0, Math.min(255, parseInt(str, 10)));\nexport const cmykInputToColor = (input) => {\n    if (/cmyk/i.test(input)) {\n        const str = input.replace(/\\s/g, '');\n        const match = str.match(REG_CMYK_STRING);\n        const c = toNumber(match[1]);\n        const m = toNumber(match[2]);\n        const y = toNumber(match[3]);\n        const k = toNumber(match[4]);\n        const { r, g, b } = cmyk2rgb(c, m, y, k);\n        return `rgb(${r}, ${g}, ${b})`;\n    }\n    return input;\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/color-picker/color.d.ts",
    "content": "import tinyColor from 'tinycolor2';\nimport { GradientColors, GradientColorPoint } from './gradient';\nexport interface ColorObject {\n    alpha: number;\n    css: string;\n    hex: string;\n    hex8: string;\n    hsl: string;\n    hsla: string;\n    hsv: string;\n    hsva: string;\n    rgb: string;\n    rgba: string;\n    saturation: number;\n    value: number;\n    isGradient: boolean;\n    linearGradient?: string;\n}\ninterface ColorStates {\n    s: number;\n    v: number;\n    h: number;\n    a: number;\n}\ninterface GradientStates {\n    colors: GradientColorPoint[];\n    degree: number;\n    selectedId: string;\n    css?: string;\n}\nexport declare const gradientColors2string: (object: GradientColors) => string;\nexport declare const getColorWithoutAlpha: (color: string) => string;\nexport declare const genId: () => string;\nexport declare const genGradientPoint: (left: number, color: string) => GradientColorPoint;\nexport declare class Color {\n    states: ColorStates;\n    originColor: string;\n    isGradient: boolean;\n    gradientStates: GradientStates;\n    constructor(input: string);\n    update(input: string): void;\n    get saturation(): number;\n    set saturation(value: number);\n    get value(): number;\n    set value(value: number);\n    get hue(): number;\n    set hue(value: number);\n    get alpha(): number;\n    set alpha(value: number);\n    get rgb(): string;\n    get rgba(): string;\n    get hsv(): string;\n    get hsva(): string;\n    get hsl(): string;\n    get hsla(): string;\n    get hex(): string;\n    get hex8(): string;\n    get cmyk(): string;\n    get css(): string;\n    get linearGradient(): string;\n    get gradientColors(): GradientColorPoint[];\n    set gradientColors(colors: GradientColorPoint[]);\n    get gradientSelectedId(): string;\n    set gradientSelectedId(id: string);\n    get gradientDegree(): number;\n    set gradientDegree(degree: number);\n    get gradientSelectedPoint(): GradientColorPoint;\n    getFormatsColorMap(): {\n        HEX: string;\n        CMYK: string;\n        RGB: string;\n        RGBA: string;\n        HSL: string;\n        HSLA: string;\n        HSV: string;\n        HSVA: string;\n        CSS: string;\n        HEX8: string;\n    };\n    updateCurrentGradientColor(): false | this;\n    updateStates(input: string): void;\n    getRgba(): {\n        r: number;\n        g: number;\n        b: number;\n        a: number;\n    };\n    getCmyk(): {\n        c: number;\n        m: number;\n        y: number;\n        k: number;\n    };\n    getHsva(): tinyColor.ColorFormats.HSVA;\n    getHsla(): tinyColor.ColorFormats.HSLA;\n    equals(color: string): boolean;\n    static isValid(color: string): boolean;\n    static hsva2color(h: number, s: number, v: number, a: number): string;\n    static hsla2color(h: number, s: number, l: number, a: number): string;\n    static rgba2color(r: number, g: number, b: number, a: number): string;\n    static hex2color(hex: string, a: number): string;\n    static object2color(object: any, format: string): string;\n    static isGradientColor: (input: string) => boolean;\n    static compare: (color1: string, color2: string) => boolean;\n}\nexport declare const getColorObject: (color: Color) => ColorObject;\nexport default Color;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/color-picker/color.js",
    "content": "import tinyColor from 'tinycolor2';\nimport { cmykInputToColor, rgb2cmyk } from './cmyk';\nimport { parseGradientString, isGradientColor } from './gradient';\nconst mathRound = Math.round;\nconst hsv2rgba = (states) => tinyColor(states).toRgb();\nconst hsv2hsva = (states) => tinyColor(states).toHsv();\nconst hsv2hsla = (states) => tinyColor(states).toHsl();\nexport const gradientColors2string = (object) => {\n    const { points, degree } = object;\n    const colorsStop = points\n        .sort((pA, pB) => pA.left - pB.left)\n        .map((p) => `${p.color} ${Math.round(p.left * 100) / 100}%`);\n    return `linear-gradient(${degree}deg,${colorsStop.join(',')})`;\n};\nexport const getColorWithoutAlpha = (color) => tinyColor(color).setAlpha(1).toHexString();\nexport const genId = () => (1 + Math.random() * 4294967295).toString(16);\nexport const genGradientPoint = (left, color) => ({\n    id: genId(),\n    left,\n    color,\n});\nexport class Color {\n    constructor(input) {\n        this.states = {\n            s: 100,\n            v: 100,\n            h: 100,\n            a: 1,\n        };\n        this.gradientStates = {\n            colors: [],\n            degree: 0,\n            selectedId: null,\n            css: '',\n        };\n        this.update(input);\n    }\n    update(input) {\n        var _a, _b;\n        const gradientColors = parseGradientString(input);\n        if (this.isGradient && !gradientColors) {\n            const colorHsv = tinyColor(input).toHsv();\n            this.states = colorHsv;\n            this.updateCurrentGradientColor();\n            return;\n        }\n        this.originColor = input;\n        this.isGradient = false;\n        let colorInput = input;\n        if (gradientColors) {\n            this.isGradient = true;\n            const object = gradientColors;\n            const points = object.points.map((c) => genGradientPoint(c.left, c.color));\n            this.gradientStates = {\n                colors: points,\n                degree: object.degree,\n                selectedId: ((_a = points[0]) === null || _a === void 0 ? void 0 : _a.id) || null,\n            };\n            this.gradientStates.css = this.linearGradient;\n            colorInput = (_b = this.gradientSelectedPoint) === null || _b === void 0 ? void 0 : _b.color;\n        }\n        this.updateStates(colorInput);\n    }\n    get saturation() {\n        return this.states.s;\n    }\n    set saturation(value) {\n        this.states.s = Math.max(0, Math.min(100, value));\n        this.updateCurrentGradientColor();\n    }\n    get value() {\n        return this.states.v;\n    }\n    set value(value) {\n        this.states.v = Math.max(0, Math.min(100, value));\n        this.updateCurrentGradientColor();\n    }\n    get hue() {\n        return this.states.h;\n    }\n    set hue(value) {\n        this.states.h = Math.max(0, Math.min(360, value));\n        this.updateCurrentGradientColor();\n    }\n    get alpha() {\n        return this.states.a;\n    }\n    set alpha(value) {\n        this.states.a = Math.max(0, Math.min(1, Math.round(value * 100) / 100));\n        this.updateCurrentGradientColor();\n    }\n    get rgb() {\n        const { r, g, b } = hsv2rgba(this.states);\n        return `rgb(${mathRound(r)}, ${mathRound(g)}, ${mathRound(b)})`;\n    }\n    get rgba() {\n        const { r, g, b, a } = hsv2rgba(this.states);\n        return `rgba(${mathRound(r)}, ${mathRound(g)}, ${mathRound(b)}, ${a})`;\n    }\n    get hsv() {\n        const { h, s, v } = this.getHsva();\n        return `hsv(${h}, ${s}%, ${v}%)`;\n    }\n    get hsva() {\n        const { h, s, v, a } = this.getHsva();\n        return `hsva(${h}, ${s}%, ${v}%, ${a})`;\n    }\n    get hsl() {\n        const { h, s, l } = this.getHsla();\n        return `hsl(${h}, ${s}%, ${l}%)`;\n    }\n    get hsla() {\n        const { h, s, l, a } = this.getHsla();\n        return `hsla(${h}, ${s}%, ${l}%, ${a})`;\n    }\n    get hex() {\n        return tinyColor(this.states).toHexString();\n    }\n    get hex8() {\n        return tinyColor(this.states).toHex8String();\n    }\n    get cmyk() {\n        const { c, m, y, k } = this.getCmyk();\n        return `cmyk(${c}, ${m}, ${y}, ${k})`;\n    }\n    get css() {\n        if (this.isGradient) {\n            return this.linearGradient;\n        }\n        return this.rgba;\n    }\n    get linearGradient() {\n        const { gradientColors, gradientDegree } = this;\n        return gradientColors2string({\n            points: gradientColors,\n            degree: gradientDegree,\n        });\n    }\n    get gradientColors() {\n        return this.gradientStates.colors;\n    }\n    set gradientColors(colors) {\n        this.gradientStates.colors = colors;\n        this.gradientStates.css = this.linearGradient;\n    }\n    get gradientSelectedId() {\n        return this.gradientStates.selectedId;\n    }\n    set gradientSelectedId(id) {\n        var _a;\n        if (id === this.gradientSelectedId) {\n            return;\n        }\n        this.gradientStates.selectedId = id;\n        this.updateStates((_a = this.gradientSelectedPoint) === null || _a === void 0 ? void 0 : _a.color);\n    }\n    get gradientDegree() {\n        return this.gradientStates.degree;\n    }\n    set gradientDegree(degree) {\n        this.gradientStates.degree = Math.max(0, Math.min(360, degree));\n        this.gradientStates.css = this.linearGradient;\n    }\n    get gradientSelectedPoint() {\n        const { gradientColors, gradientSelectedId } = this;\n        return gradientColors.find((color) => color.id === gradientSelectedId);\n    }\n    getFormatsColorMap() {\n        return {\n            HEX: this.hex,\n            CMYK: this.cmyk,\n            RGB: this.rgb,\n            RGBA: this.rgba,\n            HSL: this.hsl,\n            HSLA: this.hsla,\n            HSV: this.hsv,\n            HSVA: this.hsva,\n            CSS: this.css,\n            HEX8: this.hex8,\n        };\n    }\n    updateCurrentGradientColor() {\n        const { isGradient, gradientColors, gradientSelectedId } = this;\n        const { length } = gradientColors;\n        const current = this.gradientSelectedPoint;\n        if (!isGradient || length === 0 || !current) {\n            return false;\n        }\n        const index = gradientColors.findIndex((color) => color.id === gradientSelectedId);\n        const newColor = Object.assign(Object.assign({}, current), { color: this.rgba });\n        gradientColors.splice(index, 1, newColor);\n        this.gradientColors = gradientColors.slice();\n        return this;\n    }\n    updateStates(input) {\n        const color = tinyColor(cmykInputToColor(input));\n        const hsva = color.toHsv();\n        this.states = hsva;\n    }\n    getRgba() {\n        const { r, g, b, a } = hsv2rgba(this.states);\n        return {\n            r: mathRound(r),\n            g: mathRound(g),\n            b: mathRound(b),\n            a,\n        };\n    }\n    getCmyk() {\n        const { r, g, b } = this.getRgba();\n        const [c, m, y, k] = rgb2cmyk(r, g, b);\n        return {\n            c: mathRound(c * 100),\n            m: mathRound(m * 100),\n            y: mathRound(y * 100),\n            k: mathRound(k * 100),\n        };\n    }\n    getHsva() {\n        let { h, s, v, a } = hsv2hsva(this.states);\n        h = mathRound(h);\n        s = mathRound(s * 100);\n        v = mathRound(v * 100);\n        a *= 1;\n        return {\n            h,\n            s,\n            v,\n            a,\n        };\n    }\n    getHsla() {\n        let { h, s, l, a } = hsv2hsla(this.states);\n        h = mathRound(h);\n        s = mathRound(s * 100);\n        l = mathRound(l * 100);\n        a *= 1;\n        return {\n            h,\n            s,\n            l,\n            a,\n        };\n    }\n    equals(color) {\n        return tinyColor.equals(this.rgba, color);\n    }\n    static isValid(color) {\n        if (parseGradientString(color)) {\n            return true;\n        }\n        return tinyColor(color).isValid();\n    }\n    static hsva2color(h, s, v, a) {\n        return tinyColor({\n            h,\n            s,\n            v,\n            a,\n        }).toHsvString();\n    }\n    static hsla2color(h, s, l, a) {\n        return tinyColor({\n            h,\n            s,\n            l,\n            a,\n        }).toHslString();\n    }\n    static rgba2color(r, g, b, a) {\n        return tinyColor({\n            r,\n            g,\n            b,\n            a,\n        }).toHsvString();\n    }\n    static hex2color(hex, a) {\n        const color = tinyColor(hex);\n        color.setAlpha(a);\n        return color.toHexString();\n    }\n    static object2color(object, format) {\n        if (format === 'CMYK') {\n            const { c, m, y, k } = object;\n            return `cmyk(${c}, ${m}, ${y}, ${k})`;\n        }\n        const color = tinyColor(object, {\n            format,\n        });\n        return color.toRgbString();\n    }\n}\nColor.isGradientColor = (input) => !!isGradientColor(input);\nColor.compare = (color1, color2) => {\n    const isGradientColor1 = Color.isGradientColor(color1);\n    const isGradientColor2 = Color.isGradientColor(color2);\n    if (isGradientColor1 && isGradientColor2) {\n        const gradientColor1 = gradientColors2string(parseGradientString(color1));\n        const gradientColor2 = gradientColors2string(parseGradientString(color2));\n        return gradientColor1 === gradientColor2;\n    }\n    if (!isGradientColor1 && !isGradientColor2) {\n        return tinyColor.equals(color1, color2);\n    }\n    return false;\n};\nconst COLOR_OBJECT_OUTPUT_KEYS = [\n    'alpha',\n    'css',\n    'hex',\n    'hex8',\n    'hsl',\n    'hsla',\n    'hsv',\n    'hsva',\n    'rgb',\n    'rgba',\n    'saturation',\n    'value',\n    'isGradient',\n];\nexport const getColorObject = (color) => {\n    if (!color) {\n        return null;\n    }\n    const colorObject = Object.create(null);\n    COLOR_OBJECT_OUTPUT_KEYS.forEach((key) => (colorObject[key] = color[key]));\n    if (color.isGradient) {\n        colorObject.linearGradient = color.linearGradient;\n    }\n    return colorObject;\n};\nexport default Color;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/color-picker/gradient.d.ts",
    "content": "export interface GradientColorPoint {\n    id?: string;\n    color?: string;\n    left?: number;\n}\nexport interface GradientColors {\n    points: GradientColorPoint[];\n    degree: number;\n}\nexport declare const isGradientColor: (input: string) => null | RegExpExecArray;\nexport declare const parseGradientString: (input: string) => GradientColors | boolean;\nexport default parseGradientString;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/color-picker/gradient.js",
    "content": "import isString from 'lodash/isString';\nimport isNull from 'lodash/isNull';\nimport tinyColor from 'tinycolor2';\nconst combineRegExp = (regexpList, flags) => {\n    let source = '';\n    for (let i = 0; i < regexpList.length; i++) {\n        if (isString(regexpList[i])) {\n            source += regexpList[i];\n        }\n        else {\n            source += regexpList[i].source;\n        }\n    }\n    return new RegExp(source, flags);\n};\nconst generateRegExp = () => {\n    const searchFlags = 'gi';\n    const rAngle = /(?:[+-]?\\d*\\.?\\d+)(?:deg|grad|rad|turn)/;\n    const rSideCornerCapture = /to\\s+((?:(?:left|right|top|bottom)(?:\\s+(?:top|bottom|left|right))?))/;\n    const rComma = /\\s*,\\s*/;\n    const rColorHex = /#(?:[a-f0-9]{6}|[a-f0-9]{3})/;\n    const rDigits3 = /\\(\\s*(?:\\d{1,3}\\s*,\\s*){2}\\d{1,3}\\s*\\)/;\n    const rDigits4 = /\\(\\s*(?:\\d{1,3}\\s*,\\s*){2}\\d{1,3}\\s*,\\s*\\d*\\.?\\d+\\)/;\n    const rValue = /(?:[+-]?\\d*\\.?\\d+)(?:%|[a-z]+)?/;\n    const rKeyword = /[_a-z-][_a-z0-9-]*/;\n    const rColor = combineRegExp(['(?:', rColorHex, '|', '(?:rgb|hsl)', rDigits3, '|', '(?:rgba|hsla)', rDigits4, '|', rKeyword, ')'], '');\n    const rColorStop = combineRegExp([rColor, '(?:\\\\s+', rValue, '(?:\\\\s+', rValue, ')?)?'], '');\n    const rColorStopList = combineRegExp(['(?:', rColorStop, rComma, ')*', rColorStop], '');\n    const rLineCapture = combineRegExp(['(?:(', rAngle, ')|', rSideCornerCapture, ')'], '');\n    const rGradientSearch = combineRegExp(['(?:(', rLineCapture, ')', rComma, ')?(', rColorStopList, ')'], searchFlags);\n    const rColorStopSearch = combineRegExp(['\\\\s*(', rColor, ')', '(?:\\\\s+', '(', rValue, '))?', '(?:', rComma, '\\\\s*)?'], searchFlags);\n    return {\n        gradientSearch: rGradientSearch,\n        colorStopSearch: rColorStopSearch,\n    };\n};\nconst parseGradient = (regExpLib, input) => {\n    let result;\n    let matchColorStop;\n    let stopResult;\n    regExpLib.gradientSearch.lastIndex = 0;\n    const matchGradient = regExpLib.gradientSearch.exec(input);\n    if (!isNull(matchGradient)) {\n        result = {\n            original: matchGradient[0],\n            colorStopList: [],\n        };\n        if (matchGradient[1]) {\n            result.line = matchGradient[1];\n        }\n        if (matchGradient[2]) {\n            result.angle = matchGradient[2];\n        }\n        if (matchGradient[3]) {\n            result.sideCorner = matchGradient[3];\n        }\n        regExpLib.colorStopSearch.lastIndex = 0;\n        matchColorStop = regExpLib.colorStopSearch.exec(matchGradient[4]);\n        while (!isNull(matchColorStop)) {\n            stopResult = {\n                color: matchColorStop[1],\n            };\n            if (matchColorStop[2]) {\n                stopResult.position = matchColorStop[2];\n            }\n            result.colorStopList.push(stopResult);\n            matchColorStop = regExpLib.colorStopSearch.exec(matchGradient[4]);\n        }\n    }\n    return result;\n};\nconst REGEXP_LIB = generateRegExp();\nconst REG_GRADIENT = /.*gradient\\s*\\(((?:\\([^)]*\\)|[^)(]*)*)\\)/gim;\nexport const isGradientColor = (input) => {\n    REG_GRADIENT.lastIndex = 0;\n    return REG_GRADIENT.exec(input);\n};\nconst sideCornerDegreeMap = {\n    top: 0,\n    right: 90,\n    bottom: 180,\n    left: 270,\n    'top left': 225,\n    'left top': 225,\n    'top right': 135,\n    'right top': 135,\n    'bottom left': 315,\n    'left bottom': 315,\n    'bottom right': 45,\n    'right bottom': 45,\n};\nexport const parseGradientString = (input) => {\n    const match = isGradientColor(input);\n    if (!match) {\n        return false;\n    }\n    const gradientColors = {\n        points: [],\n        degree: 0,\n    };\n    const result = parseGradient(REGEXP_LIB, match[1]);\n    if (result.original.trim() !== match[1].trim()) {\n        return false;\n    }\n    const points = result.colorStopList.map(({ color, position }) => {\n        const point = Object.create(null);\n        point.color = tinyColor(color).toRgbString();\n        point.left = parseFloat(position);\n        return point;\n    });\n    gradientColors.points = points;\n    let degree = parseInt(result.angle, 10);\n    if (Number.isNaN(degree)) {\n        degree = sideCornerDegreeMap[result.sideCorner] || 90;\n    }\n    gradientColors.degree = degree;\n    return gradientColors;\n};\nexport default parseGradientString;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/color-picker/index.d.ts",
    "content": "export * from './cmyk';\nexport * from './color';\nexport * from './gradient';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/color-picker/index.js",
    "content": "export * from './cmyk';\nexport * from './color';\nexport * from './gradient';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/date.d.ts",
    "content": "export declare type CompareDate = Date | number | {\n    year: number;\n    month: number;\n    date: number;\n};\nexport declare const getDateRect: (date: Date | number) => {\n    year: number;\n    month: number;\n    date: number;\n    day: number;\n    time: number;\n};\nexport declare const isSameDate: (date1: CompareDate, date2: CompareDate) => boolean;\nexport declare const getMonthDateRect: (date: Date | number) => {\n    year: number;\n    month: number;\n    weekdayOfFirstDay: number;\n    lastDate: number;\n};\nexport declare const isValidDate: (val: any) => boolean;\nexport declare const getDate: (...args: any[]) => any;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/shared/date.js",
    "content": "export const getDateRect = (date) => {\n    const _date = new Date(date);\n    return {\n        year: _date.getFullYear(),\n        month: _date.getMonth(),\n        date: _date.getDate(),\n        day: _date.getDay(),\n        time: _date.getTime(),\n    };\n};\nexport const isSameDate = (date1, date2) => {\n    if (date1 instanceof Date || typeof date1 === 'number')\n        date1 = getDateRect(date1);\n    if (date2 instanceof Date || typeof date2 === 'number')\n        date2 = getDateRect(date2);\n    const keys = ['year', 'month', 'date'];\n    return keys.every((key) => date1[key] === date2[key]);\n};\nexport const getMonthDateRect = (date) => {\n    const { year, month } = getDateRect(date);\n    const firstDay = new Date(year, month, 1);\n    const weekdayOfFirstDay = firstDay.getDay();\n    const lastDate = new Date(+new Date(year, month + 1, 1) - 24 * 3600 * 1000).getDate();\n    return {\n        year,\n        month,\n        weekdayOfFirstDay,\n        lastDate,\n    };\n};\nexport const isValidDate = (val) => typeof val === 'number' || val instanceof Date;\nexport const getDate = (...args) => {\n    const now = new Date();\n    if (args.length === 0)\n        return now;\n    if (args.length === 1 && args[0] <= 1000) {\n        const { year, month, date } = getDateRect(now);\n        return new Date(year, month + args[0], date);\n    }\n    return Date.apply(null, args);\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/src/control.d.ts",
    "content": "declare type ControlInstance = {\n    controlled: boolean;\n    initValue: any;\n    set(newVal: any, extObj?: Object, fn?: any): void;\n    get(): any;\n    change(newVal: any, customChangeData?: any, customUpdateFn?: any): void;\n};\ndeclare type ControlOption = {\n    valueKey?: string;\n    defaultValueKey?: string;\n    changeEventName?: string;\n    strict?: boolean;\n};\ndeclare function useControl(this: any, option?: ControlOption): ControlInstance;\nexport { ControlOption, ControlInstance, useControl };\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/src/control.js",
    "content": "const defaultOption = {\n    valueKey: 'value',\n    defaultValueKey: 'defaultValue',\n    changeEventName: 'change',\n    strict: true,\n};\nfunction useControl(option = {}) {\n    const { valueKey, defaultValueKey, changeEventName, strict } = Object.assign(Object.assign({}, defaultOption), option);\n    const props = this.properties || {};\n    const value = props[valueKey];\n    const defaultValue = props[strict ? defaultValueKey : valueKey];\n    let controlled = false;\n    if (strict && typeof value !== 'undefined' && value !== null) {\n        controlled = true;\n    }\n    const set = (newVal, extObj, fn) => {\n        this.setData(Object.assign({ [`_${valueKey}`]: newVal }, extObj), fn);\n    };\n    return {\n        controlled,\n        initValue: controlled ? value : defaultValue,\n        set,\n        get: () => {\n            return this.data[`_${valueKey}`];\n        },\n        change: (newVal, customChangeData, customUpdateFn) => {\n            this.triggerEvent(changeEventName, typeof customChangeData !== 'undefined' ? customChangeData : newVal);\n            if (controlled) {\n                return;\n            }\n            if (typeof customUpdateFn === 'function') {\n                customUpdateFn();\n            }\n            else {\n                set(newVal);\n            }\n        },\n    };\n}\nexport { useControl };\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/src/flatTool.d.ts",
    "content": "export declare const getPrototypeOf: (obj: any) => any;\nexport declare const isObject: (something: any) => boolean;\nexport declare const iterateInheritedPrototype: (callback: (proto: Record<string, any>) => boolean | void, fromCtor: any, toCtor: any, includeToCtor?: boolean) => void;\nexport interface ClassInstanceToObjectOptions {\n    bindTo?: any;\n    excludes?: string[];\n    till?: any;\n    enumerable?: 0 | boolean;\n    configurable?: 0 | boolean;\n    writable?: 0 | boolean;\n}\nexport declare const toObject: (something: any, options?: ClassInstanceToObjectOptions) => {\n    [key: string]: any;\n};\nexport declare const isPlainObject: (something: any) => boolean;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/src/flatTool.js",
    "content": "export const getPrototypeOf = function (obj) {\n    return Object.getPrototypeOf ? Object.getPrototypeOf(obj) : obj.__proto__;\n};\nexport const isObject = function isObject(something) {\n    const type = typeof something;\n    return something !== null && (type === 'function' || type === 'object');\n};\nexport const iterateInheritedPrototype = function iterateInheritedPrototype(callback, fromCtor, toCtor, includeToCtor = true) {\n    let proto = fromCtor.prototype || fromCtor;\n    const toProto = toCtor.prototype || toCtor;\n    while (proto) {\n        if (!includeToCtor && proto === toProto)\n            break;\n        if (callback(proto) === false)\n            break;\n        if (proto === toProto)\n            break;\n        proto = getPrototypeOf(proto);\n    }\n};\nexport const toObject = function toObject(something, options = {}) {\n    const obj = {};\n    if (!isObject(something))\n        return obj;\n    const excludes = options.excludes || ['constructor'];\n    const { enumerable = true, configurable = 0, writable = 0 } = options;\n    const defaultDesc = {};\n    if (enumerable !== 0)\n        defaultDesc.enumerable = enumerable;\n    if (configurable !== 0)\n        defaultDesc.configurable = configurable;\n    if (writable !== 0)\n        defaultDesc.writable = writable;\n    iterateInheritedPrototype((proto) => {\n        Object.getOwnPropertyNames(proto).forEach((key) => {\n            if (excludes.indexOf(key) >= 0)\n                return;\n            if (Object.prototype.hasOwnProperty.call(obj, key))\n                return;\n            const desc = Object.getOwnPropertyDescriptor(proto, key);\n            const fnKeys = ['get', 'set', 'value'];\n            fnKeys.forEach((k) => {\n                if (typeof desc[k] === 'function') {\n                    const oldFn = desc[k];\n                    desc[k] = function (...args) {\n                        return oldFn.apply(Object.prototype.hasOwnProperty.call(options, 'bindTo') ? options.bindTo : this, args);\n                    };\n                }\n            });\n            Object.defineProperty(obj, key, Object.assign(Object.assign({}, desc), defaultDesc));\n        });\n    }, something, options.till || Object, false);\n    return obj;\n};\nexport const isPlainObject = function isPlainObject(something) {\n    return Object.prototype.toString.call(something) === '[object Object]';\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/src/index.d.ts",
    "content": "export * from './superComponent';\nexport * from './flatTool';\nexport * from './instantiationDecorator';\nexport * from './control';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/src/index.js",
    "content": "export * from './superComponent';\nexport * from './flatTool';\nexport * from './instantiationDecorator';\nexport * from './control';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/src/instantiationDecorator.d.ts",
    "content": "import { SuperComponent } from './superComponent';\nexport declare const toComponent: (options: Record<string, any>) => Record<string, any>;\nexport declare const wxComponent: () => (constructor: new () => SuperComponent) => void;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/src/instantiationDecorator.js",
    "content": "import { isPlainObject, toObject } from './flatTool';\nimport { canUseVirtualHost } from '../version';\nconst RawLifeCycles = ['Created', 'Attached', 'Ready', 'Moved', 'Detached', 'Error'];\nconst NativeLifeCycles = RawLifeCycles.map((k) => k.toLowerCase());\nconst ComponentNativeProps = [\n    'properties',\n    'data',\n    'observers',\n    'methods',\n    'behaviors',\n    ...NativeLifeCycles,\n    'relations',\n    'externalClasses',\n    'options',\n    'lifetimes',\n    'pageLifeTimes',\n    'definitionFilter',\n];\nexport const toComponent = function toComponent(options) {\n    const { relations, behaviors = [], externalClasses = [] } = options;\n    if (options.properties) {\n        Object.keys(options.properties).forEach((k) => {\n            let opt = options.properties[k];\n            if (!isPlainObject(opt)) {\n                opt = { type: opt };\n            }\n            options.properties[k] = opt;\n        });\n        const ariaProps = [\n            { key: 'ariaHidden', type: Boolean },\n            { key: 'ariaRole', type: String },\n            { key: 'ariaLabel', type: String },\n            { key: 'ariaLabelledby', type: String },\n            { key: 'ariaDescribedby', type: String },\n            { key: 'ariaBusy', type: Boolean },\n        ];\n        ariaProps.forEach(({ key, type }) => {\n            options.properties[key] = {\n                type,\n            };\n        });\n        options.properties.style = { type: String, value: '' };\n        options.properties.customStyle = { type: String, value: '' };\n    }\n    if (!options.methods)\n        options.methods = {};\n    if (!options.lifetimes)\n        options.lifetimes = {};\n    const inits = {};\n    if (relations) {\n        const getRelations = (relation, path) => Behavior({\n            created() {\n                Object.defineProperty(this, `$${relation}`, {\n                    get: () => {\n                        const nodes = this.getRelationNodes(path) || [];\n                        return relation === 'parent' ? nodes[0] : nodes;\n                    },\n                });\n            },\n        });\n        const map = {};\n        Object.keys(relations).forEach((path) => {\n            const comp = relations[path];\n            const relation = ['parent', 'ancestor'].includes(comp.type) ? 'parent' : 'children';\n            const mixin = getRelations(relation, path);\n            map[relation] = mixin;\n        });\n        behaviors.push(...Object.keys(map).map((key) => map[key]));\n    }\n    options.behaviors = [...behaviors];\n    options.externalClasses = ['class', ...externalClasses];\n    Object.getOwnPropertyNames(options).forEach((k) => {\n        const desc = Object.getOwnPropertyDescriptor(options, k);\n        if (!desc)\n            return;\n        if (NativeLifeCycles.indexOf(k) < 0 && typeof desc.value === 'function') {\n            Object.defineProperty(options.methods, k, desc);\n            delete options[k];\n        }\n        else if (ComponentNativeProps.indexOf(k) < 0) {\n            inits[k] = desc;\n        }\n        else if (NativeLifeCycles.indexOf(k) >= 0) {\n            options.lifetimes[k] = options[k];\n        }\n    });\n    if (Object.keys(inits).length) {\n        const oldCreated = options.lifetimes.created;\n        const oldAttached = options.lifetimes.attached;\n        const { controlledProps = [] } = options;\n        options.lifetimes.created = function (...args) {\n            Object.defineProperties(this, inits);\n            if (oldCreated)\n                oldCreated.apply(this, args);\n        };\n        options.lifetimes.attached = function (...args) {\n            if (oldAttached)\n                oldAttached.apply(this, args);\n            controlledProps.forEach(({ key }) => {\n                const defaultKey = `default${key.replace(/^(\\w)/, (m, m1) => m1.toUpperCase())}`;\n                const props = this.properties;\n                if (props[key] == null) {\n                    this._selfControlled = true;\n                }\n                if (props[key] == null && props[defaultKey] != null) {\n                    this.setData({\n                        [key]: props[defaultKey],\n                    });\n                }\n            });\n        };\n        options.methods._trigger = function (evtName, detail, opts) {\n            const target = controlledProps.find((item) => item.event == evtName);\n            if (target) {\n                const { key } = target;\n                if (this._selfControlled) {\n                    this.setData({\n                        [key]: detail[key],\n                    });\n                }\n            }\n            this.triggerEvent(evtName, detail, opts);\n        };\n    }\n    return options;\n};\nexport const wxComponent = function wxComponent() {\n    return function (constructor) {\n        class WxComponent extends constructor {\n        }\n        const current = new WxComponent();\n        current.options = current.options || {};\n        if (canUseVirtualHost()) {\n            current.options.virtualHost = true;\n        }\n        const obj = toComponent(toObject(current));\n        Component(obj);\n    };\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/src/superComponent.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\nexport interface ComponentsOptionsType extends WechatMiniprogram.Component.ComponentOptions {\n    styleIsolation?: 'isolated' | 'apply-shared' | 'shared' | 'page-isolated' | 'page-apply-shared' | 'page-shared';\n}\nexport interface RelationsOptions {\n    [componentName: string]: WechatMiniprogram.Component.RelationOption;\n}\nexport interface SuperComponent<D = {}, P = {}, M = {}> extends WechatMiniprogram.Component.Lifetimes, WechatMiniprogram.Component.OtherOption, WechatMiniprogram.Component.InstanceMethods<D> {\n    properties: P;\n    data: D;\n    options: ComponentsOptionsType;\n    methods: M | Record<string, (...args: any[]) => any>;\n    $global: Function;\n    [x: string]: any;\n}\nexport declare class SuperComponent<D = {}, P = {}, M = {}> {\n    readonly app: any;\n    constructor();\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/src/superComponent.js",
    "content": "export class SuperComponent {\n    constructor() {\n        this.app = getApp();\n    }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/_variables.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/base.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/icons.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/index.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/mixins/_clearfix.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/mixins/_cursor.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/mixins/_ellipsis.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/mixins/_hairline.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/mixins/_index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/theme/_components.wxss",
    "content": "@media (prefers-color-scheme: light) {\n  page,\n  .page {\n    --td-picker-transparent-color: rgba(255, 255, 255, 0);\n  }\n}\n@media (prefers-color-scheme: dark) {\n  page,\n  .page {\n    --td-button-primary-disabled-color: var(--td-font-white-4);\n    --td-skeleton-animation-gradient: rgba(255, 255, 255, 0.06);\n    --td-slider-dot-bg-color: var(--td-gray-color-4);\n    --td-slider-dot-disabled-bg-color: var(--td-gray-color-11);\n    --td-slider-dot-disabled-border-color: var(--td-gray-color-12);\n    --td-picker-transparent-color: transparent;\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/theme/_dark.wxss",
    "content": "@media (prefers-color-scheme: dark) {\n  page,\n  .page {\n    --td-primary-color-1: #1b2f51;\n    --td-primary-color-2: #173463;\n    --td-primary-color-3: #143975;\n    --td-primary-color-4: #103d88;\n    --td-primary-color-5: #0d429a;\n    --td-primary-color-6: #054bbe;\n    --td-primary-color-7: #2667d4;\n    --td-primary-color-8: #4582e6;\n    --td-primary-color-9: #699ef5;\n    --td-primary-color-10: #96bbf8;\n    --td-warning-color-1: #4f2a1d;\n    --td-warning-color-2: #582f21;\n    --td-warning-color-3: #733c23;\n    --td-warning-color-4: #a75d2b;\n    --td-warning-color-5: #cf6e2d;\n    --td-warning-color-6: #dc7633;\n    --td-warning-color-7: #e8935c;\n    --td-warning-color-8: #ecbf91;\n    --td-warning-color-9: #eed7bf;\n    --td-warning-color-10: #f3e9dc;\n    --td-error-color-1: #472324;\n    --td-error-color-2: #5e2a2d;\n    --td-error-color-3: #703439;\n    --td-error-color-4: #83383e;\n    --td-error-color-5: #a03f46;\n    --td-error-color-6: #c64751;\n    --td-error-color-7: #de6670;\n    --td-error-color-8: #ec888e;\n    --td-error-color-9: #edb1b6;\n    --td-error-color-10: #eeced0;\n    --td-success-color-1: #193a2a;\n    --td-success-color-2: #1a4230;\n    --td-success-color-3: #17533d;\n    --td-success-color-4: #0d7a55;\n    --td-success-color-5: #059465;\n    --td-success-color-6: #43af8a;\n    --td-success-color-7: #46bf96;\n    --td-success-color-8: #80d2b6;\n    --td-success-color-9: #b4e1d3;\n    --td-success-color-10: #deede8;\n    --td-gray-color-1: #f3f3f3;\n    --td-gray-color-2: #eee;\n    --td-gray-color-3: #e8e8e8;\n    --td-gray-color-4: #ddd;\n    --td-gray-color-5: #c6c6c6;\n    --td-gray-color-6: #a6a6a6;\n    --td-gray-color-7: #8b8b8b;\n    --td-gray-color-8: #777;\n    --td-gray-color-9: #5e5e5e;\n    --td-gray-color-10: #4b4b4b;\n    --td-gray-color-11: #383838;\n    --td-gray-color-12: #2c2c2c;\n    --td-gray-color-13: #242424;\n    --td-gray-color-14: #181818;\n    --td-font-white-1: rgba(255, 255, 255, 0.9);\n    --td-font-white-2: rgba(255, 255, 255, 0.55);\n    --td-font-white-3: rgba(255, 255, 255, 0.35);\n    --td-font-white-4: rgba(255, 255, 255, 0.22);\n    --td-font-gray-1: rgba(0, 0, 0, 0.9);\n    --td-font-gray-2: rgba(0, 0, 0, 0.6);\n    --td-font-gray-3: rgba(0, 0, 0, 0.4);\n    --td-font-gray-4: rgba(0, 0, 0, 0.26);\n    --td-brand-color: var(--td-primary-color-8);\n    --td-warning-color: var(--td-warning-color-5);\n    --td-error-color: var(--td-error-color-6);\n    --td-success-color: var(--td-success-color-5);\n    --td-brand-color-focus: var(--td-primary-color-1);\n    --td-brand-color-active: var(--td-primary-color-9);\n    --td-brand-color-disabled: var(--td-primary-color-3);\n    --td-brand-color-light: var(--td-primary-color-1);\n    --td-brand-color-light-active: var(--td-primary-color-2);\n    --td-warning-color-focus: var(--td-warning-color-2);\n    --td-warning-color-active: var(--td-warning-color-4);\n    --td-warning-color-disabled: var(--td-warning-color-3);\n    --td-warning-color-light: var(--td-warning-color-1);\n    --td-warning-color-light-active: var(--td-warning-color-2);\n    --td-error-color-focus: var(--td-error-color-2);\n    --td-error-color-active: var(--td-error-color-5);\n    --td-error-color-disabled: var(--td-error-color-3);\n    --td-error-color-light: var(--td-error-color-1);\n    --td-error-color-light-active: var(--td-error-color-2);\n    --td-success-color-focus: var(--td-success-color-2);\n    --td-success-color-active: var(--td-success-color-4);\n    --td-success-color-disabled: var(--td-success-color-3);\n    --td-success-color-light: var(--td-success-color-1);\n    --td-success-color-light-active: var(--td-success-color-2);\n    --td-mask-active: rgba(0, 0, 0, 0.4);\n    --td-mask-disabled: rgba(0, 0, 0, 0.6);\n    --td-bg-color-page: var(--td-gray-color-14);\n    --td-bg-color-container: var(--td-gray-color-13);\n    --td-bg-color-secondarycontainer: var(--td-gray-color-12);\n    --td-bg-color-component: var(--td-gray-color-11);\n    --td-bg-color-container-active: var(--td-gray-color-12);\n    --td-bg-color-secondarycontainer-active: var(--td-gray-color-11);\n    --td-bg-color-component-active: var(--td-gray-color-10);\n    --td-bg-color-component-disabled: var(--td-gray-color-12);\n    --td-bg-color-specialcomponent: transparent;\n    --td-text-color-primary: var(--td-font-white-1);\n    --td-text-color-secondary: var(--td-font-white-2);\n    --td-text-color-placeholder: var(--td-font-white-3);\n    --td-text-color-disabled: var(--td-font-white-4);\n    --td-text-color-anti: var(--td-font-white-1);\n    --td-text-color-brand: var(--td-primary-color-8);\n    --td-text-color-link: var(--td-primary-color-8);\n    --td-border-level-1-color: var(--td-gray-color-11);\n    --td-component-stroke: var(--td-gray-color-11);\n    --td-border-level-2-color: var(--td-gray-color-9);\n    --td-component-border: var(--td-gray-color-9);\n    --td-shadow-1: 0 4px 6px rgba(0, 0, 0, 0.06), 0 1px 10px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.12);\n    --td-shadow-2: 0 8px 10px rgba(0, 0, 0, 0.12), 0 3px 14px rgba(0, 0, 0, 0.1), 0 5px 5px rgba(0, 0, 0, 0.16);\n    --td-shadow-3: 0 16px 24px rgba(0, 0, 0, 0.14), 0 6px 30px rgba(0, 0, 0, 0.12), 0 8px 10px rgba(0, 0, 0, 0.2);\n    --td-shadow-inset-top: inset 0 0.5px 0 #5e5e5e;\n    --td-shadow-inset-right: inset 0.5px 0 0 #5e5e5e;\n    --td-shadow-inset-bottom: inset 0 -0.5px 0 #5e5e5e;\n    --td-shadow-inset-left: inset -0.5px 0 0 #5e5e5e;\n    --td-table-shadow-color: rgba(0, 0, 0, 0.55);\n    --td-scrollbar-color: rgba(255, 255, 255, 0.1);\n    --td-scroll-track-color: #333;\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/theme/_font.wxss",
    "content": "page,\n.page {\n  --td-font-family: PingFang SC, Microsoft YaHei, Arial Regular;\n  --td-font-family-medium: PingFang SC, Microsoft YaHei, Arial Medium;\n  --td-font-size-link-small: 24rpx;\n  --td-font-size-link-medium: 28rpx;\n  --td-font-size-link-large: 32rpx;\n  --td-font-size-mark-extra-small: 20rpx;\n  --td-font-size-mark-small: 24rpx;\n  --td-font-size-mark-medium: 28rpx;\n  --td-font-size-mark-large: 32rpx;\n  --td-font-size-body-extra-small: 20rpx;\n  --td-font-size-body-small: 24rpx;\n  --td-font-size-body-medium: 28rpx;\n  --td-font-size-body-large: 32rpx;\n  --td-font-size-title-small: 28rpx;\n  --td-font-size-title-medium: 32rpx;\n  --td-font-size-title-large: 36rpx;\n  --td-font-size-title-extra-large: 40rpx;\n  --td-font-size-headline-small: 48rpx;\n  --td-font-size-headline-medium: 56rpx;\n  --td-font-size-headline-large: 72rpx;\n  --td-font-size-display-medium: 96rpx;\n  --td-font-size-display-large: 128rpx;\n  --td-font-size: 20rpx;\n  --td-font-size-xs: var(--td-font-size-body-extra-small);\n  --td-font-size-s: var(--td-font-size-body-small);\n  --td-font-size-base: var(--td-font-size-title-small);\n  --td-font-size-m: var(--td-font-size-title-medium);\n  --td-font-size-l: var(--td-font-size-title-large);\n  --td-font-size-xl: var(--td-font-size-title-extra-large);\n  --td-font-size-xxl: var(--td-font-size-headline-large);\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/theme/_index.wxss",
    "content": "@media (prefers-color-scheme: light) {\n  page,\n  .page {\n    --td-primary-color-1: #f2f3ff;\n    --td-primary-color-2: #d9e1ff;\n    --td-primary-color-3: #b5c7ff;\n    --td-primary-color-4: #8eabff;\n    --td-primary-color-5: #618dff;\n    --td-primary-color-6: #366ef4;\n    --td-primary-color-7: #0052d9;\n    --td-primary-color-8: #003cab;\n    --td-primary-color-9: #002a7c;\n    --td-primary-color-10: #001a57;\n    --td-warning-color-1: #fff1e9;\n    --td-warning-color-2: #ffd9c2;\n    --td-warning-color-3: #ffb98c;\n    --td-warning-color-4: #fa9550;\n    --td-warning-color-5: #e37318;\n    --td-warning-color-6: #be5a00;\n    --td-warning-color-7: #954500;\n    --td-warning-color-8: #713300;\n    --td-warning-color-9: #532300;\n    --td-warning-color-10: #3b1700;\n    --td-error-color-1: #fff0ed;\n    --td-error-color-2: #ffd8d2;\n    --td-error-color-3: #ffb9b0;\n    --td-error-color-4: #ff9285;\n    --td-error-color-5: #f6685d;\n    --td-error-color-6: #d54941;\n    --td-error-color-7: #ad352f;\n    --td-error-color-8: #881f1c;\n    --td-error-color-9: #68070a;\n    --td-error-color-10: #490002;\n    --td-success-color-1: #e3f9e9;\n    --td-success-color-2: #c6f3d7;\n    --td-success-color-3: #92dab2;\n    --td-success-color-4: #56c08d;\n    --td-success-color-5: #2ba471;\n    --td-success-color-6: #008858;\n    --td-success-color-7: #006c45;\n    --td-success-color-8: #005334;\n    --td-success-color-9: #003b23;\n    --td-success-color-10: #002515;\n    --td-gray-color-1: #f3f3f3;\n    --td-gray-color-2: #eeeeee;\n    --td-gray-color-3: #e7e7e7;\n    --td-gray-color-4: #dcdcdc;\n    --td-gray-color-5: #c5c5c5;\n    --td-gray-color-6: #a6a6a6;\n    --td-gray-color-7: #8b8b8b;\n    --td-gray-color-8: #777777;\n    --td-gray-color-9: #5e5e5e;\n    --td-gray-color-10: #4b4b4b;\n    --td-gray-color-11: #383838;\n    --td-gray-color-12: #2c2c2c;\n    --td-gray-color-13: #242424;\n    --td-gray-color-14: #181818;\n    --td-font-white-1: #ffffff;\n    --td-font-white-2: rgba(255, 255, 255, 0.55);\n    --td-font-white-3: rgba(255, 255, 255, 0.35);\n    --td-font-white-4: rgba(255, 255, 255, 0.22);\n    --td-font-gray-1: rgba(0, 0, 0, 0.9);\n    --td-font-gray-2: rgba(0, 0, 0, 0.6);\n    --td-font-gray-3: rgba(0, 0, 0, 0.4);\n    --td-font-gray-4: rgba(0, 0, 0, 0.26);\n    --td-brand-color: var(--td-primary-color-7);\n    --td-warning-color: var(--td-warning-color-5);\n    --td-error-color: var(--td-error-color-6);\n    --td-success-color: var(--td-success-color-5);\n    --td-brand-color-focus: var(--td-primary-color-1);\n    --td-brand-color-active: var(--td-primary-color-8);\n    --td-brand-color-disabled: var(--td-primary-color-3);\n    --td-brand-color-light: var(--td-primary-color-1);\n    --td-brand-color-light-active: var(--td-primary-color-2);\n    --td-warning-color-active: var(--td-warning-color-6);\n    --td-warning-color-disabled: var(--td-warning-color-3);\n    --td-warning-color-focus: var(--td-warning-color-2);\n    --td-warning-color-light: var(--td-warning-color-1);\n    --td-warning-color-light-active: var(--td-warning-color-2);\n    --td-error-color-focus: var(--td-error-color-2);\n    --td-error-color-active: var(--td-error-color-7);\n    --td-error-color-disabled: var(--td-error-color-3);\n    --td-error-color-light: var(--td-error-color-1);\n    --td-error-color-light-active: var(--td-error-color-2);\n    --td-success-color-focus: var(--td-success-color-2);\n    --td-success-color-active: var(--td-success-color-6);\n    --td-success-color-disabled: var(--td-success-color-3);\n    --td-success-color-light: var(--td-success-color-1);\n    --td-success-color-light-active: var(--td-success-color-2);\n    --td-mask-active: rgba(0, 0, 0, 0.6);\n    --td-mask-disabled: rgba(255, 255, 255, 0.6);\n    --td-bg-color-page: var(--td-gray-color-1);\n    --td-bg-color-container: var(--td-font-white-1);\n    --td-bg-color-container-active: var(--td-gray-color-3);\n    --td-bg-color-secondarycontainer: var(--td-gray-color-1);\n    --td-bg-color-secondarycontainer-active: var(--td-gray-color-4);\n    --td-bg-color-component: var(--td-gray-color-3);\n    --td-bg-color-component-active: var(--td-gray-color-6);\n    --td-bg-color-component-disabled: var(--td-gray-color-2);\n    --td-bg-color-secondarycomponent: var(--td-gray-color-4);\n    --td-bg-color-secondarycomponent-active: var(--td-gray-color-6);\n    --td-bg-color-specialcomponent: #fff;\n    --td-text-color-primary: var(--td-font-gray-1);\n    --td-text-color-secondary: var(--td-font-gray-2);\n    --td-text-color-placeholder: var(--td-font-gray-3);\n    --td-text-color-disabled: var(--td-font-gray-4);\n    --td-text-color-anti: var(--td-font-white-1);\n    --td-text-color-brand: var(--td-brand-color);\n    --td-text-color-link: var(--td-brand-color);\n    --td-border-level-1-color: var(--td-gray-color-3);\n    --td-component-stroke: var(--td-gray-color-3);\n    --td-border-level-2-color: var(--td-gray-color-4);\n    --td-component-border: var(--td-gray-color-4);\n    --td-shadow-1: 0 1px 10px rgba(0, 0, 0, 0.05), 0 4px 5px rgba(0, 0, 0, 0.08), 0 2px 4px -1px rgba(0, 0, 0, 0.12);\n    --td-shadow-2: 0 3px 14px 2px rgba(0, 0, 0, 0.05), 0 8px 10px 1px rgba(0, 0, 0, 0.06), 0 5px 5px -3px rgba(0, 0, 0, 0.1);\n    --td-shadow-3: 0 6px 30px 5px rgba(0, 0, 0, 0.05), 0 16px 24px 2px rgba(0, 0, 0, 0.04), 0 8px 10px -5px rgba(0, 0, 0, 0.08);\n    --td-shadow-4: 0 2px 8px 0 rgba(0, 0, 0, 0.06);\n    --td-shadow-inset-top: inset 0 0.5px 0 #dcdcdc;\n    --td-shadow-inset-right: inset 0.5px 0 0 #dcdcdc;\n    --td-shadow-inset-bottom: inset 0 -0.5px 0 #dcdcdc;\n    --td-shadow-inset-left: inset -0.5px 0 0 #dcdcdc;\n    --td-table-shadow-color: rgba(0, 0, 0, 0.08);\n    --td-scrollbar-color: rgba(0, 0, 0, 0.1);\n    --td-scrollbar-hover-color: rgba(0, 0, 0, 0.3);\n    --td-scroll-track-color: #fff;\n  }\n}\n@media (prefers-color-scheme: dark) {\n  page,\n  .page {\n    --td-primary-color-1: #1b2f51;\n    --td-primary-color-2: #173463;\n    --td-primary-color-3: #143975;\n    --td-primary-color-4: #103d88;\n    --td-primary-color-5: #0d429a;\n    --td-primary-color-6: #054bbe;\n    --td-primary-color-7: #2667d4;\n    --td-primary-color-8: #4582e6;\n    --td-primary-color-9: #699ef5;\n    --td-primary-color-10: #96bbf8;\n    --td-warning-color-1: #4f2a1d;\n    --td-warning-color-2: #582f21;\n    --td-warning-color-3: #733c23;\n    --td-warning-color-4: #a75d2b;\n    --td-warning-color-5: #cf6e2d;\n    --td-warning-color-6: #dc7633;\n    --td-warning-color-7: #e8935c;\n    --td-warning-color-8: #ecbf91;\n    --td-warning-color-9: #eed7bf;\n    --td-warning-color-10: #f3e9dc;\n    --td-error-color-1: #472324;\n    --td-error-color-2: #5e2a2d;\n    --td-error-color-3: #703439;\n    --td-error-color-4: #83383e;\n    --td-error-color-5: #a03f46;\n    --td-error-color-6: #c64751;\n    --td-error-color-7: #de6670;\n    --td-error-color-8: #ec888e;\n    --td-error-color-9: #edb1b6;\n    --td-error-color-10: #eeced0;\n    --td-success-color-1: #193a2a;\n    --td-success-color-2: #1a4230;\n    --td-success-color-3: #17533d;\n    --td-success-color-4: #0d7a55;\n    --td-success-color-5: #059465;\n    --td-success-color-6: #43af8a;\n    --td-success-color-7: #46bf96;\n    --td-success-color-8: #80d2b6;\n    --td-success-color-9: #b4e1d3;\n    --td-success-color-10: #deede8;\n    --td-gray-color-1: #f3f3f3;\n    --td-gray-color-2: #eee;\n    --td-gray-color-3: #e8e8e8;\n    --td-gray-color-4: #ddd;\n    --td-gray-color-5: #c6c6c6;\n    --td-gray-color-6: #a6a6a6;\n    --td-gray-color-7: #8b8b8b;\n    --td-gray-color-8: #777;\n    --td-gray-color-9: #5e5e5e;\n    --td-gray-color-10: #4b4b4b;\n    --td-gray-color-11: #383838;\n    --td-gray-color-12: #2c2c2c;\n    --td-gray-color-13: #242424;\n    --td-gray-color-14: #181818;\n    --td-font-white-1: rgba(255, 255, 255, 0.9);\n    --td-font-white-2: rgba(255, 255, 255, 0.55);\n    --td-font-white-3: rgba(255, 255, 255, 0.35);\n    --td-font-white-4: rgba(255, 255, 255, 0.22);\n    --td-font-gray-1: rgba(0, 0, 0, 0.9);\n    --td-font-gray-2: rgba(0, 0, 0, 0.6);\n    --td-font-gray-3: rgba(0, 0, 0, 0.4);\n    --td-font-gray-4: rgba(0, 0, 0, 0.26);\n    --td-brand-color: var(--td-primary-color-8);\n    --td-warning-color: var(--td-warning-color-5);\n    --td-error-color: var(--td-error-color-6);\n    --td-success-color: var(--td-success-color-5);\n    --td-brand-color-focus: var(--td-primary-color-1);\n    --td-brand-color-active: var(--td-primary-color-9);\n    --td-brand-color-disabled: var(--td-primary-color-3);\n    --td-brand-color-light: var(--td-primary-color-1);\n    --td-brand-color-light-active: var(--td-primary-color-2);\n    --td-warning-color-focus: var(--td-warning-color-2);\n    --td-warning-color-active: var(--td-warning-color-4);\n    --td-warning-color-disabled: var(--td-warning-color-3);\n    --td-warning-color-light: var(--td-warning-color-1);\n    --td-warning-color-light-active: var(--td-warning-color-2);\n    --td-error-color-focus: var(--td-error-color-2);\n    --td-error-color-active: var(--td-error-color-5);\n    --td-error-color-disabled: var(--td-error-color-3);\n    --td-error-color-light: var(--td-error-color-1);\n    --td-error-color-light-active: var(--td-error-color-2);\n    --td-success-color-focus: var(--td-success-color-2);\n    --td-success-color-active: var(--td-success-color-4);\n    --td-success-color-disabled: var(--td-success-color-3);\n    --td-success-color-light: var(--td-success-color-1);\n    --td-success-color-light-active: var(--td-success-color-2);\n    --td-mask-active: rgba(0, 0, 0, 0.4);\n    --td-mask-disabled: rgba(0, 0, 0, 0.6);\n    --td-bg-color-page: var(--td-gray-color-14);\n    --td-bg-color-container: var(--td-gray-color-13);\n    --td-bg-color-secondarycontainer: var(--td-gray-color-12);\n    --td-bg-color-component: var(--td-gray-color-11);\n    --td-bg-color-container-active: var(--td-gray-color-12);\n    --td-bg-color-secondarycontainer-active: var(--td-gray-color-11);\n    --td-bg-color-component-active: var(--td-gray-color-10);\n    --td-bg-color-component-disabled: var(--td-gray-color-12);\n    --td-bg-color-specialcomponent: transparent;\n    --td-text-color-primary: var(--td-font-white-1);\n    --td-text-color-secondary: var(--td-font-white-2);\n    --td-text-color-placeholder: var(--td-font-white-3);\n    --td-text-color-disabled: var(--td-font-white-4);\n    --td-text-color-anti: var(--td-font-white-1);\n    --td-text-color-brand: var(--td-primary-color-8);\n    --td-text-color-link: var(--td-primary-color-8);\n    --td-border-level-1-color: var(--td-gray-color-11);\n    --td-component-stroke: var(--td-gray-color-11);\n    --td-border-level-2-color: var(--td-gray-color-9);\n    --td-component-border: var(--td-gray-color-9);\n    --td-shadow-1: 0 4px 6px rgba(0, 0, 0, 0.06), 0 1px 10px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.12);\n    --td-shadow-2: 0 8px 10px rgba(0, 0, 0, 0.12), 0 3px 14px rgba(0, 0, 0, 0.1), 0 5px 5px rgba(0, 0, 0, 0.16);\n    --td-shadow-3: 0 16px 24px rgba(0, 0, 0, 0.14), 0 6px 30px rgba(0, 0, 0, 0.12), 0 8px 10px rgba(0, 0, 0, 0.2);\n    --td-shadow-inset-top: inset 0 0.5px 0 #5e5e5e;\n    --td-shadow-inset-right: inset 0.5px 0 0 #5e5e5e;\n    --td-shadow-inset-bottom: inset 0 -0.5px 0 #5e5e5e;\n    --td-shadow-inset-left: inset -0.5px 0 0 #5e5e5e;\n    --td-table-shadow-color: rgba(0, 0, 0, 0.55);\n    --td-scrollbar-color: rgba(255, 255, 255, 0.1);\n    --td-scroll-track-color: #333;\n  }\n}\npage,\n.page {\n  --td-radius-small: 6rpx;\n  --td-radius-default: 12rpx;\n  --td-radius-large: 18rpx;\n  --td-radius-extra-large: 24rpx;\n  --td-radius-round: 999px;\n  --td-radius-circle: 50%;\n}\npage,\n.page {\n  --td-font-family: PingFang SC, Microsoft YaHei, Arial Regular;\n  --td-font-family-medium: PingFang SC, Microsoft YaHei, Arial Medium;\n  --td-font-size-link-small: 24rpx;\n  --td-font-size-link-medium: 28rpx;\n  --td-font-size-link-large: 32rpx;\n  --td-font-size-mark-extra-small: 20rpx;\n  --td-font-size-mark-small: 24rpx;\n  --td-font-size-mark-medium: 28rpx;\n  --td-font-size-mark-large: 32rpx;\n  --td-font-size-body-extra-small: 20rpx;\n  --td-font-size-body-small: 24rpx;\n  --td-font-size-body-medium: 28rpx;\n  --td-font-size-body-large: 32rpx;\n  --td-font-size-title-small: 28rpx;\n  --td-font-size-title-medium: 32rpx;\n  --td-font-size-title-large: 36rpx;\n  --td-font-size-title-extra-large: 40rpx;\n  --td-font-size-headline-small: 48rpx;\n  --td-font-size-headline-medium: 56rpx;\n  --td-font-size-headline-large: 72rpx;\n  --td-font-size-display-medium: 96rpx;\n  --td-font-size-display-large: 128rpx;\n  --td-font-size: 20rpx;\n  --td-font-size-xs: var(--td-font-size-body-extra-small);\n  --td-font-size-s: var(--td-font-size-body-small);\n  --td-font-size-base: var(--td-font-size-title-small);\n  --td-font-size-m: var(--td-font-size-title-medium);\n  --td-font-size-l: var(--td-font-size-title-large);\n  --td-font-size-xl: var(--td-font-size-title-extra-large);\n  --td-font-size-xxl: var(--td-font-size-headline-large);\n}\npage,\n.page {\n  --td-spacer: 16rpx;\n  --td-spacer-1: 24rpx;\n  --td-spacer-2: 32rpx;\n  --td-spacer-3: 48rpx;\n  --td-spacer-4: 64rpx;\n  --td-spacer-5: 96rpx;\n  --td-spacer-6: 160rpx;\n}\n@media (prefers-color-scheme: light) {\n  page,\n  .page {\n    --td-picker-transparent-color: rgba(255, 255, 255, 0);\n  }\n}\n@media (prefers-color-scheme: dark) {\n  page,\n  .page {\n    --td-button-primary-disabled-color: var(--td-font-white-4);\n    --td-skeleton-animation-gradient: rgba(255, 255, 255, 0.06);\n    --td-slider-dot-bg-color: var(--td-gray-color-4);\n    --td-slider-dot-disabled-bg-color: var(--td-gray-color-11);\n    --td-slider-dot-disabled-border-color: var(--td-gray-color-12);\n    --td-picker-transparent-color: transparent;\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/theme/_light.wxss",
    "content": "@media (prefers-color-scheme: light) {\n  page,\n  .page {\n    --td-primary-color-1: #f2f3ff;\n    --td-primary-color-2: #d9e1ff;\n    --td-primary-color-3: #b5c7ff;\n    --td-primary-color-4: #8eabff;\n    --td-primary-color-5: #618dff;\n    --td-primary-color-6: #366ef4;\n    --td-primary-color-7: #0052d9;\n    --td-primary-color-8: #003cab;\n    --td-primary-color-9: #002a7c;\n    --td-primary-color-10: #001a57;\n    --td-warning-color-1: #fff1e9;\n    --td-warning-color-2: #ffd9c2;\n    --td-warning-color-3: #ffb98c;\n    --td-warning-color-4: #fa9550;\n    --td-warning-color-5: #e37318;\n    --td-warning-color-6: #be5a00;\n    --td-warning-color-7: #954500;\n    --td-warning-color-8: #713300;\n    --td-warning-color-9: #532300;\n    --td-warning-color-10: #3b1700;\n    --td-error-color-1: #fff0ed;\n    --td-error-color-2: #ffd8d2;\n    --td-error-color-3: #ffb9b0;\n    --td-error-color-4: #ff9285;\n    --td-error-color-5: #f6685d;\n    --td-error-color-6: #d54941;\n    --td-error-color-7: #ad352f;\n    --td-error-color-8: #881f1c;\n    --td-error-color-9: #68070a;\n    --td-error-color-10: #490002;\n    --td-success-color-1: #e3f9e9;\n    --td-success-color-2: #c6f3d7;\n    --td-success-color-3: #92dab2;\n    --td-success-color-4: #56c08d;\n    --td-success-color-5: #2ba471;\n    --td-success-color-6: #008858;\n    --td-success-color-7: #006c45;\n    --td-success-color-8: #005334;\n    --td-success-color-9: #003b23;\n    --td-success-color-10: #002515;\n    --td-gray-color-1: #f3f3f3;\n    --td-gray-color-2: #eeeeee;\n    --td-gray-color-3: #e7e7e7;\n    --td-gray-color-4: #dcdcdc;\n    --td-gray-color-5: #c5c5c5;\n    --td-gray-color-6: #a6a6a6;\n    --td-gray-color-7: #8b8b8b;\n    --td-gray-color-8: #777777;\n    --td-gray-color-9: #5e5e5e;\n    --td-gray-color-10: #4b4b4b;\n    --td-gray-color-11: #383838;\n    --td-gray-color-12: #2c2c2c;\n    --td-gray-color-13: #242424;\n    --td-gray-color-14: #181818;\n    --td-font-white-1: #ffffff;\n    --td-font-white-2: rgba(255, 255, 255, 0.55);\n    --td-font-white-3: rgba(255, 255, 255, 0.35);\n    --td-font-white-4: rgba(255, 255, 255, 0.22);\n    --td-font-gray-1: rgba(0, 0, 0, 0.9);\n    --td-font-gray-2: rgba(0, 0, 0, 0.6);\n    --td-font-gray-3: rgba(0, 0, 0, 0.4);\n    --td-font-gray-4: rgba(0, 0, 0, 0.26);\n    --td-brand-color: var(--td-primary-color-7);\n    --td-warning-color: var(--td-warning-color-5);\n    --td-error-color: var(--td-error-color-6);\n    --td-success-color: var(--td-success-color-5);\n    --td-brand-color-focus: var(--td-primary-color-1);\n    --td-brand-color-active: var(--td-primary-color-8);\n    --td-brand-color-disabled: var(--td-primary-color-3);\n    --td-brand-color-light: var(--td-primary-color-1);\n    --td-brand-color-light-active: var(--td-primary-color-2);\n    --td-warning-color-active: var(--td-warning-color-6);\n    --td-warning-color-disabled: var(--td-warning-color-3);\n    --td-warning-color-focus: var(--td-warning-color-2);\n    --td-warning-color-light: var(--td-warning-color-1);\n    --td-warning-color-light-active: var(--td-warning-color-2);\n    --td-error-color-focus: var(--td-error-color-2);\n    --td-error-color-active: var(--td-error-color-7);\n    --td-error-color-disabled: var(--td-error-color-3);\n    --td-error-color-light: var(--td-error-color-1);\n    --td-error-color-light-active: var(--td-error-color-2);\n    --td-success-color-focus: var(--td-success-color-2);\n    --td-success-color-active: var(--td-success-color-6);\n    --td-success-color-disabled: var(--td-success-color-3);\n    --td-success-color-light: var(--td-success-color-1);\n    --td-success-color-light-active: var(--td-success-color-2);\n    --td-mask-active: rgba(0, 0, 0, 0.6);\n    --td-mask-disabled: rgba(255, 255, 255, 0.6);\n    --td-bg-color-page: var(--td-gray-color-1);\n    --td-bg-color-container: var(--td-font-white-1);\n    --td-bg-color-container-active: var(--td-gray-color-3);\n    --td-bg-color-secondarycontainer: var(--td-gray-color-1);\n    --td-bg-color-secondarycontainer-active: var(--td-gray-color-4);\n    --td-bg-color-component: var(--td-gray-color-3);\n    --td-bg-color-component-active: var(--td-gray-color-6);\n    --td-bg-color-component-disabled: var(--td-gray-color-2);\n    --td-bg-color-secondarycomponent: var(--td-gray-color-4);\n    --td-bg-color-secondarycomponent-active: var(--td-gray-color-6);\n    --td-bg-color-specialcomponent: #fff;\n    --td-text-color-primary: var(--td-font-gray-1);\n    --td-text-color-secondary: var(--td-font-gray-2);\n    --td-text-color-placeholder: var(--td-font-gray-3);\n    --td-text-color-disabled: var(--td-font-gray-4);\n    --td-text-color-anti: var(--td-font-white-1);\n    --td-text-color-brand: var(--td-brand-color);\n    --td-text-color-link: var(--td-brand-color);\n    --td-border-level-1-color: var(--td-gray-color-3);\n    --td-component-stroke: var(--td-gray-color-3);\n    --td-border-level-2-color: var(--td-gray-color-4);\n    --td-component-border: var(--td-gray-color-4);\n    --td-shadow-1: 0 1px 10px rgba(0, 0, 0, 0.05), 0 4px 5px rgba(0, 0, 0, 0.08), 0 2px 4px -1px rgba(0, 0, 0, 0.12);\n    --td-shadow-2: 0 3px 14px 2px rgba(0, 0, 0, 0.05), 0 8px 10px 1px rgba(0, 0, 0, 0.06), 0 5px 5px -3px rgba(0, 0, 0, 0.1);\n    --td-shadow-3: 0 6px 30px 5px rgba(0, 0, 0, 0.05), 0 16px 24px 2px rgba(0, 0, 0, 0.04), 0 8px 10px -5px rgba(0, 0, 0, 0.08);\n    --td-shadow-4: 0 2px 8px 0 rgba(0, 0, 0, 0.06);\n    --td-shadow-inset-top: inset 0 0.5px 0 #dcdcdc;\n    --td-shadow-inset-right: inset 0.5px 0 0 #dcdcdc;\n    --td-shadow-inset-bottom: inset 0 -0.5px 0 #dcdcdc;\n    --td-shadow-inset-left: inset -0.5px 0 0 #dcdcdc;\n    --td-table-shadow-color: rgba(0, 0, 0, 0.08);\n    --td-scrollbar-color: rgba(0, 0, 0, 0.1);\n    --td-scrollbar-hover-color: rgba(0, 0, 0, 0.3);\n    --td-scroll-track-color: #fff;\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/theme/_radius.wxss",
    "content": "page,\n.page {\n  --td-radius-small: 6rpx;\n  --td-radius-default: 12rpx;\n  --td-radius-large: 18rpx;\n  --td-radius-extra-large: 24rpx;\n  --td-radius-round: 999px;\n  --td-radius-circle: 50%;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/theme/_spacer.wxss",
    "content": "page,\n.page {\n  --td-spacer: 16rpx;\n  --td-spacer-1: 24rpx;\n  --td-spacer-2: 32rpx;\n  --td-spacer-3: 48rpx;\n  --td-spacer-4: 64rpx;\n  --td-spacer-5: 96rpx;\n  --td-spacer-6: 160rpx;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/utilities/_animation.wxss",
    "content": "@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/utilities/_float.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/style/utilities/_index.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/template/badge.wxml",
    "content": "<template name=\"badge\">\n  <t-badge\n    color=\"{{color || ''}}\"\n    content=\"{{content || ''}}\"\n    count=\"{{count || 0}}\"\n    dot=\"{{dot || false}}\"\n    max-count=\"{{maxCount || 99}}\"\n    offset=\"{{offset || []}}\"\n    shape=\"{{shape || 'circle'}}\"\n    show-zero=\"{{showZero || false}}\"\n    size=\"{{size || 'medium'}}\"\n    t-class=\"{{tClass}}\"\n    t-class-content=\"{{tClassContent}}\"\n    t-class-count=\"{{tClassCount}}\"\n  />\n</template>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/template/button.wxml",
    "content": "<template name=\"button\">\n  <t-button\n    t-id=\"{{tId || ''}}\"\n    block=\"{{block || false}}\"\n    class=\"{{rootClass || ''}}\"\n    t-class=\"{{tClass}}\"\n    disabled=\"{{disabled || false}}\"\n    data-type=\"{{type}}\"\n    data-extra=\"{{extra}}\"\n    content=\"{{content || ''}}\"\n    icon=\"{{icon || ''}}\"\n    loading=\"{{loading || false}}\"\n    theme=\"{{theme || 'default'}}\"\n    ghost=\"{{ghost || false}}\"\n    shape=\"{{shape || 'rectangle'}}\"\n    size=\"{{size || 'medium'}}\"\n    variant=\"{{variant || 'base'}}\"\n    open-type=\"{{openType || ''}}\"\n    hover-class=\"{{hoverClass || ''}}\"\n    hover-stop-propagation=\"{{hoverStopPropagation || false}}\"\n    hover-start-time=\"{{hoverStartTime || 20}}\"\n    hover-stay-time=\"{{hoverStayTime || 70}}\"\n    lang=\"{{lang || 'en'}}\"\n    session-from=\"{{sessionFrom || ''}}\"\n    send-message-title=\"{{sendMessageTitle || ''}}\"\n    send-message-path=\"{{sendMessagePath || ''}}\"\n    send-message-img=\"{{sendMessageImg || ''}}\"\n    app-parameter=\"{{appParameter || ''}}\"\n    show-message-card=\"{{showMessageCard || false}}\"\n    bind:tap=\"onTplButtonTap\"\n    bind:getuserinfo=\"onTplButtonTap\"\n    bind:contact=\"onTplButtonTap\"\n    bind:getphonenumber=\"onTplButtonTap\"\n    bind:error=\"onTplButtonTap\"\n    bind:opensetting=\"onTplButtonTap\"\n    bind:launchapp=\"onTplButtonTap\"\n    bind:agreeprivacyauthorization=\"onTplButtonTap\"\n    aria-label=\"{{ariaLabel || ''}}\"\n  >\n    <slot />\n  </t-button>\n</template>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/template/icon.wxml",
    "content": "<template name=\"icon\">\n  <t-icon\n    style=\"{{style || ''}}\"\n    t-class=\"{{tClass}}\"\n    prefix=\"{{prefix || ''}}\"\n    name=\"{{name || ''}}\"\n    size=\"{{size || ''}}\"\n    color=\"{{color || ''}}\"\n    aria-hidden=\"{{ariaHidden || '' }}\"\n    aria-label=\"{{ariaLabel || ''}}\"\n    aria-role=\"{{ariaRole || ''}}\"\n    bind:click=\"{{bindclick || ''}}\"\n  />\n</template>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/template/image.wxml",
    "content": "<template name=\"image\">\n  <t-image\n    t-class=\"{{tClass}}\"\n    t-class-load=\"{{tClassLoad}}\"\n    style=\"{{style || ''}}\"\n    customStyle=\"{{customStyle || ''}}\"\n    height=\"{{height || ''}}\"\n    width=\"{{width || ''}}\"\n    error=\"{{error || 'default'}}\"\n    lazy=\"{{lazy || false}}\"\n    loading=\"{{count || 'default'}}\"\n    shape=\"{{shape || 'square'}}\"\n    src=\"{{src || ''}}\"\n    mode=\"{{mode || 'scaleToFill'}}\"\n    webp=\"{{webp || false}}\"\n    showMenuByLongpress=\"{{showMenuByLongpress || false}}\"\n    data-custom=\"{{dataset || null}}\"\n    bind:error=\"{{binderror}}\"\n    bind:load=\"{{bindload}}\"\n  />\n</template>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/utils.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\n/// <reference types=\"miniprogram-api-typings\" />\n/// <reference types=\"miniprogram-api-typings\" />\nexport declare const systemInfo: WechatMiniprogram.WindowInfo | WechatMiniprogram.SystemInfo;\nexport declare const appBaseInfo: WechatMiniprogram.AppBaseInfo | WechatMiniprogram.SystemInfo;\nexport declare const deviceInfo: WechatMiniprogram.DeviceInfo | WechatMiniprogram.SystemInfo;\ndeclare type Context = WechatMiniprogram.Page.TrivialInstance | WechatMiniprogram.Component.TrivialInstance;\nexport declare const debounce: (func: any, wait?: number) => (...rest: any[]) => void;\nexport declare const throttle: (func: any, wait?: number, options?: any) => (...args: any[]) => void;\nexport declare const classNames: (...args: any[]) => string;\nexport declare const styles: (styleObj: any) => string;\nexport declare const getAnimationFrame: (context: any, cb: Function) => any;\nexport declare const getRect: (context: any, selector: string, needAll?: boolean) => Promise<any>;\nexport declare const isNumber: (value: any) => boolean;\nexport declare const isNull: (value: any) => boolean;\nexport declare const isUndefined: (value: any) => boolean;\nexport declare const isDef: (value: any) => boolean;\nexport declare const isIOS: () => boolean;\nexport declare const addUnit: (value?: string | number) => string | undefined;\nexport declare const getCharacterLength: (type: string, char: string | number, max?: number) => {\n    length: number;\n    characters: string;\n};\nexport declare const chunk: (arr: any[], size: number) => any[][];\nexport declare const getInstance: (context?: Context, selector?: string) => WechatMiniprogram.Component.TrivialInstance;\nexport declare const unitConvert: (value: number | string | null | undefined) => number;\nexport declare const setIcon: (iconName: any, icon: any, defaultIcon: any) => {\n    [x: string]: any;\n};\nexport declare const isBool: (val: any) => boolean;\nexport declare const isObject: (val: any) => boolean;\nexport declare const isString: (val: any) => boolean;\nexport declare const toCamel: (str: any) => any;\nexport declare const getCurrentPage: <T>() => T & WechatMiniprogram.OptionalInterface<WechatMiniprogram.Page.ILifetime> & WechatMiniprogram.Page.InstanceProperties & WechatMiniprogram.Page.InstanceMethods<WechatMiniprogram.IAnyObject> & WechatMiniprogram.Page.Data<WechatMiniprogram.IAnyObject> & WechatMiniprogram.IAnyObject;\nexport declare const uniqueFactory: (compName: any) => () => string;\nexport declare const calcIcon: (icon: string | Record<string, any>, defaultIcon?: string) => string | Record<string, any>;\nexport declare const isOverSize: (size: any, sizeLimit: any) => boolean;\nexport declare const rpx2px: (rpx: any) => number;\nexport declare const nextTick: () => Promise<void>;\nexport {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/utils.js",
    "content": "import { prefix } from './config';\nimport { getWindowInfo, getAppBaseInfo, getDeviceInfo } from './wechat';\nexport const systemInfo = getWindowInfo();\nexport const appBaseInfo = getAppBaseInfo();\nexport const deviceInfo = getDeviceInfo();\nexport const debounce = function (func, wait = 500) {\n    let timerId;\n    return function (...rest) {\n        if (timerId) {\n            clearTimeout(timerId);\n        }\n        timerId = setTimeout(() => {\n            func.apply(this, rest);\n        }, wait);\n    };\n};\nexport const throttle = (func, wait = 100, options = null) => {\n    let previous = 0;\n    let timerid = null;\n    if (!options) {\n        options = {\n            leading: true,\n        };\n    }\n    return function (...args) {\n        const now = Date.now();\n        if (!previous && !options.leading)\n            previous = now;\n        const remaining = wait - (now - previous);\n        const context = this;\n        if (remaining <= 0) {\n            if (timerid) {\n                clearTimeout(timerid);\n                timerid = null;\n            }\n            previous = now;\n            func.apply(context, args);\n        }\n    };\n};\nexport const classNames = function (...args) {\n    const hasOwn = {}.hasOwnProperty;\n    const classes = [];\n    args.forEach((arg) => {\n        if (!arg)\n            return;\n        const argType = typeof arg;\n        if (argType === 'string' || argType === 'number') {\n            classes.push(arg);\n        }\n        else if (Array.isArray(arg) && arg.length) {\n            const inner = classNames(...arg);\n            if (inner) {\n                classes.push(inner);\n            }\n        }\n        else if (argType === 'object') {\n            for (const key in arg) {\n                if (hasOwn.call(arg, key) && arg[key]) {\n                    classes.push(key);\n                }\n            }\n        }\n    });\n    return classes.join(' ');\n};\nexport const styles = function (styleObj) {\n    return Object.keys(styleObj)\n        .map((styleKey) => `${styleKey}: ${styleObj[styleKey]}`)\n        .join('; ');\n};\nexport const getAnimationFrame = function (context, cb) {\n    return context\n        .createSelectorQuery()\n        .selectViewport()\n        .boundingClientRect()\n        .exec(() => {\n        cb();\n    });\n};\nexport const getRect = function (context, selector, needAll = false) {\n    return new Promise((resolve, reject) => {\n        context\n            .createSelectorQuery()[needAll ? 'selectAll' : 'select'](selector)\n            .boundingClientRect((rect) => {\n            if (rect) {\n                resolve(rect);\n            }\n            else {\n                reject(rect);\n            }\n        })\n            .exec();\n    });\n};\nexport const isNumber = function (value) {\n    return /^\\d+(\\.\\d+)?$/.test(value);\n};\nexport const isNull = function (value) {\n    return value === null;\n};\nexport const isUndefined = (value) => typeof value === 'undefined';\nexport const isDef = function (value) {\n    return !isUndefined(value) && !isNull(value);\n};\nexport const isIOS = function () {\n    var _a;\n    return !!(((_a = deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.system) === null || _a === void 0 ? void 0 : _a.toLowerCase().search('ios')) + 1);\n};\nexport const addUnit = function (value) {\n    if (!isDef(value)) {\n        return undefined;\n    }\n    value = String(value);\n    return isNumber(value) ? `${value}px` : value;\n};\nexport const getCharacterLength = (type, char, max) => {\n    const str = String(char !== null && char !== void 0 ? char : '');\n    if (str.length === 0) {\n        return {\n            length: 0,\n            characters: '',\n        };\n    }\n    if (type === 'maxcharacter') {\n        let len = 0;\n        for (let i = 0; i < str.length; i += 1) {\n            let currentStringLength = 0;\n            if (str.charCodeAt(i) > 127 || str.charCodeAt(i) === 94) {\n                currentStringLength = 2;\n            }\n            else {\n                currentStringLength = 1;\n            }\n            if (len + currentStringLength > max) {\n                return {\n                    length: len,\n                    characters: str.slice(0, i),\n                };\n            }\n            len += currentStringLength;\n        }\n        return {\n            length: len,\n            characters: str,\n        };\n    }\n    else if (type === 'maxlength') {\n        const length = str.length > max ? max : str.length;\n        return {\n            length,\n            characters: str.slice(0, length),\n        };\n    }\n    return {\n        length: str.length,\n        characters: str,\n    };\n};\nexport const chunk = (arr, size) => Array.from({ length: Math.ceil(arr.length / size) }, (v, i) => arr.slice(i * size, i * size + size));\nexport const getInstance = function (context, selector) {\n    if (!context) {\n        const pages = getCurrentPages();\n        const page = pages[pages.length - 1];\n        context = page.$$basePage || page;\n    }\n    const instance = context ? context.selectComponent(selector) : null;\n    if (!instance) {\n        console.warn('未找到组件,请检查selector是否正确');\n        return null;\n    }\n    return instance;\n};\nexport const unitConvert = (value) => {\n    var _a;\n    if (typeof value === 'string') {\n        if (value.includes('rpx')) {\n            return (parseInt(value, 10) * ((_a = systemInfo === null || systemInfo === void 0 ? void 0 : systemInfo.screenWidth) !== null && _a !== void 0 ? _a : 750)) / 750;\n        }\n        return parseInt(value, 10);\n    }\n    return value !== null && value !== void 0 ? value : 0;\n};\nexport const setIcon = (iconName, icon, defaultIcon) => {\n    if (icon) {\n        if (typeof icon === 'string') {\n            return {\n                [`${iconName}Name`]: icon,\n                [`${iconName}Data`]: {},\n            };\n        }\n        else if (typeof icon === 'object') {\n            return {\n                [`${iconName}Name`]: '',\n                [`${iconName}Data`]: icon,\n            };\n        }\n        else {\n            return {\n                [`${iconName}Name`]: defaultIcon,\n                [`${iconName}Data`]: {},\n            };\n        }\n    }\n    return {\n        [`${iconName}Name`]: '',\n        [`${iconName}Data`]: {},\n    };\n};\nexport const isBool = (val) => typeof val === 'boolean';\nexport const isObject = (val) => typeof val === 'object' && val != null;\nexport const isString = (val) => typeof val === 'string';\nexport const toCamel = (str) => str.replace(/-(\\w)/g, (match, m1) => m1.toUpperCase());\nexport const getCurrentPage = function () {\n    const pages = getCurrentPages();\n    return pages[pages.length - 1];\n};\nexport const uniqueFactory = (compName) => {\n    let number = 0;\n    return () => `${prefix}_${compName}_${number++}`;\n};\nexport const calcIcon = (icon, defaultIcon) => {\n    if (icon && ((isBool(icon) && defaultIcon) || isString(icon))) {\n        return { name: isBool(icon) ? defaultIcon : icon };\n    }\n    if (isObject(icon)) {\n        return icon;\n    }\n    return null;\n};\nexport const isOverSize = (size, sizeLimit) => {\n    var _a;\n    if (!sizeLimit)\n        return false;\n    const base = 1000;\n    const unitMap = {\n        B: 1,\n        KB: base,\n        MB: base * base,\n        GB: base * base * base,\n    };\n    const computedSize = typeof sizeLimit === 'number' ? sizeLimit * base : (sizeLimit === null || sizeLimit === void 0 ? void 0 : sizeLimit.size) * unitMap[(_a = sizeLimit === null || sizeLimit === void 0 ? void 0 : sizeLimit.unit) !== null && _a !== void 0 ? _a : 'KB'];\n    return size > computedSize;\n};\nexport const rpx2px = (rpx) => Math.floor((systemInfo.windowWidth * rpx) / 750);\nexport const nextTick = () => {\n    return new Promise((resolve) => {\n        wx.nextTick(() => {\n            resolve();\n        });\n    });\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/utils.wxs",
    "content": "/* utils */\n\n/**\n * addUnit */\n// 为 css 添加单位\nfunction addUnit(value) {\n  // prettier-ignore\n  var REGEXP = getRegExp('^-?\\d+(.\\d+)?$');\n  if (value == null) {\n    return undefined;\n  }\n  return REGEXP.test('' + value) ? value + 'px' : value;\n}\n\nfunction isString(string) {\n  return string && string.constructor === 'String';\n}\n\nfunction isArray(array) {\n  return array && array.constructor === 'Array';\n}\n\nfunction isObject(obj) {\n  return obj && obj.constructor === 'Object';\n}\n\nvar isNoEmptyObj = function (obj) {\n  return isObject(obj) && JSON.stringify(obj) !== '{}';\n};\n\nfunction includes(arr, value) {\n  if (!arr || !isArray(arr)) return false;\n\n  var i = 0;\n  var len = arr.length;\n\n  for (; i < len; i++) {\n    if (arr[i] === value) return true;\n  }\n  return false;\n}\n\nfunction cls(base, arr) {\n  var res = [base];\n  var i = 0;\n  for (var size = arr.length; i < size; i++) {\n    var item = arr[i];\n\n    if (item && item.constructor === 'Array') {\n      var key = arr[i][0];\n      var value = arr[i][1];\n\n      if (value) {\n        res.push(base + '--' + key);\n      }\n    } else if (typeof item === 'string' || typeof item === 'number') {\n      if (item) {\n        res.push(base + '--' + item);\n      }\n    }\n  }\n  return res.join(' ');\n}\n\nfunction getBadgeAriaLabel(options) {\n  var maxCount = options.maxCount || 99;\n  if (options.dot) {\n    return '有新的消息';\n  }\n  if (options.count === '...') {\n    return '有很多消息';\n  }\n  if (isNaN(options.count)) {\n    return options.count;\n  }\n  var str1 = '有' + maxCount + '+条消息';\n  var str2 = '有' + options.count + '条消息';\n  return Number(options.count) > maxCount ? str1 : str2;\n}\n\nfunction endsWith(str, endStr) {\n  return str.slice(-endStr.length) === endStr ? str : str + endStr;\n}\n\nfunction keys(obj) {\n  return JSON.stringify(obj)\n    .replace(getRegExp('{|}|\"', 'g'), '')\n    .split(',')\n    .map(function (item) {\n      return item.split(':')[0];\n    });\n}\n\nfunction kebabCase(str) {\n  return str\n    .replace(getRegExp('[A-Z]', 'g'), function (ele) {\n      return '-' + ele;\n    })\n    .toLowerCase();\n}\n\nfunction _style(styles) {\n  if (isArray(styles)) {\n    return styles\n      .filter(function (item) {\n        return item != null && item !== '';\n      })\n      .map(function (item) {\n        return isArray(item) ? _style(item) : endsWith(item, ';');\n      })\n      .join(' ');\n  }\n\n  if (isObject(styles)) {\n    return keys(styles)\n      .filter(function (key) {\n        return styles[key] != null && styles[key] !== '';\n      })\n      .map(function (key) {\n        return [kebabCase(key), [styles[key]]].join(':');\n      })\n      .join(';');\n  }\n\n  return styles;\n}\n\nfunction isValidIconName(str) {\n  // prettier-ignore\n  return getRegExp('^[A-Za-z0-9\\-]+$').test(str);\n}\n\nmodule.exports = {\n  addUnit: addUnit,\n  isString: isString,\n  isArray: isArray,\n  isObject: isObject,\n  isNoEmptyObj: isNoEmptyObj,\n  includes: includes,\n  cls: cls,\n  getBadgeAriaLabel: getBadgeAriaLabel,\n  _style: _style,\n  isValidIconName: isValidIconName,\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/version.d.ts",
    "content": "export declare function compareVersion(v1: any, v2: any): 0 | 1 | -1;\nexport declare function canIUseFormFieldButton(): boolean;\nexport declare function canUseVirtualHost(): boolean;\nexport declare function canUseProxyScrollView(): boolean;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/version.js",
    "content": "import { getAppBaseInfo } from './wechat';\nlet systemInfo;\nfunction getSystemInfo() {\n    if (systemInfo == null) {\n        systemInfo = getAppBaseInfo();\n    }\n    return systemInfo;\n}\nexport function compareVersion(v1, v2) {\n    v1 = v1.split('.');\n    v2 = v2.split('.');\n    const len = Math.max(v1.length, v2.length);\n    while (v1.length < len) {\n        v1.push('0');\n    }\n    while (v2.length < len) {\n        v2.push('0');\n    }\n    for (let i = 0; i < len; i++) {\n        const num1 = parseInt(v1[i]);\n        const num2 = parseInt(v2[i]);\n        if (num1 > num2) {\n            return 1;\n        }\n        else if (num1 < num2) {\n            return -1;\n        }\n    }\n    return 0;\n}\nfunction judgeByVersion(version) {\n    const currentSDKVersion = getSystemInfo().SDKVersion;\n    return compareVersion(currentSDKVersion, version) >= 0;\n}\nexport function canIUseFormFieldButton() {\n    return judgeByVersion('2.10.3');\n}\nexport function canUseVirtualHost() {\n    return judgeByVersion('2.19.2');\n}\nexport function canUseProxyScrollView() {\n    return judgeByVersion('2.19.2');\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/wechat.d.ts",
    "content": "export declare const getObserver: (context: any, selector: string) => Promise<unknown>;\nexport declare const getWindowInfo: () => WechatMiniprogram.WindowInfo | WechatMiniprogram.SystemInfo;\nexport declare const getAppBaseInfo: () => WechatMiniprogram.SystemInfo | WechatMiniprogram.AppBaseInfo;\nexport declare const getDeviceInfo: () => WechatMiniprogram.SystemInfo | WechatMiniprogram.DeviceInfo;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/common/wechat.js",
    "content": "export const getObserver = (context, selector) => {\n    return new Promise((resolve, reject) => {\n        context\n            .createIntersectionObserver(context)\n            .relativeToViewport()\n            .observe(selector, (res) => {\n            resolve(res);\n        });\n    });\n};\nexport const getWindowInfo = () => {\n    return wx.getWindowInfo ? wx.getWindowInfo() || wx.getSystemInfoSync() : wx.getSystemInfoSync();\n};\nexport const getAppBaseInfo = () => {\n    return wx.getAppBaseInfo ? wx.getAppBaseInfo() || wx.getSystemInfoSync() : wx.getSystemInfoSync();\n};\nexport const getDeviceInfo = () => {\n    return wx.getDeviceInfo ? wx.getDeviceInfo() || wx.getSystemInfoSync() : wx.getSystemInfoSync();\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/divider/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Divider Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nalign | String | center | options: left/right/center | N\ncontent | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndashed | Boolean | false | \\- | N\nlayout | String | horizontal | options: horizontal/vertical | N\n### Divider External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-content | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-divider-color | @bg-color-component | - \n--td-divider-content-color | @font-gray-3 | - \n--td-divider-content-font-size | 24rpx | - \n--td-divider-content-line-height | 40rpx | - \n--td-divider-content-line-style | solid | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/divider/README.md",
    "content": "---\ntitle: Divider 分割线\ndescription: 用于分割、组织、细化有一定逻辑的组织元素内容和页面结构。\nspline: message\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-100%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-divider\": \"tdesign-miniprogram/divider/divider\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/tfHzFbma7IS4\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n\n\n### 基础分割符\n\n分割符主要是由直线和文字组成，通过`slot`传入分割线文案或者其他自定义内容，通过`layout`控制分隔符是垂直还是横向\n\n{{ base }}\n\n### 虚线样式\n\n{{ theme }}\n\n## API\n\n### Divider Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nalign | String | center | 文本位置（仅在水平分割线有效）。可选项：left/right/center | N\ncontent | String / Slot | - | 子元素。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndashed | Boolean | false | 是否虚线（仅在水平分割线有效） | N\nlayout | String | horizontal | 分隔线类型有两种：水平和垂直。可选项：horizontal/vertical | N\n### Divider External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-content | 内容样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-divider-color | @bg-color-component | - \n--td-divider-content-color | @font-gray-3 | - \n--td-divider-content-font-size | 24rpx | - \n--td-divider-content-line-height | 40rpx | - \n--td-divider-content-line-style | solid | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/divider/divider.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nexport default class Divider extends SuperComponent {\n    externalClasses: string[];\n    options: {\n        multipleSlots: boolean;\n    };\n    properties: import(\"./type\").TdDividerProps;\n    data: {\n        prefix: string;\n        classPrefix: string;\n    };\n    observers: {\n        lineColor(): void;\n    };\n    methods: {\n        setStyle(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/divider/divider.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-divider`;\nlet Divider = class Divider extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-content`];\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n        };\n        this.observers = {\n            lineColor() {\n                this.setStyle();\n            },\n        };\n        this.methods = {\n            setStyle() {\n                const { lineColor } = this.properties;\n                const dividerStyle = `${lineColor ? `border-color: ${lineColor};` : ''}`;\n                this.setData({\n                    dividerStyle,\n                });\n            },\n        };\n    }\n};\nDivider = __decorate([\n    wxComponent()\n], Divider);\nexport default Divider;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/divider/divider.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/divider/divider.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view class=\"{{layout==='vertical'? classPrefix + '--vertical-center' : ''}}\">\n  <view\n    class=\"{{classPrefix}} class {{prefix}}-class {{classPrefix}}--{{layout}} {{classPrefix}}--{{align}} {{dashed? classPrefix + '--dashed' : ''}} \"\n    style=\"{{_._style([dividerStyle, style, customStyle])}}\"\n  >\n    <view class=\"{{prefix}}-class-content {{classPrefix}}__content\">\n      <view wx:if=\"{{content}}\"> {{content}} </view>\n      <slot wx:else name=\"content\" />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/divider/divider.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-divider {\n  display: flex;\n  color: var(--td-divider-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  border-color: var(--td-divider-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  border-style: var(--td-divider-content-line-style, solid);\n  border-width: 0;\n}\n.t-divider::before,\n.t-divider::after {\n  content: '';\n  display: block;\n  flex: 1;\n  box-sizing: border-box;\n  border: inherit;\n  border-color: inherit;\n  border-style: inherit;\n}\n.t-divider--horizontal {\n  align-items: center;\n  margin-top: 20rpx;\n  margin-bottom: 20rpx;\n}\n.t-divider--horizontal::before,\n.t-divider--horizontal::after {\n  border-top-width: 1px;\n  transform: scaleY(0.5);\n  transform-origin: bottom;\n}\n.t-divider--horizontal .t-divider__content:not(:empty) {\n  margin: 0 24rpx;\n}\n.t-divider--vertical {\n  flex-direction: column;\n  height: 28rpx;\n  margin: 0 16rpx;\n}\n.t-divider--vertical::before,\n.t-divider--vertical::after {\n  border-left-width: 1px;\n  transform: scaleX(0.5);\n  transform-origin: bottom;\n}\n.t-divider--vertical-center {\n  align-items: center;\n  height: 100%;\n}\n.t-divider--dashed {\n  border-style: dashed;\n}\n.t-divider__content {\n  font-size: var(--td-divider-content-font-size, 24rpx);\n  line-height: var(--td-divider-content-line-height, 40rpx);\n  color: var(--td-divider-content-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n}\n.t-divider--left::before,\n.t-divider--right::after {\n  max-width: 60rpx;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/divider/props.d.ts",
    "content": "import { TdDividerProps } from './type';\ndeclare const props: TdDividerProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/divider/props.js",
    "content": "const props = {\n    align: {\n        type: String,\n        value: 'center',\n    },\n    content: {\n        type: String,\n    },\n    dashed: {\n        type: Boolean,\n        value: false,\n    },\n    layout: {\n        type: String,\n        value: 'horizontal',\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/divider/type.d.ts",
    "content": "export interface TdDividerProps {\n    align?: {\n        type: StringConstructor;\n        value?: 'left' | 'right' | 'center';\n    };\n    content?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    dashed?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    layout?: {\n        type: StringConstructor;\n        value?: 'horizontal' | 'vertical';\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/divider/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/empty/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Empty Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\naction | Slot | - | action block。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndescription | String / Slot | - | empty component description。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nicon | String / Object | - | \\- | N\nimage | String / Slot | - | image url, or Image component props, or custom any node you need.。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\n### Empty External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-description | \\-\nt-class-image | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-empty-action-margin-top | @spacer-4 | - \n--td-empty-description-color | @font-gray-3 | - \n--td-empty-description-font-size | @font-size-base | - \n--td-empty-description-line-height | 44rpx | - \n--td-empty-description-margin-top | @spacer-2 | - \n--td-empty-icon-color | @font-gray-3 | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/empty/README.md",
    "content": "---\ntitle: Empty 空状态\ndescription: 用于空状态时的占位提示。\nspline: data\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-100%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-empty\": \"tdesign-miniprogram/empty/empty\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/yM7PIimR7eSL\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 类型\n\n图标空状态\n\n{{ base }}\n\n自定义图片空状态\n\n{{ imageEmpty }}\n\n带操作空状态\n\n{{ buttonEmpty }}\n\n\n\n## API\n\n### Empty Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\naction | Slot | - | 操作按钮。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndescription | String / Slot | - | 描述文字。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nicon | String / Object | - | 图标名称。值为字符串表示图标名称，值为 `Object` 类型，表示透传至 `icon`。 | N\nimage | String / Slot | - | 图片地址。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\n### Empty External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-description | 描述样式类\nt-class-image | 图片样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-empty-action-margin-top | @spacer-4 | - \n--td-empty-description-color | @font-gray-3 | - \n--td-empty-description-font-size | @font-size-base | - \n--td-empty-description-line-height | 44rpx | - \n--td-empty-description-margin-top | @spacer-2 | - \n--td-empty-icon-color | @font-gray-3 | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/empty/empty.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nexport default class extends SuperComponent {\n    options: {\n        multipleSlots: boolean;\n    };\n    externalClasses: string[];\n    properties: import(\"./type\").TdEmptyProps;\n    data: {\n        prefix: string;\n        classPrefix: string;\n    };\n    observers: {\n        icon(icon: any): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/empty/empty.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport props from './props';\nimport config from '../common/config';\nimport { setIcon } from '../common/utils';\nconst { prefix } = config;\nconst name = `${prefix}-empty`;\nlet default_1 = class extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.options = {\n            multipleSlots: true,\n        };\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-description`, `${prefix}-class-image`];\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n        };\n        this.observers = {\n            icon(icon) {\n                const obj = setIcon('icon', icon, '');\n                this.setData(Object.assign({}, obj));\n            },\n        };\n    }\n};\ndefault_1 = __decorate([\n    wxComponent()\n], default_1);\nexport default default_1;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/empty/empty.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\",\n    \"t-image\": \"../image/image\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/empty/empty.wxml",
    "content": "<import src=\"../common/template/icon.wxml\" />\n<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view style=\"{{_._style([style, customStyle])}}\" class=\"class {{prefix}}-class {{classPrefix}}\">\n  <view aria-hidden=\"true\" class=\"{{classPrefix}}__thumb\">\n    <t-image wx:if=\"{{image}}\" t-class=\"{{prefix}}-class-image\" src=\"{{image}}\" mode=\"aspectFit\" />\n    <template\n      wx:elif=\"{{iconName || _.isNoEmptyObj(iconData)}}\"\n      is=\"icon\"\n      data=\"{{tClass: classPrefix + '__icon', name: iconName, ...iconData}}\"\n    />\n    <slot wx:else name=\"image\" />\n  </view>\n  <view class=\"{{classPrefix}}__description {{prefix}}-class-description\">\n    <block wx:if=\"{{description}}\"> {{description}} </block>\n    <slot name=\"description\" />\n  </view>\n  <view class=\"{{classPrefix}}__actions {{prefix}}-class-actions\">\n    <slot name=\"action\" />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/empty/empty.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-empty {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n.t-empty__icon {\n  font-size: 192rpx;\n  color: var(--td-empty-icon-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n}\n.t-empty__thumb + .t-empty__description:not(:empty) {\n  margin-top: var(--td-empty-description-margin-top, var(--td-spacer-2, 32rpx));\n}\n.t-empty__description {\n  text-align: center;\n  color: var(--td-empty-description-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n  font-size: var(--td-empty-description-font-size, var(--td-font-size-base, 28rpx));\n  line-height: var(--td-empty-description-line-height, 44rpx);\n  white-space: pre-wrap;\n}\n.t-empty__description + .t-empty__actions:not(:empty) {\n  margin-top: var(--td-empty-action-margin-top, var(--td-spacer-4, 64rpx));\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/empty/props.d.ts",
    "content": "import { TdEmptyProps } from './type';\ndeclare const props: TdEmptyProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/empty/props.js",
    "content": "const props = {\n    description: {\n        type: String,\n    },\n    externalClasses: {\n        type: Array,\n    },\n    icon: {\n        type: null,\n    },\n    image: {\n        type: String,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/empty/type.d.ts",
    "content": "export interface TdEmptyProps {\n    description?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    externalClasses?: {\n        type: ArrayConstructor;\n        value?: ['t-class', 't-class-description', 't-class-image', 't-class-actions'];\n    };\n    icon?: {\n        type: null;\n        value?: string | object;\n    };\n    image?: {\n        type: StringConstructor;\n        value?: string;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/empty/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/icon/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n\n### Icon Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ncolor | String | - | \\- | N\nname | String | - | required | Y\nprefix | String | - | \\- | N\nsize | String / Number | - | \\- | N\n\n### Icon Events\n\nname | params | description\n-- | -- | --\nclick | \\- | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts)\n### Icon External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/icon/README.md",
    "content": "---\ntitle: Icon 图标\ndescription: 图标。\nspline: base\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-100%25-blue\" /></span>\n\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-icon\": \"tdesign-miniprogram/icon/icon\"\n}\n```\n\n## 常见问题\n\n<details>\n  <summary>\n    控制台告警：Failed to load font\n    <span class=\"icon\">👇</span>\n  </summary>\n  <p style=\"margin-top: 10px; color: rgba(0, 0, 0, .6)\">\n    告警属于开发者工具的 bug，可以忽略，具体可以看 <a href=\"https://developers.weixin.qq.com/miniprogram/dev/api/ui/font/wx.loadFontFace.html\" target=\"_blank\">官网文档</a>\n  </p>\n</details>\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/wMINibmJ7WSQ\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n\n### 基础组件图标\n\n{{ base }}\n\n### 自定义组件图标\n\n{{ custom }}\n\n自定义图标用法，下面以 `iconfont` 为例\n\n#### 准备图标文件\n\n文件后缀应为`.wxss`，如下方代码块所示：\n\n```css\n@font-face {\n  font-family: 'icon';  // 使用自定义的字体名称\n  ···\n}\n\n.icon {\n  font-family: 'icon' !important;  // 字体名称\n  ···\n}\n\n.icon-a-0:before {  // icon 图标。注意 FontClass 前缀与 font-family 保持一致\n  content: '\\e64d';\n}\n```\n- 添加所需图标，下载图标。图标库一般会提供 **在线链接** 或者 **下载至本地** 等使用方式。**在线链接** 方式会指向一个 `.css` 文件，可以下载或复制其内容，将其修改成后缀名为 `.wxss` 的文件\n- 将 `.wxss` 文件中的 `FontClass/Symbol前缀` 与 `Font Family` 两项内容保持一致，如: `FontClass/Symbol` 前缀为 `icon-`，则 `Font Family` 为 `icon`。\n\n> 注：若是采用 `下载至本地` 方式，需关注 `.css` 和 `.ttf` 文件。由于微信小程序不支持处理 `ttf、woff、eot` 等文件，但支持 `base64`，所以需要将 `.ttf` 文件转换为 `base64`  (可借助转换工具，如 [transfonter.org](https://transfonter.org/)，会得到一个 `stylesheet.css` 文件)，然后将 `.css` 文件中的 `@font-face {}` 内容替换为 `stylesheet.css` 中的 `base64` 内容，最后将 `.css` 文件修改后缀为 `.wxss`\n\n#### 引入自定义图标\n\n- 全局引入：在项目 `app.wxss`，使用 `@import` 引入上述的 `.wxss` 文件\n- 局部引入：在 `page` 对应的 `.wxss` 中，使用 `@import` 引入上述的 `.wxss` 文件\n\n#### 自定义图标的使用\n\n `<t-icon>` 组件中的 `prefix` 属性值与前面设置的 `Font Family` 保持一致，即 `prefix=\"icon\"`，`name` 属性值为自定义图标名称，如图标的 `className` 为 `icon-a-1h`，则 `name=\"a-1h\"`。\n\n### 图片链接\n\n{{ iconImage }}\n\n### 全部图标\n\n<div style=\"background: #ecf2fe; display: flex; align-items: center; line-height: 20px; padding: 14px 24px; border-radius: 3px; color: #555a65;margin:16px 0\">\n  <svg fill=\"none\" viewBox=\"0 0 16 16\" width=\"16px\" height=\"16px\" style=\"margin-right: 5px\">\n    <path fill=\"#0052d9\" d=\"M8 15A7 7 0 108 1a7 7 0 000 14zM7.4 4h1.2v1.2H7.4V4zm.1 2.5h1V12h-1V6.5z\" fillOpacity=\"0.9\"></path>\n  </svg>\n <p style=\"flex: 1\">大部分图标在 1.8.0 版本中新增，如果发现引入组件库后，部分图标无法使用，请检查安装的组件库`tdesign-miniprogram`的版本。支持中文英文搜索，如果觉得可以再增加其他关键词提示，欢迎到 <a href=\"https://github.com/Tencent/tdesign-icons/blob/develop/packages/view/src/manifest.js\" target=\"_blank\" > 图标仓库</a> 提交PR，帮我们一起补充。\n </p>\n</div>\n\n<td-icons-view />\n\n## API\n\n### Icon Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ncolor | String | - | 图标颜色 | N\nname | String | - | 必需。图标名称或图片链接 | Y\nprefix | String | - | 自定义图标前缀 | N\nsize | String / Number | - | 图标大小, 如 `20`, `20px`, `48rpx`, 默认单位是 `px` | N\n\n### Icon Events\n\n名称 | 参数 | 描述\n-- | -- | --\nclick | \\- | 点击图标时触发。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts)\n### Icon External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/icon/icon.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nexport default class Icon extends SuperComponent {\n    externalClasses: string[];\n    properties: import(\"./type\").TdIconProps;\n    data: {\n        componentPrefix: string;\n        classPrefix: string;\n        isImage: boolean;\n        iconStyle: any;\n    };\n    observers: {\n        'name, color, size, style'(): void;\n    };\n    methods: {\n        onTap(event: any): void;\n        setIconStyle(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/icon/icon.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport { styles, addUnit, getRect } from '../common/utils';\nconst { prefix } = config;\nconst name = `${prefix}-icon`;\nlet Icon = class Icon extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`];\n        this.properties = props;\n        this.data = {\n            componentPrefix: prefix,\n            classPrefix: name,\n            isImage: false,\n            iconStyle: undefined,\n        };\n        this.observers = {\n            'name, color, size, style'() {\n                this.setIconStyle();\n            },\n        };\n        this.methods = {\n            onTap(event) {\n                this.triggerEvent('click', event.detail);\n            },\n            setIconStyle() {\n                const { name, color, size, classPrefix } = this.data;\n                const isImage = name.indexOf('/') !== -1;\n                const sizeValue = addUnit(size);\n                const colorStyle = color ? { color: color } : {};\n                const fontStyle = size ? { 'font-size': sizeValue } : {};\n                const iconStyle = Object.assign(Object.assign({}, colorStyle), fontStyle);\n                this.setData({ isImage }, () => __awaiter(this, void 0, void 0, function* () {\n                    if (isImage) {\n                        let iconSize = sizeValue;\n                        if (!iconSize) {\n                            yield getRect(this, `.${classPrefix}`)\n                                .then((res) => {\n                                iconSize = addUnit(res === null || res === void 0 ? void 0 : res.height);\n                            })\n                                .catch(() => { });\n                        }\n                        iconStyle.width = iconSize;\n                        iconStyle.height = iconSize;\n                    }\n                    this.setData({ iconStyle: `${styles(iconStyle)}` });\n                }));\n            },\n        };\n    }\n};\nIcon = __decorate([\n    wxComponent()\n], Icon);\nexport default Icon;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/icon/icon.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/icon/icon.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  class=\"{{ prefix ? prefix : classPrefix}} class {{componentPrefix}}-class\"\n  style=\"{{_._style([iconStyle, style, customStyle])}}\"\n  bind:tap=\"onTap\"\n  aria-hidden=\"{{ariaHidden}}\"\n  aria-label=\"{{ariaLabel}}\"\n  aria-role=\"{{ariaRole}}\"\n>\n  <view wx:if=\"{{ isImage }}\" class=\"{{classPrefix}}--image\">\n    <image src=\"{{ name }}\" mode=\"aspectFit\" class=\"{{classPrefix}}__image\" />\n  </view>\n  <label\n    wx:if=\"{{ _.isValidIconName(name) && !isImage }}\"\n    class=\"{{ prefix ? prefix : classPrefix }}-{{ name}} {{ classPrefix }}-base\"\n  >\n  </label>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/icon/icon.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n@font-face {\n  font-family: t;\n  src: url('https://tdesign.gtimg.com/icon/0.3.1/fonts/t.eot'), url('https://tdesign.gtimg.com/icon/0.3.1/fonts/t.eot?#iefix') format('ded-opentype'), url('https://tdesign.gtimg.com/icon/0.3.1/fonts/t.woff') format('woff'), url('https://tdesign.gtimg.com/icon/0.3.1/fonts/t.ttf') format('truetype'), url('https://tdesign.gtimg.com/icon/0.3.1/fonts/t.svg') format('svg');\n  /* iOS 4.1- */\n  font-weight: normal;\n  font-style: normal;\n}\n.t-icon--image {\n  width: 100%;\n  height: 100%;\n}\n.t-icon__image {\n  vertical-align: top;\n  width: 100%;\n  height: 100%;\n}\n.t-icon-base {\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n  line-height: 1;\n  text-align: center;\n  display: block;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.t-icon {\n  /* stylelint-disable-next-line declaration-no-important */\n  font-family: t !important;\n  /* prevent issues with browser extensions that change fonts */\n}\n.t-icon-accessibility-filled:before {\n  content: '\\E001';\n}\n.t-icon-accessibility:before {\n  content: '\\E002';\n}\n.t-icon-activity-filled:before {\n  content: '\\E003';\n}\n.t-icon-activity:before {\n  content: '\\E004';\n}\n.t-icon-add-and-subtract:before {\n  content: '\\E005';\n}\n.t-icon-add-circle-filled:before {\n  content: '\\E006';\n}\n.t-icon-add-circle:before {\n  content: '\\E007';\n}\n.t-icon-add-rectangle-filled:before {\n  content: '\\E008';\n}\n.t-icon-add-rectangle:before {\n  content: '\\E009';\n}\n.t-icon-add:before {\n  content: '\\E00A';\n}\n.t-icon-address-book-filled:before {\n  content: '\\E00B';\n}\n.t-icon-address-book:before {\n  content: '\\E00C';\n}\n.t-icon-adjustment-filled:before {\n  content: '\\E00D';\n}\n.t-icon-adjustment:before {\n  content: '\\E00E';\n}\n.t-icon-airplay-wave-filled:before {\n  content: '\\E00F';\n}\n.t-icon-airplay-wave:before {\n  content: '\\E010';\n}\n.t-icon-alarm-add-filled:before {\n  content: '\\E011';\n}\n.t-icon-alarm-add:before {\n  content: '\\E012';\n}\n.t-icon-alarm-filled:before {\n  content: '\\E013';\n}\n.t-icon-alarm-off-filled:before {\n  content: '\\E014';\n}\n.t-icon-alarm-off:before {\n  content: '\\E015';\n}\n.t-icon-alarm:before {\n  content: '\\E016';\n}\n.t-icon-align-top:before {\n  content: '\\E017';\n}\n.t-icon-align-vertical:before {\n  content: '\\E018';\n}\n.t-icon-alpha:before {\n  content: '\\E019';\n}\n.t-icon-analytics-filled:before {\n  content: '\\E01A';\n}\n.t-icon-analytics:before {\n  content: '\\E01B';\n}\n.t-icon-anchor:before {\n  content: '\\E01C';\n}\n.t-icon-angry-filled:before {\n  content: '\\E01D';\n}\n.t-icon-angry:before {\n  content: '\\E01E';\n}\n.t-icon-animation-1-filled:before {\n  content: '\\E01F';\n}\n.t-icon-animation-1:before {\n  content: '\\E020';\n}\n.t-icon-animation-filled:before {\n  content: '\\E021';\n}\n.t-icon-animation:before {\n  content: '\\E022';\n}\n.t-icon-anticlockwise-filled:before {\n  content: '\\E023';\n}\n.t-icon-anticlockwise:before {\n  content: '\\E024';\n}\n.t-icon-api:before {\n  content: '\\E025';\n}\n.t-icon-app-filled:before {\n  content: '\\E026';\n}\n.t-icon-app:before {\n  content: '\\E027';\n}\n.t-icon-apple-filled:before {\n  content: '\\E028';\n}\n.t-icon-apple:before {\n  content: '\\E029';\n}\n.t-icon-application-filled:before {\n  content: '\\E02A';\n}\n.t-icon-application:before {\n  content: '\\E02B';\n}\n.t-icon-architecture-hui-style-filled:before {\n  content: '\\E02C';\n}\n.t-icon-architecture-hui-style:before {\n  content: '\\E02D';\n}\n.t-icon-archway-1-filled:before {\n  content: '\\E02E';\n}\n.t-icon-archway-1:before {\n  content: '\\E02F';\n}\n.t-icon-archway-filled:before {\n  content: '\\E030';\n}\n.t-icon-archway:before {\n  content: '\\E031';\n}\n.t-icon-arrow-down-circle-filled:before {\n  content: '\\E032';\n}\n.t-icon-arrow-down-circle:before {\n  content: '\\E033';\n}\n.t-icon-arrow-down-rectangle-filled:before {\n  content: '\\E034';\n}\n.t-icon-arrow-down-rectangle:before {\n  content: '\\E035';\n}\n.t-icon-arrow-down:before {\n  content: '\\E036';\n}\n.t-icon-arrow-left-circle-filled:before {\n  content: '\\E037';\n}\n.t-icon-arrow-left-circle:before {\n  content: '\\E038';\n}\n.t-icon-arrow-left-down-circle-filled:before {\n  content: '\\E039';\n}\n.t-icon-arrow-left-down-circle:before {\n  content: '\\E03A';\n}\n.t-icon-arrow-left-down:before {\n  content: '\\E03B';\n}\n.t-icon-arrow-left-right-1:before {\n  content: '\\E03C';\n}\n.t-icon-arrow-left-right-2:before {\n  content: '\\E03D';\n}\n.t-icon-arrow-left-right-3:before {\n  content: '\\E03E';\n}\n.t-icon-arrow-left-right-circle-filled:before {\n  content: '\\E03F';\n}\n.t-icon-arrow-left-right-circle:before {\n  content: '\\E040';\n}\n.t-icon-arrow-left-up-circle-filled:before {\n  content: '\\E041';\n}\n.t-icon-arrow-left-up-circle:before {\n  content: '\\E042';\n}\n.t-icon-arrow-left-up:before {\n  content: '\\E043';\n}\n.t-icon-arrow-left:before {\n  content: '\\E044';\n}\n.t-icon-arrow-right-circle-filled:before {\n  content: '\\E045';\n}\n.t-icon-arrow-right-circle:before {\n  content: '\\E046';\n}\n.t-icon-arrow-right-down-circle-filled:before {\n  content: '\\E047';\n}\n.t-icon-arrow-right-down-circle:before {\n  content: '\\E048';\n}\n.t-icon-arrow-right-down:before {\n  content: '\\E049';\n}\n.t-icon-arrow-right-up-circle-filled:before {\n  content: '\\E04A';\n}\n.t-icon-arrow-right-up-circle:before {\n  content: '\\E04B';\n}\n.t-icon-arrow-right-up:before {\n  content: '\\E04C';\n}\n.t-icon-arrow-right:before {\n  content: '\\E04D';\n}\n.t-icon-arrow-triangle-down-filled:before {\n  content: '\\E04E';\n}\n.t-icon-arrow-triangle-down:before {\n  content: '\\E04F';\n}\n.t-icon-arrow-triangle-up-filled:before {\n  content: '\\E050';\n}\n.t-icon-arrow-triangle-up:before {\n  content: '\\E051';\n}\n.t-icon-arrow-up-circle-filled:before {\n  content: '\\E052';\n}\n.t-icon-arrow-up-circle:before {\n  content: '\\E053';\n}\n.t-icon-arrow-up-down-1:before {\n  content: '\\E054';\n}\n.t-icon-arrow-up-down-2:before {\n  content: '\\E055';\n}\n.t-icon-arrow-up-down-3:before {\n  content: '\\E056';\n}\n.t-icon-arrow-up-down-circle-filled:before {\n  content: '\\E057';\n}\n.t-icon-arrow-up-down-circle:before {\n  content: '\\E058';\n}\n.t-icon-arrow-up:before {\n  content: '\\E059';\n}\n.t-icon-artboard:before {\n  content: '\\E05A';\n}\n.t-icon-article-filled:before {\n  content: '\\E05B';\n}\n.t-icon-article:before {\n  content: '\\E05C';\n}\n.t-icon-assignment-checked-filled:before {\n  content: '\\E05D';\n}\n.t-icon-assignment-checked:before {\n  content: '\\E05E';\n}\n.t-icon-assignment-code-filled:before {\n  content: '\\E05F';\n}\n.t-icon-assignment-code:before {\n  content: '\\E060';\n}\n.t-icon-assignment-error-filled:before {\n  content: '\\E061';\n}\n.t-icon-assignment-error:before {\n  content: '\\E062';\n}\n.t-icon-assignment-filled:before {\n  content: '\\E063';\n}\n.t-icon-assignment-user-filled:before {\n  content: '\\E064';\n}\n.t-icon-assignment-user:before {\n  content: '\\E065';\n}\n.t-icon-assignment:before {\n  content: '\\E066';\n}\n.t-icon-attach:before {\n  content: '\\E067';\n}\n.t-icon-attic-1-filled:before {\n  content: '\\E068';\n}\n.t-icon-attic-1:before {\n  content: '\\E069';\n}\n.t-icon-attic-filled:before {\n  content: '\\E06A';\n}\n.t-icon-attic:before {\n  content: '\\E06B';\n}\n.t-icon-audio-filled:before {\n  content: '\\E06C';\n}\n.t-icon-audio:before {\n  content: '\\E06D';\n}\n.t-icon-awkward-filled:before {\n  content: '\\E06E';\n}\n.t-icon-awkward:before {\n  content: '\\E06F';\n}\n.t-icon-backtop-rectangle-filled:before {\n  content: '\\E070';\n}\n.t-icon-backtop-rectangle:before {\n  content: '\\E071';\n}\n.t-icon-backtop:before {\n  content: '\\E072';\n}\n.t-icon-backup-filled:before {\n  content: '\\E073';\n}\n.t-icon-backup:before {\n  content: '\\E074';\n}\n.t-icon-backward-filled:before {\n  content: '\\E075';\n}\n.t-icon-backward:before {\n  content: '\\E076';\n}\n.t-icon-bad-laugh-filled:before {\n  content: '\\E077';\n}\n.t-icon-bad-laugh:before {\n  content: '\\E078';\n}\n.t-icon-bamboo-shoot-filled:before {\n  content: '\\E079';\n}\n.t-icon-bamboo-shoot:before {\n  content: '\\E07A';\n}\n.t-icon-banana-filled:before {\n  content: '\\E07B';\n}\n.t-icon-banana:before {\n  content: '\\E07C';\n}\n.t-icon-barbecue-filled:before {\n  content: '\\E07D';\n}\n.t-icon-barbecue:before {\n  content: '\\E07E';\n}\n.t-icon-barcode-1:before {\n  content: '\\E07F';\n}\n.t-icon-barcode:before {\n  content: '\\E080';\n}\n.t-icon-base-station:before {\n  content: '\\E081';\n}\n.t-icon-battery-add-filled:before {\n  content: '\\E082';\n}\n.t-icon-battery-add:before {\n  content: '\\E083';\n}\n.t-icon-battery-charging-filled:before {\n  content: '\\E084';\n}\n.t-icon-battery-charging:before {\n  content: '\\E085';\n}\n.t-icon-battery-filled:before {\n  content: '\\E086';\n}\n.t-icon-battery-low-filled:before {\n  content: '\\E087';\n}\n.t-icon-battery-low:before {\n  content: '\\E088';\n}\n.t-icon-battery:before {\n  content: '\\E089';\n}\n.t-icon-bean-filled:before {\n  content: '\\E08A';\n}\n.t-icon-bean:before {\n  content: '\\E08B';\n}\n.t-icon-beer-filled:before {\n  content: '\\E08C';\n}\n.t-icon-beer:before {\n  content: '\\E08D';\n}\n.t-icon-beta:before {\n  content: '\\E08E';\n}\n.t-icon-bifurcate-filled:before {\n  content: '\\E08F';\n}\n.t-icon-bifurcate:before {\n  content: '\\E090';\n}\n.t-icon-bill-filled:before {\n  content: '\\E091';\n}\n.t-icon-bill:before {\n  content: '\\E092';\n}\n.t-icon-bluetooth:before {\n  content: '\\E093';\n}\n.t-icon-bone-filled:before {\n  content: '\\E094';\n}\n.t-icon-bone:before {\n  content: '\\E095';\n}\n.t-icon-book-filled:before {\n  content: '\\E096';\n}\n.t-icon-book-open-filled:before {\n  content: '\\E097';\n}\n.t-icon-book-open:before {\n  content: '\\E098';\n}\n.t-icon-book-unknown-filled:before {\n  content: '\\E099';\n}\n.t-icon-book-unknown:before {\n  content: '\\E09A';\n}\n.t-icon-book:before {\n  content: '\\E09B';\n}\n.t-icon-bookmark-add-filled:before {\n  content: '\\E09C';\n}\n.t-icon-bookmark-add:before {\n  content: '\\E09D';\n}\n.t-icon-bookmark-checked-filled:before {\n  content: '\\E09E';\n}\n.t-icon-bookmark-checked:before {\n  content: '\\E09F';\n}\n.t-icon-bookmark-double-filled:before {\n  content: '\\E0A0';\n}\n.t-icon-bookmark-double:before {\n  content: '\\E0A1';\n}\n.t-icon-bookmark-filled:before {\n  content: '\\E0A2';\n}\n.t-icon-bookmark-minus-filled:before {\n  content: '\\E0A3';\n}\n.t-icon-bookmark-minus:before {\n  content: '\\E0A4';\n}\n.t-icon-bookmark:before {\n  content: '\\E0A5';\n}\n.t-icon-braces:before {\n  content: '\\E0A6';\n}\n.t-icon-brackets:before {\n  content: '\\E0A7';\n}\n.t-icon-bread-filled:before {\n  content: '\\E0A8';\n}\n.t-icon-bread:before {\n  content: '\\E0A9';\n}\n.t-icon-bridge-1-filled:before {\n  content: '\\E0AA';\n}\n.t-icon-bridge-1:before {\n  content: '\\E0AB';\n}\n.t-icon-bridge-2-filled:before {\n  content: '\\E0AC';\n}\n.t-icon-bridge-2:before {\n  content: '\\E0AD';\n}\n.t-icon-bridge-3:before {\n  content: '\\E0AE';\n}\n.t-icon-bridge-4:before {\n  content: '\\E0AF';\n}\n.t-icon-bridge-5-filled:before {\n  content: '\\E0B0';\n}\n.t-icon-bridge-5:before {\n  content: '\\E0B1';\n}\n.t-icon-bridge-6-filled:before {\n  content: '\\E0B2';\n}\n.t-icon-bridge-6:before {\n  content: '\\E0B3';\n}\n.t-icon-bridge:before {\n  content: '\\E0B4';\n}\n.t-icon-brightness-1-filled:before {\n  content: '\\E0B5';\n}\n.t-icon-brightness-1:before {\n  content: '\\E0B6';\n}\n.t-icon-brightness-filled:before {\n  content: '\\E0B7';\n}\n.t-icon-brightness:before {\n  content: '\\E0B8';\n}\n.t-icon-broccoli-filled:before {\n  content: '\\E0B9';\n}\n.t-icon-broccoli:before {\n  content: '\\E0BA';\n}\n.t-icon-browse-filled:before {\n  content: '\\E0BB';\n}\n.t-icon-browse-gallery-filled:before {\n  content: '\\E0BC';\n}\n.t-icon-browse-gallery:before {\n  content: '\\E0BD';\n}\n.t-icon-browse-off-filled:before {\n  content: '\\E0BE';\n}\n.t-icon-browse-off:before {\n  content: '\\E0BF';\n}\n.t-icon-browse:before {\n  content: '\\E0C0';\n}\n.t-icon-brush-filled:before {\n  content: '\\E0C1';\n}\n.t-icon-brush:before {\n  content: '\\E0C2';\n}\n.t-icon-bug-filled:before {\n  content: '\\E0C3';\n}\n.t-icon-bug-report-filled:before {\n  content: '\\E0C4';\n}\n.t-icon-bug-report:before {\n  content: '\\E0C5';\n}\n.t-icon-bug:before {\n  content: '\\E0C6';\n}\n.t-icon-building-1-filled:before {\n  content: '\\E0C7';\n}\n.t-icon-building-1:before {\n  content: '\\E0C8';\n}\n.t-icon-building-2-filled:before {\n  content: '\\E0C9';\n}\n.t-icon-building-2:before {\n  content: '\\E0CA';\n}\n.t-icon-building-3-filled:before {\n  content: '\\E0CB';\n}\n.t-icon-building-3:before {\n  content: '\\E0CC';\n}\n.t-icon-building-4-filled:before {\n  content: '\\E0CD';\n}\n.t-icon-building-4:before {\n  content: '\\E0CE';\n}\n.t-icon-building-5-filled:before {\n  content: '\\E0CF';\n}\n.t-icon-building-5:before {\n  content: '\\E0D0';\n}\n.t-icon-building-filled:before {\n  content: '\\E0D1';\n}\n.t-icon-building:before {\n  content: '\\E0D2';\n}\n.t-icon-bulletpoint:before {\n  content: '\\E0D3';\n}\n.t-icon-button-filled:before {\n  content: '\\E0D4';\n}\n.t-icon-button:before {\n  content: '\\E0D5';\n}\n.t-icon-cabbage-filled:before {\n  content: '\\E0D6';\n}\n.t-icon-cabbage:before {\n  content: '\\E0D7';\n}\n.t-icon-cake-filled:before {\n  content: '\\E0D8';\n}\n.t-icon-cake:before {\n  content: '\\E0D9';\n}\n.t-icon-calculation-1-filled:before {\n  content: '\\E0DA';\n}\n.t-icon-calculation-1:before {\n  content: '\\E0DB';\n}\n.t-icon-calculation:before {\n  content: '\\E0DC';\n}\n.t-icon-calculator-1:before {\n  content: '\\E0DD';\n}\n.t-icon-calculator-filled:before {\n  content: '\\E0DE';\n}\n.t-icon-calculator:before {\n  content: '\\E0DF';\n}\n.t-icon-calendar-1-filled:before {\n  content: '\\E0E0';\n}\n.t-icon-calendar-1:before {\n  content: '\\E0E1';\n}\n.t-icon-calendar-2-filled:before {\n  content: '\\E0E2';\n}\n.t-icon-calendar-2:before {\n  content: '\\E0E3';\n}\n.t-icon-calendar-edit-filled:before {\n  content: '\\E0E4';\n}\n.t-icon-calendar-edit:before {\n  content: '\\E0E5';\n}\n.t-icon-calendar-event-filled:before {\n  content: '\\E0E6';\n}\n.t-icon-calendar-event:before {\n  content: '\\E0E7';\n}\n.t-icon-calendar-filled:before {\n  content: '\\E0E8';\n}\n.t-icon-calendar:before {\n  content: '\\E0E9';\n}\n.t-icon-call-1-filled:before {\n  content: '\\E0EA';\n}\n.t-icon-call-1:before {\n  content: '\\E0EB';\n}\n.t-icon-call-cancel-filled:before {\n  content: '\\E0EC';\n}\n.t-icon-call-cancel:before {\n  content: '\\E0ED';\n}\n.t-icon-call-filled:before {\n  content: '\\E0EE';\n}\n.t-icon-call-forwarded-filled:before {\n  content: '\\E0EF';\n}\n.t-icon-call-forwarded:before {\n  content: '\\E0F0';\n}\n.t-icon-call-incoming-filled:before {\n  content: '\\E0F1';\n}\n.t-icon-call-incoming:before {\n  content: '\\E0F2';\n}\n.t-icon-call-off-filled:before {\n  content: '\\E0F3';\n}\n.t-icon-call-off:before {\n  content: '\\E0F4';\n}\n.t-icon-call:before {\n  content: '\\E0F5';\n}\n.t-icon-calm-1-filled:before {\n  content: '\\E0F6';\n}\n.t-icon-calm-1:before {\n  content: '\\E0F7';\n}\n.t-icon-calm-filled:before {\n  content: '\\E0F8';\n}\n.t-icon-calm:before {\n  content: '\\E0F9';\n}\n.t-icon-camera-1-filled:before {\n  content: '\\E0FA';\n}\n.t-icon-camera-1:before {\n  content: '\\E0FB';\n}\n.t-icon-camera-2-filled:before {\n  content: '\\E0FC';\n}\n.t-icon-camera-2:before {\n  content: '\\E0FD';\n}\n.t-icon-camera-filled:before {\n  content: '\\E0FE';\n}\n.t-icon-camera-off-filled:before {\n  content: '\\E0FF';\n}\n.t-icon-camera-off:before {\n  content: '\\E100';\n}\n.t-icon-camera:before {\n  content: '\\E101';\n}\n.t-icon-candy-filled:before {\n  content: '\\E102';\n}\n.t-icon-candy:before {\n  content: '\\E103';\n}\n.t-icon-card-filled:before {\n  content: '\\E104';\n}\n.t-icon-card:before {\n  content: '\\E105';\n}\n.t-icon-cardmembership-filled:before {\n  content: '\\E106';\n}\n.t-icon-cardmembership:before {\n  content: '\\E107';\n}\n.t-icon-caret-down-small:before {\n  content: '\\E108';\n}\n.t-icon-caret-down:before {\n  content: '\\E109';\n}\n.t-icon-caret-left-small:before {\n  content: '\\E10A';\n}\n.t-icon-caret-left:before {\n  content: '\\E10B';\n}\n.t-icon-caret-right-small:before {\n  content: '\\E10C';\n}\n.t-icon-caret-right:before {\n  content: '\\E10D';\n}\n.t-icon-caret-up-small:before {\n  content: '\\E10E';\n}\n.t-icon-caret-up:before {\n  content: '\\E10F';\n}\n.t-icon-cart-add-filled:before {\n  content: '\\E110';\n}\n.t-icon-cart-add:before {\n  content: '\\E111';\n}\n.t-icon-cart-filled:before {\n  content: '\\E112';\n}\n.t-icon-cart:before {\n  content: '\\E113';\n}\n.t-icon-cast-filled:before {\n  content: '\\E114';\n}\n.t-icon-cast:before {\n  content: '\\E115';\n}\n.t-icon-castle-1-filled:before {\n  content: '\\E116';\n}\n.t-icon-castle-1:before {\n  content: '\\E117';\n}\n.t-icon-castle-2-filled:before {\n  content: '\\E118';\n}\n.t-icon-castle-2:before {\n  content: '\\E119';\n}\n.t-icon-castle-3-filled:before {\n  content: '\\E11A';\n}\n.t-icon-castle-3:before {\n  content: '\\E11B';\n}\n.t-icon-castle-4-filled:before {\n  content: '\\E11C';\n}\n.t-icon-castle-4:before {\n  content: '\\E11D';\n}\n.t-icon-castle-5-filled:before {\n  content: '\\E11E';\n}\n.t-icon-castle-5:before {\n  content: '\\E11F';\n}\n.t-icon-castle-6-filled:before {\n  content: '\\E120';\n}\n.t-icon-castle-6:before {\n  content: '\\E121';\n}\n.t-icon-castle-7-filled:before {\n  content: '\\E122';\n}\n.t-icon-castle-7:before {\n  content: '\\E123';\n}\n.t-icon-castle-filled:before {\n  content: '\\E124';\n}\n.t-icon-castle:before {\n  content: '\\E125';\n}\n.t-icon-cat-filled:before {\n  content: '\\E126';\n}\n.t-icon-cat:before {\n  content: '\\E127';\n}\n.t-icon-catalog-filled:before {\n  content: '\\E128';\n}\n.t-icon-catalog:before {\n  content: '\\E129';\n}\n.t-icon-cd-filled:before {\n  content: '\\E12A';\n}\n.t-icon-cd:before {\n  content: '\\E12B';\n}\n.t-icon-celsius:before {\n  content: '\\E12C';\n}\n.t-icon-center-focus-strong-filled:before {\n  content: '\\E12D';\n}\n.t-icon-center-focus-strong:before {\n  content: '\\E12E';\n}\n.t-icon-centimeter:before {\n  content: '\\E12F';\n}\n.t-icon-certificate-1-filled:before {\n  content: '\\E130';\n}\n.t-icon-certificate-1:before {\n  content: '\\E131';\n}\n.t-icon-certificate-filled:before {\n  content: '\\E132';\n}\n.t-icon-certificate:before {\n  content: '\\E133';\n}\n.t-icon-chart-3d-filled:before {\n  content: '\\E134';\n}\n.t-icon-chart-3d:before {\n  content: '\\E135';\n}\n.t-icon-chart-add-filled:before {\n  content: '\\E136';\n}\n.t-icon-chart-add:before {\n  content: '\\E137';\n}\n.t-icon-chart-analytics:before {\n  content: '\\E138';\n}\n.t-icon-chart-area-filled:before {\n  content: '\\E139';\n}\n.t-icon-chart-area-multi-filled:before {\n  content: '\\E13A';\n}\n.t-icon-chart-area-multi:before {\n  content: '\\E13B';\n}\n.t-icon-chart-area:before {\n  content: '\\E13C';\n}\n.t-icon-chart-bar-filled:before {\n  content: '\\E13D';\n}\n.t-icon-chart-bar:before {\n  content: '\\E13E';\n}\n.t-icon-chart-bubble-filled:before {\n  content: '\\E13F';\n}\n.t-icon-chart-bubble:before {\n  content: '\\E140';\n}\n.t-icon-chart-column-filled:before {\n  content: '\\E141';\n}\n.t-icon-chart-column:before {\n  content: '\\E142';\n}\n.t-icon-chart-combo-filled:before {\n  content: '\\E143';\n}\n.t-icon-chart-combo:before {\n  content: '\\E144';\n}\n.t-icon-chart-filled:before {\n  content: '\\E145';\n}\n.t-icon-chart-line-data-1:before {\n  content: '\\E146';\n}\n.t-icon-chart-line-data:before {\n  content: '\\E147';\n}\n.t-icon-chart-line-multi:before {\n  content: '\\E148';\n}\n.t-icon-chart-line:before {\n  content: '\\E149';\n}\n.t-icon-chart-maximum:before {\n  content: '\\E14A';\n}\n.t-icon-chart-median:before {\n  content: '\\E14B';\n}\n.t-icon-chart-minimum:before {\n  content: '\\E14C';\n}\n.t-icon-chart-pie-filled:before {\n  content: '\\E14D';\n}\n.t-icon-chart-pie:before {\n  content: '\\E14E';\n}\n.t-icon-chart-radar-filled:before {\n  content: '\\E14F';\n}\n.t-icon-chart-radar:before {\n  content: '\\E150';\n}\n.t-icon-chart-radial:before {\n  content: '\\E151';\n}\n.t-icon-chart-ring-1-filled:before {\n  content: '\\E152';\n}\n.t-icon-chart-ring-1:before {\n  content: '\\E153';\n}\n.t-icon-chart-ring-filled:before {\n  content: '\\E154';\n}\n.t-icon-chart-ring:before {\n  content: '\\E155';\n}\n.t-icon-chart-scatter:before {\n  content: '\\E156';\n}\n.t-icon-chart-stacked-filled:before {\n  content: '\\E157';\n}\n.t-icon-chart-stacked:before {\n  content: '\\E158';\n}\n.t-icon-chart:before {\n  content: '\\E159';\n}\n.t-icon-chat-add-filled:before {\n  content: '\\E15A';\n}\n.t-icon-chat-add:before {\n  content: '\\E15B';\n}\n.t-icon-chat-bubble-1-filled:before {\n  content: '\\E15C';\n}\n.t-icon-chat-bubble-1:before {\n  content: '\\E15D';\n}\n.t-icon-chat-bubble-add-filled:before {\n  content: '\\E15E';\n}\n.t-icon-chat-bubble-add:before {\n  content: '\\E15F';\n}\n.t-icon-chat-bubble-error-filled:before {\n  content: '\\E160';\n}\n.t-icon-chat-bubble-error:before {\n  content: '\\E161';\n}\n.t-icon-chat-bubble-filled:before {\n  content: '\\E162';\n}\n.t-icon-chat-bubble-help-filled:before {\n  content: '\\E163';\n}\n.t-icon-chat-bubble-help:before {\n  content: '\\E164';\n}\n.t-icon-chat-bubble-history-filled:before {\n  content: '\\E165';\n}\n.t-icon-chat-bubble-history:before {\n  content: '\\E166';\n}\n.t-icon-chat-bubble-locked-filled:before {\n  content: '\\E167';\n}\n.t-icon-chat-bubble-locked:before {\n  content: '\\E168';\n}\n.t-icon-chat-bubble-smile-filled:before {\n  content: '\\E169';\n}\n.t-icon-chat-bubble-smile:before {\n  content: '\\E16A';\n}\n.t-icon-chat-bubble:before {\n  content: '\\E16B';\n}\n.t-icon-chat-checked-filled:before {\n  content: '\\E16C';\n}\n.t-icon-chat-checked:before {\n  content: '\\E16D';\n}\n.t-icon-chat-clear-filled:before {\n  content: '\\E16E';\n}\n.t-icon-chat-clear:before {\n  content: '\\E16F';\n}\n.t-icon-chat-double-filled:before {\n  content: '\\E170';\n}\n.t-icon-chat-double:before {\n  content: '\\E171';\n}\n.t-icon-chat-error-filled:before {\n  content: '\\E172';\n}\n.t-icon-chat-error:before {\n  content: '\\E173';\n}\n.t-icon-chat-filled:before {\n  content: '\\E174';\n}\n.t-icon-chat-heart-filled:before {\n  content: '\\E175';\n}\n.t-icon-chat-heart:before {\n  content: '\\E176';\n}\n.t-icon-chat-message-filled:before {\n  content: '\\E177';\n}\n.t-icon-chat-message:before {\n  content: '\\E178';\n}\n.t-icon-chat-off-filled:before {\n  content: '\\E179';\n}\n.t-icon-chat-off:before {\n  content: '\\E17A';\n}\n.t-icon-chat-poll-filled:before {\n  content: '\\E17B';\n}\n.t-icon-chat-poll:before {\n  content: '\\E17C';\n}\n.t-icon-chat-setting-filled:before {\n  content: '\\E17D';\n}\n.t-icon-chat-setting:before {\n  content: '\\E17E';\n}\n.t-icon-chat:before {\n  content: '\\E17F';\n}\n.t-icon-check-circle-filled:before {\n  content: '\\E180';\n}\n.t-icon-check-circle:before {\n  content: '\\E181';\n}\n.t-icon-check-double:before {\n  content: '\\E182';\n}\n.t-icon-check-rectangle-filled:before {\n  content: '\\E183';\n}\n.t-icon-check-rectangle:before {\n  content: '\\E184';\n}\n.t-icon-check:before {\n  content: '\\E185';\n}\n.t-icon-cheese-filled:before {\n  content: '\\E186';\n}\n.t-icon-cheese:before {\n  content: '\\E187';\n}\n.t-icon-cherry-filled:before {\n  content: '\\E188';\n}\n.t-icon-cherry:before {\n  content: '\\E189';\n}\n.t-icon-chevron-down-circle-filled:before {\n  content: '\\E18A';\n}\n.t-icon-chevron-down-circle:before {\n  content: '\\E18B';\n}\n.t-icon-chevron-down-double-s:before {\n  content: '\\E18C';\n}\n.t-icon-chevron-down-double:before {\n  content: '\\E18D';\n}\n.t-icon-chevron-down-rectangle-filled:before {\n  content: '\\E18E';\n}\n.t-icon-chevron-down-rectangle:before {\n  content: '\\E18F';\n}\n.t-icon-chevron-down-s:before {\n  content: '\\E190';\n}\n.t-icon-chevron-down:before {\n  content: '\\E191';\n}\n.t-icon-chevron-left-circle-filled:before {\n  content: '\\E192';\n}\n.t-icon-chevron-left-circle:before {\n  content: '\\E193';\n}\n.t-icon-chevron-left-double-s:before {\n  content: '\\E194';\n}\n.t-icon-chevron-left-double:before {\n  content: '\\E195';\n}\n.t-icon-chevron-left-rectangle-filled:before {\n  content: '\\E196';\n}\n.t-icon-chevron-left-rectangle:before {\n  content: '\\E197';\n}\n.t-icon-chevron-left-s:before {\n  content: '\\E198';\n}\n.t-icon-chevron-left:before {\n  content: '\\E199';\n}\n.t-icon-chevron-right-circle-filled:before {\n  content: '\\E19A';\n}\n.t-icon-chevron-right-circle:before {\n  content: '\\E19B';\n}\n.t-icon-chevron-right-double-s:before {\n  content: '\\E19C';\n}\n.t-icon-chevron-right-double:before {\n  content: '\\E19D';\n}\n.t-icon-chevron-right-rectangle-filled:before {\n  content: '\\E19E';\n}\n.t-icon-chevron-right-rectangle:before {\n  content: '\\E19F';\n}\n.t-icon-chevron-right-s:before {\n  content: '\\E1A0';\n}\n.t-icon-chevron-right:before {\n  content: '\\E1A1';\n}\n.t-icon-chevron-up-circle-filled:before {\n  content: '\\E1A2';\n}\n.t-icon-chevron-up-circle:before {\n  content: '\\E1A3';\n}\n.t-icon-chevron-up-double-s:before {\n  content: '\\E1A4';\n}\n.t-icon-chevron-up-double:before {\n  content: '\\E1A5';\n}\n.t-icon-chevron-up-rectangle-filled:before {\n  content: '\\E1A6';\n}\n.t-icon-chevron-up-rectangle:before {\n  content: '\\E1A7';\n}\n.t-icon-chevron-up-s:before {\n  content: '\\E1A8';\n}\n.t-icon-chevron-up:before {\n  content: '\\E1A9';\n}\n.t-icon-chicken:before {\n  content: '\\E1AA';\n}\n.t-icon-chili-filled:before {\n  content: '\\E1AB';\n}\n.t-icon-chili:before {\n  content: '\\E1AC';\n}\n.t-icon-chimney-1-filled:before {\n  content: '\\E1AD';\n}\n.t-icon-chimney-1:before {\n  content: '\\E1AE';\n}\n.t-icon-chimney-2-filled:before {\n  content: '\\E1AF';\n}\n.t-icon-chimney-2:before {\n  content: '\\E1B0';\n}\n.t-icon-chimney-filled:before {\n  content: '\\E1B1';\n}\n.t-icon-chimney:before {\n  content: '\\E1B2';\n}\n.t-icon-chinese-cabbage-filled:before {\n  content: '\\E1B3';\n}\n.t-icon-chinese-cabbage:before {\n  content: '\\E1B4';\n}\n.t-icon-church-filled:before {\n  content: '\\E1B5';\n}\n.t-icon-church:before {\n  content: '\\E1B6';\n}\n.t-icon-circle-filled:before {\n  content: '\\E1B7';\n}\n.t-icon-circle:before {\n  content: '\\E1B8';\n}\n.t-icon-city-1-filled:before {\n  content: '\\E1B9';\n}\n.t-icon-city-1:before {\n  content: '\\E1BA';\n}\n.t-icon-city-10-filled:before {\n  content: '\\E1BB';\n}\n.t-icon-city-10:before {\n  content: '\\E1BC';\n}\n.t-icon-city-11-filled:before {\n  content: '\\E1BD';\n}\n.t-icon-city-11:before {\n  content: '\\E1BE';\n}\n.t-icon-city-12-filled:before {\n  content: '\\E1BF';\n}\n.t-icon-city-12:before {\n  content: '\\E1C0';\n}\n.t-icon-city-13-filled:before {\n  content: '\\E1C1';\n}\n.t-icon-city-13:before {\n  content: '\\E1C2';\n}\n.t-icon-city-14-filled:before {\n  content: '\\E1C3';\n}\n.t-icon-city-14:before {\n  content: '\\E1C4';\n}\n.t-icon-city-15-filled:before {\n  content: '\\E1C5';\n}\n.t-icon-city-15:before {\n  content: '\\E1C6';\n}\n.t-icon-city-2-filled:before {\n  content: '\\E1C7';\n}\n.t-icon-city-2:before {\n  content: '\\E1C8';\n}\n.t-icon-city-3-filled:before {\n  content: '\\E1C9';\n}\n.t-icon-city-3:before {\n  content: '\\E1CA';\n}\n.t-icon-city-4-filled:before {\n  content: '\\E1CB';\n}\n.t-icon-city-4:before {\n  content: '\\E1CC';\n}\n.t-icon-city-5-filled:before {\n  content: '\\E1CD';\n}\n.t-icon-city-5:before {\n  content: '\\E1CE';\n}\n.t-icon-city-6-filled:before {\n  content: '\\E1CF';\n}\n.t-icon-city-6:before {\n  content: '\\E1D0';\n}\n.t-icon-city-7-filled:before {\n  content: '\\E1D1';\n}\n.t-icon-city-7:before {\n  content: '\\E1D2';\n}\n.t-icon-city-8-filled:before {\n  content: '\\E1D3';\n}\n.t-icon-city-8:before {\n  content: '\\E1D4';\n}\n.t-icon-city-9-filled:before {\n  content: '\\E1D5';\n}\n.t-icon-city-9:before {\n  content: '\\E1D6';\n}\n.t-icon-city-ancient-1-filled:before {\n  content: '\\E1D7';\n}\n.t-icon-city-ancient-1:before {\n  content: '\\E1D8';\n}\n.t-icon-city-ancient-2-filled:before {\n  content: '\\E1D9';\n}\n.t-icon-city-ancient-2:before {\n  content: '\\E1DA';\n}\n.t-icon-city-ancient-filled:before {\n  content: '\\E1DB';\n}\n.t-icon-city-ancient:before {\n  content: '\\E1DC';\n}\n.t-icon-city-filled:before {\n  content: '\\E1DD';\n}\n.t-icon-city:before {\n  content: '\\E1DE';\n}\n.t-icon-clear-filled:before {\n  content: '\\E1DF';\n}\n.t-icon-clear-formatting-1-filled:before {\n  content: '\\E1E0';\n}\n.t-icon-clear-formatting-1:before {\n  content: '\\E1E1';\n}\n.t-icon-clear-formatting-filled:before {\n  content: '\\E1E2';\n}\n.t-icon-clear-formatting:before {\n  content: '\\E1E3';\n}\n.t-icon-clear:before {\n  content: '\\E1E4';\n}\n.t-icon-close-circle-filled:before {\n  content: '\\E1E5';\n}\n.t-icon-close-circle:before {\n  content: '\\E1E6';\n}\n.t-icon-close-octagon-filled:before {\n  content: '\\E1E7';\n}\n.t-icon-close-octagon:before {\n  content: '\\E1E8';\n}\n.t-icon-close-rectangle-filled:before {\n  content: '\\E1E9';\n}\n.t-icon-close-rectangle:before {\n  content: '\\E1EA';\n}\n.t-icon-close:before {\n  content: '\\E1EB';\n}\n.t-icon-cloud-download:before {\n  content: '\\E1EC';\n}\n.t-icon-cloud-filled:before {\n  content: '\\E1ED';\n}\n.t-icon-cloud-upload:before {\n  content: '\\E1EE';\n}\n.t-icon-cloud:before {\n  content: '\\E1EF';\n}\n.t-icon-cloudy-day-filled:before {\n  content: '\\E1F0';\n}\n.t-icon-cloudy-day:before {\n  content: '\\E1F1';\n}\n.t-icon-cloudy-night-filled:before {\n  content: '\\E1F2';\n}\n.t-icon-cloudy-night-rain-filled:before {\n  content: '\\E1F3';\n}\n.t-icon-cloudy-night-rain:before {\n  content: '\\E1F4';\n}\n.t-icon-cloudy-night:before {\n  content: '\\E1F5';\n}\n.t-icon-cloudy-rain-filled:before {\n  content: '\\E1F6';\n}\n.t-icon-cloudy-rain:before {\n  content: '\\E1F7';\n}\n.t-icon-cloudy-sunny-filled:before {\n  content: '\\E1F8';\n}\n.t-icon-cloudy-sunny:before {\n  content: '\\E1F9';\n}\n.t-icon-code-1:before {\n  content: '\\E1FA';\n}\n.t-icon-code-off:before {\n  content: '\\E1FB';\n}\n.t-icon-code:before {\n  content: '\\E1FC';\n}\n.t-icon-cola-filled:before {\n  content: '\\E1FD';\n}\n.t-icon-cola:before {\n  content: '\\E1FE';\n}\n.t-icon-collage-filled:before {\n  content: '\\E1FF';\n}\n.t-icon-collage:before {\n  content: '\\E200';\n}\n.t-icon-collection-filled:before {\n  content: '\\E201';\n}\n.t-icon-collection:before {\n  content: '\\E202';\n}\n.t-icon-color-invert-filled:before {\n  content: '\\E203';\n}\n.t-icon-color-invert:before {\n  content: '\\E204';\n}\n.t-icon-combination-filled:before {\n  content: '\\E205';\n}\n.t-icon-combination:before {\n  content: '\\E206';\n}\n.t-icon-command:before {\n  content: '\\E207';\n}\n.t-icon-compass-1-filled:before {\n  content: '\\E208';\n}\n.t-icon-compass-1:before {\n  content: '\\E209';\n}\n.t-icon-compass-filled:before {\n  content: '\\E20A';\n}\n.t-icon-compass:before {\n  content: '\\E20B';\n}\n.t-icon-component-breadcrumb-filled:before {\n  content: '\\E20C';\n}\n.t-icon-component-breadcrumb:before {\n  content: '\\E20D';\n}\n.t-icon-component-checkbox-filled:before {\n  content: '\\E20E';\n}\n.t-icon-component-checkbox:before {\n  content: '\\E20F';\n}\n.t-icon-component-divider-horizontal-filled:before {\n  content: '\\E210';\n}\n.t-icon-component-divider-horizontal:before {\n  content: '\\E211';\n}\n.t-icon-component-divider-vertical-filled:before {\n  content: '\\E212';\n}\n.t-icon-component-divider-vertical:before {\n  content: '\\E213';\n}\n.t-icon-component-dropdown-filled:before {\n  content: '\\E214';\n}\n.t-icon-component-dropdown:before {\n  content: '\\E215';\n}\n.t-icon-component-grid-filled:before {\n  content: '\\E216';\n}\n.t-icon-component-grid:before {\n  content: '\\E217';\n}\n.t-icon-component-input-filled:before {\n  content: '\\E218';\n}\n.t-icon-component-input:before {\n  content: '\\E219';\n}\n.t-icon-component-layout-filled:before {\n  content: '\\E21A';\n}\n.t-icon-component-layout:before {\n  content: '\\E21B';\n}\n.t-icon-component-radio:before {\n  content: '\\E21C';\n}\n.t-icon-component-space-filled:before {\n  content: '\\E21D';\n}\n.t-icon-component-space:before {\n  content: '\\E21E';\n}\n.t-icon-component-steps-filled:before {\n  content: '\\E21F';\n}\n.t-icon-component-steps:before {\n  content: '\\E220';\n}\n.t-icon-component-switch-filled:before {\n  content: '\\E221';\n}\n.t-icon-component-switch:before {\n  content: '\\E222';\n}\n.t-icon-constraint:before {\n  content: '\\E223';\n}\n.t-icon-contrast-1-filled:before {\n  content: '\\E224';\n}\n.t-icon-contrast-1:before {\n  content: '\\E225';\n}\n.t-icon-contrast-filled:before {\n  content: '\\E226';\n}\n.t-icon-contrast:before {\n  content: '\\E227';\n}\n.t-icon-control-platform-filled:before {\n  content: '\\E228';\n}\n.t-icon-control-platform:before {\n  content: '\\E229';\n}\n.t-icon-cooperate-filled:before {\n  content: '\\E22A';\n}\n.t-icon-cooperate:before {\n  content: '\\E22B';\n}\n.t-icon-coordinate-system-filled:before {\n  content: '\\E22C';\n}\n.t-icon-coordinate-system:before {\n  content: '\\E22D';\n}\n.t-icon-copy-filled:before {\n  content: '\\E22E';\n}\n.t-icon-copy:before {\n  content: '\\E22F';\n}\n.t-icon-copyright-filled:before {\n  content: '\\E230';\n}\n.t-icon-copyright:before {\n  content: '\\E231';\n}\n.t-icon-corn-filled:before {\n  content: '\\E232';\n}\n.t-icon-corn:before {\n  content: '\\E233';\n}\n.t-icon-coupon-filled:before {\n  content: '\\E234';\n}\n.t-icon-coupon:before {\n  content: '\\E235';\n}\n.t-icon-course-filled:before {\n  content: '\\E236';\n}\n.t-icon-course:before {\n  content: '\\E237';\n}\n.t-icon-cpu-filled:before {\n  content: '\\E238';\n}\n.t-icon-cpu:before {\n  content: '\\E239';\n}\n.t-icon-crack-filled:before {\n  content: '\\E23A';\n}\n.t-icon-crack:before {\n  content: '\\E23B';\n}\n.t-icon-creditcard-add-filled:before {\n  content: '\\E23C';\n}\n.t-icon-creditcard-add:before {\n  content: '\\E23D';\n}\n.t-icon-creditcard-filled:before {\n  content: '\\E23E';\n}\n.t-icon-creditcard-off-filled:before {\n  content: '\\E23F';\n}\n.t-icon-creditcard-off:before {\n  content: '\\E240';\n}\n.t-icon-creditcard:before {\n  content: '\\E241';\n}\n.t-icon-crooked-smile-filled:before {\n  content: '\\E242';\n}\n.t-icon-crooked-smile:before {\n  content: '\\E243';\n}\n.t-icon-cry-and-laugh-filled:before {\n  content: '\\E244';\n}\n.t-icon-cry-and-laugh:before {\n  content: '\\E245';\n}\n.t-icon-cry-loudly-filled:before {\n  content: '\\E246';\n}\n.t-icon-cry-loudly:before {\n  content: '\\E247';\n}\n.t-icon-css3-filled:before {\n  content: '\\E248';\n}\n.t-icon-css3:before {\n  content: '\\E249';\n}\n.t-icon-cucumber:before {\n  content: '\\E24A';\n}\n.t-icon-currency-exchange:before {\n  content: '\\E24B';\n}\n.t-icon-cursor-filled:before {\n  content: '\\E24C';\n}\n.t-icon-cursor:before {\n  content: '\\E24D';\n}\n.t-icon-curtain-filled:before {\n  content: '\\E24E';\n}\n.t-icon-curtain:before {\n  content: '\\E24F';\n}\n.t-icon-curve:before {\n  content: '\\E250';\n}\n.t-icon-cut-1:before {\n  content: '\\E251';\n}\n.t-icon-cut:before {\n  content: '\\E252';\n}\n.t-icon-dam-1-filled:before {\n  content: '\\E253';\n}\n.t-icon-dam-1:before {\n  content: '\\E254';\n}\n.t-icon-dam-2-filled:before {\n  content: '\\E255';\n}\n.t-icon-dam-2:before {\n  content: '\\E256';\n}\n.t-icon-dam-3-filled:before {\n  content: '\\E257';\n}\n.t-icon-dam-3:before {\n  content: '\\E258';\n}\n.t-icon-dam-4-filled:before {\n  content: '\\E259';\n}\n.t-icon-dam-4:before {\n  content: '\\E25A';\n}\n.t-icon-dam-5-filled:before {\n  content: '\\E25B';\n}\n.t-icon-dam-5:before {\n  content: '\\E25C';\n}\n.t-icon-dam-6-filled:before {\n  content: '\\E25D';\n}\n.t-icon-dam-6:before {\n  content: '\\E25E';\n}\n.t-icon-dam-7-filled:before {\n  content: '\\E25F';\n}\n.t-icon-dam-7:before {\n  content: '\\E260';\n}\n.t-icon-dam-filled:before {\n  content: '\\E261';\n}\n.t-icon-dam:before {\n  content: '\\E262';\n}\n.t-icon-dart-board-filled:before {\n  content: '\\E263';\n}\n.t-icon-dart-board:before {\n  content: '\\E264';\n}\n.t-icon-dashboard-1-filled:before {\n  content: '\\E265';\n}\n.t-icon-dashboard-1:before {\n  content: '\\E266';\n}\n.t-icon-dashboard-filled:before {\n  content: '\\E267';\n}\n.t-icon-dashboard:before {\n  content: '\\E268';\n}\n.t-icon-data-base-filled:before {\n  content: '\\E269';\n}\n.t-icon-data-base:before {\n  content: '\\E26A';\n}\n.t-icon-data-checked-filled:before {\n  content: '\\E26B';\n}\n.t-icon-data-checked:before {\n  content: '\\E26C';\n}\n.t-icon-data-display:before {\n  content: '\\E26D';\n}\n.t-icon-data-error-filled:before {\n  content: '\\E26E';\n}\n.t-icon-data-error:before {\n  content: '\\E26F';\n}\n.t-icon-data-filled:before {\n  content: '\\E270';\n}\n.t-icon-data-search-filled:before {\n  content: '\\E271';\n}\n.t-icon-data-search:before {\n  content: '\\E272';\n}\n.t-icon-data:before {\n  content: '\\E273';\n}\n.t-icon-delete-1-filled:before {\n  content: '\\E274';\n}\n.t-icon-delete-1:before {\n  content: '\\E275';\n}\n.t-icon-delete-filled:before {\n  content: '\\E276';\n}\n.t-icon-delete-time-filled:before {\n  content: '\\E277';\n}\n.t-icon-delete-time:before {\n  content: '\\E278';\n}\n.t-icon-delete:before {\n  content: '\\E279';\n}\n.t-icon-delta-filled:before {\n  content: '\\E27A';\n}\n.t-icon-delta:before {\n  content: '\\E27B';\n}\n.t-icon-depressed-filled:before {\n  content: '\\E27C';\n}\n.t-icon-depressed:before {\n  content: '\\E27D';\n}\n.t-icon-desktop-1-filled:before {\n  content: '\\E27E';\n}\n.t-icon-desktop-1:before {\n  content: '\\E27F';\n}\n.t-icon-desktop-filled:before {\n  content: '\\E280';\n}\n.t-icon-desktop:before {\n  content: '\\E281';\n}\n.t-icon-despise-filled:before {\n  content: '\\E282';\n}\n.t-icon-despise:before {\n  content: '\\E283';\n}\n.t-icon-device-filled:before {\n  content: '\\E284';\n}\n.t-icon-device:before {\n  content: '\\E285';\n}\n.t-icon-discount-filled:before {\n  content: '\\E286';\n}\n.t-icon-discount:before {\n  content: '\\E287';\n}\n.t-icon-dissatisfaction-filled:before {\n  content: '\\E288';\n}\n.t-icon-dissatisfaction:before {\n  content: '\\E289';\n}\n.t-icon-divide:before {\n  content: '\\E28A';\n}\n.t-icon-dividers-1:before {\n  content: '\\E28B';\n}\n.t-icon-dividers:before {\n  content: '\\E28C';\n}\n.t-icon-doge-filled:before {\n  content: '\\E28D';\n}\n.t-icon-doge:before {\n  content: '\\E28E';\n}\n.t-icon-double-storey-filled:before {\n  content: '\\E28F';\n}\n.t-icon-double-storey:before {\n  content: '\\E290';\n}\n.t-icon-download-1:before {\n  content: '\\E291';\n}\n.t-icon-download-2-filled:before {\n  content: '\\E292';\n}\n.t-icon-download-2:before {\n  content: '\\E293';\n}\n.t-icon-download:before {\n  content: '\\E294';\n}\n.t-icon-downscale:before {\n  content: '\\E295';\n}\n.t-icon-drag-drop:before {\n  content: '\\E296';\n}\n.t-icon-drag-move:before {\n  content: '\\E297';\n}\n.t-icon-drink-filled:before {\n  content: '\\E298';\n}\n.t-icon-drink:before {\n  content: '\\E299';\n}\n.t-icon-drumstick-filled:before {\n  content: '\\E29A';\n}\n.t-icon-drumstick:before {\n  content: '\\E29B';\n}\n.t-icon-dv-filled:before {\n  content: '\\E29C';\n}\n.t-icon-dv:before {\n  content: '\\E29D';\n}\n.t-icon-dvd-filled:before {\n  content: '\\E29E';\n}\n.t-icon-dvd:before {\n  content: '\\E29F';\n}\n.t-icon-earphone-filled:before {\n  content: '\\E2A0';\n}\n.t-icon-earphone:before {\n  content: '\\E2A1';\n}\n.t-icon-earth-filled:before {\n  content: '\\E2A2';\n}\n.t-icon-earth:before {\n  content: '\\E2A3';\n}\n.t-icon-edit-1-filled:before {\n  content: '\\E2A4';\n}\n.t-icon-edit-1:before {\n  content: '\\E2A5';\n}\n.t-icon-edit-2-filled:before {\n  content: '\\E2A6';\n}\n.t-icon-edit-2:before {\n  content: '\\E2A7';\n}\n.t-icon-edit-filled:before {\n  content: '\\E2A8';\n}\n.t-icon-edit-off-filled:before {\n  content: '\\E2A9';\n}\n.t-icon-edit-off:before {\n  content: '\\E2AA';\n}\n.t-icon-edit:before {\n  content: '\\E2AB';\n}\n.t-icon-education-filled:before {\n  content: '\\E2AC';\n}\n.t-icon-education:before {\n  content: '\\E2AD';\n}\n.t-icon-eggplant-filled:before {\n  content: '\\E2AE';\n}\n.t-icon-eggplant:before {\n  content: '\\E2AF';\n}\n.t-icon-ellipsis:before {\n  content: '\\E2B0';\n}\n.t-icon-emo-emotional-filled:before {\n  content: '\\E2B1';\n}\n.t-icon-emo-emotional:before {\n  content: '\\E2B2';\n}\n.t-icon-enter:before {\n  content: '\\E2B3';\n}\n.t-icon-equal:before {\n  content: '\\E2B4';\n}\n.t-icon-error-circle-filled:before {\n  content: '\\E2B5';\n}\n.t-icon-error-circle:before {\n  content: '\\E2B6';\n}\n.t-icon-error-triangle-filled:before {\n  content: '\\E2B7';\n}\n.t-icon-error-triangle:before {\n  content: '\\E2B8';\n}\n.t-icon-error:before {\n  content: '\\E2B9';\n}\n.t-icon-excited-1-filled:before {\n  content: '\\E2BA';\n}\n.t-icon-excited-1:before {\n  content: '\\E2BB';\n}\n.t-icon-excited-filled:before {\n  content: '\\E2BC';\n}\n.t-icon-excited:before {\n  content: '\\E2BD';\n}\n.t-icon-expand-down-filled:before {\n  content: '\\E2BE';\n}\n.t-icon-expand-down:before {\n  content: '\\E2BF';\n}\n.t-icon-expand-horizontal:before {\n  content: '\\E2C0';\n}\n.t-icon-expand-up-filled:before {\n  content: '\\E2C1';\n}\n.t-icon-expand-up:before {\n  content: '\\E2C2';\n}\n.t-icon-expand-vertical:before {\n  content: '\\E2C3';\n}\n.t-icon-explore-filled:before {\n  content: '\\E2C4';\n}\n.t-icon-explore-off-filled:before {\n  content: '\\E2C5';\n}\n.t-icon-explore-off:before {\n  content: '\\E2C6';\n}\n.t-icon-explore:before {\n  content: '\\E2C7';\n}\n.t-icon-exposure-filled:before {\n  content: '\\E2C8';\n}\n.t-icon-exposure:before {\n  content: '\\E2C9';\n}\n.t-icon-extension-filled:before {\n  content: '\\E2CA';\n}\n.t-icon-extension-off-filled:before {\n  content: '\\E2CB';\n}\n.t-icon-extension-off:before {\n  content: '\\E2CC';\n}\n.t-icon-extension:before {\n  content: '\\E2CD';\n}\n.t-icon-face-retouching-filled:before {\n  content: '\\E2CE';\n}\n.t-icon-face-retouching:before {\n  content: '\\E2CF';\n}\n.t-icon-fact-check-filled:before {\n  content: '\\E2D0';\n}\n.t-icon-fact-check:before {\n  content: '\\E2D1';\n}\n.t-icon-fahrenheit-scale:before {\n  content: '\\E2D2';\n}\n.t-icon-feel-at-ease-filled:before {\n  content: '\\E2D3';\n}\n.t-icon-feel-at-ease:before {\n  content: '\\E2D4';\n}\n.t-icon-ferocious-filled:before {\n  content: '\\E2D5';\n}\n.t-icon-ferocious:before {\n  content: '\\E2D6';\n}\n.t-icon-ferris-wheel-filled:before {\n  content: '\\E2D7';\n}\n.t-icon-ferris-wheel:before {\n  content: '\\E2D8';\n}\n.t-icon-file-1-filled:before {\n  content: '\\E2D9';\n}\n.t-icon-file-1:before {\n  content: '\\E2DA';\n}\n.t-icon-file-add-1-filled:before {\n  content: '\\E2DB';\n}\n.t-icon-file-add-1:before {\n  content: '\\E2DC';\n}\n.t-icon-file-add-filled:before {\n  content: '\\E2DD';\n}\n.t-icon-file-add:before {\n  content: '\\E2DE';\n}\n.t-icon-file-attachment-filled:before {\n  content: '\\E2DF';\n}\n.t-icon-file-attachment:before {\n  content: '\\E2E0';\n}\n.t-icon-file-blocked-filled:before {\n  content: '\\E2E1';\n}\n.t-icon-file-blocked:before {\n  content: '\\E2E2';\n}\n.t-icon-file-code-1-filled:before {\n  content: '\\E2E3';\n}\n.t-icon-file-code-1:before {\n  content: '\\E2E4';\n}\n.t-icon-file-code-filled:before {\n  content: '\\E2E5';\n}\n.t-icon-file-code:before {\n  content: '\\E2E6';\n}\n.t-icon-file-copy-filled:before {\n  content: '\\E2E7';\n}\n.t-icon-file-copy:before {\n  content: '\\E2E8';\n}\n.t-icon-file-download-filled:before {\n  content: '\\E2E9';\n}\n.t-icon-file-download:before {\n  content: '\\E2EA';\n}\n.t-icon-file-excel-filled:before {\n  content: '\\E2EB';\n}\n.t-icon-file-excel:before {\n  content: '\\E2EC';\n}\n.t-icon-file-export-filled:before {\n  content: '\\E2ED';\n}\n.t-icon-file-export:before {\n  content: '\\E2EE';\n}\n.t-icon-file-filled:before {\n  content: '\\E2EF';\n}\n.t-icon-file-icon-filled:before {\n  content: '\\E2F0';\n}\n.t-icon-file-icon:before {\n  content: '\\E2F1';\n}\n.t-icon-file-image-filled:before {\n  content: '\\E2F2';\n}\n.t-icon-file-image:before {\n  content: '\\E2F3';\n}\n.t-icon-file-import-filled:before {\n  content: '\\E2F4';\n}\n.t-icon-file-import:before {\n  content: '\\E2F5';\n}\n.t-icon-file-locked-filled:before {\n  content: '\\E2F6';\n}\n.t-icon-file-locked:before {\n  content: '\\E2F7';\n}\n.t-icon-file-minus-filled:before {\n  content: '\\E2F8';\n}\n.t-icon-file-minus:before {\n  content: '\\E2F9';\n}\n.t-icon-file-music-filled:before {\n  content: '\\E2FA';\n}\n.t-icon-file-music:before {\n  content: '\\E2FB';\n}\n.t-icon-file-onenote-filled:before {\n  content: '\\E2FC';\n}\n.t-icon-file-onenote:before {\n  content: '\\E2FD';\n}\n.t-icon-file-outlook-filled:before {\n  content: '\\E2FE';\n}\n.t-icon-file-outlook:before {\n  content: '\\E2FF';\n}\n.t-icon-file-paste-filled:before {\n  content: '\\E300';\n}\n.t-icon-file-paste:before {\n  content: '\\E301';\n}\n.t-icon-file-pdf-filled:before {\n  content: '\\E302';\n}\n.t-icon-file-pdf:before {\n  content: '\\E303';\n}\n.t-icon-file-powerpoint-filled:before {\n  content: '\\E304';\n}\n.t-icon-file-powerpoint:before {\n  content: '\\E305';\n}\n.t-icon-file-restore-filled:before {\n  content: '\\E306';\n}\n.t-icon-file-restore:before {\n  content: '\\E307';\n}\n.t-icon-file-safety-filled:before {\n  content: '\\E308';\n}\n.t-icon-file-safety:before {\n  content: '\\E309';\n}\n.t-icon-file-search-filled:before {\n  content: '\\E30A';\n}\n.t-icon-file-search:before {\n  content: '\\E30B';\n}\n.t-icon-file-setting-filled:before {\n  content: '\\E30C';\n}\n.t-icon-file-setting:before {\n  content: '\\E30D';\n}\n.t-icon-file-teams-filled:before {\n  content: '\\E30E';\n}\n.t-icon-file-teams:before {\n  content: '\\E30F';\n}\n.t-icon-file-transmit-double-filled:before {\n  content: '\\E310';\n}\n.t-icon-file-transmit-double:before {\n  content: '\\E311';\n}\n.t-icon-file-transmit-filled:before {\n  content: '\\E312';\n}\n.t-icon-file-transmit:before {\n  content: '\\E313';\n}\n.t-icon-file-unknown-filled:before {\n  content: '\\E314';\n}\n.t-icon-file-unknown:before {\n  content: '\\E315';\n}\n.t-icon-file-unlocked-filled:before {\n  content: '\\E316';\n}\n.t-icon-file-unlocked:before {\n  content: '\\E317';\n}\n.t-icon-file-word-filled:before {\n  content: '\\E318';\n}\n.t-icon-file-word:before {\n  content: '\\E319';\n}\n.t-icon-file-zip-filled:before {\n  content: '\\E31A';\n}\n.t-icon-file-zip:before {\n  content: '\\E31B';\n}\n.t-icon-file:before {\n  content: '\\E31C';\n}\n.t-icon-fill-color-1-filled:before {\n  content: '\\E31D';\n}\n.t-icon-fill-color-1:before {\n  content: '\\E31E';\n}\n.t-icon-fill-color-filled:before {\n  content: '\\E31F';\n}\n.t-icon-fill-color:before {\n  content: '\\E320';\n}\n.t-icon-film-1-filled:before {\n  content: '\\E321';\n}\n.t-icon-film-1:before {\n  content: '\\E322';\n}\n.t-icon-film-filled:before {\n  content: '\\E323';\n}\n.t-icon-film:before {\n  content: '\\E324';\n}\n.t-icon-filter-1-filled:before {\n  content: '\\E325';\n}\n.t-icon-filter-1:before {\n  content: '\\E326';\n}\n.t-icon-filter-2-filled:before {\n  content: '\\E327';\n}\n.t-icon-filter-2:before {\n  content: '\\E328';\n}\n.t-icon-filter-3-filled:before {\n  content: '\\E329';\n}\n.t-icon-filter-3:before {\n  content: '\\E32A';\n}\n.t-icon-filter-clear-filled:before {\n  content: '\\E32B';\n}\n.t-icon-filter-clear:before {\n  content: '\\E32C';\n}\n.t-icon-filter-filled:before {\n  content: '\\E32D';\n}\n.t-icon-filter-off-filled:before {\n  content: '\\E32E';\n}\n.t-icon-filter-off:before {\n  content: '\\E32F';\n}\n.t-icon-filter-sort-filled:before {\n  content: '\\E330';\n}\n.t-icon-filter-sort:before {\n  content: '\\E331';\n}\n.t-icon-filter:before {\n  content: '\\E332';\n}\n.t-icon-fingerprint-1:before {\n  content: '\\E333';\n}\n.t-icon-fingerprint-2:before {\n  content: '\\E334';\n}\n.t-icon-fingerprint-3:before {\n  content: '\\E335';\n}\n.t-icon-fingerprint:before {\n  content: '\\E336';\n}\n.t-icon-fish-filled:before {\n  content: '\\E337';\n}\n.t-icon-fish:before {\n  content: '\\E338';\n}\n.t-icon-flag-1-filled:before {\n  content: '\\E339';\n}\n.t-icon-flag-1:before {\n  content: '\\E33A';\n}\n.t-icon-flag-2-filled:before {\n  content: '\\E33B';\n}\n.t-icon-flag-2:before {\n  content: '\\E33C';\n}\n.t-icon-flag-3-filled:before {\n  content: '\\E33D';\n}\n.t-icon-flag-3:before {\n  content: '\\E33E';\n}\n.t-icon-flag-4-filled:before {\n  content: '\\E33F';\n}\n.t-icon-flag-4:before {\n  content: '\\E340';\n}\n.t-icon-flag-filled:before {\n  content: '\\E341';\n}\n.t-icon-flag:before {\n  content: '\\E342';\n}\n.t-icon-flashlight-filled:before {\n  content: '\\E343';\n}\n.t-icon-flashlight:before {\n  content: '\\E344';\n}\n.t-icon-flight-landing-filled:before {\n  content: '\\E345';\n}\n.t-icon-flight-landing:before {\n  content: '\\E346';\n}\n.t-icon-flight-takeoff-filled:before {\n  content: '\\E347';\n}\n.t-icon-flight-takeoff:before {\n  content: '\\E348';\n}\n.t-icon-flip-smiling-face-filled:before {\n  content: '\\E349';\n}\n.t-icon-flip-smiling-face:before {\n  content: '\\E34A';\n}\n.t-icon-flip-to-back-filled:before {\n  content: '\\E34B';\n}\n.t-icon-flip-to-back:before {\n  content: '\\E34C';\n}\n.t-icon-flip-to-front-filled:before {\n  content: '\\E34D';\n}\n.t-icon-flip-to-front:before {\n  content: '\\E34E';\n}\n.t-icon-focus-filled:before {\n  content: '\\E34F';\n}\n.t-icon-focus:before {\n  content: '\\E350';\n}\n.t-icon-fog-filled:before {\n  content: '\\E351';\n}\n.t-icon-fog-night-filled:before {\n  content: '\\E352';\n}\n.t-icon-fog-night:before {\n  content: '\\E353';\n}\n.t-icon-fog-sunny-filled:before {\n  content: '\\E354';\n}\n.t-icon-fog-sunny:before {\n  content: '\\E355';\n}\n.t-icon-fog:before {\n  content: '\\E356';\n}\n.t-icon-folder-1-filled:before {\n  content: '\\E357';\n}\n.t-icon-folder-1:before {\n  content: '\\E358';\n}\n.t-icon-folder-add-1-filled:before {\n  content: '\\E359';\n}\n.t-icon-folder-add-1:before {\n  content: '\\E35A';\n}\n.t-icon-folder-add-filled:before {\n  content: '\\E35B';\n}\n.t-icon-folder-add:before {\n  content: '\\E35C';\n}\n.t-icon-folder-blocked-filled:before {\n  content: '\\E35D';\n}\n.t-icon-folder-blocked:before {\n  content: '\\E35E';\n}\n.t-icon-folder-details-filled:before {\n  content: '\\E35F';\n}\n.t-icon-folder-details:before {\n  content: '\\E360';\n}\n.t-icon-folder-export-filled:before {\n  content: '\\E361';\n}\n.t-icon-folder-export:before {\n  content: '\\E362';\n}\n.t-icon-folder-filled:before {\n  content: '\\E363';\n}\n.t-icon-folder-import-filled:before {\n  content: '\\E364';\n}\n.t-icon-folder-import:before {\n  content: '\\E365';\n}\n.t-icon-folder-locked-filled:before {\n  content: '\\E366';\n}\n.t-icon-folder-locked:before {\n  content: '\\E367';\n}\n.t-icon-folder-minus-filled:before {\n  content: '\\E368';\n}\n.t-icon-folder-minus:before {\n  content: '\\E369';\n}\n.t-icon-folder-move-filled:before {\n  content: '\\E36A';\n}\n.t-icon-folder-move:before {\n  content: '\\E36B';\n}\n.t-icon-folder-off-filled:before {\n  content: '\\E36C';\n}\n.t-icon-folder-off:before {\n  content: '\\E36D';\n}\n.t-icon-folder-open-1-filled:before {\n  content: '\\E36E';\n}\n.t-icon-folder-open-1:before {\n  content: '\\E36F';\n}\n.t-icon-folder-open-filled:before {\n  content: '\\E370';\n}\n.t-icon-folder-open:before {\n  content: '\\E371';\n}\n.t-icon-folder-search-filled:before {\n  content: '\\E372';\n}\n.t-icon-folder-search:before {\n  content: '\\E373';\n}\n.t-icon-folder-setting-filled:before {\n  content: '\\E374';\n}\n.t-icon-folder-setting:before {\n  content: '\\E375';\n}\n.t-icon-folder-shared-filled:before {\n  content: '\\E376';\n}\n.t-icon-folder-shared:before {\n  content: '\\E377';\n}\n.t-icon-folder-unlocked-filled:before {\n  content: '\\E378';\n}\n.t-icon-folder-unlocked:before {\n  content: '\\E379';\n}\n.t-icon-folder-zip-filled:before {\n  content: '\\E37A';\n}\n.t-icon-folder-zip:before {\n  content: '\\E37B';\n}\n.t-icon-folder:before {\n  content: '\\E37C';\n}\n.t-icon-forest-filled:before {\n  content: '\\E37D';\n}\n.t-icon-forest:before {\n  content: '\\E37E';\n}\n.t-icon-fork-filled:before {\n  content: '\\E37F';\n}\n.t-icon-fork:before {\n  content: '\\E380';\n}\n.t-icon-form-filled:before {\n  content: '\\E381';\n}\n.t-icon-form:before {\n  content: '\\E382';\n}\n.t-icon-format-horizontal-align-bottom:before {\n  content: '\\E383';\n}\n.t-icon-format-horizontal-align-center:before {\n  content: '\\E384';\n}\n.t-icon-format-horizontal-align-top:before {\n  content: '\\E385';\n}\n.t-icon-format-vertical-align-center:before {\n  content: '\\E386';\n}\n.t-icon-format-vertical-align-left:before {\n  content: '\\E387';\n}\n.t-icon-format-vertical-align-right:before {\n  content: '\\E388';\n}\n.t-icon-forward-filled:before {\n  content: '\\E389';\n}\n.t-icon-forward:before {\n  content: '\\E38A';\n}\n.t-icon-frame-1-filled:before {\n  content: '\\E38B';\n}\n.t-icon-frame-1:before {\n  content: '\\E38C';\n}\n.t-icon-frame-filled:before {\n  content: '\\E38D';\n}\n.t-icon-frame:before {\n  content: '\\E38E';\n}\n.t-icon-fries-filled:before {\n  content: '\\E38F';\n}\n.t-icon-fries:before {\n  content: '\\E390';\n}\n.t-icon-fullscreen-1:before {\n  content: '\\E391';\n}\n.t-icon-fullscreen-2:before {\n  content: '\\E392';\n}\n.t-icon-fullscreen-exit-1:before {\n  content: '\\E393';\n}\n.t-icon-fullscreen-exit:before {\n  content: '\\E394';\n}\n.t-icon-fullscreen:before {\n  content: '\\E395';\n}\n.t-icon-function-curve:before {\n  content: '\\E396';\n}\n.t-icon-functions-1:before {\n  content: '\\E397';\n}\n.t-icon-functions:before {\n  content: '\\E398';\n}\n.t-icon-gamepad-1-filled:before {\n  content: '\\E399';\n}\n.t-icon-gamepad-1:before {\n  content: '\\E39A';\n}\n.t-icon-gamepad-filled:before {\n  content: '\\E39B';\n}\n.t-icon-gamepad:before {\n  content: '\\E39C';\n}\n.t-icon-gamma:before {\n  content: '\\E39D';\n}\n.t-icon-garlic-filled:before {\n  content: '\\E39E';\n}\n.t-icon-garlic:before {\n  content: '\\E39F';\n}\n.t-icon-gender-female:before {\n  content: '\\E3A0';\n}\n.t-icon-gender-male:before {\n  content: '\\E3A1';\n}\n.t-icon-gesture-applause-filled:before {\n  content: '\\E3A2';\n}\n.t-icon-gesture-applause:before {\n  content: '\\E3A3';\n}\n.t-icon-gesture-click-filled:before {\n  content: '\\E3A4';\n}\n.t-icon-gesture-click:before {\n  content: '\\E3A5';\n}\n.t-icon-gesture-down-filled:before {\n  content: '\\E3A6';\n}\n.t-icon-gesture-down:before {\n  content: '\\E3A7';\n}\n.t-icon-gesture-expansion-filled:before {\n  content: '\\E3A8';\n}\n.t-icon-gesture-expansion:before {\n  content: '\\E3A9';\n}\n.t-icon-gesture-left-filled:before {\n  content: '\\E3AA';\n}\n.t-icon-gesture-left-slip-filled:before {\n  content: '\\E3AB';\n}\n.t-icon-gesture-left-slip:before {\n  content: '\\E3AC';\n}\n.t-icon-gesture-left:before {\n  content: '\\E3AD';\n}\n.t-icon-gesture-open-filled:before {\n  content: '\\E3AE';\n}\n.t-icon-gesture-open:before {\n  content: '\\E3AF';\n}\n.t-icon-gesture-pray-filled:before {\n  content: '\\E3B0';\n}\n.t-icon-gesture-pray:before {\n  content: '\\E3B1';\n}\n.t-icon-gesture-press-filled:before {\n  content: '\\E3B2';\n}\n.t-icon-gesture-press:before {\n  content: '\\E3B3';\n}\n.t-icon-gesture-ranslation-filled:before {\n  content: '\\E3B4';\n}\n.t-icon-gesture-ranslation:before {\n  content: '\\E3B5';\n}\n.t-icon-gesture-right-filled:before {\n  content: '\\E3B6';\n}\n.t-icon-gesture-right-slip-filled:before {\n  content: '\\E3B7';\n}\n.t-icon-gesture-right-slip:before {\n  content: '\\E3B8';\n}\n.t-icon-gesture-right:before {\n  content: '\\E3B9';\n}\n.t-icon-gesture-slide-left-and-right-filled:before {\n  content: '\\E3BA';\n}\n.t-icon-gesture-slide-left-and-right:before {\n  content: '\\E3BB';\n}\n.t-icon-gesture-slide-up-filled:before {\n  content: '\\E3BC';\n}\n.t-icon-gesture-slide-up:before {\n  content: '\\E3BD';\n}\n.t-icon-gesture-typing-filled:before {\n  content: '\\E3BE';\n}\n.t-icon-gesture-typing:before {\n  content: '\\E3BF';\n}\n.t-icon-gesture-up-and-down-filled:before {\n  content: '\\E3C0';\n}\n.t-icon-gesture-up-and-down:before {\n  content: '\\E3C1';\n}\n.t-icon-gesture-up-filled:before {\n  content: '\\E3C2';\n}\n.t-icon-gesture-up:before {\n  content: '\\E3C3';\n}\n.t-icon-gesture-wipe-down-filled:before {\n  content: '\\E3C4';\n}\n.t-icon-gesture-wipe-down:before {\n  content: '\\E3C5';\n}\n.t-icon-gift-filled:before {\n  content: '\\E3C6';\n}\n.t-icon-gift:before {\n  content: '\\E3C7';\n}\n.t-icon-giggle-filled:before {\n  content: '\\E3C8';\n}\n.t-icon-giggle:before {\n  content: '\\E3C9';\n}\n.t-icon-git-branch-filled:before {\n  content: '\\E3CA';\n}\n.t-icon-git-branch:before {\n  content: '\\E3CB';\n}\n.t-icon-git-commit-filled:before {\n  content: '\\E3CC';\n}\n.t-icon-git-commit:before {\n  content: '\\E3CD';\n}\n.t-icon-git-merge-filled:before {\n  content: '\\E3CE';\n}\n.t-icon-git-merge:before {\n  content: '\\E3CF';\n}\n.t-icon-git-pull-request-filled:before {\n  content: '\\E3D0';\n}\n.t-icon-git-pull-request:before {\n  content: '\\E3D1';\n}\n.t-icon-git-repository-commits-filled:before {\n  content: '\\E3D2';\n}\n.t-icon-git-repository-commits:before {\n  content: '\\E3D3';\n}\n.t-icon-git-repository-filled:before {\n  content: '\\E3D4';\n}\n.t-icon-git-repository-private-filled:before {\n  content: '\\E3D5';\n}\n.t-icon-git-repository-private:before {\n  content: '\\E3D6';\n}\n.t-icon-git-repository:before {\n  content: '\\E3D7';\n}\n.t-icon-gps-filled:before {\n  content: '\\E3D8';\n}\n.t-icon-gps:before {\n  content: '\\E3D9';\n}\n.t-icon-grape-filled:before {\n  content: '\\E3DA';\n}\n.t-icon-grape:before {\n  content: '\\E3DB';\n}\n.t-icon-greater-than-or-equal:before {\n  content: '\\E3DC';\n}\n.t-icon-greater-than:before {\n  content: '\\E3DD';\n}\n.t-icon-green-onion:before {\n  content: '\\E3DE';\n}\n.t-icon-grid-add-filled:before {\n  content: '\\E3DF';\n}\n.t-icon-grid-add:before {\n  content: '\\E3E0';\n}\n.t-icon-grid-view-filled:before {\n  content: '\\E3E1';\n}\n.t-icon-grid-view:before {\n  content: '\\E3E2';\n}\n.t-icon-guitar-filled:before {\n  content: '\\E3E3';\n}\n.t-icon-guitar:before {\n  content: '\\E3E4';\n}\n.t-icon-hamburger-filled:before {\n  content: '\\E3E5';\n}\n.t-icon-hamburger:before {\n  content: '\\E3E6';\n}\n.t-icon-happy-filled:before {\n  content: '\\E3E7';\n}\n.t-icon-happy:before {\n  content: '\\E3E8';\n}\n.t-icon-hard-disk-storage-filled:before {\n  content: '\\E3E9';\n}\n.t-icon-hard-disk-storage:before {\n  content: '\\E3EA';\n}\n.t-icon-hard-drive-filled:before {\n  content: '\\E3EB';\n}\n.t-icon-hard-drive:before {\n  content: '\\E3EC';\n}\n.t-icon-hashtag:before {\n  content: '\\E3ED';\n}\n.t-icon-hd-filled:before {\n  content: '\\E3EE';\n}\n.t-icon-hd:before {\n  content: '\\E3EF';\n}\n.t-icon-heart-filled:before {\n  content: '\\E3F0';\n}\n.t-icon-heart:before {\n  content: '\\E3F1';\n}\n.t-icon-help-circle-filled:before {\n  content: '\\E3F2';\n}\n.t-icon-help-circle:before {\n  content: '\\E3F3';\n}\n.t-icon-help-rectangle-filled:before {\n  content: '\\E3F4';\n}\n.t-icon-help-rectangle:before {\n  content: '\\E3F5';\n}\n.t-icon-help:before {\n  content: '\\E3F6';\n}\n.t-icon-highlight-1-filled:before {\n  content: '\\E3F7';\n}\n.t-icon-highlight-1:before {\n  content: '\\E3F8';\n}\n.t-icon-highlight:before {\n  content: '\\E3F9';\n}\n.t-icon-history-setting:before {\n  content: '\\E3FA';\n}\n.t-icon-history:before {\n  content: '\\E3FB';\n}\n.t-icon-home-filled:before {\n  content: '\\E3FC';\n}\n.t-icon-home:before {\n  content: '\\E3FD';\n}\n.t-icon-horizontal-filled:before {\n  content: '\\E3FE';\n}\n.t-icon-horizontal:before {\n  content: '\\E3FF';\n}\n.t-icon-hospital-1-filled:before {\n  content: '\\E400';\n}\n.t-icon-hospital-1:before {\n  content: '\\E401';\n}\n.t-icon-hospital-filled:before {\n  content: '\\E402';\n}\n.t-icon-hospital:before {\n  content: '\\E403';\n}\n.t-icon-hotspot-wave-filled:before {\n  content: '\\E404';\n}\n.t-icon-hotspot-wave:before {\n  content: '\\E405';\n}\n.t-icon-hourglass-filled:before {\n  content: '\\E406';\n}\n.t-icon-hourglass:before {\n  content: '\\E407';\n}\n.t-icon-houses-1-filled:before {\n  content: '\\E408';\n}\n.t-icon-houses-1:before {\n  content: '\\E409';\n}\n.t-icon-houses-2-filled:before {\n  content: '\\E40A';\n}\n.t-icon-houses-2:before {\n  content: '\\E40B';\n}\n.t-icon-houses-filled:before {\n  content: '\\E40C';\n}\n.t-icon-houses:before {\n  content: '\\E40D';\n}\n.t-icon-html5-filled:before {\n  content: '\\E40E';\n}\n.t-icon-html5:before {\n  content: '\\E40F';\n}\n.t-icon-https-filled:before {\n  content: '\\E410';\n}\n.t-icon-https:before {\n  content: '\\E411';\n}\n.t-icon-ice-cream-filled:before {\n  content: '\\E412';\n}\n.t-icon-ice-cream:before {\n  content: '\\E413';\n}\n.t-icon-icon-filled:before {\n  content: '\\E414';\n}\n.t-icon-icon:before {\n  content: '\\E415';\n}\n.t-icon-image-1-filled:before {\n  content: '\\E416';\n}\n.t-icon-image-1:before {\n  content: '\\E417';\n}\n.t-icon-image-add-filled:before {\n  content: '\\E418';\n}\n.t-icon-image-add:before {\n  content: '\\E419';\n}\n.t-icon-image-edit-filled:before {\n  content: '\\E41A';\n}\n.t-icon-image-edit:before {\n  content: '\\E41B';\n}\n.t-icon-image-error-filled:before {\n  content: '\\E41C';\n}\n.t-icon-image-error:before {\n  content: '\\E41D';\n}\n.t-icon-image-filled:before {\n  content: '\\E41E';\n}\n.t-icon-image-off-filled:before {\n  content: '\\E41F';\n}\n.t-icon-image-off:before {\n  content: '\\E420';\n}\n.t-icon-image-search-filled:before {\n  content: '\\E421';\n}\n.t-icon-image-search:before {\n  content: '\\E422';\n}\n.t-icon-image:before {\n  content: '\\E423';\n}\n.t-icon-indent-left:before {\n  content: '\\E424';\n}\n.t-icon-indent-right:before {\n  content: '\\E425';\n}\n.t-icon-indicator-filled:before {\n  content: '\\E426';\n}\n.t-icon-indicator:before {\n  content: '\\E427';\n}\n.t-icon-info-circle-filled:before {\n  content: '\\E428';\n}\n.t-icon-info-circle:before {\n  content: '\\E429';\n}\n.t-icon-ink-filled:before {\n  content: '\\E42A';\n}\n.t-icon-ink:before {\n  content: '\\E42B';\n}\n.t-icon-install-desktop-filled:before {\n  content: '\\E42C';\n}\n.t-icon-install-desktop:before {\n  content: '\\E42D';\n}\n.t-icon-install-filled:before {\n  content: '\\E42E';\n}\n.t-icon-install-mobile-filled:before {\n  content: '\\E42F';\n}\n.t-icon-install-mobile:before {\n  content: '\\E430';\n}\n.t-icon-install:before {\n  content: '\\E431';\n}\n.t-icon-institution-checked-filled:before {\n  content: '\\E432';\n}\n.t-icon-institution-checked:before {\n  content: '\\E433';\n}\n.t-icon-institution-filled:before {\n  content: '\\E434';\n}\n.t-icon-institution:before {\n  content: '\\E435';\n}\n.t-icon-internet-filled:before {\n  content: '\\E436';\n}\n.t-icon-internet:before {\n  content: '\\E437';\n}\n.t-icon-ipod-filled:before {\n  content: '\\E438';\n}\n.t-icon-ipod:before {\n  content: '\\E439';\n}\n.t-icon-joyful-filled:before {\n  content: '\\E43A';\n}\n.t-icon-joyful:before {\n  content: '\\E43B';\n}\n.t-icon-jump-double:before {\n  content: '\\E43C';\n}\n.t-icon-jump-off:before {\n  content: '\\E43D';\n}\n.t-icon-jump:before {\n  content: '\\E43E';\n}\n.t-icon-key-filled:before {\n  content: '\\E43F';\n}\n.t-icon-key:before {\n  content: '\\E440';\n}\n.t-icon-keyboard-filled:before {\n  content: '\\E441';\n}\n.t-icon-keyboard:before {\n  content: '\\E442';\n}\n.t-icon-laptop-filled:before {\n  content: '\\E443';\n}\n.t-icon-laptop:before {\n  content: '\\E444';\n}\n.t-icon-layers-filled:before {\n  content: '\\E445';\n}\n.t-icon-layers:before {\n  content: '\\E446';\n}\n.t-icon-layout-filled:before {\n  content: '\\E447';\n}\n.t-icon-layout:before {\n  content: '\\E448';\n}\n.t-icon-leaderboard-filled:before {\n  content: '\\E449';\n}\n.t-icon-leaderboard:before {\n  content: '\\E44A';\n}\n.t-icon-lemon-filled:before {\n  content: '\\E44B';\n}\n.t-icon-lemon-slice-filled:before {\n  content: '\\E44C';\n}\n.t-icon-lemon-slice:before {\n  content: '\\E44D';\n}\n.t-icon-lemon:before {\n  content: '\\E44E';\n}\n.t-icon-less-than-or-equal:before {\n  content: '\\E44F';\n}\n.t-icon-less-than:before {\n  content: '\\E450';\n}\n.t-icon-letters-a:before {\n  content: '\\E451';\n}\n.t-icon-letters-b:before {\n  content: '\\E452';\n}\n.t-icon-letters-c:before {\n  content: '\\E453';\n}\n.t-icon-letters-d:before {\n  content: '\\E454';\n}\n.t-icon-letters-e:before {\n  content: '\\E455';\n}\n.t-icon-letters-f:before {\n  content: '\\E456';\n}\n.t-icon-letters-g:before {\n  content: '\\E457';\n}\n.t-icon-letters-h:before {\n  content: '\\E458';\n}\n.t-icon-letters-i:before {\n  content: '\\E459';\n}\n.t-icon-letters-j:before {\n  content: '\\E45A';\n}\n.t-icon-letters-k:before {\n  content: '\\E45B';\n}\n.t-icon-letters-l:before {\n  content: '\\E45C';\n}\n.t-icon-letters-m:before {\n  content: '\\E45D';\n}\n.t-icon-letters-n:before {\n  content: '\\E45E';\n}\n.t-icon-letters-o:before {\n  content: '\\E45F';\n}\n.t-icon-letters-p:before {\n  content: '\\E460';\n}\n.t-icon-letters-q:before {\n  content: '\\E461';\n}\n.t-icon-letters-r:before {\n  content: '\\E462';\n}\n.t-icon-letters-s:before {\n  content: '\\E463';\n}\n.t-icon-letters-t:before {\n  content: '\\E464';\n}\n.t-icon-letters-u:before {\n  content: '\\E465';\n}\n.t-icon-letters-v:before {\n  content: '\\E466';\n}\n.t-icon-letters-w:before {\n  content: '\\E467';\n}\n.t-icon-letters-x:before {\n  content: '\\E468';\n}\n.t-icon-letters-y:before {\n  content: '\\E469';\n}\n.t-icon-letters-z:before {\n  content: '\\E46A';\n}\n.t-icon-lightbulb-circle-filled:before {\n  content: '\\E46B';\n}\n.t-icon-lightbulb-circle:before {\n  content: '\\E46C';\n}\n.t-icon-lightbulb-filled:before {\n  content: '\\E46D';\n}\n.t-icon-lightbulb:before {\n  content: '\\E46E';\n}\n.t-icon-lighthouse-1-filled:before {\n  content: '\\E46F';\n}\n.t-icon-lighthouse-1:before {\n  content: '\\E470';\n}\n.t-icon-lighthouse-2-filled:before {\n  content: '\\E471';\n}\n.t-icon-lighthouse-2:before {\n  content: '\\E472';\n}\n.t-icon-lighthouse-filled:before {\n  content: '\\E473';\n}\n.t-icon-lighthouse:before {\n  content: '\\E474';\n}\n.t-icon-lighting-circle-filled:before {\n  content: '\\E475';\n}\n.t-icon-lighting-circle:before {\n  content: '\\E476';\n}\n.t-icon-line-height:before {\n  content: '\\E477';\n}\n.t-icon-link-1:before {\n  content: '\\E478';\n}\n.t-icon-link-unlink:before {\n  content: '\\E479';\n}\n.t-icon-link:before {\n  content: '\\E47A';\n}\n.t-icon-liquor-filled:before {\n  content: '\\E47B';\n}\n.t-icon-liquor:before {\n  content: '\\E47C';\n}\n.t-icon-list-numbered:before {\n  content: '\\E47D';\n}\n.t-icon-list:before {\n  content: '\\E47E';\n}\n.t-icon-load:before {\n  content: '\\E47F';\n}\n.t-icon-loading:before {\n  content: '\\E480';\n}\n.t-icon-location-1-filled:before {\n  content: '\\E481';\n}\n.t-icon-location-1:before {\n  content: '\\E482';\n}\n.t-icon-location-enlargement-filled:before {\n  content: '\\E483';\n}\n.t-icon-location-enlargement:before {\n  content: '\\E484';\n}\n.t-icon-location-error-filled:before {\n  content: '\\E485';\n}\n.t-icon-location-error:before {\n  content: '\\E486';\n}\n.t-icon-location-filled:before {\n  content: '\\E487';\n}\n.t-icon-location-parking-place-filled:before {\n  content: '\\E488';\n}\n.t-icon-location-parking-place:before {\n  content: '\\E489';\n}\n.t-icon-location-reduction-filled:before {\n  content: '\\E48A';\n}\n.t-icon-location-reduction:before {\n  content: '\\E48B';\n}\n.t-icon-location-setting-filled:before {\n  content: '\\E48C';\n}\n.t-icon-location-setting:before {\n  content: '\\E48D';\n}\n.t-icon-location:before {\n  content: '\\E48E';\n}\n.t-icon-lock-off-filled:before {\n  content: '\\E48F';\n}\n.t-icon-lock-off:before {\n  content: '\\E490';\n}\n.t-icon-lock-on-filled:before {\n  content: '\\E491';\n}\n.t-icon-lock-on:before {\n  content: '\\E492';\n}\n.t-icon-lock-time-filled:before {\n  content: '\\E493';\n}\n.t-icon-lock-time:before {\n  content: '\\E494';\n}\n.t-icon-login:before {\n  content: '\\E495';\n}\n.t-icon-logo-adobe-illustrate-filled:before {\n  content: '\\E496';\n}\n.t-icon-logo-adobe-illustrate:before {\n  content: '\\E497';\n}\n.t-icon-logo-adobe-lightroom-filled:before {\n  content: '\\E498';\n}\n.t-icon-logo-adobe-lightroom:before {\n  content: '\\E499';\n}\n.t-icon-logo-adobe-photoshop-filled:before {\n  content: '\\E49A';\n}\n.t-icon-logo-adobe-photoshop:before {\n  content: '\\E49B';\n}\n.t-icon-logo-alipay-filled:before {\n  content: '\\E49C';\n}\n.t-icon-logo-alipay:before {\n  content: '\\E49D';\n}\n.t-icon-logo-android-filled:before {\n  content: '\\E49E';\n}\n.t-icon-logo-android:before {\n  content: '\\E49F';\n}\n.t-icon-logo-apple-filled:before {\n  content: '\\E4A0';\n}\n.t-icon-logo-apple:before {\n  content: '\\E4A1';\n}\n.t-icon-logo-behance-filled:before {\n  content: '\\E4A2';\n}\n.t-icon-logo-behance:before {\n  content: '\\E4A3';\n}\n.t-icon-logo-chrome-filled:before {\n  content: '\\E4A4';\n}\n.t-icon-logo-chrome:before {\n  content: '\\E4A5';\n}\n.t-icon-logo-cinema4d-filled:before {\n  content: '\\E4A6';\n}\n.t-icon-logo-cinema4d:before {\n  content: '\\E4A7';\n}\n.t-icon-logo-codepen:before {\n  content: '\\E4A8';\n}\n.t-icon-logo-codesandbox:before {\n  content: '\\E4A9';\n}\n.t-icon-logo-dribbble-filled:before {\n  content: '\\E4AA';\n}\n.t-icon-logo-dribbble:before {\n  content: '\\E4AB';\n}\n.t-icon-logo-facebook-filled:before {\n  content: '\\E4AC';\n}\n.t-icon-logo-facebook:before {\n  content: '\\E4AD';\n}\n.t-icon-logo-figma-filled:before {\n  content: '\\E4AE';\n}\n.t-icon-logo-figma:before {\n  content: '\\E4AF';\n}\n.t-icon-logo-framer-filled:before {\n  content: '\\E4B0';\n}\n.t-icon-logo-framer:before {\n  content: '\\E4B1';\n}\n.t-icon-logo-github-filled:before {\n  content: '\\E4B2';\n}\n.t-icon-logo-github:before {\n  content: '\\E4B3';\n}\n.t-icon-logo-gitlab-filled:before {\n  content: '\\E4B4';\n}\n.t-icon-logo-gitlab:before {\n  content: '\\E4B5';\n}\n.t-icon-logo-ie-filled:before {\n  content: '\\E4B6';\n}\n.t-icon-logo-ie:before {\n  content: '\\E4B7';\n}\n.t-icon-logo-instagram-filled:before {\n  content: '\\E4B8';\n}\n.t-icon-logo-instagram:before {\n  content: '\\E4B9';\n}\n.t-icon-logo-qq-filled:before {\n  content: '\\E4BA';\n}\n.t-icon-logo-qq:before {\n  content: '\\E4BB';\n}\n.t-icon-logo-twitter-filled:before {\n  content: '\\E4BC';\n}\n.t-icon-logo-twitter:before {\n  content: '\\E4BD';\n}\n.t-icon-logo-wechat-stroke-filled:before {\n  content: '\\E4BE';\n}\n.t-icon-logo-wechat-stroke:before {\n  content: '\\E4BF';\n}\n.t-icon-logo-wechatpay-filled:before {\n  content: '\\E4C0';\n}\n.t-icon-logo-wechatpay:before {\n  content: '\\E4C1';\n}\n.t-icon-logo-wecom:before {\n  content: '\\E4C2';\n}\n.t-icon-logo-windows-filled:before {\n  content: '\\E4C3';\n}\n.t-icon-logo-windows:before {\n  content: '\\E4C4';\n}\n.t-icon-logo-youtube-filled:before {\n  content: '\\E4C5';\n}\n.t-icon-logo-youtube:before {\n  content: '\\E4C6';\n}\n.t-icon-logout:before {\n  content: '\\E4C7';\n}\n.t-icon-look-around-filled:before {\n  content: '\\E4C8';\n}\n.t-icon-look-around:before {\n  content: '\\E4C9';\n}\n.t-icon-loudspeaker-filled:before {\n  content: '\\E4CA';\n}\n.t-icon-loudspeaker:before {\n  content: '\\E4CB';\n}\n.t-icon-mail-filled:before {\n  content: '\\E4CC';\n}\n.t-icon-mail:before {\n  content: '\\E4CD';\n}\n.t-icon-map-3d-filled:before {\n  content: '\\E4CE';\n}\n.t-icon-map-3d:before {\n  content: '\\E4CF';\n}\n.t-icon-map-add-filled:before {\n  content: '\\E4D0';\n}\n.t-icon-map-add:before {\n  content: '\\E4D1';\n}\n.t-icon-map-aiming-filled:before {\n  content: '\\E4D2';\n}\n.t-icon-map-aiming:before {\n  content: '\\E4D3';\n}\n.t-icon-map-blocked-filled:before {\n  content: '\\E4D4';\n}\n.t-icon-map-blocked:before {\n  content: '\\E4D5';\n}\n.t-icon-map-bubble-filled:before {\n  content: '\\E4D6';\n}\n.t-icon-map-bubble:before {\n  content: '\\E4D7';\n}\n.t-icon-map-cancel-filled:before {\n  content: '\\E4D8';\n}\n.t-icon-map-cancel:before {\n  content: '\\E4D9';\n}\n.t-icon-map-chat-filled:before {\n  content: '\\E4DA';\n}\n.t-icon-map-chat:before {\n  content: '\\E4DB';\n}\n.t-icon-map-checked-filled:before {\n  content: '\\E4DC';\n}\n.t-icon-map-checked:before {\n  content: '\\E4DD';\n}\n.t-icon-map-collection-filled:before {\n  content: '\\E4DE';\n}\n.t-icon-map-collection:before {\n  content: '\\E4DF';\n}\n.t-icon-map-connection-filled:before {\n  content: '\\E4E0';\n}\n.t-icon-map-connection:before {\n  content: '\\E4E1';\n}\n.t-icon-map-distance-filled:before {\n  content: '\\E4E2';\n}\n.t-icon-map-distance:before {\n  content: '\\E4E3';\n}\n.t-icon-map-double-filled:before {\n  content: '\\E4E4';\n}\n.t-icon-map-double:before {\n  content: '\\E4E5';\n}\n.t-icon-map-edit-filled:before {\n  content: '\\E4E6';\n}\n.t-icon-map-edit:before {\n  content: '\\E4E7';\n}\n.t-icon-map-filled:before {\n  content: '\\E4E8';\n}\n.t-icon-map-grid-filled:before {\n  content: '\\E4E9';\n}\n.t-icon-map-grid:before {\n  content: '\\E4EA';\n}\n.t-icon-map-information-1-filled:before {\n  content: '\\E4EB';\n}\n.t-icon-map-information-1:before {\n  content: '\\E4EC';\n}\n.t-icon-map-information-2-filled:before {\n  content: '\\E4ED';\n}\n.t-icon-map-information-2:before {\n  content: '\\E4EE';\n}\n.t-icon-map-information-filled:before {\n  content: '\\E4EF';\n}\n.t-icon-map-information:before {\n  content: '\\E4F0';\n}\n.t-icon-map-location-filled:before {\n  content: '\\E4F1';\n}\n.t-icon-map-location:before {\n  content: '\\E4F2';\n}\n.t-icon-map-locked-filled:before {\n  content: '\\E4F3';\n}\n.t-icon-map-locked:before {\n  content: '\\E4F4';\n}\n.t-icon-map-marked-filled:before {\n  content: '\\E4F5';\n}\n.t-icon-map-marked:before {\n  content: '\\E4F6';\n}\n.t-icon-map-navigation-filled:before {\n  content: '\\E4F7';\n}\n.t-icon-map-navigation:before {\n  content: '\\E4F8';\n}\n.t-icon-map-outline-filled:before {\n  content: '\\E4F9';\n}\n.t-icon-map-outline:before {\n  content: '\\E4FA';\n}\n.t-icon-map-route-planning-filled:before {\n  content: '\\E4FB';\n}\n.t-icon-map-route-planning:before {\n  content: '\\E4FC';\n}\n.t-icon-map-ruler-filled:before {\n  content: '\\E4FD';\n}\n.t-icon-map-ruler:before {\n  content: '\\E4FE';\n}\n.t-icon-map-safety-filled:before {\n  content: '\\E4FF';\n}\n.t-icon-map-safety:before {\n  content: '\\E500';\n}\n.t-icon-map-search-1-filled:before {\n  content: '\\E501';\n}\n.t-icon-map-search-1:before {\n  content: '\\E502';\n}\n.t-icon-map-search-filled:before {\n  content: '\\E503';\n}\n.t-icon-map-search:before {\n  content: '\\E504';\n}\n.t-icon-map-setting-filled:before {\n  content: '\\E505';\n}\n.t-icon-map-setting:before {\n  content: '\\E506';\n}\n.t-icon-map-unlocked-filled:before {\n  content: '\\E507';\n}\n.t-icon-map-unlocked:before {\n  content: '\\E508';\n}\n.t-icon-map:before {\n  content: '\\E509';\n}\n.t-icon-mark-as-unread-filled:before {\n  content: '\\E50A';\n}\n.t-icon-mark-as-unread:before {\n  content: '\\E50B';\n}\n.t-icon-markup-filled:before {\n  content: '\\E50C';\n}\n.t-icon-markup:before {\n  content: '\\E50D';\n}\n.t-icon-mathematics-filled:before {\n  content: '\\E50E';\n}\n.t-icon-mathematics:before {\n  content: '\\E50F';\n}\n.t-icon-measurement-1-filled:before {\n  content: '\\E510';\n}\n.t-icon-measurement-1:before {\n  content: '\\E511';\n}\n.t-icon-measurement-2-filled:before {\n  content: '\\E512';\n}\n.t-icon-measurement-2:before {\n  content: '\\E513';\n}\n.t-icon-measurement-filled:before {\n  content: '\\E514';\n}\n.t-icon-measurement:before {\n  content: '\\E515';\n}\n.t-icon-meat-pepper-filled:before {\n  content: '\\E516';\n}\n.t-icon-meat-pepper:before {\n  content: '\\E517';\n}\n.t-icon-media-library-filled:before {\n  content: '\\E518';\n}\n.t-icon-media-library:before {\n  content: '\\E519';\n}\n.t-icon-member-filled:before {\n  content: '\\E51A';\n}\n.t-icon-member:before {\n  content: '\\E51B';\n}\n.t-icon-menu-application:before {\n  content: '\\E51C';\n}\n.t-icon-menu-filled:before {\n  content: '\\E51D';\n}\n.t-icon-menu-fold:before {\n  content: '\\E51E';\n}\n.t-icon-menu-unfold:before {\n  content: '\\E51F';\n}\n.t-icon-menu:before {\n  content: '\\E520';\n}\n.t-icon-merge-cells-filled:before {\n  content: '\\E521';\n}\n.t-icon-merge-cells:before {\n  content: '\\E522';\n}\n.t-icon-microphone-1-filled:before {\n  content: '\\E523';\n}\n.t-icon-microphone-1:before {\n  content: '\\E524';\n}\n.t-icon-microphone-2-filled:before {\n  content: '\\E525';\n}\n.t-icon-microphone-2:before {\n  content: '\\E526';\n}\n.t-icon-microphone-filled:before {\n  content: '\\E527';\n}\n.t-icon-microphone:before {\n  content: '\\E528';\n}\n.t-icon-milk-filled:before {\n  content: '\\E529';\n}\n.t-icon-milk:before {\n  content: '\\E52A';\n}\n.t-icon-minus-circle-filled:before {\n  content: '\\E52B';\n}\n.t-icon-minus-circle:before {\n  content: '\\E52C';\n}\n.t-icon-minus-rectangle-filled:before {\n  content: '\\E52D';\n}\n.t-icon-minus-rectangle:before {\n  content: '\\E52E';\n}\n.t-icon-minus:before {\n  content: '\\E52F';\n}\n.t-icon-mirror-filled:before {\n  content: '\\E530';\n}\n.t-icon-mirror:before {\n  content: '\\E531';\n}\n.t-icon-mobile-blocked-filled:before {\n  content: '\\E532';\n}\n.t-icon-mobile-blocked:before {\n  content: '\\E533';\n}\n.t-icon-mobile-filled:before {\n  content: '\\E534';\n}\n.t-icon-mobile-list-filled:before {\n  content: '\\E535';\n}\n.t-icon-mobile-list:before {\n  content: '\\E536';\n}\n.t-icon-mobile-navigation-filled:before {\n  content: '\\E537';\n}\n.t-icon-mobile-navigation:before {\n  content: '\\E538';\n}\n.t-icon-mobile-shortcut-filled:before {\n  content: '\\E539';\n}\n.t-icon-mobile-shortcut:before {\n  content: '\\E53A';\n}\n.t-icon-mobile-vibrate-filled:before {\n  content: '\\E53B';\n}\n.t-icon-mobile-vibrate:before {\n  content: '\\E53C';\n}\n.t-icon-mobile:before {\n  content: '\\E53D';\n}\n.t-icon-mode-dark-filled:before {\n  content: '\\E53E';\n}\n.t-icon-mode-dark:before {\n  content: '\\E53F';\n}\n.t-icon-mode-light-filled:before {\n  content: '\\E540';\n}\n.t-icon-mode-light:before {\n  content: '\\E541';\n}\n.t-icon-module-filled:before {\n  content: '\\E542';\n}\n.t-icon-module:before {\n  content: '\\E543';\n}\n.t-icon-money-filled:before {\n  content: '\\E544';\n}\n.t-icon-money:before {\n  content: '\\E545';\n}\n.t-icon-monument-filled:before {\n  content: '\\E546';\n}\n.t-icon-monument:before {\n  content: '\\E547';\n}\n.t-icon-moon-fall-filled:before {\n  content: '\\E548';\n}\n.t-icon-moon-fall:before {\n  content: '\\E549';\n}\n.t-icon-moon-filled:before {\n  content: '\\E54A';\n}\n.t-icon-moon-rising-filled:before {\n  content: '\\E54B';\n}\n.t-icon-moon-rising:before {\n  content: '\\E54C';\n}\n.t-icon-moon:before {\n  content: '\\E54D';\n}\n.t-icon-more:before {\n  content: '\\E54E';\n}\n.t-icon-mosque-1-filled:before {\n  content: '\\E54F';\n}\n.t-icon-mosque-1:before {\n  content: '\\E550';\n}\n.t-icon-mosque-filled:before {\n  content: '\\E551';\n}\n.t-icon-mosque:before {\n  content: '\\E552';\n}\n.t-icon-mouse-filled:before {\n  content: '\\E553';\n}\n.t-icon-mouse:before {\n  content: '\\E554';\n}\n.t-icon-move-1:before {\n  content: '\\E555';\n}\n.t-icon-move:before {\n  content: '\\E556';\n}\n.t-icon-movie-clapper-filled:before {\n  content: '\\E557';\n}\n.t-icon-movie-clapper:before {\n  content: '\\E558';\n}\n.t-icon-multiply:before {\n  content: '\\E559';\n}\n.t-icon-museum-1-filled:before {\n  content: '\\E55A';\n}\n.t-icon-museum-1:before {\n  content: '\\E55B';\n}\n.t-icon-museum-2-filled:before {\n  content: '\\E55C';\n}\n.t-icon-museum-2:before {\n  content: '\\E55D';\n}\n.t-icon-museum-filled:before {\n  content: '\\E55E';\n}\n.t-icon-museum:before {\n  content: '\\E55F';\n}\n.t-icon-mushroom-1-filled:before {\n  content: '\\E560';\n}\n.t-icon-mushroom-1:before {\n  content: '\\E561';\n}\n.t-icon-mushroom-filled:before {\n  content: '\\E562';\n}\n.t-icon-mushroom:before {\n  content: '\\E563';\n}\n.t-icon-music-1-filled:before {\n  content: '\\E564';\n}\n.t-icon-music-1:before {\n  content: '\\E565';\n}\n.t-icon-music-2-filled:before {\n  content: '\\E566';\n}\n.t-icon-music-2:before {\n  content: '\\E567';\n}\n.t-icon-music-filled:before {\n  content: '\\E568';\n}\n.t-icon-music-rectangle-add-filled:before {\n  content: '\\E569';\n}\n.t-icon-music-rectangle-add:before {\n  content: '\\E56A';\n}\n.t-icon-music:before {\n  content: '\\E56B';\n}\n.t-icon-navigation-arrow-filled:before {\n  content: '\\E56C';\n}\n.t-icon-navigation-arrow:before {\n  content: '\\E56D';\n}\n.t-icon-next-filled:before {\n  content: '\\E56E';\n}\n.t-icon-next:before {\n  content: '\\E56F';\n}\n.t-icon-no-expression-filled:before {\n  content: '\\E570';\n}\n.t-icon-no-expression:before {\n  content: '\\E571';\n}\n.t-icon-noodle-filled:before {\n  content: '\\E572';\n}\n.t-icon-noodle:before {\n  content: '\\E573';\n}\n.t-icon-notification-add-filled:before {\n  content: '\\E574';\n}\n.t-icon-notification-add:before {\n  content: '\\E575';\n}\n.t-icon-notification-circle-filled:before {\n  content: '\\E576';\n}\n.t-icon-notification-circle:before {\n  content: '\\E577';\n}\n.t-icon-notification-error-filled:before {\n  content: '\\E578';\n}\n.t-icon-notification-error:before {\n  content: '\\E579';\n}\n.t-icon-notification-filled:before {\n  content: '\\E57A';\n}\n.t-icon-notification:before {\n  content: '\\E57B';\n}\n.t-icon-numbers-0-1:before {\n  content: '\\E57C';\n}\n.t-icon-numbers-0:before {\n  content: '\\E57D';\n}\n.t-icon-numbers-1-1:before {\n  content: '\\E57E';\n}\n.t-icon-numbers-1:before {\n  content: '\\E57F';\n}\n.t-icon-numbers-2-1:before {\n  content: '\\E580';\n}\n.t-icon-numbers-2:before {\n  content: '\\E581';\n}\n.t-icon-numbers-3-1:before {\n  content: '\\E582';\n}\n.t-icon-numbers-3:before {\n  content: '\\E583';\n}\n.t-icon-numbers-4-1:before {\n  content: '\\E584';\n}\n.t-icon-numbers-4:before {\n  content: '\\E585';\n}\n.t-icon-numbers-5-1:before {\n  content: '\\E586';\n}\n.t-icon-numbers-5:before {\n  content: '\\E587';\n}\n.t-icon-numbers-6-1:before {\n  content: '\\E588';\n}\n.t-icon-numbers-6:before {\n  content: '\\E589';\n}\n.t-icon-numbers-7-1:before {\n  content: '\\E58A';\n}\n.t-icon-numbers-7:before {\n  content: '\\E58B';\n}\n.t-icon-numbers-8-1:before {\n  content: '\\E58C';\n}\n.t-icon-numbers-8:before {\n  content: '\\E58D';\n}\n.t-icon-numbers-9-1:before {\n  content: '\\E58E';\n}\n.t-icon-numbers-9:before {\n  content: '\\E58F';\n}\n.t-icon-nut-filled:before {\n  content: '\\E590';\n}\n.t-icon-nut:before {\n  content: '\\E591';\n}\n.t-icon-object-storage:before {\n  content: '\\E592';\n}\n.t-icon-open-mouth-filled:before {\n  content: '\\E593';\n}\n.t-icon-open-mouth:before {\n  content: '\\E594';\n}\n.t-icon-opera-filled:before {\n  content: '\\E595';\n}\n.t-icon-opera:before {\n  content: '\\E596';\n}\n.t-icon-order-adjustment-column:before {\n  content: '\\E597';\n}\n.t-icon-order-ascending:before {\n  content: '\\E598';\n}\n.t-icon-order-descending:before {\n  content: '\\E599';\n}\n.t-icon-outbox-filled:before {\n  content: '\\E59A';\n}\n.t-icon-outbox:before {\n  content: '\\E59B';\n}\n.t-icon-page-first:before {\n  content: '\\E59C';\n}\n.t-icon-page-head-filled:before {\n  content: '\\E59D';\n}\n.t-icon-page-head:before {\n  content: '\\E59E';\n}\n.t-icon-page-last:before {\n  content: '\\E59F';\n}\n.t-icon-palace-1-filled:before {\n  content: '\\E5A0';\n}\n.t-icon-palace-1:before {\n  content: '\\E5A1';\n}\n.t-icon-palace-2-filled:before {\n  content: '\\E5A2';\n}\n.t-icon-palace-2:before {\n  content: '\\E5A3';\n}\n.t-icon-palace-3-filled:before {\n  content: '\\E5A4';\n}\n.t-icon-palace-3:before {\n  content: '\\E5A5';\n}\n.t-icon-palace-4-filled:before {\n  content: '\\E5A6';\n}\n.t-icon-palace-4:before {\n  content: '\\E5A7';\n}\n.t-icon-palace-filled:before {\n  content: '\\E5A8';\n}\n.t-icon-palace:before {\n  content: '\\E5A9';\n}\n.t-icon-palette-1-filled:before {\n  content: '\\E5AA';\n}\n.t-icon-palette-1:before {\n  content: '\\E5AB';\n}\n.t-icon-palette-filled:before {\n  content: '\\E5AC';\n}\n.t-icon-palette:before {\n  content: '\\E5AD';\n}\n.t-icon-panorama-horizontal-filled:before {\n  content: '\\E5AE';\n}\n.t-icon-panorama-horizontal:before {\n  content: '\\E5AF';\n}\n.t-icon-panorama-vertical-filled:before {\n  content: '\\E5B0';\n}\n.t-icon-panorama-vertical:before {\n  content: '\\E5B1';\n}\n.t-icon-pantone-filled:before {\n  content: '\\E5B2';\n}\n.t-icon-pantone:before {\n  content: '\\E5B3';\n}\n.t-icon-parabola:before {\n  content: '\\E5B4';\n}\n.t-icon-parentheses:before {\n  content: '\\E5B5';\n}\n.t-icon-paste-filled:before {\n  content: '\\E5B6';\n}\n.t-icon-paste:before {\n  content: '\\E5B7';\n}\n.t-icon-patio-filled:before {\n  content: '\\E5B8';\n}\n.t-icon-patio:before {\n  content: '\\E5B9';\n}\n.t-icon-pause-circle-filled:before {\n  content: '\\E5BA';\n}\n.t-icon-pause-circle-stroke-filled:before {\n  content: '\\E5BB';\n}\n.t-icon-pause-circle-stroke:before {\n  content: '\\E5BC';\n}\n.t-icon-pause-circle:before {\n  content: '\\E5BD';\n}\n.t-icon-pause:before {\n  content: '\\E5BE';\n}\n.t-icon-pea-filled:before {\n  content: '\\E5BF';\n}\n.t-icon-pea:before {\n  content: '\\E5C0';\n}\n.t-icon-peach-filled:before {\n  content: '\\E5C1';\n}\n.t-icon-peach:before {\n  content: '\\E5C2';\n}\n.t-icon-pear-filled:before {\n  content: '\\E5C3';\n}\n.t-icon-pear:before {\n  content: '\\E5C4';\n}\n.t-icon-pearl-of-the-orient-filled:before {\n  content: '\\E5C5';\n}\n.t-icon-pearl-of-the-orient:before {\n  content: '\\E5C6';\n}\n.t-icon-pen-ball-filled:before {\n  content: '\\E5C7';\n}\n.t-icon-pen-ball:before {\n  content: '\\E5C8';\n}\n.t-icon-pen-brush-filled:before {\n  content: '\\E5C9';\n}\n.t-icon-pen-brush:before {\n  content: '\\E5CA';\n}\n.t-icon-pen-filled:before {\n  content: '\\E5CB';\n}\n.t-icon-pen-mark-filled:before {\n  content: '\\E5CC';\n}\n.t-icon-pen-mark:before {\n  content: '\\E5CD';\n}\n.t-icon-pen-quill-filled:before {\n  content: '\\E5CE';\n}\n.t-icon-pen-quill:before {\n  content: '\\E5CF';\n}\n.t-icon-pen:before {\n  content: '\\E5D0';\n}\n.t-icon-pending-filled:before {\n  content: '\\E5D1';\n}\n.t-icon-pending:before {\n  content: '\\E5D2';\n}\n.t-icon-percent:before {\n  content: '\\E5D3';\n}\n.t-icon-personal-information-filled:before {\n  content: '\\E5D4';\n}\n.t-icon-personal-information:before {\n  content: '\\E5D5';\n}\n.t-icon-phone-locked-filled:before {\n  content: '\\E5D6';\n}\n.t-icon-phone-locked:before {\n  content: '\\E5D7';\n}\n.t-icon-phone-search-filled:before {\n  content: '\\E5D8';\n}\n.t-icon-phone-search:before {\n  content: '\\E5D9';\n}\n.t-icon-pi:before {\n  content: '\\E5DA';\n}\n.t-icon-piano-filled:before {\n  content: '\\E5DB';\n}\n.t-icon-piano:before {\n  content: '\\E5DC';\n}\n.t-icon-pin-filled:before {\n  content: '\\E5DD';\n}\n.t-icon-pin:before {\n  content: '\\E5DE';\n}\n.t-icon-play-circle-filled:before {\n  content: '\\E5DF';\n}\n.t-icon-play-circle-stroke-add-filled:before {\n  content: '\\E5E0';\n}\n.t-icon-play-circle-stroke-add:before {\n  content: '\\E5E1';\n}\n.t-icon-play-circle-stroke-filled:before {\n  content: '\\E5E2';\n}\n.t-icon-play-circle-stroke:before {\n  content: '\\E5E3';\n}\n.t-icon-play-circle:before {\n  content: '\\E5E4';\n}\n.t-icon-play-demo-filled:before {\n  content: '\\E5E5';\n}\n.t-icon-play-demo:before {\n  content: '\\E5E6';\n}\n.t-icon-play-rectangle-filled:before {\n  content: '\\E5E7';\n}\n.t-icon-play-rectangle:before {\n  content: '\\E5E8';\n}\n.t-icon-play:before {\n  content: '\\E5E9';\n}\n.t-icon-plus:before {\n  content: '\\E5EA';\n}\n.t-icon-popsicle-filled:before {\n  content: '\\E5EB';\n}\n.t-icon-popsicle:before {\n  content: '\\E5EC';\n}\n.t-icon-portrait-filled:before {\n  content: '\\E5ED';\n}\n.t-icon-portrait:before {\n  content: '\\E5EE';\n}\n.t-icon-pout-filled:before {\n  content: '\\E5EF';\n}\n.t-icon-pout:before {\n  content: '\\E5F0';\n}\n.t-icon-poweroff:before {\n  content: '\\E5F1';\n}\n.t-icon-precise-monitor:before {\n  content: '\\E5F2';\n}\n.t-icon-previous-filled:before {\n  content: '\\E5F3';\n}\n.t-icon-previous:before {\n  content: '\\E5F4';\n}\n.t-icon-print-filled:before {\n  content: '\\E5F5';\n}\n.t-icon-print:before {\n  content: '\\E5F6';\n}\n.t-icon-pumpkin-filled:before {\n  content: '\\E5F7';\n}\n.t-icon-pumpkin:before {\n  content: '\\E5F8';\n}\n.t-icon-pyramid-filled:before {\n  content: '\\E5F9';\n}\n.t-icon-pyramid-maya-filled:before {\n  content: '\\E5FA';\n}\n.t-icon-pyramid-maya:before {\n  content: '\\E5FB';\n}\n.t-icon-pyramid:before {\n  content: '\\E5FC';\n}\n.t-icon-qrcode:before {\n  content: '\\E5FD';\n}\n.t-icon-quadratic:before {\n  content: '\\E5FE';\n}\n.t-icon-questionnaire-double-filled:before {\n  content: '\\E5FF';\n}\n.t-icon-questionnaire-double:before {\n  content: '\\E600';\n}\n.t-icon-questionnaire-filled:before {\n  content: '\\E601';\n}\n.t-icon-questionnaire:before {\n  content: '\\E602';\n}\n.t-icon-queue-filled:before {\n  content: '\\E603';\n}\n.t-icon-queue:before {\n  content: '\\E604';\n}\n.t-icon-radar:before {\n  content: '\\E605';\n}\n.t-icon-radio-1-filled:before {\n  content: '\\E606';\n}\n.t-icon-radio-1:before {\n  content: '\\E607';\n}\n.t-icon-radio-2-filled:before {\n  content: '\\E608';\n}\n.t-icon-radio-2:before {\n  content: '\\E609';\n}\n.t-icon-radish-filled:before {\n  content: '\\E60A';\n}\n.t-icon-radish:before {\n  content: '\\E60B';\n}\n.t-icon-rain-heavy:before {\n  content: '\\E60C';\n}\n.t-icon-rain-light-filled:before {\n  content: '\\E60D';\n}\n.t-icon-rain-light:before {\n  content: '\\E60E';\n}\n.t-icon-rain-medium:before {\n  content: '\\E60F';\n}\n.t-icon-rainbow:before {\n  content: '\\E610';\n}\n.t-icon-rectangle-filled:before {\n  content: '\\E611';\n}\n.t-icon-rectangle:before {\n  content: '\\E612';\n}\n.t-icon-refresh:before {\n  content: '\\E613';\n}\n.t-icon-relation:before {\n  content: '\\E614';\n}\n.t-icon-relativity-filled:before {\n  content: '\\E615';\n}\n.t-icon-relativity:before {\n  content: '\\E616';\n}\n.t-icon-remote-wave-filled:before {\n  content: '\\E617';\n}\n.t-icon-remote-wave:before {\n  content: '\\E618';\n}\n.t-icon-remove:before {\n  content: '\\E619';\n}\n.t-icon-replay-filled:before {\n  content: '\\E61A';\n}\n.t-icon-replay:before {\n  content: '\\E61B';\n}\n.t-icon-rice-ball-filled:before {\n  content: '\\E61C';\n}\n.t-icon-rice-ball:before {\n  content: '\\E61D';\n}\n.t-icon-rice-filled:before {\n  content: '\\E61E';\n}\n.t-icon-rice:before {\n  content: '\\E61F';\n}\n.t-icon-roast-filled:before {\n  content: '\\E620';\n}\n.t-icon-roast:before {\n  content: '\\E621';\n}\n.t-icon-rocket-filled:before {\n  content: '\\E622';\n}\n.t-icon-rocket:before {\n  content: '\\E623';\n}\n.t-icon-rollback:before {\n  content: '\\E624';\n}\n.t-icon-rollfront:before {\n  content: '\\E625';\n}\n.t-icon-root-list-filled:before {\n  content: '\\E626';\n}\n.t-icon-root-list:before {\n  content: '\\E627';\n}\n.t-icon-rotate-locked-filled:before {\n  content: '\\E628';\n}\n.t-icon-rotate-locked:before {\n  content: '\\E629';\n}\n.t-icon-rotate:before {\n  content: '\\E62A';\n}\n.t-icon-rotation:before {\n  content: '\\E62B';\n}\n.t-icon-round-filled:before {\n  content: '\\E62C';\n}\n.t-icon-round:before {\n  content: '\\E62D';\n}\n.t-icon-router-wave-filled:before {\n  content: '\\E62E';\n}\n.t-icon-router-wave:before {\n  content: '\\E62F';\n}\n.t-icon-rss:before {\n  content: '\\E630';\n}\n.t-icon-ruler-filled:before {\n  content: '\\E631';\n}\n.t-icon-ruler:before {\n  content: '\\E632';\n}\n.t-icon-sailing-hotel-filled:before {\n  content: '\\E633';\n}\n.t-icon-sailing-hotel:before {\n  content: '\\E634';\n}\n.t-icon-sandwich-filled:before {\n  content: '\\E635';\n}\n.t-icon-sandwich:before {\n  content: '\\E636';\n}\n.t-icon-saturation-filled:before {\n  content: '\\E637';\n}\n.t-icon-saturation:before {\n  content: '\\E638';\n}\n.t-icon-sausage-filled:before {\n  content: '\\E639';\n}\n.t-icon-sausage:before {\n  content: '\\E63A';\n}\n.t-icon-save-filled:before {\n  content: '\\E63B';\n}\n.t-icon-save:before {\n  content: '\\E63C';\n}\n.t-icon-saving-pot-filled:before {\n  content: '\\E63D';\n}\n.t-icon-saving-pot:before {\n  content: '\\E63E';\n}\n.t-icon-scan:before {\n  content: '\\E63F';\n}\n.t-icon-screen-4k-filled:before {\n  content: '\\E640';\n}\n.t-icon-screen-4k:before {\n  content: '\\E641';\n}\n.t-icon-screencast-filled:before {\n  content: '\\E642';\n}\n.t-icon-screencast:before {\n  content: '\\E643';\n}\n.t-icon-screenshot:before {\n  content: '\\E644';\n}\n.t-icon-scroll-bar-filled:before {\n  content: '\\E645';\n}\n.t-icon-scroll-bar:before {\n  content: '\\E646';\n}\n.t-icon-sd-card-1-filled:before {\n  content: '\\E647';\n}\n.t-icon-sd-card-1:before {\n  content: '\\E648';\n}\n.t-icon-sd-card-filled:before {\n  content: '\\E649';\n}\n.t-icon-sd-card:before {\n  content: '\\E64A';\n}\n.t-icon-search-error-filled:before {\n  content: '\\E64B';\n}\n.t-icon-search-error:before {\n  content: '\\E64C';\n}\n.t-icon-search-filled:before {\n  content: '\\E64D';\n}\n.t-icon-search:before {\n  content: '\\E64E';\n}\n.t-icon-secured-filled:before {\n  content: '\\E64F';\n}\n.t-icon-secured:before {\n  content: '\\E650';\n}\n.t-icon-send-cancel-filled:before {\n  content: '\\E651';\n}\n.t-icon-send-cancel:before {\n  content: '\\E652';\n}\n.t-icon-send-filled:before {\n  content: '\\E653';\n}\n.t-icon-send:before {\n  content: '\\E654';\n}\n.t-icon-sensors-1:before {\n  content: '\\E655';\n}\n.t-icon-sensors-2:before {\n  content: '\\E656';\n}\n.t-icon-sensors-off:before {\n  content: '\\E657';\n}\n.t-icon-sensors:before {\n  content: '\\E658';\n}\n.t-icon-sequence-filled:before {\n  content: '\\E659';\n}\n.t-icon-sequence:before {\n  content: '\\E65A';\n}\n.t-icon-serenity-filled:before {\n  content: '\\E65B';\n}\n.t-icon-serenity:before {\n  content: '\\E65C';\n}\n.t-icon-server-filled:before {\n  content: '\\E65D';\n}\n.t-icon-server:before {\n  content: '\\E65E';\n}\n.t-icon-service-filled:before {\n  content: '\\E65F';\n}\n.t-icon-service:before {\n  content: '\\E660';\n}\n.t-icon-setting-1-filled:before {\n  content: '\\E661';\n}\n.t-icon-setting-1:before {\n  content: '\\E662';\n}\n.t-icon-setting-filled:before {\n  content: '\\E663';\n}\n.t-icon-setting:before {\n  content: '\\E664';\n}\n.t-icon-share-1-filled:before {\n  content: '\\E665';\n}\n.t-icon-share-1:before {\n  content: '\\E666';\n}\n.t-icon-share-filled:before {\n  content: '\\E667';\n}\n.t-icon-share:before {\n  content: '\\E668';\n}\n.t-icon-sharpness-filled:before {\n  content: '\\E669';\n}\n.t-icon-sharpness:before {\n  content: '\\E66A';\n}\n.t-icon-shield-error-filled:before {\n  content: '\\E66B';\n}\n.t-icon-shield-error:before {\n  content: '\\E66C';\n}\n.t-icon-shimen-filled:before {\n  content: '\\E66D';\n}\n.t-icon-shimen:before {\n  content: '\\E66E';\n}\n.t-icon-shop-1-filled:before {\n  content: '\\E66F';\n}\n.t-icon-shop-1:before {\n  content: '\\E670';\n}\n.t-icon-shop-2-filled:before {\n  content: '\\E671';\n}\n.t-icon-shop-2:before {\n  content: '\\E672';\n}\n.t-icon-shop-3-filled:before {\n  content: '\\E673';\n}\n.t-icon-shop-3:before {\n  content: '\\E674';\n}\n.t-icon-shop-4-filled:before {\n  content: '\\E675';\n}\n.t-icon-shop-4:before {\n  content: '\\E676';\n}\n.t-icon-shop-5-filled:before {\n  content: '\\E677';\n}\n.t-icon-shop-5:before {\n  content: '\\E678';\n}\n.t-icon-shop-filled:before {\n  content: '\\E679';\n}\n.t-icon-shop:before {\n  content: '\\E67A';\n}\n.t-icon-shrimp-filled:before {\n  content: '\\E67B';\n}\n.t-icon-shrimp:before {\n  content: '\\E67C';\n}\n.t-icon-shrink-horizontal:before {\n  content: '\\E67D';\n}\n.t-icon-shrink-vertical:before {\n  content: '\\E67E';\n}\n.t-icon-shutter-filled:before {\n  content: '\\E67F';\n}\n.t-icon-shutter:before {\n  content: '\\E680';\n}\n.t-icon-shutup-filled:before {\n  content: '\\E681';\n}\n.t-icon-shutup:before {\n  content: '\\E682';\n}\n.t-icon-sim-card-1-filled:before {\n  content: '\\E683';\n}\n.t-icon-sim-card-1:before {\n  content: '\\E684';\n}\n.t-icon-sim-card-2-filled:before {\n  content: '\\E685';\n}\n.t-icon-sim-card-2:before {\n  content: '\\E686';\n}\n.t-icon-sim-card-filled:before {\n  content: '\\E687';\n}\n.t-icon-sim-card:before {\n  content: '\\E688';\n}\n.t-icon-sinister-smile-filled:before {\n  content: '\\E689';\n}\n.t-icon-sinister-smile:before {\n  content: '\\E68A';\n}\n.t-icon-sip-filled:before {\n  content: '\\E68B';\n}\n.t-icon-sip:before {\n  content: '\\E68C';\n}\n.t-icon-sitemap-filled:before {\n  content: '\\E68D';\n}\n.t-icon-sitemap:before {\n  content: '\\E68E';\n}\n.t-icon-slash:before {\n  content: '\\E68F';\n}\n.t-icon-sleep-filled:before {\n  content: '\\E690';\n}\n.t-icon-sleep:before {\n  content: '\\E691';\n}\n.t-icon-slice-filled:before {\n  content: '\\E692';\n}\n.t-icon-slice:before {\n  content: '\\E693';\n}\n.t-icon-slideshow-filled:before {\n  content: '\\E694';\n}\n.t-icon-slideshow:before {\n  content: '\\E695';\n}\n.t-icon-smile-filled:before {\n  content: '\\E696';\n}\n.t-icon-smile:before {\n  content: '\\E697';\n}\n.t-icon-sneer-filled:before {\n  content: '\\E698';\n}\n.t-icon-sneer:before {\n  content: '\\E699';\n}\n.t-icon-snowflake:before {\n  content: '\\E69A';\n}\n.t-icon-sonic:before {\n  content: '\\E69B';\n}\n.t-icon-sound-down-filled:before {\n  content: '\\E69C';\n}\n.t-icon-sound-down:before {\n  content: '\\E69D';\n}\n.t-icon-sound-filled:before {\n  content: '\\E69E';\n}\n.t-icon-sound-high-filled:before {\n  content: '\\E69F';\n}\n.t-icon-sound-high:before {\n  content: '\\E6A0';\n}\n.t-icon-sound-low-filled:before {\n  content: '\\E6A1';\n}\n.t-icon-sound-low:before {\n  content: '\\E6A2';\n}\n.t-icon-sound-mute-1-filled:before {\n  content: '\\E6A3';\n}\n.t-icon-sound-mute-1:before {\n  content: '\\E6A4';\n}\n.t-icon-sound-mute-filled:before {\n  content: '\\E6A5';\n}\n.t-icon-sound-mute:before {\n  content: '\\E6A6';\n}\n.t-icon-sound-up-filled:before {\n  content: '\\E6A7';\n}\n.t-icon-sound-up:before {\n  content: '\\E6A8';\n}\n.t-icon-sound:before {\n  content: '\\E6A9';\n}\n.t-icon-space:before {\n  content: '\\E6AA';\n}\n.t-icon-speechless-1-filled:before {\n  content: '\\E6AB';\n}\n.t-icon-speechless-1:before {\n  content: '\\E6AC';\n}\n.t-icon-speechless-filled:before {\n  content: '\\E6AD';\n}\n.t-icon-speechless:before {\n  content: '\\E6AE';\n}\n.t-icon-star-filled:before {\n  content: '\\E6AF';\n}\n.t-icon-star:before {\n  content: '\\E6B0';\n}\n.t-icon-statue-of-jesus-filled:before {\n  content: '\\E6B1';\n}\n.t-icon-statue-of-jesus:before {\n  content: '\\E6B2';\n}\n.t-icon-sticky-note-filled:before {\n  content: '\\E6B3';\n}\n.t-icon-sticky-note:before {\n  content: '\\E6B4';\n}\n.t-icon-stop-circle-filled:before {\n  content: '\\E6B5';\n}\n.t-icon-stop-circle-stroke-filled:before {\n  content: '\\E6B6';\n}\n.t-icon-stop-circle-stroke:before {\n  content: '\\E6B7';\n}\n.t-icon-stop-circle:before {\n  content: '\\E6B8';\n}\n.t-icon-stop:before {\n  content: '\\E6B9';\n}\n.t-icon-store-filled:before {\n  content: '\\E6BA';\n}\n.t-icon-store:before {\n  content: '\\E6BB';\n}\n.t-icon-street-road-1-filled:before {\n  content: '\\E6BC';\n}\n.t-icon-street-road-1:before {\n  content: '\\E6BD';\n}\n.t-icon-street-road-filled:before {\n  content: '\\E6BE';\n}\n.t-icon-street-road:before {\n  content: '\\E6BF';\n}\n.t-icon-subtitle-filled:before {\n  content: '\\E6C0';\n}\n.t-icon-subtitle:before {\n  content: '\\E6C1';\n}\n.t-icon-subway-line-filled:before {\n  content: '\\E6C2';\n}\n.t-icon-subway-line:before {\n  content: '\\E6C3';\n}\n.t-icon-sum:before {\n  content: '\\E6C4';\n}\n.t-icon-sun-fall-filled:before {\n  content: '\\E6C5';\n}\n.t-icon-sun-fall:before {\n  content: '\\E6C6';\n}\n.t-icon-sun-rising-filled:before {\n  content: '\\E6C7';\n}\n.t-icon-sun-rising:before {\n  content: '\\E6C8';\n}\n.t-icon-sunny-filled:before {\n  content: '\\E6C9';\n}\n.t-icon-sunny:before {\n  content: '\\E6CA';\n}\n.t-icon-support-filled:before {\n  content: '\\E6CB';\n}\n.t-icon-support:before {\n  content: '\\E6CC';\n}\n.t-icon-surprised-1-filled:before {\n  content: '\\E6CD';\n}\n.t-icon-surprised-1:before {\n  content: '\\E6CE';\n}\n.t-icon-surprised-filled:before {\n  content: '\\E6CF';\n}\n.t-icon-surprised:before {\n  content: '\\E6D0';\n}\n.t-icon-swap-left:before {\n  content: '\\E6D1';\n}\n.t-icon-swap-right:before {\n  content: '\\E6D2';\n}\n.t-icon-swap:before {\n  content: '\\E6D3';\n}\n.t-icon-swear-1-filled:before {\n  content: '\\E6D4';\n}\n.t-icon-swear-1:before {\n  content: '\\E6D5';\n}\n.t-icon-swear-2-filled:before {\n  content: '\\E6D6';\n}\n.t-icon-swear-2:before {\n  content: '\\E6D7';\n}\n.t-icon-system-2:before {\n  content: '\\E6D8';\n}\n.t-icon-system-3-filled:before {\n  content: '\\E6D9';\n}\n.t-icon-system-3:before {\n  content: '\\E6DA';\n}\n.t-icon-system-application-filled:before {\n  content: '\\E6DB';\n}\n.t-icon-system-application:before {\n  content: '\\E6DC';\n}\n.t-icon-system-blocked-filled:before {\n  content: '\\E6DD';\n}\n.t-icon-system-blocked:before {\n  content: '\\E6DE';\n}\n.t-icon-system-code-filled:before {\n  content: '\\E6DF';\n}\n.t-icon-system-code:before {\n  content: '\\E6E0';\n}\n.t-icon-system-components-filled:before {\n  content: '\\E6E1';\n}\n.t-icon-system-components:before {\n  content: '\\E6E2';\n}\n.t-icon-system-coordinate-filled:before {\n  content: '\\E6E3';\n}\n.t-icon-system-coordinate:before {\n  content: '\\E6E4';\n}\n.t-icon-system-device-filled:before {\n  content: '\\E6E5';\n}\n.t-icon-system-device:before {\n  content: '\\E6E6';\n}\n.t-icon-system-interface-filled:before {\n  content: '\\E6E7';\n}\n.t-icon-system-interface:before {\n  content: '\\E6E8';\n}\n.t-icon-system-location-filled:before {\n  content: '\\E6E9';\n}\n.t-icon-system-location:before {\n  content: '\\E6EA';\n}\n.t-icon-system-locked-filled:before {\n  content: '\\E6EB';\n}\n.t-icon-system-locked:before {\n  content: '\\E6EC';\n}\n.t-icon-system-log-filled:before {\n  content: '\\E6ED';\n}\n.t-icon-system-log:before {\n  content: '\\E6EE';\n}\n.t-icon-system-marked-filled:before {\n  content: '\\E6EF';\n}\n.t-icon-system-marked:before {\n  content: '\\E6F0';\n}\n.t-icon-system-messages-filled:before {\n  content: '\\E6F1';\n}\n.t-icon-system-messages:before {\n  content: '\\E6F2';\n}\n.t-icon-system-regulation-filled:before {\n  content: '\\E6F3';\n}\n.t-icon-system-regulation:before {\n  content: '\\E6F4';\n}\n.t-icon-system-search-filled:before {\n  content: '\\E6F5';\n}\n.t-icon-system-search:before {\n  content: '\\E6F6';\n}\n.t-icon-system-setting-filled:before {\n  content: '\\E6F7';\n}\n.t-icon-system-setting:before {\n  content: '\\E6F8';\n}\n.t-icon-system-storage-filled:before {\n  content: '\\E6F9';\n}\n.t-icon-system-storage:before {\n  content: '\\E6FA';\n}\n.t-icon-system-sum:before {\n  content: '\\E6FB';\n}\n.t-icon-system-unlocked-filled:before {\n  content: '\\E6FC';\n}\n.t-icon-system-unlocked:before {\n  content: '\\E6FD';\n}\n.t-icon-tab-filled:before {\n  content: '\\E6FE';\n}\n.t-icon-tab:before {\n  content: '\\E6FF';\n}\n.t-icon-table-1-filled:before {\n  content: '\\E700';\n}\n.t-icon-table-1:before {\n  content: '\\E701';\n}\n.t-icon-table-2-filled:before {\n  content: '\\E702';\n}\n.t-icon-table-2:before {\n  content: '\\E703';\n}\n.t-icon-table-add-filled:before {\n  content: '\\E704';\n}\n.t-icon-table-add:before {\n  content: '\\E705';\n}\n.t-icon-table-filled:before {\n  content: '\\E706';\n}\n.t-icon-table-split-filled:before {\n  content: '\\E707';\n}\n.t-icon-table-split:before {\n  content: '\\E708';\n}\n.t-icon-table:before {\n  content: '\\E709';\n}\n.t-icon-tag-filled:before {\n  content: '\\E70A';\n}\n.t-icon-tag:before {\n  content: '\\E70B';\n}\n.t-icon-tangerinr-filled:before {\n  content: '\\E70C';\n}\n.t-icon-tangerinr:before {\n  content: '\\E70D';\n}\n.t-icon-tape-filled:before {\n  content: '\\E70E';\n}\n.t-icon-tape:before {\n  content: '\\E70F';\n}\n.t-icon-task-1-filled:before {\n  content: '\\E710';\n}\n.t-icon-task-1:before {\n  content: '\\E711';\n}\n.t-icon-task-add-1:before {\n  content: '\\E712';\n}\n.t-icon-task-add-filled:before {\n  content: '\\E713';\n}\n.t-icon-task-add:before {\n  content: '\\E714';\n}\n.t-icon-task-checked-1:before {\n  content: '\\E715';\n}\n.t-icon-task-checked-filled:before {\n  content: '\\E716';\n}\n.t-icon-task-checked:before {\n  content: '\\E717';\n}\n.t-icon-task-double-filled:before {\n  content: '\\E718';\n}\n.t-icon-task-double:before {\n  content: '\\E719';\n}\n.t-icon-task-error-filled:before {\n  content: '\\E71A';\n}\n.t-icon-task-error:before {\n  content: '\\E71B';\n}\n.t-icon-task-filled:before {\n  content: '\\E71C';\n}\n.t-icon-task-location-filled:before {\n  content: '\\E71D';\n}\n.t-icon-task-location:before {\n  content: '\\E71E';\n}\n.t-icon-task-marked-filled:before {\n  content: '\\E71F';\n}\n.t-icon-task-marked:before {\n  content: '\\E720';\n}\n.t-icon-task-setting-filled:before {\n  content: '\\E721';\n}\n.t-icon-task-setting:before {\n  content: '\\E722';\n}\n.t-icon-task-time-filled:before {\n  content: '\\E723';\n}\n.t-icon-task-time:before {\n  content: '\\E724';\n}\n.t-icon-task-visible-filled:before {\n  content: '\\E725';\n}\n.t-icon-task-visible:before {\n  content: '\\E726';\n}\n.t-icon-task:before {\n  content: '\\E727';\n}\n.t-icon-tea-filled:before {\n  content: '\\E728';\n}\n.t-icon-tea:before {\n  content: '\\E729';\n}\n.t-icon-teahouse-filled:before {\n  content: '\\E72A';\n}\n.t-icon-teahouse:before {\n  content: '\\E72B';\n}\n.t-icon-template-filled:before {\n  content: '\\E72C';\n}\n.t-icon-template:before {\n  content: '\\E72D';\n}\n.t-icon-temple-filled:before {\n  content: '\\E72E';\n}\n.t-icon-temple:before {\n  content: '\\E72F';\n}\n.t-icon-terminal-rectangle-1-filled:before {\n  content: '\\E730';\n}\n.t-icon-terminal-rectangle-1:before {\n  content: '\\E731';\n}\n.t-icon-terminal-rectangle-filled:before {\n  content: '\\E732';\n}\n.t-icon-terminal-rectangle:before {\n  content: '\\E733';\n}\n.t-icon-terminal-window-filled:before {\n  content: '\\E734';\n}\n.t-icon-terminal-window:before {\n  content: '\\E735';\n}\n.t-icon-terminal:before {\n  content: '\\E736';\n}\n.t-icon-textbox-filled:before {\n  content: '\\E737';\n}\n.t-icon-textbox:before {\n  content: '\\E738';\n}\n.t-icon-textformat-bold:before {\n  content: '\\E739';\n}\n.t-icon-textformat-color:before {\n  content: '\\E73A';\n}\n.t-icon-textformat-italic:before {\n  content: '\\E73B';\n}\n.t-icon-textformat-strikethrough:before {\n  content: '\\E73C';\n}\n.t-icon-textformat-underline:before {\n  content: '\\E73D';\n}\n.t-icon-textformat-wrap:before {\n  content: '\\E73E';\n}\n.t-icon-theaters-filled:before {\n  content: '\\E73F';\n}\n.t-icon-theaters:before {\n  content: '\\E740';\n}\n.t-icon-thumb-down-1-filled:before {\n  content: '\\E741';\n}\n.t-icon-thumb-down-1:before {\n  content: '\\E742';\n}\n.t-icon-thumb-down-2-filled:before {\n  content: '\\E743';\n}\n.t-icon-thumb-down-2:before {\n  content: '\\E744';\n}\n.t-icon-thumb-down-filled:before {\n  content: '\\E745';\n}\n.t-icon-thumb-down:before {\n  content: '\\E746';\n}\n.t-icon-thumb-up-1-filled:before {\n  content: '\\E747';\n}\n.t-icon-thumb-up-1:before {\n  content: '\\E748';\n}\n.t-icon-thumb-up-2-filled:before {\n  content: '\\E749';\n}\n.t-icon-thumb-up-2:before {\n  content: '\\E74A';\n}\n.t-icon-thumb-up-filled:before {\n  content: '\\E74B';\n}\n.t-icon-thumb-up:before {\n  content: '\\E74C';\n}\n.t-icon-thunder:before {\n  content: '\\E74D';\n}\n.t-icon-thunderstorm-night-filled:before {\n  content: '\\E74E';\n}\n.t-icon-thunderstorm-night:before {\n  content: '\\E74F';\n}\n.t-icon-thunderstorm-sunny-filled:before {\n  content: '\\E750';\n}\n.t-icon-thunderstorm-sunny:before {\n  content: '\\E751';\n}\n.t-icon-thunderstorm:before {\n  content: '\\E752';\n}\n.t-icon-ticket-filled:before {\n  content: '\\E753';\n}\n.t-icon-ticket:before {\n  content: '\\E754';\n}\n.t-icon-time-filled:before {\n  content: '\\E755';\n}\n.t-icon-time:before {\n  content: '\\E756';\n}\n.t-icon-tips-double-filled:before {\n  content: '\\E757';\n}\n.t-icon-tips-double:before {\n  content: '\\E758';\n}\n.t-icon-tips-filled:before {\n  content: '\\E759';\n}\n.t-icon-tips:before {\n  content: '\\E75A';\n}\n.t-icon-tomato-filled:before {\n  content: '\\E75B';\n}\n.t-icon-tomato:before {\n  content: '\\E75C';\n}\n.t-icon-tools-circle-filled:before {\n  content: '\\E75D';\n}\n.t-icon-tools-circle:before {\n  content: '\\E75E';\n}\n.t-icon-tools-filled:before {\n  content: '\\E75F';\n}\n.t-icon-tools:before {\n  content: '\\E760';\n}\n.t-icon-tornado:before {\n  content: '\\E761';\n}\n.t-icon-tower-1-filled:before {\n  content: '\\E762';\n}\n.t-icon-tower-1:before {\n  content: '\\E763';\n}\n.t-icon-tower-2-filled:before {\n  content: '\\E764';\n}\n.t-icon-tower-2:before {\n  content: '\\E765';\n}\n.t-icon-tower-3-filled:before {\n  content: '\\E766';\n}\n.t-icon-tower-3:before {\n  content: '\\E767';\n}\n.t-icon-tower-clock-filled:before {\n  content: '\\E768';\n}\n.t-icon-tower-clock:before {\n  content: '\\E769';\n}\n.t-icon-tower-filled:before {\n  content: '\\E76A';\n}\n.t-icon-tower:before {\n  content: '\\E76B';\n}\n.t-icon-town-filled:before {\n  content: '\\E76C';\n}\n.t-icon-town:before {\n  content: '\\E76D';\n}\n.t-icon-traffic-events-filled:before {\n  content: '\\E76E';\n}\n.t-icon-traffic-events:before {\n  content: '\\E76F';\n}\n.t-icon-traffic-filled:before {\n  content: '\\E770';\n}\n.t-icon-traffic:before {\n  content: '\\E771';\n}\n.t-icon-transform-1-filled:before {\n  content: '\\E772';\n}\n.t-icon-transform-1:before {\n  content: '\\E773';\n}\n.t-icon-transform-2:before {\n  content: '\\E774';\n}\n.t-icon-transform-3:before {\n  content: '\\E775';\n}\n.t-icon-transform-filled:before {\n  content: '\\E776';\n}\n.t-icon-transform:before {\n  content: '\\E777';\n}\n.t-icon-translate-1:before {\n  content: '\\E778';\n}\n.t-icon-translate:before {\n  content: '\\E779';\n}\n.t-icon-tree-round-dot-filled:before {\n  content: '\\E77A';\n}\n.t-icon-tree-round-dot-vertical-filled:before {\n  content: '\\E77B';\n}\n.t-icon-tree-round-dot-vertical:before {\n  content: '\\E77C';\n}\n.t-icon-tree-round-dot:before {\n  content: '\\E77D';\n}\n.t-icon-tree-square-dot-filled:before {\n  content: '\\E77E';\n}\n.t-icon-tree-square-dot-vertical-filled:before {\n  content: '\\E77F';\n}\n.t-icon-tree-square-dot-vertical:before {\n  content: '\\E780';\n}\n.t-icon-tree-square-dot:before {\n  content: '\\E781';\n}\n.t-icon-trending-down:before {\n  content: '\\E782';\n}\n.t-icon-trending-up:before {\n  content: '\\E783';\n}\n.t-icon-tv-1-filled:before {\n  content: '\\E784';\n}\n.t-icon-tv-1:before {\n  content: '\\E785';\n}\n.t-icon-tv-2-filled:before {\n  content: '\\E786';\n}\n.t-icon-tv-2:before {\n  content: '\\E787';\n}\n.t-icon-tv-filled:before {\n  content: '\\E788';\n}\n.t-icon-tv:before {\n  content: '\\E789';\n}\n.t-icon-typography-filled:before {\n  content: '\\E78A';\n}\n.t-icon-typography:before {\n  content: '\\E78B';\n}\n.t-icon-uncomfortable-1-filled:before {\n  content: '\\E78C';\n}\n.t-icon-uncomfortable-1:before {\n  content: '\\E78D';\n}\n.t-icon-uncomfortable-2-filled:before {\n  content: '\\E78E';\n}\n.t-icon-uncomfortable-2:before {\n  content: '\\E78F';\n}\n.t-icon-uncomfortable-filled:before {\n  content: '\\E790';\n}\n.t-icon-uncomfortable:before {\n  content: '\\E791';\n}\n.t-icon-undertake-delivery-filled:before {\n  content: '\\E792';\n}\n.t-icon-undertake-delivery:before {\n  content: '\\E793';\n}\n.t-icon-undertake-environment-protection-filled:before {\n  content: '\\E794';\n}\n.t-icon-undertake-environment-protection:before {\n  content: '\\E795';\n}\n.t-icon-undertake-filled:before {\n  content: '\\E796';\n}\n.t-icon-undertake-hold-up-filled:before {\n  content: '\\E797';\n}\n.t-icon-undertake-hold-up:before {\n  content: '\\E798';\n}\n.t-icon-undertake-transaction-filled:before {\n  content: '\\E799';\n}\n.t-icon-undertake-transaction:before {\n  content: '\\E79A';\n}\n.t-icon-undertake:before {\n  content: '\\E79B';\n}\n.t-icon-unfold-less:before {\n  content: '\\E79C';\n}\n.t-icon-unfold-more:before {\n  content: '\\E79D';\n}\n.t-icon-unhappy-1-filled:before {\n  content: '\\E79E';\n}\n.t-icon-unhappy-1:before {\n  content: '\\E79F';\n}\n.t-icon-unhappy-filled:before {\n  content: '\\E7A0';\n}\n.t-icon-unhappy:before {\n  content: '\\E7A1';\n}\n.t-icon-uninstall-filled:before {\n  content: '\\E7A2';\n}\n.t-icon-uninstall:before {\n  content: '\\E7A3';\n}\n.t-icon-upload-1:before {\n  content: '\\E7A4';\n}\n.t-icon-upload:before {\n  content: '\\E7A5';\n}\n.t-icon-upscale:before {\n  content: '\\E7A6';\n}\n.t-icon-usb-filled:before {\n  content: '\\E7A7';\n}\n.t-icon-usb:before {\n  content: '\\E7A8';\n}\n.t-icon-user-1-filled:before {\n  content: '\\E7A9';\n}\n.t-icon-user-1:before {\n  content: '\\E7AA';\n}\n.t-icon-user-add-filled:before {\n  content: '\\E7AB';\n}\n.t-icon-user-add:before {\n  content: '\\E7AC';\n}\n.t-icon-user-arrow-down-filled:before {\n  content: '\\E7AD';\n}\n.t-icon-user-arrow-down:before {\n  content: '\\E7AE';\n}\n.t-icon-user-arrow-left-filled:before {\n  content: '\\E7AF';\n}\n.t-icon-user-arrow-left:before {\n  content: '\\E7B0';\n}\n.t-icon-user-arrow-right-filled:before {\n  content: '\\E7B1';\n}\n.t-icon-user-arrow-right:before {\n  content: '\\E7B2';\n}\n.t-icon-user-arrow-up-filled:before {\n  content: '\\E7B3';\n}\n.t-icon-user-arrow-up:before {\n  content: '\\E7B4';\n}\n.t-icon-user-avatar-filled:before {\n  content: '\\E7B5';\n}\n.t-icon-user-avatar:before {\n  content: '\\E7B6';\n}\n.t-icon-user-blocked-filled:before {\n  content: '\\E7B7';\n}\n.t-icon-user-blocked:before {\n  content: '\\E7B8';\n}\n.t-icon-user-business-filled:before {\n  content: '\\E7B9';\n}\n.t-icon-user-business:before {\n  content: '\\E7BA';\n}\n.t-icon-user-checked-1-filled:before {\n  content: '\\E7BB';\n}\n.t-icon-user-checked-1:before {\n  content: '\\E7BC';\n}\n.t-icon-user-checked-filled:before {\n  content: '\\E7BD';\n}\n.t-icon-user-checked:before {\n  content: '\\E7BE';\n}\n.t-icon-user-circle-filled:before {\n  content: '\\E7BF';\n}\n.t-icon-user-circle:before {\n  content: '\\E7C0';\n}\n.t-icon-user-clear-filled:before {\n  content: '\\E7C1';\n}\n.t-icon-user-clear:before {\n  content: '\\E7C2';\n}\n.t-icon-user-error-1-filled:before {\n  content: '\\E7C3';\n}\n.t-icon-user-error-1:before {\n  content: '\\E7C4';\n}\n.t-icon-user-filled:before {\n  content: '\\E7C5';\n}\n.t-icon-user-invisible-filled:before {\n  content: '\\E7C6';\n}\n.t-icon-user-invisible:before {\n  content: '\\E7C7';\n}\n.t-icon-user-list-filled:before {\n  content: '\\E7C8';\n}\n.t-icon-user-list:before {\n  content: '\\E7C9';\n}\n.t-icon-user-locked-filled:before {\n  content: '\\E7CA';\n}\n.t-icon-user-locked:before {\n  content: '\\E7CB';\n}\n.t-icon-user-marked-filled:before {\n  content: '\\E7CC';\n}\n.t-icon-user-marked:before {\n  content: '\\E7CD';\n}\n.t-icon-user-password-filled:before {\n  content: '\\E7CE';\n}\n.t-icon-user-password:before {\n  content: '\\E7CF';\n}\n.t-icon-user-safety-filled:before {\n  content: '\\E7D0';\n}\n.t-icon-user-safety:before {\n  content: '\\E7D1';\n}\n.t-icon-user-search-filled:before {\n  content: '\\E7D2';\n}\n.t-icon-user-search:before {\n  content: '\\E7D3';\n}\n.t-icon-user-setting-filled:before {\n  content: '\\E7D4';\n}\n.t-icon-user-setting:before {\n  content: '\\E7D5';\n}\n.t-icon-user-talk-1-filled:before {\n  content: '\\E7D6';\n}\n.t-icon-user-talk-1:before {\n  content: '\\E7D7';\n}\n.t-icon-user-talk-filled:before {\n  content: '\\E7D8';\n}\n.t-icon-user-talk-off-1-filled:before {\n  content: '\\E7D9';\n}\n.t-icon-user-talk-off-1:before {\n  content: '\\E7DA';\n}\n.t-icon-user-talk:before {\n  content: '\\E7DB';\n}\n.t-icon-user-time-filled:before {\n  content: '\\E7DC';\n}\n.t-icon-user-time:before {\n  content: '\\E7DD';\n}\n.t-icon-user-transmit-filled:before {\n  content: '\\E7DE';\n}\n.t-icon-user-transmit:before {\n  content: '\\E7DF';\n}\n.t-icon-user-unknown-filled:before {\n  content: '\\E7E0';\n}\n.t-icon-user-unknown:before {\n  content: '\\E7E1';\n}\n.t-icon-user-unlocked-filled:before {\n  content: '\\E7E2';\n}\n.t-icon-user-unlocked:before {\n  content: '\\E7E3';\n}\n.t-icon-user-vip-filled:before {\n  content: '\\E7E4';\n}\n.t-icon-user-vip:before {\n  content: '\\E7E5';\n}\n.t-icon-user-visible-filled:before {\n  content: '\\E7E6';\n}\n.t-icon-user-visible:before {\n  content: '\\E7E7';\n}\n.t-icon-user:before {\n  content: '\\E7E8';\n}\n.t-icon-usercase-filled:before {\n  content: '\\E7E9';\n}\n.t-icon-usercase-link-filled:before {\n  content: '\\E7EA';\n}\n.t-icon-usercase-link:before {\n  content: '\\E7EB';\n}\n.t-icon-usercase:before {\n  content: '\\E7EC';\n}\n.t-icon-usergroup-add-filled:before {\n  content: '\\E7ED';\n}\n.t-icon-usergroup-add:before {\n  content: '\\E7EE';\n}\n.t-icon-usergroup-clear-filled:before {\n  content: '\\E7EF';\n}\n.t-icon-usergroup-clear:before {\n  content: '\\E7F0';\n}\n.t-icon-usergroup-filled:before {\n  content: '\\E7F1';\n}\n.t-icon-usergroup:before {\n  content: '\\E7F2';\n}\n.t-icon-vehicle-filled:before {\n  content: '\\E7F3';\n}\n.t-icon-vehicle:before {\n  content: '\\E7F4';\n}\n.t-icon-verified-filled:before {\n  content: '\\E7F5';\n}\n.t-icon-verified:before {\n  content: '\\E7F6';\n}\n.t-icon-verify-filled:before {\n  content: '\\E7F7';\n}\n.t-icon-verify:before {\n  content: '\\E7F8';\n}\n.t-icon-vertical-filled:before {\n  content: '\\E7F9';\n}\n.t-icon-vertical:before {\n  content: '\\E7FA';\n}\n.t-icon-video-camera-1-filled:before {\n  content: '\\E7FB';\n}\n.t-icon-video-camera-1:before {\n  content: '\\E7FC';\n}\n.t-icon-video-camera-2-filled:before {\n  content: '\\E7FD';\n}\n.t-icon-video-camera-2:before {\n  content: '\\E7FE';\n}\n.t-icon-video-camera-3-filled:before {\n  content: '\\E7FF';\n}\n.t-icon-video-camera-3:before {\n  content: '\\E800';\n}\n.t-icon-video-camera-dollar-filled:before {\n  content: '\\E801';\n}\n.t-icon-video-camera-dollar:before {\n  content: '\\E802';\n}\n.t-icon-video-camera-filled:before {\n  content: '\\E803';\n}\n.t-icon-video-camera-minus-filled:before {\n  content: '\\E804';\n}\n.t-icon-video-camera-minus:before {\n  content: '\\E805';\n}\n.t-icon-video-camera-music-filled:before {\n  content: '\\E806';\n}\n.t-icon-video-camera-music:before {\n  content: '\\E807';\n}\n.t-icon-video-camera-off-filled:before {\n  content: '\\E808';\n}\n.t-icon-video-camera-off:before {\n  content: '\\E809';\n}\n.t-icon-video-camera:before {\n  content: '\\E80A';\n}\n.t-icon-video-filled:before {\n  content: '\\E80B';\n}\n.t-icon-video-library-filled:before {\n  content: '\\E80C';\n}\n.t-icon-video-library:before {\n  content: '\\E80D';\n}\n.t-icon-video:before {\n  content: '\\E80E';\n}\n.t-icon-view-agenda-filled:before {\n  content: '\\E80F';\n}\n.t-icon-view-agenda:before {\n  content: '\\E810';\n}\n.t-icon-view-column:before {\n  content: '\\E811';\n}\n.t-icon-view-in-ar-filled:before {\n  content: '\\E812';\n}\n.t-icon-view-in-ar:before {\n  content: '\\E813';\n}\n.t-icon-view-list:before {\n  content: '\\E814';\n}\n.t-icon-view-module-filled:before {\n  content: '\\E815';\n}\n.t-icon-view-module:before {\n  content: '\\E816';\n}\n.t-icon-visual-recognition-filled:before {\n  content: '\\E817';\n}\n.t-icon-visual-recognition:before {\n  content: '\\E818';\n}\n.t-icon-wallet-filled:before {\n  content: '\\E819';\n}\n.t-icon-wallet:before {\n  content: '\\E81A';\n}\n.t-icon-watch-filled:before {\n  content: '\\E81B';\n}\n.t-icon-watch:before {\n  content: '\\E81C';\n}\n.t-icon-watermelon-filled:before {\n  content: '\\E81D';\n}\n.t-icon-watermelon:before {\n  content: '\\E81E';\n}\n.t-icon-wave-bye-filled:before {\n  content: '\\E81F';\n}\n.t-icon-wave-bye:before {\n  content: '\\E820';\n}\n.t-icon-wave-left-filled:before {\n  content: '\\E821';\n}\n.t-icon-wave-left:before {\n  content: '\\E822';\n}\n.t-icon-wave-right-filled:before {\n  content: '\\E823';\n}\n.t-icon-wave-right:before {\n  content: '\\E824';\n}\n.t-icon-wealth-1-filled:before {\n  content: '\\E825';\n}\n.t-icon-wealth-1:before {\n  content: '\\E826';\n}\n.t-icon-wealth-filled:before {\n  content: '\\E827';\n}\n.t-icon-wealth:before {\n  content: '\\E828';\n}\n.t-icon-widget-filled:before {\n  content: '\\E829';\n}\n.t-icon-widget:before {\n  content: '\\E82A';\n}\n.t-icon-wifi-1-filled:before {\n  content: '\\E82B';\n}\n.t-icon-wifi-1:before {\n  content: '\\E82C';\n}\n.t-icon-wifi-off-1-filled:before {\n  content: '\\E82D';\n}\n.t-icon-wifi-off-1:before {\n  content: '\\E82E';\n}\n.t-icon-wifi-off:before {\n  content: '\\E82F';\n}\n.t-icon-wifi:before {\n  content: '\\E830';\n}\n.t-icon-window-1-filled:before {\n  content: '\\E831';\n}\n.t-icon-window-1:before {\n  content: '\\E832';\n}\n.t-icon-window-filled:before {\n  content: '\\E833';\n}\n.t-icon-window:before {\n  content: '\\E834';\n}\n.t-icon-windy-rain:before {\n  content: '\\E835';\n}\n.t-icon-windy:before {\n  content: '\\E836';\n}\n.t-icon-wink-filled:before {\n  content: '\\E837';\n}\n.t-icon-wink:before {\n  content: '\\E838';\n}\n.t-icon-work-filled:before {\n  content: '\\E839';\n}\n.t-icon-work-history-filled:before {\n  content: '\\E83A';\n}\n.t-icon-work-history:before {\n  content: '\\E83B';\n}\n.t-icon-work-off-filled:before {\n  content: '\\E83C';\n}\n.t-icon-work-off:before {\n  content: '\\E83D';\n}\n.t-icon-work:before {\n  content: '\\E83E';\n}\n.t-icon-wry-smile-filled:before {\n  content: '\\E83F';\n}\n.t-icon-wry-smile:before {\n  content: '\\E840';\n}\n.t-icon-zoom-in-filled:before {\n  content: '\\E841';\n}\n.t-icon-zoom-in:before {\n  content: '\\E842';\n}\n.t-icon-zoom-out-filled:before {\n  content: '\\E843';\n}\n.t-icon-zoom-out:before {\n  content: '\\E844';\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/icon/props.d.ts",
    "content": "import { TdIconProps } from './type';\ndeclare const props: TdIconProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/icon/props.js",
    "content": "const props = {\n    color: {\n        type: String,\n        value: '',\n    },\n    name: {\n        type: String,\n        value: '',\n        required: true,\n    },\n    prefix: {\n        type: String,\n        value: '',\n    },\n    size: {\n        type: null,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/icon/type.d.ts",
    "content": "export interface TdIconProps {\n    color?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    name: {\n        type: StringConstructor;\n        value?: string;\n        required?: boolean;\n    };\n    prefix?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    size?: {\n        type: null;\n        value?: string | number;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/icon/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Image Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nerror | String / Slot | 'default' | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nheight | String / Number | - | \\- | N\nlazy | Boolean | false | \\- | N\nloading | String / Slot | 'default' | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmode | String | scaleToFill | options: scaleToFill/aspectFit/aspectFill/widthFix/heightFix/top/bottom/center/left/right/top left/top right/bottom left/bottom right | N\nshape | String | square | options: circle/round/square | N\nshow-menu-by-longpress | Boolean | false | \\- | N\nsrc | String | - | src attribute of `<img>`. image File can also be loaded | N\nt-id | String | - | `1.2.10`。image tag id | N\nwebp | Boolean | false | \\- | N\nwidth | String / Number | - | \\- | N\n\n### Image Events\n\nname | params | description\n-- | -- | --\nerror | - | trigger on image load failed\nload | - | trigger on image loaded\n### Image External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-load | \\-\nt-class-image | \\-\nt-class-error | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description\n-- | -- | --\n--td-image-color | @font-gray-3 | -\n--td-image-loading-bg-color | @bg-color-secondarycontainer | -\n--td-image-loading-color | @font-gray-3 | -\n--td-image-round-radius | @radius-default | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/README.md",
    "content": "---\ntitle: Image 图片\ndescription: 用于展示效果，主要为上下左右居中裁切、拉伸、平铺等方式。\nspline: base\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-100%25-blue\" /></span>\n\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n    \"t-image\": \"tdesign-miniprogram/image/image\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/wP7zUima7kSF\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 裁切样式\n\n{{ base }}\n\n### 加载状态\n\n{{ status }}\n\n## 常见问题\n\n<details>\n  <summary>\n    本地图片无法正确引用?\n    <span class=\"icon\">👇</span>\n  </summary>\n  <p style=\"margin-top: 10px; color: rgba(0, 0, 0, .6)\">\n    建议使用绝对路径，而不是相对路径。绝对路径以 app.json 所在位置为基准。\n  </p>\n</details>\n\n## API\n\n### Image Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nerror | String / Slot | 'default' | 加载失败时显示的内容。值为 `default` 则表示使用默认加载失败风格；值为空或者 `slot` 表示使用插槽渲染，插槽名称为 `error`；值为其他则表示普通文本内容，如“加载失败”。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nheight | String / Number | - | 高度，默认单位为`px` | N\nlazy | Boolean | false | 是否开启图片懒加载 | N\nloading | String / Slot | 'default' | 加载态内容。值为 `default` 则表示使用默认加载中风格；值为其他则表示普通文本内容，如“加载中”。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmode | String | scaleToFill | 图片裁剪、缩放的模式；[小程序官方文档](https://developers.weixin.qq.com/miniprogram/dev/component/image.html)。可选项：scaleToFill/aspectFit/aspectFill/widthFix/heightFix/top/bottom/center/left/right/top left/top right/bottom left/bottom right | N\nshape | String | square | 图片圆角类型。可选项：circle/round/square | N\nshow-menu-by-longpress | Boolean | false | 长按图片显示发送给朋友、收藏、保存图片、搜一搜、打开名片/前往群聊/打开小程序（若图片中包含对应二维码或小程序码）的菜单。 | N\nsrc | String | - | 图片链接 | N\nt-id | String | - | `1.2.10`。图片标签id | N\nwebp | Boolean | false | 默认不解析 webP 格式，只支持网络资源 | N\nwidth | String / Number | - | 宽度，默认单位为`px` | N\n\n### Image Events\n\n名称 | 参数 | 描述\n-- | -- | --\nerror | - | 图片加载失败时触发\nload | - | 图片加载完成时触发\n### Image External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-load | 加载样式类\nt-class-image | 图片样式类\nt-class-error | 加载失败样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述\n-- | -- | --\n--td-image-color | @font-gray-3 | -\n--td-image-loading-bg-color | @bg-color-secondarycontainer | -\n--td-image-loading-color | @font-gray-3 | -\n--td-image-round-radius | @radius-default | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/image-info.json",
    "content": "{\n  \"key\": \"Image\",\n  \"label\": \"图片\",\n  \"icon\": \"\",\n  \"properties\": [\n    {\n      \"key\": \"error\",\n      \"type\": [\"String\", \"TNode\"],\n      \"defaultValue\": \"'default'\",\n      \"desc\": \"加载失败时显示的内容。值为 `default` 则表示使用默认加载失败风格；值为空或者 `slot` 表示使用插槽渲染，插槽名称为 `error`；值为其他则表示普通文本内容，如“加载失败”\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"externalClasses\",\n      \"type\": [\"Array\"],\n      \"defaultValue\": \"\",\n      \"desc\": \"组件类名，分别用于设置加载组件外层元素，中间内容等元素类名\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"lazy\",\n      \"type\": [\"Boolean\"],\n      \"defaultValue\": \"false\",\n      \"desc\": \"是否开启图片懒加载\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"loading\",\n      \"type\": [\"String\", \"TNode\"],\n      \"defaultValue\": \"'default'\",\n      \"desc\": \"加载态内容。值为 `default` 则表示使用默认加载中风格；值为空或者 `slot` 表示使用插槽渲染，插槽名称为 `loading`；值为其他则表示普通文本内容，如“加载中”\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"MP_EXCLUDE_PROPS\",\n      \"type\": [\"String\"],\n      \"defaultValue\": \"\",\n      \"desc\": \"为避免重复或冲突，需要过滤掉的小程序原生属性\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"MP_PROPS\",\n      \"type\": [\"String\"],\n      \"defaultValue\": \"\",\n      \"desc\": \"[小程序原生属性](https://developers.weixin.qq.com/miniprogram/dev/component/image.html)\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"shape\",\n      \"type\": [\"String\"],\n      \"defaultValue\": \"square\",\n      \"desc\": \"图片圆角类型\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"src\",\n      \"type\": [\"String\"],\n      \"defaultValue\": \"\",\n      \"desc\": \"图片链接\",\n      \"label\": \"\"\n    }\n  ],\n  \"events\": [\n    {\n      \"key\": \"error\",\n      \"desc\": \"图片加载失败时触发\",\n      \"label\": \"\"\n    },\n    {\n      \"key\": \"load\",\n      \"desc\": \"图片加载完成时触发\",\n      \"label\": \"\"\n    }\n  ]\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/image.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nexport default class Image extends SuperComponent {\n    externalClasses: string[];\n    options: {\n        multipleSlots: boolean;\n    };\n    properties: import(\"./type\").TdImageProps;\n    data: {\n        prefix: string;\n        isLoading: boolean;\n        isFailed: boolean;\n        innerStyle: string;\n        classPrefix: string;\n    };\n    preSrc: any;\n    observers: {\n        src(): void;\n        'width, height'(width: any, height: any): void;\n    };\n    methods: {\n        onLoaded(e: any): void;\n        onLoadError(e: any): void;\n        calcSize(width: any, height: any): void;\n        update(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/image.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport ImageProps from './props';\nimport config from '../common/config';\nimport { addUnit, getRect, appBaseInfo } from '../common/utils';\nimport { compareVersion } from '../common/version';\nconst { prefix } = config;\nconst name = `${prefix}-image`;\nlet Image = class Image extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-load`, `${prefix}-class-image`, `${prefix}-class-error`];\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = ImageProps;\n        this.data = {\n            prefix,\n            isLoading: true,\n            isFailed: false,\n            innerStyle: '',\n            classPrefix: name,\n        };\n        this.preSrc = undefined;\n        this.observers = {\n            src() {\n                if (this.preSrc === this.properties.src)\n                    return;\n                this.update();\n            },\n            'width, height'(width, height) {\n                this.calcSize(width, height);\n            },\n        };\n        this.methods = {\n            onLoaded(e) {\n                const sdkVersion = appBaseInfo.SDKVersion;\n                const { mode, tId } = this.properties;\n                const isInCompatible = compareVersion(sdkVersion, '2.10.3') < 0;\n                if (mode === 'heightFix' && isInCompatible) {\n                    const { height: picHeight, width: picWidth } = e.detail;\n                    getRect(this, `#${tId || 'image'}`).then((rect) => {\n                        const { height } = rect;\n                        const resultWidth = ((height / picHeight) * picWidth).toFixed(2);\n                        this.setData({ innerStyle: `height: ${addUnit(height)}; width: ${resultWidth}px;` });\n                    });\n                }\n                this.setData({\n                    isLoading: false,\n                    isFailed: false,\n                });\n                this.triggerEvent('load', e.detail);\n            },\n            onLoadError(e) {\n                this.setData({\n                    isLoading: false,\n                    isFailed: true,\n                });\n                this.triggerEvent('error', e.detail);\n            },\n            calcSize(width, height) {\n                let innerStyle = '';\n                if (width) {\n                    innerStyle += `width: ${addUnit(width)};`;\n                }\n                if (height) {\n                    innerStyle += `height: ${addUnit(height)};`;\n                }\n                this.setData({\n                    innerStyle,\n                });\n            },\n            update() {\n                const { src } = this.properties;\n                this.preSrc = src;\n                if (!src) {\n                    this.onLoadError({ errMsg: '图片链接为空' });\n                }\n                else {\n                    this.setData({\n                        isLoading: true,\n                        isFailed: false,\n                    });\n                }\n            },\n        };\n    }\n};\nImage = __decorate([\n    wxComponent()\n], Image);\nexport default Image;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/image.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-loading\": \"../loading/loading\",\n    \"t-icon\": \"../icon/icon\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/image.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view style=\"{{_._style([style, customStyle])}}\" class=\"class {{prefix}}-class {{classPrefix}}\">\n  <!-- 加载中占位 -->\n  <view\n    wx:if=\"{{isLoading}}\"\n    style=\"{{_._style([innerStyle])}}\"\n    class=\"{{classPrefix}}__mask {{classPrefix}}--loading {{classPrefix}}--shape-{{shape}}\"\n    aria-hidden=\"{{ariaHidden}}\"\n  >\n    <t-loading\n      wx:if=\"{{loading === 'default'}}\"\n      theme=\"dots\"\n      size=\"44rpx\"\n      loading\n      inherit-color\n      t-class=\"t-class-load\"\n      t-class-text=\"{{classPrefix}}--loading-text\"\n    ></t-loading>\n    <view wx:elif=\"{{loading !== '' && loading !== 'slot'}}\" class=\"{{classPrefix}}__common {{prefix}}-class-load\">\n      {{loading}}\n    </view>\n    <slot wx:else name=\"loading\" />\n  </view>\n  <!-- 加载失败占位 -->\n  <view\n    wx:elif=\"{{isFailed}}\"\n    style=\"{{_._style([innerStyle])}}\"\n    class=\"{{classPrefix}}__mask {{classPrefix}}--failed {{classPrefix}}--shape-{{shape}} {{prefix}}-class-error\"\n    aria-hidden=\"{{ariaHidden}}\"\n  >\n    <view wx:if=\"{{error === 'default'}}\" style=\"font-size: 44rpx\" class=\"{{prefix}}-class-load\">\n      <t-icon name=\"close\" aria-role=\"img\" aria-label=\"加载失败\" />\n    </view>\n    <view wx:elif=\"{{error && error !== 'slot'}}\" class=\"{{classPrefix}}__common {{prefix}}-class-load\">\n      {{error}}\n    </view>\n    <slot wx:else name=\"error\" />\n  </view>\n  <!-- 图片 -->\n  <image\n    id=\"{{tId||'image'}}\"\n    wx:if=\"{{ !isFailed }}\"\n    style=\"{{_._style([innerStyle])}}\"\n    class=\"{{classPrefix}}__img {{classPrefix}}--shape-{{shape}} {{isLoading ? classPrefix + '--lazy' : ''}} {{prefix}}-class-image\"\n    src=\"{{src}}\"\n    mode=\"{{mode}}\"\n    webp=\"{{webp}}\"\n    lazy-load=\"{{lazy}}\"\n    bind:load=\"onLoaded\"\n    bind:error=\"onLoadError\"\n    show-menu-by-longpress=\"{{showMenuByLongpress}}\"\n    aria-hidden=\"{{ariaHidden || isLoading || isFailed}}\"\n    aria-label=\"{{ariaLabel}}\"\n  />\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/image.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-image {\n  position: relative;\n  display: inline-block;\n}\n.t-image__mask,\n.t-image__img {\n  color: var(--td-image-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n  vertical-align: top;\n  width: inherit;\n  height: inherit;\n}\n.t-image__mask {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background-color: var(--td-image-loading-bg-color, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n  color: var(--td-image-loading-color, var(--td-text-color-placeholder, var(--td-font-gray-3, rgba(0, 0, 0, 0.4))));\n}\n.t-image--loading-text {\n  width: 0;\n  height: 0;\n}\n.t-image__common {\n  width: 100%;\n  height: 100%;\n}\n.t-image--lazy {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: -1;\n}\n.t-image--shape-circle {\n  border-radius: 50%;\n  overflow: hidden;\n}\n.t-image--shape-round {\n  border-radius: var(--td-image-round-radius, var(--td-radius-default, 12rpx));\n  overflow: hidden;\n}\n.t-image--shape-square {\n  border-radius: 0;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/index.d.ts",
    "content": "import { TdImageProps } from './type';\nexport declare type ImageProps = TdImageProps;\nexport * from './props';\nexport * from './image';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/index.js",
    "content": "export * from './props';\nexport * from './image';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/props.d.ts",
    "content": "import { TdImageProps } from './type';\ndeclare const props: TdImageProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/props.js",
    "content": "const props = {\n    error: {\n        type: String,\n        value: 'default',\n    },\n    height: {\n        type: null,\n    },\n    lazy: {\n        type: Boolean,\n        value: false,\n    },\n    loading: {\n        type: String,\n        value: 'default',\n    },\n    mode: {\n        type: String,\n        value: 'scaleToFill',\n    },\n    shape: {\n        type: String,\n        value: 'square',\n    },\n    showMenuByLongpress: {\n        type: Boolean,\n        value: false,\n    },\n    src: {\n        type: String,\n        value: '',\n    },\n    tId: {\n        type: String,\n        value: '',\n    },\n    webp: {\n        type: Boolean,\n        value: false,\n    },\n    width: {\n        type: null,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/type.d.ts",
    "content": "export interface TdImageProps {\n    error?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    height?: {\n        type: null;\n        value?: string | number;\n    };\n    lazy?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    loading?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    mode?: {\n        type: StringConstructor;\n        value?: 'scaleToFill' | 'aspectFit' | 'aspectFill' | 'widthFix' | 'heightFix' | 'top' | 'bottom' | 'center' | 'left' | 'right' | 'top left' | 'top right' | 'bottom left' | 'bottom right';\n    };\n    shape?: {\n        type: StringConstructor;\n        value?: 'circle' | 'round' | 'square';\n    };\n    showMenuByLongpress?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    src?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    tId?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    webp?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    width?: {\n        type: null;\n        value?: string | number;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/image/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/index.d.ts",
    "content": "export { default as ActionSheet, ActionSheetTheme } from './action-sheet/index';\nexport { default as Dialog } from './dialog/index';\nexport { default as Message } from './message/index';\nexport { default as Toast } from './toast/index';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/index.js",
    "content": "export { default as ActionSheet, ActionSheetTheme } from './action-sheet/index';\nexport { default as Dialog } from './dialog/index';\nexport { default as Message } from './message/index';\nexport { default as Toast } from './toast/index';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/indexes/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Indexes Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nindex-list | Array | - | `0.32.0`。Typescript：`string [] \\| number[]` | N\nlist | Array | [] | `deprecated`。Typescript：`ListItem[] ` `interface ListItem { title: string;  index: string;  children: { title: string; [key: string]: any} [] }`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/indexes/type.ts) | N\nsticky | Boolean | true | Typescript：`Boolean` | N\nsticky-offset | Number | 0 | `1.0.0` | N\n\n### Indexes Events\n\nname | params | description\n-- | -- | --\nchange | `(index: string \\| number)` | `0.34.0`\nselect | `(index: string \\| number)` | \\-\n\n\n### IndexesAnchor Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nindex | String / Number | - | \\- | N\n### IndexesAnchor External Classes\n\nclassName | Description\n-- | --\nt-class | class name of root node\nt-class-sidebar | \\-\nt-class-sidebar-item | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-indexes-sidebar-active-bg-color | @brand-color | - \n--td-indexes-sidebar-active-color | @font-white-1 | - \n--td-indexes-sidebar-color | @font-gray-1 | - \n--td-indexes-sidebar-font-size | 24rpx | - \n--td-indexes-sidebar-item-size | 40rpx | - \n--td-indexes-sidebar-line-height | 40rpx | - \n--td-indexes-sidebar-right | 16rpx | - \n--td-indexes-sidebar-tips-bg-color | @brand-color-light | - \n--td-indexes-sidebar-tips-color | @brand-color | - \n--td-indexes-sidebar-tips-font-size | 40rpx | - \n--td-indexes-sidebar-tips-right | calc(100% + 32rpx) | - \n--td-indexes-sidebar-tips-size | 96rpx | - \n--td-indexes-anchor-active-bg-color | @bg-color-container | - \n--td-indexes-anchor-active-color | @brand-color | - \n--td-indexes-anchor-active-font-weight | 600 | - \n--td-indexes-anchor-bg-color | @bg-color-secondarycontainer | - \n--td-indexes-anchor-color | @font-gray-1 | - \n--td-indexes-anchor-font-size | 28rpx | - \n--td-indexes-anchor-line-height | 44rpx | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/indexes/README.md",
    "content": "---\ntitle: Indexes 索引\ndescription: 用于页面中信息快速检索，可以根据目录中的页码快速找到所需的内容。\nspline: navigation\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-88%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-87%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-85%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-65%25-red\" /></span>\n\n<div style=\"background: #ecf2fe; display: flex; align-items: center; line-height: 20px; padding: 14px 24px; border-radius: 3px; color: #555a65\">\n  <svg fill=\"none\" viewBox=\"0 0 16 16\" width=\"16px\" height=\"16px\" style=\"margin-right: 5px\">\n    <path fill=\"#0052d9\" d=\"M8 15A7 7 0 108 1a7 7 0 000 14zM7.4 4h1.2v1.2H7.4V4zm.1 2.5h1V12h-1V6.5z\" fillOpacity=\"0.9\"></path>\n  </svg>\n  IndexesAnchor 索引锚点组件于 0.32.0 版本上线，请留意版本。\n</div>\n\n\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-indexes\": \"tdesign-miniprogram/indexes/indexes\",\n  \"t-indexes-anchor\": \"tdesign-miniprogram/indexes-anchor/indexes-anchor\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/BH9tQimJ7mSj\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 基础索引\n\n\n{{ base }}\n\n### 自定义索引\n\n{{ custom }}\n\n### API\n\n### Indexes Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nindex-list | Array | - | `0.32.0`。索引字符列表。不传默认 `A-Z`。TS 类型：`string [] \\| number[]` | N\nlist | Array | [] | 已废弃。索引列表的列表数据。每个元素包含三个子元素，index(string)：索引值，例如1，2，3，...或A，B，C等；title(string): 索引标题，可不填将默认设为索引值；children(Array<{title: string}>): 子元素列表，title为子元素的展示文案。TS 类型：`ListItem[] ` `interface ListItem { title: string;  index: string;  children: { title: string; [key: string]: any} [] }`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/indexes/type.ts) | N\nsticky | Boolean | true | 索引是否吸顶，默认为true。TS 类型：`Boolean` | N\nsticky-offset | Number | 0 | `1.0.0`。锚点吸顶时与顶部的距离\t | N\n\n### Indexes Events\n\n名称 | 参数 | 描述\n-- | -- | --\nchange | `(index: string \\| number)` | `0.34.0`。索引发生变更时触发事件\nselect | `(index: string \\| number)` | 点击侧边栏时触发事件\n\n\n### IndexesAnchor Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nindex | String / Number | - | 索引字符 | N\n### IndexesAnchor External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-sidebar | 侧边栏样式类\nt-class-sidebar-item | 侧边栏选项样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-indexes-sidebar-active-bg-color | @brand-color | - \n--td-indexes-sidebar-active-color | @font-white-1 | - \n--td-indexes-sidebar-color | @font-gray-1 | - \n--td-indexes-sidebar-font-size | 24rpx | - \n--td-indexes-sidebar-item-size | 40rpx | - \n--td-indexes-sidebar-line-height | 40rpx | - \n--td-indexes-sidebar-right | 16rpx | - \n--td-indexes-sidebar-tips-bg-color | @brand-color-light | - \n--td-indexes-sidebar-tips-color | @brand-color | - \n--td-indexes-sidebar-tips-font-size | 40rpx | - \n--td-indexes-sidebar-tips-right | calc(100% + 32rpx) | - \n--td-indexes-sidebar-tips-size | 96rpx | - \n--td-indexes-anchor-active-bg-color | @bg-color-container | - \n--td-indexes-anchor-active-color | @brand-color | - \n--td-indexes-anchor-active-font-weight | 600 | - \n--td-indexes-anchor-bg-color | @bg-color-secondarycontainer | - \n--td-indexes-anchor-color | @font-gray-1 | - \n--td-indexes-anchor-font-size | 28rpx | - \n--td-indexes-anchor-line-height | 44rpx | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/indexes/indexes.d.ts",
    "content": "import { RelationsOptions, SuperComponent } from '../common/src/index';\nexport default class Indexes extends SuperComponent {\n    externalClasses: string[];\n    properties: import(\"./type\").TdIndexesProps;\n    data: {\n        prefix: string;\n        classPrefix: string;\n        _height: number;\n        _indexList: any[];\n        scrollTop: number;\n        activeAnchor: any;\n        showTips: boolean;\n    };\n    relations: RelationsOptions;\n    behaviors: string[];\n    timer: any;\n    groupTop: any[];\n    sidebar: any;\n    currentTouchAnchor: any;\n    observers: {\n        indexList(v: any): void;\n        height(v: any): void;\n    };\n    lifetimes: {\n        ready(): void;\n    };\n    methods: {\n        setHeight(height: string | number): void;\n        setIndexList(list: any): void;\n        getAllRect(): void;\n        getAnchorsRect(): Promise<any[]>;\n        getSidebarRect(): void;\n        toggleTips(flag: boolean): void;\n        setAnchorByIndex(index: any): void;\n        onClick(e: any): void;\n        onTouchMove(e: any): void;\n        onTouchCancel(): void;\n        onTouchEnd(e: any): void;\n        onAnchorTouch: (...args: any[]) => void;\n        setAnchorOnScroll(scrollTop: number): void;\n        onScroll({ scrollTop }: {\n            scrollTop: any;\n        }): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/indexes/indexes.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport { getRect, throttle, systemInfo } from '../common/utils';\nimport pageScrollMixin from '../mixins/page-scroll';\nconst { prefix } = config;\nconst name = `${prefix}-indexes`;\nlet Indexes = class Indexes extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-sidebar`, `${prefix}-class-sidebar-item`];\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n            _height: 0,\n            _indexList: [],\n            scrollTop: 0,\n            activeAnchor: null,\n            showTips: false,\n        };\n        this.relations = {\n            '../indexes-anchor/indexes-anchor': {\n                type: 'child',\n            },\n        };\n        this.behaviors = [pageScrollMixin()];\n        this.timer = null;\n        this.groupTop = [];\n        this.sidebar = null;\n        this.currentTouchAnchor = null;\n        this.observers = {\n            indexList(v) {\n                this.setIndexList(v);\n                this.setHeight(this.data._height);\n            },\n            height(v) {\n                this.setHeight(v);\n            },\n        };\n        this.lifetimes = {\n            ready() {\n                this.timer = null;\n                this.groupTop = [];\n                this.sidebar = null;\n                if (this.data._height === 0) {\n                    this.setHeight();\n                }\n                if (this.data.indexList === null) {\n                    this.setIndexList();\n                }\n            },\n        };\n        this.methods = {\n            setHeight(height) {\n                if (!height) {\n                    const { windowHeight } = systemInfo;\n                    height = windowHeight;\n                }\n                this.setData({\n                    _height: height,\n                }, () => {\n                    this.getAllRect();\n                });\n            },\n            setIndexList(list) {\n                if (!list) {\n                    const start = 'A'.charCodeAt(0);\n                    const alphabet = [];\n                    for (let i = start, end = start + 26; i < end; i += 1) {\n                        alphabet.push(String.fromCharCode(i));\n                    }\n                    this.setData({ _indexList: alphabet });\n                }\n                else {\n                    this.setData({ _indexList: list });\n                }\n            },\n            getAllRect() {\n                this.getAnchorsRect().then(() => {\n                    this.groupTop.forEach((item, index) => {\n                        const next = this.groupTop[index + 1];\n                        item.totalHeight = ((next === null || next === void 0 ? void 0 : next.top) || Infinity) - item.top;\n                    });\n                    this.setAnchorOnScroll(0);\n                });\n                this.getSidebarRect();\n            },\n            getAnchorsRect() {\n                return Promise.all(this.$children.map((child) => getRect(child, `.${name}-anchor`).then((rect) => {\n                    this.groupTop.push({\n                        height: rect.height,\n                        top: rect.top,\n                        anchor: child.data.index,\n                    });\n                })));\n            },\n            getSidebarRect() {\n                getRect(this, `#id-${name}__bar`).then((rect) => {\n                    const { top, height } = rect;\n                    const { length } = this.data._indexList;\n                    this.sidebar = {\n                        top,\n                        height,\n                        itemHeight: (height - (length - 1) * 2) / length,\n                    };\n                });\n            },\n            toggleTips(flag) {\n                if (!flag) {\n                    clearInterval(this.timer);\n                    this.timer = setTimeout(() => {\n                        this.setData({\n                            showTips: false,\n                        });\n                    }, 300);\n                }\n                else {\n                    this.setData({\n                        showTips: true,\n                    });\n                }\n            },\n            setAnchorByIndex(index) {\n                const { _indexList, stickyOffset } = this.data;\n                const activeAnchor = _indexList[index];\n                if (this.data.activeAnchor !== null && this.data.activeAnchor === activeAnchor)\n                    return;\n                const target = this.groupTop.find((item) => item.anchor === activeAnchor);\n                if (target) {\n                    this.currentTouchAnchor = activeAnchor;\n                    const scrollTop = target.top - stickyOffset;\n                    wx.pageScrollTo({\n                        scrollTop,\n                        duration: 0,\n                    });\n                    this.toggleTips(true);\n                    this.triggerEvent('select', { index: activeAnchor });\n                    this.setData({ activeAnchor });\n                }\n            },\n            onClick(e) {\n                const { index } = e.currentTarget.dataset;\n                this.setAnchorByIndex(index);\n            },\n            onTouchMove(e) {\n                this.onAnchorTouch(e);\n            },\n            onTouchCancel() {\n                this.toggleTips(false);\n            },\n            onTouchEnd(e) {\n                this.toggleTips(false);\n                this.onAnchorTouch(e);\n            },\n            onAnchorTouch: throttle(function (e) {\n                const getAnchorIndex = (clientY) => {\n                    const offsetY = clientY - this.sidebar.top;\n                    if (offsetY <= 0) {\n                        return 0;\n                    }\n                    if (offsetY > this.sidebar.height) {\n                        return this.data._indexList.length - 1;\n                    }\n                    return Math.floor(offsetY / this.sidebar.itemHeight);\n                };\n                const index = getAnchorIndex(e.changedTouches[0].clientY);\n                this.setAnchorByIndex(index);\n            }, 1000 / 30),\n            setAnchorOnScroll(scrollTop) {\n                if (!this.groupTop) {\n                    return;\n                }\n                const { sticky, stickyOffset, activeAnchor } = this.data;\n                scrollTop += stickyOffset;\n                const curIndex = this.groupTop.findIndex((group) => scrollTop >= group.top - group.height && scrollTop <= group.top + group.totalHeight - group.height);\n                if (curIndex === -1)\n                    return;\n                const curGroup = this.groupTop[curIndex];\n                if (this.currentTouchAnchor !== null) {\n                    this.triggerEvent('change', { index: curGroup.anchor });\n                    this.currentTouchAnchor = null;\n                }\n                else if (activeAnchor !== curGroup.anchor) {\n                    this.triggerEvent('change', { index: curGroup.anchor });\n                    this.setData({ activeAnchor: curGroup.anchor });\n                }\n                if (sticky) {\n                    const offset = curGroup.top - scrollTop;\n                    const betwixt = offset < curGroup.height && offset > 0 && scrollTop > stickyOffset;\n                    this.$children.forEach((child, index) => {\n                        if (index === curIndex) {\n                            const sticky = scrollTop > stickyOffset;\n                            const anchorStyle = `transform: translate3d(0, ${betwixt ? offset : 0}px, 0); top: ${stickyOffset}px`;\n                            if (anchorStyle !== child.data.anchorStyle || sticky !== child.data.sticky) {\n                                child.setData({\n                                    sticky,\n                                    active: true,\n                                    style: `height: ${curGroup.height}px`,\n                                    anchorStyle,\n                                });\n                            }\n                        }\n                        else if (index + 1 === curIndex) {\n                            const anchorStyle = `transform: translate3d(0, ${betwixt ? offset - curGroup.height : 0}px, 0); top: ${stickyOffset}px`;\n                            if (anchorStyle !== child.data.anchorStyle) {\n                                child.setData({\n                                    sticky: true,\n                                    active: true,\n                                    style: `height: ${curGroup.height}px`,\n                                    anchorStyle,\n                                });\n                            }\n                        }\n                        else {\n                            child.setData({ active: false, sticky: false, anchorStyle: '' });\n                        }\n                    });\n                }\n            },\n            onScroll({ scrollTop }) {\n                this.setAnchorOnScroll(scrollTop);\n            },\n        };\n    }\n};\nIndexes = __decorate([\n    wxComponent()\n], Indexes);\nexport default Indexes;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/indexes/indexes.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\",\n    \"t-cell\": \"../cell/cell\",\n    \"t-cell-group\": \"../cell-group/cell-group\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/indexes/indexes.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n<wxs src=\"./indexes.wxs\" module=\"this\" />\n\n<view style=\"{{_._style([style, customStyle])}}\" class=\"{{classPrefix}} class {{prefix}}-class\">\n  <view\n    class=\"{{classPrefix}}__sidebar {{prefix}}-class-sidebar\"\n    id=\"id-{{classPrefix}}__bar\"\n    catch:touchmove=\"onTouchMove\"\n    catch:touchcancel=\"onTouchCancel\"\n    catch:touchend=\"onTouchEnd\"\n  >\n    <view\n      class=\"{{_.cls(classPrefix + '__sidebar-item', [['active', activeAnchor === item]])}} {{prefix}}-class-sidebar-item\"\n      wx:for=\"{{ _indexList }}\"\n      wx:key=\"*this\"\n      bind:tap=\"onClick\"\n      data-index=\"{{index}}\"\n    >\n      <view aria-role=\"button\" aria-label=\"{{ activeAnchor === item ? '已选中' + item : ''}}\">\n        {{ this.getFirstCharacter(item) }}\n      </view>\n      <view class=\"{{classPrefix}}__sidebar-tips\" wx:if=\"{{ showTips && activeAnchor === item }}\">\n        {{ activeAnchor }}\n      </view>\n    </view>\n  </view>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/indexes/indexes.wxs",
    "content": "function getFirstCharacter(str) {\n  return str.toString().substring(0, 1);\n}\n\nmodule.exports = {\n  getFirstCharacter: getFirstCharacter,\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/indexes/indexes.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-indexes {\n  position: relative;\n  height: 100vh;\n}\n.t-indexes__sidebar {\n  position: fixed;\n  right: var(--td-indexes-sidebar-right, 16rpx);\n  width: var(--td-indexes-sidebar-item-size, 40rpx);\n  color: var(--td-indexes-sidebar-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  font-size: var(--td-indexes-sidebar-font-size, 24rpx);\n  line-height: var(--td-indexes-sidebar-line-height, 40rpx);\n  display: flex;\n  flex-flow: column nowrap;\n  top: 50%;\n  transform: translateY(-50%);\n  z-index: 1;\n}\n.t-indexes__sidebar-item {\n  border-radius: 50%;\n  position: relative;\n  text-align: center;\n}\n.t-indexes__sidebar-item--active {\n  background-color: var(--td-indexes-sidebar-active-bg-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  color: var(--td-indexes-sidebar-active-color, var(--td-text-color-anti, var(--td-font-white-1, #ffffff)));\n}\n.t-indexes__sidebar-item + .t-indexes__sidebar-item {\n  margin-top: 4rpx;\n}\n.t-indexes__sidebar-tips {\n  min-width: var(--td-indexes-sidebar-tips-size, 96rpx);\n  max-width: 198rpx;\n  padding: 0 32rpx;\n  box-sizing: border-box;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  height: var(--td-indexes-sidebar-tips-size, 96rpx);\n  line-height: var(--td-indexes-sidebar-tips-size, 96rpx);\n  text-align: center;\n  font-size: var(--td-indexes-sidebar-tips-font-size, 40rpx);\n  font-weight: 700;\n  color: var(--td-indexes-sidebar-tips-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  background-color: var(--td-indexes-sidebar-tips-bg-color, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n  border-radius: var(--td-indexes-sidebar-tips-size, 96rpx);\n  position: absolute;\n  top: 50%;\n  bottom: 0;\n  transform: translateY(-50%);\n  right: var(--td-indexes-sidebar-tips-right, calc(100% + 32rpx));\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/indexes/props.d.ts",
    "content": "import { TdIndexesProps } from './type';\ndeclare const props: TdIndexesProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/indexes/props.js",
    "content": "const props = {\n    indexList: {\n        type: null,\n    },\n    sticky: {\n        type: Boolean,\n        value: true,\n    },\n    stickyOffset: {\n        type: Number,\n        value: 0,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/indexes/type.d.ts",
    "content": "export interface TdIndexesProps {\n    indexList?: {\n        type: null;\n        value?: string[] | number[];\n    };\n    sticky?: {\n        type: BooleanConstructor;\n        value?: Boolean;\n    };\n    stickyOffset?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/indexes/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Loading Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ndelay | Number | 0 | \\- | N\nduration | Number | 800 | \\- | N\nfullscreen | Boolean | false | `1.8.5` | N\nindicator | Boolean / Slot | true | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ninherit-color | Boolean | false | \\- | N\nlayout | String | horizontal | options: horizontal/vertical | N\nloading | Boolean | true | \\- | N\npause | Boolean | false | \\- | N\nprogress | Number | - | \\- | N\nreverse | Boolean | - | \\- | N\nsize | String | '20px' | \\- | N\ntext | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ntheme | String | circular | options: circular/spinner/dots | N\n\n### Loading External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-indicator | \\-\nt-class-text | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-loading-color | @brand-color | - \n--td-loading-text-color | inherit | - \n--td-loading-text-font-size | 24rpx | - \n--td-loading-text-line-height | 40rpx | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/README.md",
    "content": "---\ntitle: Loading 加载\ndescription: 用于表示页面或操作的加载状态，给予用户反馈的同时减缓等待的焦虑感，由一个或一组反馈动效组成。\nspline: message\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-95%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-95%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-83%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-loading\": \"tdesign-miniprogram/loading/loading\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/Jraocimc7mSr\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 纯icon\n\n{{ base }}\n\n### icon加文字横向\n\n{{ horizontal }}\n\n### icon加文字竖向\n\n{{ vertical }}\n\n### 纯文字\n\n{{ text }}\n\n### 加载失败\n\n{{ error }}\n\n### 状态\n\n{{ status }}\n\n### 加载速度\n\n{{ duration }}\n\n### 规格\n\n{{ size }}\n\n## API\n\n### Loading Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ndelay | Number | 0 | 延迟显示加载效果的时间，用于防止请求速度过快引起的加载闪烁，单位：毫秒 | N\nduration | Number | 800 | 加载动画执行完成一次的时间，单位：毫秒 | N\nfullscreen | Boolean | false | `1.8.5`。是否显示为全屏加载 | N\nindicator | Boolean / Slot | true | 加载指示符，值为 true 显示默认指示符，值为 false 则不显示，也可以自定义指示符。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ninherit-color | Boolean | false | 是否继承父元素颜色 | N\nlayout | String | horizontal | 对齐方式。可选项：horizontal/vertical | N\nloading | Boolean | true | 是否处于加载状态 | N\npause | Boolean | false | 是否暂停动画 | N\nprogress | Number | - | 加载进度 | N\nreverse | Boolean | - | 加载动画是否反向 | N\nsize | String | '20px' | 尺寸，示例：20px | N\ntext | String / Slot | - | 加载提示文案。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ntheme | String | circular | 加载组件类型。可选项：circular/spinner/dots，skyline 模式下暂不支持枚举值 circular | N\n\n### Loading External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-indicator | 指示符样式类\nt-class-text | 文本样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-loading-color | @brand-color | - \n--td-loading-text-color | inherit | - \n--td-loading-text-font-size | 24rpx | - \n--td-loading-text-line-height | 40rpx | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/index.d.ts",
    "content": "export * from './props';\nexport * from './type';\nexport * from './loading';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/index.js",
    "content": "export * from './props';\nexport * from './type';\nexport * from './loading';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/loading.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nimport type { TdLoadingProps } from './type';\nexport interface LoadingProps extends TdLoadingProps {\n}\nexport default class Loading extends SuperComponent {\n    externalClasses: string[];\n    data: {\n        prefix: string;\n        classPrefix: string;\n        show: boolean;\n    };\n    options: {\n        multipleSlots: boolean;\n    };\n    properties: {\n        delay?: {\n            type: NumberConstructor;\n            value?: number;\n        };\n        duration?: {\n            type: NumberConstructor;\n            value?: number;\n        };\n        fullscreen?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        indicator?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        inheritColor?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        layout?: {\n            type: StringConstructor;\n            value?: \"horizontal\" | \"vertical\";\n        };\n        loading?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        pause?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        progress?: {\n            type: NumberConstructor;\n            value?: number;\n        };\n        reverse?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        size?: {\n            type: StringConstructor;\n            value?: string;\n        };\n        text?: {\n            type: StringConstructor;\n            value?: string;\n        };\n        theme?: {\n            type: StringConstructor;\n            value?: \"circular\" | \"spinner\" | \"dots\";\n        };\n    };\n    timer: any;\n    observers: {\n        loading(this: any, cur: any): void;\n    };\n    lifetimes: {\n        detached(): void;\n    };\n    refreshPage(): void;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/loading.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-loading`;\nlet Loading = class Loading extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-text`, `${prefix}-class-indicator`];\n        this.data = {\n            prefix,\n            classPrefix: name,\n            show: true,\n        };\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = Object.assign({}, props);\n        this.timer = null;\n        this.observers = {\n            loading(cur) {\n                const { delay } = this.properties;\n                if (this.timer) {\n                    clearTimeout(this.timer);\n                }\n                if (cur) {\n                    if (delay) {\n                        this.timer = setTimeout(() => {\n                            this.setData({ show: cur });\n                            this.timer = null;\n                        }, delay);\n                    }\n                    else {\n                        this.setData({ show: cur });\n                    }\n                }\n                else {\n                    this.setData({ show: cur });\n                }\n            },\n        };\n        this.lifetimes = {\n            detached() {\n                clearTimeout(this.timer);\n            },\n        };\n    }\n    refreshPage() {\n        this.triggerEvent('reload');\n    }\n};\nLoading = __decorate([\n    wxComponent()\n], Loading);\nexport default Loading;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/loading.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/loading.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n<view\n  style=\"{{_._style([style, customStyle, show ? '' : 'display: none', inheritColor ? 'color: inherit' : ''])}}\"\n  class=\"class {{prefix}}-class {{classPrefix}} {{classPrefix + '--' + layout}} {{fullscreen ? classPrefix + '--fullscreen' : ''}}\"\n>\n  <view\n    wx:if=\"{{indicator}}\"\n    class=\"{{prefix}}-class-indicator {{classPrefix}}__spinner {{classPrefix}}__spinner--{{ theme }} {{reverse ? 'reverse' : ''}}\"\n    style=\"width: {{ _.addUnit(size) }}; height: {{ _.addUnit(size) }}; {{inheritColor ? 'color: inherit;' : ''}} {{indicator ? '' : 'display: none;'}} {{duration ? 'animation-duration: ' + duration / 1000 + 's;' : ''}} animation-play-state: {{pause ? 'paused' : 'running'}};\"\n    aria-role=\"{{ariaRole  || 'img'}}\"\n    aria-label=\"{{ ariaLabel || text || '加载中'  }}\"\n  >\n    <view\n      wx:if=\"{{ theme === 'spinner' }}\"\n      wx:for=\"{{12}}\"\n      wx:key=\"index\"\n      class=\"{{classPrefix}}__dot {{classPrefix}}__dot-{{index}}\"\n    />\n    <view wx:if=\"{{ theme === 'circular' }}\" class=\"{{classPrefix}}__circular\" />\n    <block wx:if=\"{{ theme === 'dots' }}\">\n      <view\n        class=\"{{classPrefix}}__dot\"\n        style=\"{{duration ? 'animation-duration: ' + duration/1000 + 's; animation-delay:' + 0 + 's;' : ''}} animation-play-state: {{pause ? 'paused' : 'running'}};\"\n      ></view>\n      <view\n        class=\"{{classPrefix}}__dot\"\n        style=\"{{duration ? 'animation-duration: ' + duration/1000 + 's; animation-delay:' + duration * 1 / 3000 + 's;' : ''}} animation-play-state: {{pause ? 'paused' : 'running'}};\"\n      ></view>\n      <view\n        class=\"{{classPrefix}}__dot\"\n        style=\"{{duration ? 'animation-duration: ' + duration/1000 + 's; animation-delay:' + duration * 2 / 3000 + 's;' : ''}} animation-play-state: {{pause ? 'paused' : 'running'}};\"\n      ></view>\n    </block>\n    <slot name=\"indicator\" />\n  </view>\n  <view\n    class=\"{{_.cls(classPrefix + '__text', [layout])}} {{prefix}}-class-text\"\n    aria-hidden=\"{{indicator}}\"\n    aria-label=\"{{ ariaLabel || text }}\"\n  >\n    <block wx:if=\"{{text}}\">{{text}}</block>\n    <slot name=\"text\" />\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/loading.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-loading {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 24rpx;\n}\n.t-loading--fullscreen {\n  position: fixed;\n  display: flex;\n  align-items: center;\n  vertical-align: middle;\n  justify-content: center;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: var(--td-loading-z-index, 3500);\n  background-color: var(--td-loading-full-bg-color, rgba(255, 255, 255, 0.6));\n}\n.t-loading__spinner {\n  position: relative;\n  box-sizing: border-box;\n  width: 100%;\n  height: 100%;\n  max-width: 100%;\n  max-height: 100%;\n  animation: rotate 0.8s linear infinite;\n  color: var(--td-loading-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-loading__spinner.reverse {\n  animation-name: rotateReverse;\n}\n.t-loading__spinner--spinner {\n  animation-timing-function: steps(12);\n  color: var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9)));\n}\n.t-loading__spinner--spinner .t-loading__dot {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n.t-loading__spinner--spinner .t-loading__dot::before {\n  display: block;\n  width: 5rpx;\n  height: 25%;\n  margin: 0 auto;\n  background-color: var(--td-loading-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  border-radius: 40%;\n  content: ' ';\n}\n.t-loading__spinner--circular .t-loading__circular {\n  border-radius: 100%;\n  width: 100%;\n  height: 100%;\n  background: conic-gradient(from 180deg at 50% 50%, rgba(255, 255, 255, 0) 0deg, rgba(255, 255, 255, 0) 60deg, currentColor 330deg, rgba(255, 255, 255, 0) 360deg);\n  mask: radial-gradient(transparent calc(50% - 1rpx), #fff 50%);\n  /* stylelint-disable-next-line */\n  -webkit-mask: radial-gradient(transparent calc(50% - 1rpx), #fff 50%);\n}\n.t-loading__spinner--dots {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  animation: none;\n}\n.t-loading__spinner--dots .t-loading__dot {\n  width: 20%;\n  height: 20%;\n  border-radius: 50%;\n  background-color: var(--td-loading-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  animation-duration: 1.8s;\n  animation-name: dotting;\n  animation-timing-function: linear;\n  animation-iteration-count: infinite;\n  animation-fill-mode: both;\n}\n.t-loading__text {\n  color: var(--td-loading-text-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  font-size: var(--td-loading-text-font-size, 24rpx);\n  line-height: var(--td-loading-text-line-height, 40rpx);\n}\n.t-loading__text--vertical:not(:first-child):not(:empty) {\n  margin-top: 12rpx;\n}\n.t-loading__text--horizontal:not(:first-child):not(:empty) {\n  margin-left: 16rpx;\n}\n.t-loading--vertical {\n  flex-direction: column;\n}\n.t-loading--horizontal {\n  flex-direction: row;\n  vertical-align: top;\n}\n@keyframes t-bar {\n  0% {\n    width: 0;\n  }\n  50% {\n    width: 70%;\n  }\n  100% {\n    width: 80%;\n  }\n}\n@keyframes t-bar-loaded {\n  0% {\n    height: 6rpx;\n    opacity: 1;\n    width: 90%;\n  }\n  50% {\n    height: 6rpx;\n    opacity: 1;\n    width: 100%;\n  }\n  100% {\n    height: 0;\n    opacity: 0;\n    width: 100%;\n  }\n}\n.t-loading__dot-1 {\n  transform: rotate(30deg);\n  opacity: 0;\n}\n.t-loading__dot-2 {\n  transform: rotate(60deg);\n  opacity: 0.08333333;\n}\n.t-loading__dot-3 {\n  transform: rotate(90deg);\n  opacity: 0.16666667;\n}\n.t-loading__dot-4 {\n  transform: rotate(120deg);\n  opacity: 0.25;\n}\n.t-loading__dot-5 {\n  transform: rotate(150deg);\n  opacity: 0.33333333;\n}\n.t-loading__dot-6 {\n  transform: rotate(180deg);\n  opacity: 0.41666667;\n}\n.t-loading__dot-7 {\n  transform: rotate(210deg);\n  opacity: 0.5;\n}\n.t-loading__dot-8 {\n  transform: rotate(240deg);\n  opacity: 0.58333333;\n}\n.t-loading__dot-9 {\n  transform: rotate(270deg);\n  opacity: 0.66666667;\n}\n.t-loading__dot-10 {\n  transform: rotate(300deg);\n  opacity: 0.75;\n}\n.t-loading__dot-11 {\n  transform: rotate(330deg);\n  opacity: 0.83333333;\n}\n.t-loading__dot-12 {\n  transform: rotate(360deg);\n  opacity: 0.91666667;\n}\n@keyframes rotate {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n@keyframes rotateReverse {\n  from {\n    transform: rotate(360deg);\n  }\n  to {\n    transform: rotate(0deg);\n  }\n}\n@keyframes dotting {\n  0% {\n    opacity: 0.15;\n  }\n  1% {\n    opacity: 0.8;\n  }\n  33% {\n    opacity: 0.8;\n  }\n  34% {\n    opacity: 0.15;\n  }\n  100% {\n    opacity: 0.15;\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/props.d.ts",
    "content": "import { TdLoadingProps } from './type';\ndeclare const props: TdLoadingProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/props.js",
    "content": "const props = {\n    delay: {\n        type: Number,\n        value: 0,\n    },\n    duration: {\n        type: Number,\n        value: 800,\n    },\n    fullscreen: {\n        type: Boolean,\n        value: false,\n    },\n    indicator: {\n        type: Boolean,\n        value: true,\n    },\n    inheritColor: {\n        type: Boolean,\n        value: false,\n    },\n    layout: {\n        type: String,\n        value: 'horizontal',\n    },\n    loading: {\n        type: Boolean,\n        value: true,\n    },\n    pause: {\n        type: Boolean,\n        value: false,\n    },\n    progress: {\n        type: Number,\n    },\n    reverse: {\n        type: Boolean,\n    },\n    size: {\n        type: String,\n        value: '20px',\n    },\n    text: {\n        type: String,\n    },\n    theme: {\n        type: String,\n        value: 'circular',\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/type.d.ts",
    "content": "export interface TdLoadingProps {\n    delay?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    duration?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    fullscreen?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    indicator?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    inheritColor?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    layout?: {\n        type: StringConstructor;\n        value?: 'horizontal' | 'vertical';\n    };\n    loading?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    pause?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    progress?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    reverse?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    size?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    text?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    theme?: {\n        type: StringConstructor;\n        value?: 'circular' | 'spinner' | 'dots';\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/loading/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/mixins/page-scroll.d.ts",
    "content": "declare const _default: (funcName?: string) => string;\nexport default _default;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/mixins/page-scroll.js",
    "content": "import { getCurrentPage } from '../common/utils';\nconst onPageScroll = function (event) {\n    const page = getCurrentPage();\n    if (!page)\n        return;\n    const { pageScroller } = page;\n    pageScroller === null || pageScroller === void 0 ? void 0 : pageScroller.forEach((scroller) => {\n        if (typeof scroller === 'function') {\n            scroller(event);\n        }\n    });\n};\nexport default (funcName = 'onScroll') => {\n    return Behavior({\n        attached() {\n            var _a;\n            const page = getCurrentPage();\n            if (!page)\n                return;\n            const bindScroller = (_a = this[funcName]) === null || _a === void 0 ? void 0 : _a.bind(this);\n            if (bindScroller) {\n                this._pageScroller = bindScroller;\n            }\n            if (Array.isArray(page.pageScroller)) {\n                page.pageScroller.push(bindScroller);\n            }\n            else {\n                page.pageScroller =\n                    typeof page.onPageScroll === 'function' ? [page.onPageScroll.bind(page), bindScroller] : [bindScroller];\n            }\n            page.onPageScroll = onPageScroll;\n        },\n        detached() {\n            var _a;\n            const page = getCurrentPage();\n            if (!page)\n                return;\n            page.pageScroller = ((_a = page.pageScroller) === null || _a === void 0 ? void 0 : _a.filter((item) => item !== this._pageScroller)) || [];\n        },\n    });\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/mixins/theme-change.d.ts",
    "content": "declare const themeChangeBehavior: string;\nexport default themeChangeBehavior;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/mixins/theme-change.js",
    "content": "import { appBaseInfo } from '../common/utils';\nconst themeChangeBehavior = Behavior({\n    data: {\n        theme: 'light',\n    },\n    attached() {\n        this._initTheme();\n    },\n    methods: {\n        _initTheme() {\n            const that = this;\n            that.setData({\n                theme: appBaseInfo.theme,\n            });\n            wx.onThemeChange((res) => {\n                that.setData({\n                    theme: res.theme,\n                });\n            });\n        },\n    },\n});\nexport default themeChangeBehavior;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/mixins/touch.d.ts",
    "content": "declare const _default: string;\nexport default _default;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/mixins/touch.js",
    "content": "const MinDistance = 10;\nconst getDirection = (x, y) => {\n    if (x > y && x > MinDistance) {\n        return 'horizontal';\n    }\n    if (y > x && y > MinDistance) {\n        return 'vertical';\n    }\n    return '';\n};\nexport default Behavior({\n    methods: {\n        resetTouchStatus() {\n            this.direction = '';\n            this.deltaX = 0;\n            this.deltaY = 0;\n            this.offsetX = 0;\n            this.offsetY = 0;\n        },\n        touchStart(event) {\n            this.resetTouchStatus();\n            const [touch] = event.touches;\n            this.startX = touch.clientX;\n            this.startY = touch.clientY;\n        },\n        touchMove(event) {\n            const [touch] = event.touches;\n            this.deltaX = touch.clientX - this.startX;\n            this.deltaY = touch.clientY - this.startY;\n            this.offsetX = Math.abs(this.deltaX);\n            this.offsetY = Math.abs(this.deltaY);\n            this.direction = getDirection(this.offsetX, this.offsetY);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/mixins/transition.d.ts",
    "content": "export default function transition(): string;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/mixins/transition.js",
    "content": "import config from '../common/config';\nconst { prefix } = config;\nexport default function transition() {\n    return Behavior({\n        properties: {\n            visible: {\n                type: Boolean,\n                value: null,\n                observer: 'watchVisible',\n            },\n            appear: Boolean,\n            name: {\n                type: String,\n                value: 'fade',\n            },\n            durations: {\n                type: Number,\n                optionalTypes: [Array],\n            },\n        },\n        data: {\n            transitionClass: '',\n            transitionDurations: 300,\n            className: '',\n            realVisible: false,\n        },\n        created() {\n            this.status = '';\n            this.transitionT = 0;\n        },\n        attached() {\n            this.durations = this.getDurations();\n            if (this.data.visible) {\n                this.enter();\n            }\n            this.inited = true;\n        },\n        detached() {\n            clearTimeout(this.transitionT);\n        },\n        methods: {\n            watchVisible(curr, prev) {\n                if (this.inited && curr !== prev) {\n                    curr ? this.enter() : this.leave();\n                }\n            },\n            getDurations() {\n                const { durations } = this.data;\n                if (Array.isArray(durations)) {\n                    return durations.map((item) => Number(item));\n                }\n                return [Number(durations), Number(durations)];\n            },\n            enter() {\n                const { name } = this.data;\n                const [duration] = this.durations;\n                this.status = 'entering';\n                this.setData({\n                    realVisible: true,\n                    transitionClass: `${prefix}-${name}-enter ${prefix}-${name}-enter-active`,\n                });\n                setTimeout(() => {\n                    this.setData({\n                        transitionClass: `${prefix}-${name}-enter-active ${prefix}-${name}-enter-to`,\n                    });\n                }, 30);\n                if (typeof duration === 'number' && duration > 0) {\n                    this.transitionT = setTimeout(this.entered.bind(this), duration + 30);\n                }\n            },\n            entered() {\n                this.customDuration = false;\n                clearTimeout(this.transitionT);\n                this.status = 'entered';\n                this.setData({\n                    transitionClass: '',\n                });\n            },\n            leave() {\n                const { name } = this.data;\n                const [, duration] = this.durations;\n                this.status = 'leaving';\n                this.setData({\n                    transitionClass: `${prefix}-${name}-leave  ${prefix}-${name}-leave-active`,\n                });\n                clearTimeout(this.transitionT);\n                setTimeout(() => {\n                    this.setData({\n                        transitionClass: `${prefix}-${name}-leave-active ${prefix}-${name}-leave-to`,\n                    });\n                }, 30);\n                if (typeof duration === 'number' && duration > 0) {\n                    this.customDuration = true;\n                    this.transitionT = setTimeout(this.leaved.bind(this), duration + 30);\n                }\n            },\n            leaved() {\n                this.customDuration = false;\n                this.triggerEvent('leaved');\n                clearTimeout(this.transitionT);\n                this.status = 'leaved';\n                this.setData({\n                    transitionClass: '',\n                });\n            },\n            onTransitionEnd() {\n                if (this.customDuration) {\n                    return;\n                }\n                clearTimeout(this.transitionT);\n                if (this.status === 'entering' && this.data.visible) {\n                    this.entered();\n                }\n                else if (this.status === 'leaving' && !this.data.visible) {\n                    this.leaved();\n                    this.setData({\n                        realVisible: false,\n                    });\n                }\n            },\n        },\n    });\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/mixins/using-custom-navbar.d.ts",
    "content": "declare const useCustomNavbarBehavior: string;\nexport default useCustomNavbarBehavior;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/mixins/using-custom-navbar.js",
    "content": "import { systemInfo } from '../common/utils';\nconst useCustomNavbarBehavior = Behavior({\n    properties: {\n        usingCustomNavbar: {\n            type: Boolean,\n            value: false,\n        },\n        customNavbarHeight: {\n            type: Number,\n            value: 0,\n        },\n    },\n    data: {\n        distanceTop: 0,\n    },\n    lifetimes: {\n        attached() {\n            if (this.properties.usingCustomNavbar) {\n                this.calculateCustomNavbarDistanceTop();\n            }\n        },\n    },\n    methods: {\n        calculateCustomNavbarDistanceTop() {\n            const { statusBarHeight } = systemInfo;\n            const menuButton = wx.getMenuButtonBoundingClientRect();\n            const distance = menuButton.top + menuButton.bottom - statusBarHeight;\n            this.setData({\n                distanceTop: Math.max(distance, this.properties.customNavbarHeight + statusBarHeight),\n            });\n        },\n    },\n});\nexport default useCustomNavbarBehavior;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/navbar/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Navbar Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nanimation | Boolean | true | \\- | N\ncapsule | Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndelta | Number | 1 | \\- | N\nfixed | Boolean | true | \\- | N\nleft | Slot | - | `0.26.0`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nleft-arrow | Boolean | false | `0.26.0` | N\ntitle | String / Slot | - | page title。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ntitle-max-length | Number | - | \\- | N\nvisible | Boolean | true | \\- | N\n\n### Navbar Events\n\nname | params | description\n-- | -- | --\ncomplete | \\- | \\-\nfail | \\- | \\-\ngo-back | \\- | \\-\nsuccess | \\- | \\-\n### Navbar External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-capsule | \\-\nt-class-center | \\-\nt-class-home-icon | \\-\nt-class-left | \\-\nt-class-left-icon | \\-\nt-class-nav-btn | \\-\nt-class-title | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-navbar-bg-color | @bg-color-container | - \n--td-navbar-capsule-border-color | #e3e6ea | - \n--td-navbar-capsule-border-radius | 32rpx | - \n--td-navbar-capsule-height | 64rpx | - \n--td-navbar-capsule-width | 176rpx | - \n--td-navbar-color | @font-gray-1 | - \n--td-navbar-height | 96rpx | - \n--td-navbar-left-arrow-size | 48rpx | - \n--td-navbar-title-font-size | 36rpx | - \n--td-navbar-title-font-weight | 600 | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/navbar/README.md",
    "content": "---\ntitle: Navbar 导航栏\ndescription: 用于不同页面之间切换或者跳转，位于内容区的上方，系统状态栏的下方。\nspline: navigation\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-97%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-87%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-95%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-84%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-navbar\": \"tdesign-miniprogram/navbar/navbar\",\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/REHT3emm7kS5\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n\n### 基础导航栏\n\n{{ base }}\n\n### 胶囊样式导航栏\n\n{{ back-home }}\n\n### 带搜索导航栏\n\n{{ search }}\n\n### 带图片导航栏\n\n{{ img }}\n\n### 组件样式\n\n{{ left-title }}\n\n### 自定义颜色\n\n{{ custom-color }}\n\n## API\n\n### Navbar Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nanimation | Boolean | true | 是否添加动画效果 | N\ncapsule | Slot | - | 左侧胶囊区域。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ndelta | Number | 1 | 后退按钮后退层数，含义参考 [wx.navigateBack](https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateBack.html)，特殊的，传入 0 不会发生执行 wx.navigateBack | N\nfixed | Boolean | true | 是否固定在顶部 | N\nleft | Slot | - | `0.26.0`。左侧内容区域。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nleft-arrow | Boolean | false | `0.26.0`。是否展示左侧箭头 | N\ntitle | String / Slot | - | 页面标题。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ntitle-max-length | Number | - | 标题文字最大长度，超出的范围使用 `...` 表示 | N\nvisible | Boolean | true | 是否显示 | N\n\n### Navbar Events\n\n名称 | 参数 | 描述\n-- | -- | --\ncomplete | \\- | navigateBack 执行完成后触发（失败或成功均会触发）\nfail | \\- | navigateBack 执行失败后触发\ngo-back | \\- | 点击左侧箭头时触发\nsuccess | \\- | navigateBack 执行成功后触发\n### Navbar External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-capsule | 左侧胶囊区域样式类\nt-class-center | 中间内容样式类\nt-class-home-icon | 首页图标样式类\nt-class-left | 左侧内容样式类\nt-class-left-icon | 左侧图标样式类\nt-class-nav-btn | 导航按钮样式类\nt-class-title | 标题样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-navbar-bg-color | @bg-color-container | - \n--td-navbar-capsule-border-color | #e3e6ea | - \n--td-navbar-capsule-border-radius | 32rpx | - \n--td-navbar-capsule-height | 64rpx | - \n--td-navbar-capsule-width | 176rpx | - \n--td-navbar-color | @font-gray-1 | - \n--td-navbar-height | 96rpx | - \n--td-navbar-left-arrow-size | 48rpx | - \n--td-navbar-title-font-size | 36rpx | - \n--td-navbar-title-font-weight | 600 | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/navbar/navbar.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nexport default class Navbar extends SuperComponent {\n    externalClasses: string[];\n    timer: any;\n    options: {\n        multipleSlots: boolean;\n    };\n    properties: import(\"./type\").TdNavbarProps;\n    observers: {\n        visible(this: Navbar, visible: any): void;\n        'title,titleMaxLength'(this: any): void;\n    };\n    data: {\n        prefix: string;\n        classPrefix: string;\n        boxStyle: string;\n        showTitle: string;\n        hideLeft: boolean;\n        hideCenter: boolean;\n        _menuRect: any;\n        _leftRect: any;\n        _boxStyle: {};\n    };\n    attached(): void;\n    detached(): void;\n    methods: {\n        initStyle(): void;\n        calcCenterStyle(leftRect: WechatMiniprogram.BoundingClientRectResult, menuRect: WechatMiniprogram.BoundingClientRectResult, defaultStyle: object): void;\n        getLeftRect(): void;\n        getMenuRect(): void;\n        onMenuButtonBoundingClientRectWeightChange(): void;\n        offMenuButtonBoundingClientRectWeightChange(): void;\n        queryElements(capsuleRect: any): void;\n        goBack(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/navbar/navbar.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport { getRect, systemInfo } from '../common/utils';\nimport config from '../common/config';\nimport props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-navbar`;\nlet Navbar = class Navbar extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [\n            `${prefix}-class`,\n            `${prefix}-class-placeholder`,\n            `${prefix}-class-content`,\n            `${prefix}-class-title`,\n            `${prefix}-class-left`,\n            `${prefix}-class-center`,\n            `${prefix}-class-left-icon`,\n            `${prefix}-class-home-icon`,\n            `${prefix}-class-capsule`,\n            `${prefix}-class-nav-btn`,\n        ];\n        this.timer = null;\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = props;\n        this.observers = {\n            visible(visible) {\n                const { animation } = this.properties;\n                const visibleClass = `${name}${visible ? '--visible' : '--hide'}`;\n                this.setData({\n                    visibleClass: `${visibleClass}${animation ? '-animation' : ''}`,\n                });\n                if (this.timer) {\n                    clearTimeout(this.timer);\n                }\n                if (animation) {\n                    this.timer = setTimeout(() => {\n                        this.setData({\n                            visibleClass,\n                        });\n                    }, 300);\n                }\n            },\n            'title,titleMaxLength'() {\n                const { title } = this.properties;\n                const titleMaxLength = this.properties.titleMaxLength || Number.MAX_SAFE_INTEGER;\n                let temp = title.slice(0, titleMaxLength);\n                if (titleMaxLength < title.length)\n                    temp += '...';\n                this.setData({\n                    showTitle: temp,\n                });\n            },\n        };\n        this.data = {\n            prefix,\n            classPrefix: name,\n            boxStyle: '',\n            showTitle: '',\n            hideLeft: false,\n            hideCenter: false,\n            _menuRect: null,\n            _leftRect: null,\n            _boxStyle: {},\n        };\n        this.methods = {\n            initStyle() {\n                this.getMenuRect();\n                const { _menuRect, _leftRect } = this.data;\n                if (!_menuRect || !_leftRect || !systemInfo)\n                    return;\n                const _boxStyle = {\n                    '--td-navbar-padding-top': `${systemInfo.statusBarHeight}px`,\n                    '--td-navbar-right': `${systemInfo.windowWidth - _menuRect.left}px`,\n                    '--td-navbar-left-max-width': `${_menuRect.left}px`,\n                    '--td-navbar-capsule-height': `${_menuRect.height}px`,\n                    '--td-navbar-capsule-width': `${_menuRect.width}px`,\n                    '--td-navbar-height': `${(_menuRect.top - systemInfo.statusBarHeight) * 2 + _menuRect.height}px`,\n                };\n                this.calcCenterStyle(_leftRect, _menuRect, _boxStyle);\n            },\n            calcCenterStyle(leftRect, menuRect, defaultStyle) {\n                const maxSpacing = Math.max(leftRect.right, systemInfo.windowWidth - menuRect.left);\n                const _boxStyle = Object.assign(Object.assign({}, defaultStyle), { '--td-navbar-center-left': `${maxSpacing}px`, '--td-navbar-center-width': `${Math.max(menuRect.left - maxSpacing, 0)}px` });\n                const boxStyle = Object.entries(_boxStyle)\n                    .map(([k, v]) => `${k}: ${v}`)\n                    .join('; ');\n                this.setData({\n                    boxStyle,\n                    _boxStyle,\n                });\n            },\n            getLeftRect() {\n                getRect(this, `.${name}__left`).then((res) => {\n                    if (res.right > this.data._leftRect.right) {\n                        this.calcCenterStyle(res, this.data._menuRect, this.data._boxStyle);\n                    }\n                });\n            },\n            getMenuRect() {\n                if (wx.getMenuButtonBoundingClientRect) {\n                    const rect = wx.getMenuButtonBoundingClientRect();\n                    this.setData({\n                        _menuRect: rect,\n                        _leftRect: {\n                            right: systemInfo.windowWidth - rect.left,\n                        },\n                    });\n                }\n            },\n            onMenuButtonBoundingClientRectWeightChange() {\n                if (wx.onMenuButtonBoundingClientRectWeightChange) {\n                    wx.onMenuButtonBoundingClientRectWeightChange((res) => this.queryElements(res));\n                }\n            },\n            offMenuButtonBoundingClientRectWeightChange() {\n                if (wx.offMenuButtonBoundingClientRectWeightChange) {\n                    wx.offMenuButtonBoundingClientRectWeightChange((res) => this.queryElements(res));\n                }\n            },\n            queryElements(capsuleRect) {\n                Promise.all([\n                    getRect(this, `.${this.data.classPrefix}__left`),\n                    getRect(this, `.${this.data.classPrefix}__center`),\n                ]).then(([leftRect, centerRect]) => {\n                    if (Math.round(leftRect.right) > capsuleRect.left) {\n                        this.setData({\n                            hideLeft: true,\n                            hideCenter: true,\n                        });\n                    }\n                    else if (Math.round(centerRect.right) > capsuleRect.left) {\n                        this.setData({\n                            hideLeft: false,\n                            hideCenter: true,\n                        });\n                    }\n                    else {\n                        this.setData({\n                            hideLeft: false,\n                            hideCenter: false,\n                        });\n                    }\n                });\n            },\n            goBack() {\n                const { delta } = this.data;\n                const that = this;\n                this.triggerEvent('go-back');\n                if (delta > 0) {\n                    wx.navigateBack({\n                        delta,\n                        fail(e) {\n                            that.triggerEvent('fail', e);\n                        },\n                        complete(e) {\n                            that.triggerEvent('complete', e);\n                        },\n                        success(e) {\n                            that.triggerEvent('success', e);\n                        },\n                    });\n                }\n            },\n        };\n    }\n    attached() {\n        this.initStyle();\n        this.getLeftRect();\n        this.onMenuButtonBoundingClientRectWeightChange();\n    }\n    detached() {\n        this.offMenuButtonBoundingClientRectWeightChange();\n    }\n};\nNavbar = __decorate([\n    wxComponent()\n], Navbar);\nexport default Navbar;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/navbar/navbar.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/navbar/navbar.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n<view\n  class=\"{{_.cls(classPrefix, [['fixed', fixed]])}} {{visibleClass}} class {{prefix}}-class\"\n  style=\"{{_._style([boxStyle, style, customStyle])}}\"\n>\n  <view wx:if=\"{{fixed}}\" class=\"{{classPrefix}}__placeholder {{prefix}}-class-placeholder\" />\n  <view class=\"{{classPrefix}}__content {{prefix}}-class-content\">\n    <view class=\"{{classPrefix}}__left {{hideLeft ? classPrefix + '__left--hide' : ''}} {{prefix}}-class-left\">\n      <view wx:if=\"{{leftArrow}}\" class=\"{{classPrefix}}__btn\" bind:tap=\"goBack\" aria-role=\"button\" aria-label=\"返回\">\n        <t-icon name=\"chevron-left\" class=\"{{classPrefix}}__left-arrow\" />\n      </view>\n      <slot name=\"left\" />\n      <view class=\"{{classPrefix}}__capsule {{prefix}}-class-capsule\">\n        <slot name=\"capsule\" />\n      </view>\n    </view>\n    <view class=\"{{classPrefix}}__center {{hideCenter ? classPrefix + '__center--hide' : ''}} {{prefix}}-class-center\">\n      <slot name=\"title\" />\n      <text wx:if=\"{{title}}\" class=\"{{classPrefix}}__center-title {{prefix}}-class-title\">{{showTitle}}</text>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/navbar/navbar.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-navbar--fixed .t-navbar__content {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 5001;\n}\n.t-navbar--visible {\n  display: '';\n}\n.t-navbar--visible-animation {\n  opacity: 1;\n  transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.t-navbar--hide-animation {\n  opacity: 0;\n  transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.t-navbar--hide {\n  display: none;\n}\n.t-navbar__placeholder {\n  height: var(--td-navbar-height, 48px);\n  padding-top: var(--td-navbar-padding-top, 20px);\n  position: relative;\n  visibility: hidden;\n  box-sizing: content-box;\n}\n.t-navbar__content {\n  position: relative;\n  z-index: 1;\n  height: var(--td-navbar-height, 48px);\n  width: calc(100% - var(--td-navbar-right, 95px));\n  padding-right: var(--td-navbar-right, 95px);\n  padding-top: var(--td-navbar-padding-top, 20px);\n  color: var(--td-navbar-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  background-color: var(--td-navbar-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n  display: flex;\n  align-items: center;\n  box-sizing: content-box;\n}\n.t-navbar__left {\n  position: relative;\n  box-sizing: border-box;\n  max-width: var(--td-navbar-left-max-width);\n  overflow: hidden;\n  display: flex;\n  align-items: center;\n  margin-left: var(--td-spacer-1, 24rpx);\n  transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.t-navbar__left-arrow {\n  font-size: var(--td-navbar-left-arrow-size, 24px);\n}\n.t-navbar__left--hide {\n  opacity: 0;\n}\n.t-navbar__capsule {\n  box-sizing: border-box;\n  width: var(--td-navbar-capsule-width, 88px);\n  height: var(--td-navbar-capsule-height, 32px);\n  display: flex;\n  align-items: center;\n}\n.t-navbar__capsule::before {\n  content: '';\n  position: absolute;\n  z-index: -1;\n  top: 0;\n  left: 0;\n  width: 200%;\n  height: 200%;\n  transform: scale(0.5);\n  transform-origin: 0 0;\n  box-sizing: border-box;\n  border-radius: calc(var(--td-navbar-capsule-border-radius, 16px) * 2);\n  border: 2rpx solid var(--td-navbar-capsule-border-color, var(--td-border-level-1-color, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-navbar__capsule:empty {\n  display: none;\n}\n.t-navbar__center {\n  font-size: 18px;\n  text-align: center;\n  position: absolute;\n  bottom: 0;\n  left: var(--td-navbar-center-left, var(--td-navbar-right, 95px));\n  width: var(--td-navbar-center-width);\n  height: var(--td-navbar-height, 48px);\n  line-height: var(--td-navbar-height, 48px);\n  flex: 1;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  overflow: hidden;\n  transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n.t-navbar__center:empty {\n  display: none;\n}\n.t-navbar__center-title {\n  font-size: var(--td-navbar-title-font-size, 18px);\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  font-weight: var(--td-navbar-title-font-weight, 600);\n}\n.t-navbar__center--hide {\n  opacity: 0;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/navbar/props.d.ts",
    "content": "import { TdNavbarProps } from './type';\ndeclare const props: TdNavbarProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/navbar/props.js",
    "content": "const props = {\n    animation: {\n        type: Boolean,\n        value: true,\n    },\n    delta: {\n        type: Number,\n        value: 1,\n    },\n    fixed: {\n        type: Boolean,\n        value: true,\n    },\n    leftArrow: {\n        type: Boolean,\n        value: false,\n    },\n    title: {\n        type: String,\n    },\n    titleMaxLength: {\n        type: Number,\n    },\n    visible: {\n        type: Boolean,\n        value: true,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/navbar/type.d.ts",
    "content": "export interface TdNavbarProps {\n    animation?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    delta?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    fixed?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    leftArrow?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    title?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    titleMaxLength?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    visible?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/navbar/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Progress Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ncolor | String / Object / Array | '' | Typescript：`string \\| Array<string> \\| Record<string, string>` | N\nlabel | String / Boolean / Slot | true | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\npercentage | Number | 0 | \\- | N\nstatus | String | - | options: success/error/warning/active。Typescript：`ProgressStatus` `type ProgressStatus = 'success' \\| 'error' \\| 'warning' \\| 'active'`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/progress/type.ts) | N\nstroke-width | String / Number | - | \\- | N\ntheme | String | line | options: line/plump/circle。Typescript：`ProgressTheme` `type ProgressTheme = 'line' \\| 'plump' \\| 'circle'`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/progress/type.ts) | N\ntrack-color | String | '' | \\- | N\n\n### Progress External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-bar | \\-\nt-class-label | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\n\nName | Default Value | Description\n-- | -- | --\n--td-progress-circle-inner-bg-color | @font-white-1 | -\n--td-progress-circle-width | 224rpx | -\n--td-progress-circle-from | 0deg | -\n--td-progress-inner-bg-color | @brand-color | -\n--td-progress-line-stroke-width | 12rpx | -\n--td-progress-stroke-circle-width | 12rpx | -\n--td-progress-stroke-plump-width | 40rpx | -\n--td-progress-track-bg-color | @bg-color-component | -\n--td-progress-circle-label-font-size | 40rpx | -\n--td-progress-circle-label-line-height | 56rpx | -\n--td-progress-circle-label-font-weight | 700 | -\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/README.md",
    "content": "---\ntitle: Progress 进度条\ndescription: 用于展示任务当前的进度。\nspline: message\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-88%25-blue\" /></span>\n\n<div style=\"background: #ecf2fe; display: flex; align-items: center; line-height: 20px; padding: 14px 24px; border-radius: 3px; color: #555a65\">\n  <svg fill=\"none\" viewBox=\"0 0 16 16\" width=\"16px\" height=\"16px\" style=\"margin-right: 5px\">\n    <path fill=\"#0052d9\" d=\"M8 15A7 7 0 108 1a7 7 0 000 14zM7.4 4h1.2v1.2H7.4V4zm.1 2.5h1V12h-1V6.5z\" fillOpacity=\"0.9\"></path>\n  </svg>\n  该组件于 0.7.3 版本上线，请留意版本。\n</div>\n\n## 引入\n\n### 引入组件\n\n在 `app.json` 或 `page.json` 中引入组件：\n\n```json\n\"usingComponents\": {\n  \"t-progress\": \"tdesign-miniprogram/progress/progress\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/qua7YimQ7tSx\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 01 组件类型\n\n基础进度条\n\n{{ base }}\n\n过渡样式\n\n{{ transition }}\n\n自定义颜色/圆角\n\n{{ custom }}\n\n### 02 组件状态\n\n线性进度条\n\n{{ line }}\n\n百分比内显进度条\n\n{{ plump }}\n\n环形进度条\n\n{{ circle }}\n\n## API\n\n### Progress Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ncolor | String / Object / Array | '' | 进度条颜色。示例：'#ED7B2F' 或 'orange' 或 `['#f00', '#0ff', '#f0f']` 或 `{ '0%': '#f00', '100%': '#0ff' }` 或  `{ from: '#000', to: '#000' }` 等。TS 类型：`string \\| Array<string> \\| Record<string, string>` | N\nlabel | String / Boolean / Slot | true | 进度百分比，可自定义。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\npercentage | Number | 0 | 进度条百分比 | N\nstatus | String | - | 进度条状态。可选项：success/error/warning/active。TS 类型：`ProgressStatus` `type ProgressStatus = 'success' \\| 'error' \\| 'warning' \\| 'active'`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/progress/type.ts) | N\nstroke-width | String / Number | - | 进度条线宽，默认单位 `px` | N\ntheme | String | line | 进度条风格。值为 line，标签（label）显示在进度条右侧；值为 plump，标签（label）显示在进度条里面；值为 circle，标签（label）显示在进度条正中间。可选项：line/plump/circle。TS 类型：`ProgressTheme` `type ProgressTheme = 'line' \\| 'plump' \\| 'circle'`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/progress/type.ts) | N\ntrack-color | String | '' | 进度条未完成部分颜色 | N\n\n### Progress External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-bar | 进度文字样式类\nt-class-label | 标签样式类\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n\n名称 | 默认值 | 描述\n-- | -- | --\n--td-progress-circle-inner-bg-color | @font-white-1 | -\n--td-progress-circle-width | 224rpx | -\n--td-progress-circle-from | 0deg | -\n--td-progress-inner-bg-color | @brand-color | -\n--td-progress-line-stroke-width | 12rpx | -\n--td-progress-stroke-circle-width | 12rpx | -\n--td-progress-stroke-plump-width | 40rpx | -\n--td-progress-track-bg-color | @bg-color-component | -\n--td-progress-circle-label-font-size | 40rpx | -\n--td-progress-circle-label-line-height | 56rpx | -\n--td-progress-circle-label-font-weight | 700 | -\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/progress.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nexport default class Progress extends SuperComponent {\n    externalClasses: string[];\n    options: {\n        multipleSlots: boolean;\n    };\n    properties: import(\"./type\").TdProgressProps;\n    data: {\n        prefix: string;\n        classPrefix: string;\n        colorBar: string;\n        heightBar: string;\n        computedStatus: string;\n        computedProgress: number;\n        isIOS: boolean;\n    };\n    attached(): void;\n    observers: {\n        percentage(percentage: any): void;\n        color(color: any): void;\n        strokeWidth(strokeWidth: any): string;\n        trackColor(trackColor: any): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/progress.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nimport { getBackgroundColor } from './utils';\nimport { unitConvert, deviceInfo } from '../common/utils';\nconst { prefix } = config;\nconst name = `${prefix}-progress`;\nlet Progress = class Progress extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-bar`, `${prefix}-class-label`];\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n            colorBar: '',\n            heightBar: '',\n            computedStatus: '',\n            computedProgress: 0,\n            isIOS: false,\n        };\n        this.observers = {\n            percentage(percentage) {\n                percentage = Math.max(0, Math.min(percentage, 100));\n                this.setData({\n                    computedStatus: percentage === 100 ? 'success' : '',\n                    computedProgress: percentage,\n                });\n            },\n            color(color) {\n                this.setData({\n                    colorBar: getBackgroundColor(color),\n                    colorCircle: typeof color === 'object' ? '' : color,\n                });\n            },\n            strokeWidth(strokeWidth) {\n                if (!strokeWidth) {\n                    return '';\n                }\n                this.setData({\n                    heightBar: unitConvert(strokeWidth),\n                });\n            },\n            trackColor(trackColor) {\n                this.setData({\n                    bgColorBar: trackColor,\n                });\n            },\n        };\n    }\n    attached() {\n        var _a;\n        const isIOS = !!(((_a = deviceInfo === null || deviceInfo === void 0 ? void 0 : deviceInfo.system) === null || _a === void 0 ? void 0 : _a.toLowerCase().search('ios')) + 1);\n        this.setData({\n            isIOS,\n        });\n    }\n};\nProgress = __decorate([\n    wxComponent()\n], Progress);\nexport default Progress;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/progress.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/progress.wxml",
    "content": "<import src=\"../common/template/icon.wxml\" />\n<wxs src=\"../common/utils.wxs\" module=\"_\" />\n<wxs src=\"./progress.wxs\" module=\"this\" />\n\n<view style=\"{{_._style([style, customStyle])}}\" class=\"{{classPrefix}} class\">\n  <view\n    wx:if=\"{{theme === this.PRO_THEME.LINE}}\"\n    class=\"{{classPrefix }}--thin {{classPrefix}}--status--{{status || computedStatus}} {{prefix}}-class\"\n  >\n    <view\n      aria-role=\"progressbar\"\n      aria-valuemin=\"0\"\n      aria-valuemax=\"100\"\n      aria-valuenow=\"{{computedProgress}}\"\n      aria-label=\"{{ ariaLabel || (isIOS ? this.getIOSAriaLabel(status) : this.getAndroidAriaLabel(status))  }}\"\n      aria-live=\"polite\"\n      class=\"{{classPrefix }}__bar\"\n      style=\"height: {{heightBar}}px;border-radius: {{heightBar}}px;background-color: {{bgColorBar}}\"\n    >\n      <view\n        class=\"{{classPrefix }}__inner {{prefix}}-class-bar\"\n        style=\"background: {{colorBar}}; width: {{computedProgress + '%'}}\"\n      ></view>\n    </view>\n    <!-- aria-hidden=true 禁用掉额外的聚焦 -->\n    <view wx:if=\"{{label}}\" class=\"{{classPrefix}}__info {{prefix}}-class-label\" aria-hidden=\"{{ true }}\">\n      <template\n        wx:if=\"{{_.includes(this.STATUS, status)}}\"\n        is=\"icon\"\n        data=\"{{tClass: classPrefix + '__icon', size:'44rpx', name: this.LINE_STATUS_ICON[status]}}\"\n      ></template>\n      <text wx:else>{{ _.isString(label)? label: computedProgress + '%' }}</text>\n    </view>\n    <slot name=\"label\" />\n  </view>\n\n  <view\n    aria-role=\"progressbar\"\n    aria-valuemin=\"0\"\n    aria-valuemax=\"100\"\n    aria-valuenow=\"{{computedProgress}}\"\n    aria-label=\"{{ ariaLabel || (isIOS ? this.getIOSAriaLabel(status) : this.getAndroidAriaLabel(status))  }}\"\n    aria-live=\"polite\"\n    wx:if=\"{{theme === this.PRO_THEME.PLUMP}}\"\n    class=\"{{classPrefix}}__bar {{classPrefix}}--plump {{computedProgress > 10 ? classPrefix + '--over-ten':  classPrefix + '--under-ten'}} {{classPrefix}}--status--{{status || computedStatus}} {{prefix}}-class\"\n    style=\"height: {{heightBar}}px;border-radius: {{heightBar}}px;background-color: {{bgColorBar}}\"\n  >\n    <view\n      class=\"{{classPrefix}}__inner {{prefix}}-class-bar\"\n      style=\"background: {{colorBar}}; width: {{computedProgress}}%\"\n    >\n      <view wx:if=\"{{label && computedProgress > 10}}\" class=\"{{classPrefix }}__info {{prefix}}-class-label\">\n        <text>{{ _.isString(label)? label: computedProgress + '%' }}</text>\n      </view>\n      <slot wx:if=\"{{computedProgress > 10}}\" name=\"label\" />\n    </view>\n    <view\n      wx:if=\"{{label && computedProgress <= 10}}\"\n      class=\"{{ classPrefix }}__info {{prefix}}-class-label\"\n      aria-hidden=\"{{ true }}\"\n    >\n      <text>{{ _.isString(label)? label: computedProgress + '%' }}</text>\n    </view>\n    <slot wx:if=\"{{computedProgress <= 10}}\" name=\"label\" />\n  </view>\n\n  <view\n    wx:if=\"{{theme === this.PRO_THEME.CIRCLE}}\"\n    class=\"{{classPrefix}}--status--{{status || computedStatus}} {{prefix}}-class\"\n  >\n    <view\n      aria-role=\"progressbar\"\n      aria-valuemin=\"0\"\n      aria-valuemax=\"100\"\n      aria-valuenow=\"{{computedProgress}}\"\n      aria-label=\"{{ ariaLabel || (isIOS ? this.getIOSAriaLabel(status) : this.getAndroidAriaLabel(status))  }}\"\n      aria-live=\"polite\"\n      class=\"{{classPrefix}}__canvas--circle\"\n      style=\"background-image: conic-gradient(from var(--td-progress-circle-from), {{colorCircle || this.STATUS_COLOR[status] || 'var(--td-progress-inner-bg-color)'}} {{computedProgress}}%, {{bgColorBar || 'var(--td-progress-track-bg-color)'}} 0%);\"\n    >\n      <view\n        class=\"{{classPrefix}}__canvas--inner {{prefix}}-class-bar\"\n        style=\"{{heightBar? '--td-progress-stroke-circle-width:' + heightBar + 'px' : ''}}\"\n      >\n        <view wx:if=\"{{label}}\" class=\"{{classPrefix}}__info {{prefix}}-class-label\" aria-hidden=\"{{ true }}\">\n          <template\n            wx:if=\"{{_.includes(this.STATUS, status)}}\"\n            is=\"icon\"\n            data=\"{{tClass: classPrefix + '__icon', size:'96rpx', name: this.CIRCLE_STATUS_ICON[status]}}\"\n          ></template>\n          <text wx:else>{{ _.isString(label)? label: computedProgress + '%' }}</text>\n        </view>\n        <slot name=\"label\" />\n      </view>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/progress.wxs",
    "content": "var STATUS = ['success', 'error', 'warning'];\nvar STATUS_TEXT = ['success', 'error', 'warning', 'active'];\n\nvar PRO_THEME = {\n  LINE: 'line',\n  PLUMP: 'plump',\n  CIRCLE: 'circle',\n};\n\nvar STATUS_COLOR = {\n  success: '#00a870',\n  error: '#e34d59',\n  warning: '#ed7b2f',\n};\nvar LINE_STATUS_ICON = {\n  success: 'check-circle-filled',\n  error: 'error-circle-filled',\n  warning: 'error-circle-filled',\n};\nvar CIRCLE_STATUS_ICON = {\n  success: 'check',\n  error: 'close',\n  warning: 'error',\n};\n\n/**\n *\n * 1. getIOSAriaLabel， getAndroidAriaLabel 两个函数的初衷是处理progress异常情况的文案识别。\n * 2. iOS可以识别%，而安卓不会识别%，如 80， iOS可以识别成 80%， 而安卓只会80，因此android部分做了一个% 拼接，后续看是否有更好的方案去解决。\n * 3. 安卓 talkback 版本为 8.1.0.278818032 ，只会读一次 80， 最新版本talkback 会读 80.0, 80。（目前也是一个痛点，啰嗦了）\n *\n */\n\nvar getIOSAriaLabel = function (status) {\n  if (status === 'error') {\n    return '进度失败';\n  }\n  if (status === 'warning') {\n    return '进度异常';\n  }\n  return '';\n};\n\nvar getAndroidAriaLabel = function (status) {\n  if (status === 'error') {\n    return '%' + '，进度失败';\n  }\n  if (status === 'warning') {\n    return '%' + '，进度异常';\n  }\n  return '%';\n};\n\nmodule.exports = {\n  STATUS: STATUS,\n  STATUS_TEXT: STATUS_TEXT,\n  PRO_THEME: PRO_THEME,\n  STATUS_COLOR: STATUS_COLOR,\n  LINE_STATUS_ICON: LINE_STATUS_ICON,\n  CIRCLE_STATUS_ICON: CIRCLE_STATUS_ICON,\n  getAndroidAriaLabel: getAndroidAriaLabel,\n  getIOSAriaLabel: getIOSAriaLabel,\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/progress.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-progress {\n  --td-progress-inner-bg-color: var(--td-brand-color, var(--td-primary-color-7, #0052d9));\n  --td-progress-track-bg-color: var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7));\n  --td-progress-circle-from: 0deg;\n}\n.t-progress__inner {\n  position: relative;\n  height: 100%;\n  background: var(--td-progress-inner-bg-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  border-radius: var(--td-radius-round, 999px);\n  transition: all var(--td-anim-duration-base, 0.2s) var(--td-anim-time-fn-easing, cubic-bezier(0.38, 0, 0.24, 1));\n}\n.t-progress__bar {\n  width: 100%;\n  height: var(--td-progress-line-stroke-width, 12rpx);\n  overflow: hidden;\n  background: var(--td-progress-track-bg-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  border-radius: var(--td-radius-round, 999px);\n}\n.t-progress__info {\n  padding-left: var(--td-spacer, 16rpx);\n  box-sizing: border-box;\n  color: var(--td-progress-info-dark-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  white-space: nowrap;\n  display: inline-flex;\n}\n.t-progress--thin {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n.t-progress--thin .t-progress__icon {\n  font-size: calc(var(--td-font-size-base, 28rpx) + 2px);\n}\n.t-progress--plump {\n  height: var(--td-progress-stroke-plump-width, 40rpx);\n  border-radius: calc(var(--td-progress-stroke-plump-width, 40rpx) / 2);\n  display: flex;\n  align-items: center;\n}\n.t-progress--plump .t-progress__info {\n  font-size: var(--td-font-size-s, 24rpx);\n}\n.t-progress--over-ten .t-progress__info {\n  position: absolute;\n  top: 50%;\n  right: var(--td-spacer, 16rpx);\n  color: var(--td-progress-info-light-color, var(--td-text-color-anti, var(--td-font-white-1, #ffffff)));\n  transform: translateY(-50%);\n}\n.t-progress--under-ten .t-progress__info,\n.t-progress--under-ten .t-progress__inner {\n  display: inline-block;\n}\n.t-progress--under-ten .t-progress__info {\n  vertical-align: top;\n}\n.t-progress__canvas--circle {\n  position: relative;\n  width: var(--td-progress-circle-width, 224rpx);\n  height: var(--td-progress-circle-width, 224rpx);\n  border-radius: var(--td-radius-circle, 50%);\n}\n.t-progress__canvas--circle .t-progress__canvas--inner {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -50%);\n  width: calc(100% - var(--td-progress-stroke-circle-width, 12rpx)*2);\n  height: calc(100% - var(--td-progress-stroke-circle-width, 12rpx)*2);\n  border-radius: var(--td-radius-circle, 50%);\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n  align-items: center;\n  background-color: var(--td-progress-circle-inner-bg-color, var(--td-text-color-anti, var(--td-font-white-1, #ffffff)));\n}\n.t-progress__canvas--circle .t-progress__info {\n  margin: 0;\n  font-size: var(--td-progress-circle-label-font-size, 40rpx);\n  font-weight: var(--td-progress-circle-label-font-weight, 700);\n  line-height: var(--td-progress-circle-label-line-height, 56rpx);\n  overflow: hidden;\n  text-overflow: ellipsis;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n}\n.t-progress__canvas--circle .t-progress__icon {\n  font-size: 96rpx;\n}\n.t-progress--status--active .t-progress__inner::before {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  content: '';\n  animation: progress-active-animation 2s cubic-bezier(0.23, 0.99, 0.86, 0.2) infinite;\n  background: var(--td-progress-inner-bg-color-active, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n  opacity: 0.2;\n}\n.t-progress--status--success .t-progress__inner {\n  background: var(--td-progress-inner-bg-color-success, var(--td-success-color, var(--td-success-color-5, #2ba471)));\n}\n.t-progress--status--success .t-progress__icon {\n  color: var(--td-success-color, var(--td-success-color-5, #2ba471));\n}\n.t-progress--status--warning .t-progress__inner {\n  background: var(--td-progress-inner-bg-color-warning, var(--td-warning-color, var(--td-warning-color-5, #e37318)));\n}\n.t-progress--status--warning .t-progress__icon {\n  color: var(--td-warning-color, var(--td-warning-color-5, #e37318));\n}\n.t-progress--status--error .t-progress__inner {\n  background: var(--td-progress-inner-bg-color-error, var(--td-error-color, var(--td-error-color-6, #d54941)));\n}\n.t-progress--status--error .t-progress__icon {\n  color: var(--td-error-color, var(--td-error-color-6, #d54941));\n}\n@keyframes progress-active-animation {\n  0% {\n    width: 0;\n    opacity: 0.1;\n  }\n  35% {\n    width: 50%;\n    opacity: 0.4;\n  }\n  100% {\n    width: 100%;\n    opacity: 0;\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/props.d.ts",
    "content": "import { TdProgressProps } from './type';\ndeclare const props: TdProgressProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/props.js",
    "content": "const props = {\n    color: {\n        type: null,\n        value: '',\n    },\n    label: {\n        type: null,\n        value: true,\n    },\n    percentage: {\n        type: Number,\n        value: 0,\n    },\n    status: {\n        type: String,\n    },\n    strokeWidth: {\n        type: null,\n    },\n    style: {\n        type: String,\n        value: '',\n    },\n    theme: {\n        type: String,\n        value: 'line',\n    },\n    trackColor: {\n        type: String,\n        value: '',\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/type.d.ts",
    "content": "export interface TdProgressProps {\n    color?: {\n        type: null;\n        value?: string | Array<string> | Record<string, string>;\n    };\n    label?: {\n        type: null;\n        value?: string | boolean;\n    };\n    percentage?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    status?: {\n        type: StringConstructor;\n        value?: ProgressStatus;\n    };\n    strokeWidth?: {\n        type: null;\n        value?: string | number;\n    };\n    style?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    theme?: {\n        type: StringConstructor;\n        value?: ProgressTheme;\n    };\n    trackColor?: {\n        type: StringConstructor;\n        value?: string;\n    };\n}\nexport declare type ProgressStatus = 'success' | 'error' | 'warning' | 'active';\nexport declare type ProgressTheme = 'line' | 'plump' | 'circle';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/utils.d.ts",
    "content": "export declare type Gradients = {\n    [percent: string]: string;\n};\nexport declare type FromTo = {\n    from: string;\n    to: string;\n};\nexport declare type LinearGradient = {\n    direction?: string;\n} & (Gradients | FromTo);\nexport declare function getBackgroundColor(color: string | string[] | LinearGradient): string;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/progress/utils.js",
    "content": "var __rest = (this && this.__rest) || function (s, e) {\n    var t = {};\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n        t[p] = s[p];\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                t[p[i]] = s[p[i]];\n        }\n    return t;\n};\nexport function getBackgroundColor(color) {\n    if (typeof color === 'string') {\n        return color;\n    }\n    if (Array.isArray(color)) {\n        if (color[0] && color[0][0] === '#') {\n            color.unshift('90deg');\n        }\n        return `linear-gradient( ${color.join(',')} )`;\n    }\n    const { from, to, direction = 'to right' } = color, rest = __rest(color, [\"from\", \"to\", \"direction\"]);\n    let keys = Object.keys(rest);\n    if (keys.length) {\n        keys = keys.sort((a, b) => parseFloat(a.substr(0, a.length - 1)) - parseFloat(b.substr(0, b.length - 1)));\n        const tempArr = keys.map((key) => `${rest[key]} ${key}`);\n        return `linear-gradient(${direction}, ${tempArr.join(',')})`;\n    }\n    return `linear-gradient(${direction}, ${from}, ${to})`;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Radio Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nallow-uncheck | Boolean | false | \\- | N\nblock | Boolean | true | \\- | N\nchecked | Boolean | false | \\- | N\ndefault-checked | Boolean | undefined | uncontrolled property | N\ncontent | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ncontent-disabled | Boolean | false | \\- | N\ndisabled | Boolean | undefined | \\- | N\nicon | String / Array / Slot | 'circle' | Typescript：`'circle' \\| 'line' \\| 'dot' \\| Array<string>` | N\nlabel | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmax-content-row | Number | 5 | \\- | N\nmax-label-row | Number | 3 | \\- | N\nname | String | - | \\- | N\nplacement | String | left | options: left/right | N\nreadonly | Boolean | false | \\- | N\nvalue | String / Number / Boolean | false | Typescript：`T` `type RadioValue = string \\| number \\| boolean`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/radio/type.ts) | N\n\n### Radio Events\n\nname | params | description\n-- | -- | --\nchange | `(checked: boolean)` | \\-\n\n### Radio External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-border | \\-\nt-class-content | \\-\nt-class-icon | \\-\nt-class-label | \\-\n\n\n### RadioGroup Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nallow-uncheck | Boolean | false | \\- | N\nborderless | Boolean | false | \\- | N\ndisabled | Boolean | undefined | \\- | N\nicon | String / Array | 'circle' | Typescript：`'circle' \\| 'line' \\| 'dot' \\| Array<string>` | N\nkeys | Object | - | Typescript：`KeysType`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nname | String | - | \\- | N\noptions | Array | - | Typescript：`Array<RadioOption>` `type RadioOption = string \\| number \\| RadioOptionObj` `interface RadioOptionObj { label?: string; value?: string \\| number; readonly?: boolean; disabled?: boolean; allowUncheck?: boolean; }`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/radio-group/type.ts) | N\nplacement | String | left | options: left/right | N\nvalue | String / Number / Boolean | - | Typescript：`T` `type RadioValue = string \\| number \\| boolean`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/radio-group/type.ts) | N\ndefault-value | String / Number / Boolean | undefined | uncontrolled property。Typescript：`T` `type RadioValue = string \\| number \\| boolean`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/radio-group/type.ts) | N\n\n### RadioGroup Events\n\nname | params | description\n-- | -- | --\nchange | `(value: RadioValue)` | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-radio-bg-color | @bg-color-container | - \n--td-radio-border-color | @component-stroke | - \n--td-radio-content-checked-color | @font-gray-2 | - \n--td-radio-content-color | @font-gray-2 | - \n--td-radio-content-disabled-color | @font-gray-4 | - \n--td-radio-content-font-size | 28rpx | - \n--td-radio-content-line-height | 44rpx | - \n--td-radio-font-size | 32rpx | - \n--td-radio-icon-checked-color | @brand-color | - \n--td-radio-icon-color | @component-border | - \n--td-radio-icon-disabled-bg-color | @bg-color-component-disabled | - \n--td-radio-icon-disabled-color | @brand-color-disabled | - \n--td-radio-icon-size | 48rpx | - \n--td-radio-label-checked-color | @font-gray-1 | - \n--td-radio-label-color | @font-gray-1 | - \n--td-radio-label-disabled-color | @font-gray-4 | - \n--td-radio-label-line-height | 48rpx | - \n--td-radio-vertical-padding | 32rpx | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio/README.md",
    "content": "---\ntitle: Radio 单选框\ndescription: 用于在预设的一组选项中执行单项选择，并呈现选择结果。\nspline: form\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-98%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-99%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-88%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-radio\": \"tdesign-miniprogram/radio/radio\",\n  \"t-radio-group\": \"tdesign-miniprogram/radio-group/radio-group\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/GW6DrimI7hSV\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 纵向单选框\n\n{{ base }}\n\n### 横向单选框\n\n{{ horizontal }}\n\n### 单选框状态\n\n{{ status }}\n\n### 勾选样式\n\n{{ theme }}\n\n### 勾选显示位置\n\n{{ align }}\n\n### 非通栏单选样式\n\n{{ card }}\n\n### 特殊样式\n\n{{ special }}\n\n## API\n\n### Radio Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nallow-uncheck | Boolean | false | 是否允许取消选中 | N\nblock | Boolean | true | 是否为块级元素 | N\nchecked | Boolean | false | 是否选中 | N\ndefault-checked | Boolean | undefined | 是否选中。非受控属性 | N\ncontent | String / Slot | - | 单选内容。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\ncontent-disabled | Boolean | false | 是否禁用组件内容（content）触发选中 | N\ndisabled | Boolean | undefined | 是否为禁用态 | N\nicon | String / Array / Slot | 'circle' | 自定义选中图标和非选中图标。使用 Array 时表示：`[选中态图标，非选中态图标]`。使用 String 时，值为 circle 表示填充型图标、值为 line 表示描边型图标、值为 dot 表示圆点图标，值为 slot 时使用插槽。TS 类型：`'circle' \\| 'line' \\| 'dot' \\| Array<string>` | N\nlabel | String / Slot | - | 主文案。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nmax-content-row | Number | 5 | 内容最大行数限制 | N\nmax-label-row | Number | 3 | 主文案最大行数限制 | N\nname | String | - | HTML 元素原生属性 | N\nplacement | String | left | 复选框和内容相对位置。可选项：left/right | N\nreadonly | Boolean | false | 只读状态 | N\nvalue | String / Number / Boolean | false | 单选按钮的值。TS 类型：`T` `type RadioValue = string \\| number \\| boolean`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/radio/type.ts) | N\n\n### Radio Events\n\n名称 | 参数 | 描述\n-- | -- | --\nchange | `(checked: boolean)` | 值变化时触发\n\n### Radio External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-border | 边框样式类\nt-class-content | 内容样式类\nt-class-icon | 图标样式类\nt-class-label | 标签样式类\n\n\n### RadioGroup Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nallow-uncheck | Boolean | false | 是否允许取消选中 | N\nborderless | Boolean | false | 是否开启无边框模式 | N\ndisabled | Boolean | undefined | 是否禁用全部子单选框 | N\nicon | String / Array | 'circle' | 自定义选中图标和非选中图标。示例：[选中态图标，非选中态图标]。使用 String 时，值为 circle 表示填充型图标、值为 line 表示描边型图标、值为 dot 表示圆点图标；仅在使用 options 时生效。TS 类型：`'circle' \\| 'line' \\| 'dot' \\| Array<string>` | N\nkeys | Object | - | 用来定义 value / label 在 `options` 中对应的字段别名。TS 类型：`KeysType`。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nname | String | - | HTML 元素原生属性 | N\noptions | Array | - | 单选组件按钮形式。RadioOption 数据类型为 string 或 number 时，表示 label 和 value 值相同。TS 类型：`Array<RadioOption>` `type RadioOption = string \\| number \\| RadioOptionObj` `interface RadioOptionObj { label?: string; value?: string \\| number; readonly?: boolean; disabled?: boolean; allowUncheck?: boolean; }`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/radio-group/type.ts) | N\nplacement | String | left | 复选框和内容相对位置。可选项：left/right | N\nvalue | String / Number / Boolean | - | 选中的值。TS 类型：`T` `type RadioValue = string \\| number \\| boolean`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/radio-group/type.ts) | N\ndefault-value | String / Number / Boolean | undefined | 选中的值。非受控属性。TS 类型：`T` `type RadioValue = string \\| number \\| boolean`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/radio-group/type.ts) | N\n\n### RadioGroup Events\n\n名称 | 参数 | 描述\n-- | -- | --\nchange | `(value: RadioValue)` | 选中值发生变化时触发\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-radio-bg-color | @bg-color-container | - \n--td-radio-border-color | @component-stroke | - \n--td-radio-content-checked-color | @font-gray-2 | - \n--td-radio-content-color | @font-gray-2 | - \n--td-radio-content-disabled-color | @font-gray-4 | - \n--td-radio-content-font-size | 28rpx | - \n--td-radio-content-line-height | 44rpx | - \n--td-radio-font-size | 32rpx | - \n--td-radio-icon-checked-color | @brand-color | - \n--td-radio-icon-color | @component-border | - \n--td-radio-icon-disabled-bg-color | @bg-color-component-disabled | - \n--td-radio-icon-disabled-color | @brand-color-disabled | - \n--td-radio-icon-size | 48rpx | - \n--td-radio-label-checked-color | @font-gray-1 | - \n--td-radio-label-color | @font-gray-1 | - \n--td-radio-label-disabled-color | @font-gray-4 | - \n--td-radio-label-line-height | 48rpx | - \n--td-radio-vertical-padding | 32rpx | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio/props.d.ts",
    "content": "import { TdRadioProps } from './type';\ndeclare const props: TdRadioProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio/props.js",
    "content": "const props = {\n    allowUncheck: {\n        type: Boolean,\n        value: false,\n    },\n    block: {\n        type: Boolean,\n        value: true,\n    },\n    checked: {\n        type: Boolean,\n        value: null,\n    },\n    defaultChecked: {\n        type: Boolean,\n        value: false,\n    },\n    content: {\n        type: String,\n    },\n    contentDisabled: {\n        type: Boolean,\n        value: false,\n    },\n    disabled: {\n        type: null,\n        value: undefined,\n    },\n    icon: {\n        type: null,\n        value: 'circle',\n    },\n    label: {\n        type: String,\n    },\n    maxContentRow: {\n        type: Number,\n        value: 5,\n    },\n    maxLabelRow: {\n        type: Number,\n        value: 3,\n    },\n    name: {\n        type: String,\n        value: '',\n    },\n    placement: {\n        type: String,\n        value: 'left',\n    },\n    readonly: {\n        type: Boolean,\n        value: false,\n    },\n    value: {\n        type: null,\n        value: false,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio/radio.d.ts",
    "content": "import { SuperComponent, RelationsOptions } from '../common/src/index';\nexport default class Radio extends SuperComponent {\n    externalClasses: string[];\n    behaviors: string[];\n    relations: RelationsOptions;\n    options: {\n        multipleSlots: boolean;\n    };\n    lifetimes: {\n        attached(): void;\n    };\n    properties: {\n        borderless: {\n            type: BooleanConstructor;\n            value: boolean;\n        };\n        tId: {\n            type: StringConstructor;\n        };\n        allowUncheck?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        block?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        checked?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        defaultChecked?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        content?: {\n            type: StringConstructor;\n            value?: string;\n        };\n        contentDisabled?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        disabled?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        icon?: {\n            type: null;\n            value?: string[] | \"circle\" | \"line\" | \"dot\";\n        };\n        label?: {\n            type: StringConstructor;\n            value?: string;\n        };\n        maxContentRow?: {\n            type: NumberConstructor;\n            value?: number;\n        };\n        maxLabelRow?: {\n            type: NumberConstructor;\n            value?: number;\n        };\n        name?: {\n            type: StringConstructor;\n            value?: string;\n        };\n        placement?: {\n            type: StringConstructor;\n            value?: \"left\" | \"right\";\n        };\n        readonly?: {\n            type: BooleanConstructor;\n            value?: boolean;\n        };\n        value?: {\n            type: null;\n            value?: import(\"./type\").RadioValue;\n        };\n    };\n    controlledProps: {\n        key: string;\n        event: string;\n    }[];\n    data: {\n        prefix: string;\n        classPrefix: string;\n        customIcon: boolean;\n        slotIcon: boolean;\n        optionLinked: boolean;\n        iconVal: any[];\n        _placement: string;\n        _disabled: boolean;\n    };\n    observers: {\n        disabled(v: any): void;\n    };\n    methods: {\n        handleTap(e: any): void;\n        doChange(): void;\n        init(): void;\n        setDisabled(disabled: Boolean): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio/radio.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport config from '../common/config';\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport Props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-radio`;\nlet Radio = class Radio extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [\n            `${prefix}-class`,\n            `${prefix}-class-label`,\n            `${prefix}-class-icon`,\n            `${prefix}-class-content`,\n            `${prefix}-class-border`,\n        ];\n        this.behaviors = ['wx://form-field'];\n        this.relations = {\n            '../radio-group/radio-group': {\n                type: 'ancestor',\n                linked(parent) {\n                    if (parent.data.borderless) {\n                        this.setData({ borderless: true });\n                    }\n                },\n            },\n        };\n        this.options = {\n            multipleSlots: true,\n        };\n        this.lifetimes = {\n            attached() {\n                this.init();\n            },\n        };\n        this.properties = Object.assign(Object.assign({}, Props), { borderless: {\n                type: Boolean,\n                value: false,\n            }, tId: {\n                type: String,\n            } });\n        this.controlledProps = [\n            {\n                key: 'checked',\n                event: 'change',\n            },\n        ];\n        this.data = {\n            prefix,\n            classPrefix: name,\n            customIcon: false,\n            slotIcon: false,\n            optionLinked: false,\n            iconVal: [],\n            _placement: '',\n            _disabled: false,\n        };\n        this.observers = {\n            disabled(v) {\n                this.setData({ _disabled: v });\n            },\n        };\n        this.methods = {\n            handleTap(e) {\n                const { _disabled, readonly, contentDisabled } = this.data;\n                const { target } = e.currentTarget.dataset;\n                if (_disabled || readonly || (target === 'text' && contentDisabled))\n                    return;\n                this.doChange();\n            },\n            doChange() {\n                var _a;\n                const { value, checked, allowUncheck } = this.data;\n                const isAllowUncheck = Boolean(allowUncheck || ((_a = this.$parent) === null || _a === void 0 ? void 0 : _a.data.allowUncheck));\n                if (this.$parent) {\n                    this.$parent.updateValue(checked && isAllowUncheck ? null : value);\n                }\n                else {\n                    this._trigger('change', { checked: isAllowUncheck ? !checked : true });\n                }\n            },\n            init() {\n                var _a, _b, _c, _d, _e, _f;\n                const { icon } = this.data;\n                const isIdArr = Array.isArray(((_a = this.$parent) === null || _a === void 0 ? void 0 : _a.icon) || icon);\n                this.setData({\n                    customIcon: isIdArr,\n                    slotIcon: icon === 'slot',\n                    iconVal: isIdArr ? ((_b = this.$parent) === null || _b === void 0 ? void 0 : _b.icon) || icon : [],\n                    _placement: (_f = (_c = this.data.placement) !== null && _c !== void 0 ? _c : (_e = (_d = this.$parent) === null || _d === void 0 ? void 0 : _d.data) === null || _e === void 0 ? void 0 : _e.placement) !== null && _f !== void 0 ? _f : 'left',\n                });\n            },\n            setDisabled(disabled) {\n                this.setData({\n                    _disabled: this.data.disabled || disabled,\n                });\n            },\n        };\n    }\n};\nRadio = __decorate([\n    wxComponent()\n], Radio);\nexport default Radio;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio/radio.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio/radio.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  id=\"{{tId}}\"\n  style=\"{{_._style([style, customStyle])}}\"\n  class=\"{{_.cls(classPrefix, [_placement, ['block', block]])}} class {{prefix}}-class\"\n  disabled=\"{{_disabled}}\"\n  aria-role=\"radio\"\n  aria-checked=\"{{checked}}\"\n  aria-label=\"{{label + content}}\"\n  aria-disabled=\"{{_disabled}}\"\n  tabindex=\"{{tabindex}}\"\n  mut-bind:tap=\"handleTap\"\n>\n  <view\n    class=\"{{_.cls(classPrefix + '__icon', [_placement, ['checked', checked], ['disabled', _disabled]])}} {{prefix}}-class-icon\"\n  >\n    <slot name=\"icon\" wx:if=\"{{slotIcon}}\" />\n    <view wx:elif=\"{{customIcon}}\" class=\"{{classPrefix}}__image\">\n      <image src=\"{{checked ? iconVal[0] : iconVal[1]}}\" class=\"{{classPrefix}}-icon__image\" webp />\n    </view>\n    <block wx:else>\n      <t-icon\n        wx:if=\"{{checked && (icon == 'circle' || icon == 'line')}}\"\n        name=\"{{icon == 'circle' ? 'check-circle-filled' : 'check'}}\"\n        class=\"{{classPrefix}}__icon-wrap\"\n      />\n      <view\n        wx:if=\"{{checked && icon == 'dot'}}\"\n        class=\"{{_.cls(classPrefix + '__icon-' + icon, [['disabled', _disabled]])}}\"\n      />\n      <view\n        wx:if=\"{{!checked && (icon == 'circle' || icon == 'dot')}}\"\n        class=\"{{_.cls(classPrefix + '__icon-circle', [['disabled', _disabled]])}}\"\n      />\n      <!-- line && unchecked 为空 需要展位元素 -->\n      <view wx:if=\"{{!checked && icon == 'line'}}\" class=\"placeholder\"></view>\n    </block>\n  </view>\n\n  <view class=\"{{classPrefix}}__content\" data-target=\"text\" mut-bind:tap=\"handleTap\">\n    <view\n      class=\"{{_.cls(classPrefix + '__title', [['disabled', _disabled], ['checked', checked]])}} {{prefix}}-class-label\"\n      style=\"-webkit-line-clamp:{{maxLabelRow}}\"\n    >\n      <block wx:if=\"{{label}}\">{{label}}</block>\n      <slot />\n      <slot name=\"label\" />\n    </view>\n\n    <view\n      class=\"{{_.cls(classPrefix + '__description', [['disabled', _disabled], ['checked', checked]])}} {{prefix}}-class-content \"\n      style=\"-webkit-line-clamp:{{maxContentRow}}\"\n    >\n      <block wx:if=\"{{content}}\">{{content}}</block>\n      <slot name=\"content\" />\n    </view>\n  </view>\n\n  <view wx:if=\"{{!borderless}}\" class=\"{{_.cls(classPrefix + '__border', [_placement])}} {{prefix}}-class-border\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio/radio.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.limit-title-row {\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  overflow: hidden;\n}\n.t-radio {\n  position: relative;\n  display: inline-flex;\n  vertical-align: middle;\n  font-size: var(--td-radio-font-size, 32rpx);\n  background: var(--td-radio-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n}\n.t-radio:focus {\n  outline: 0;\n}\n.t-radio--block {\n  display: flex;\n  padding: var(--td-radio-vertical-padding, 32rpx);\n}\n.t-radio--right {\n  flex-direction: row-reverse;\n}\n.t-radio__icon {\n  position: relative;\n  margin-top: calc((var(--td-radio-label-line-height, 48rpx) - var(--td-radio-icon-size, 48rpx)) / 2);\n  width: var(--td-radio-icon-size, 48rpx);\n  height: var(--td-radio-icon-size, 48rpx);\n  font-size: var(--td-radio-icon-size, 48rpx);\n  color: var(--td-radio-icon-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));\n  overflow: hidden;\n}\n.t-radio__icon:empty {\n  display: none;\n}\n.t-radio__icon--left {\n  margin-right: 16rpx;\n}\n.t-radio__icon--checked {\n  color: var(--td-radio-icon-checked-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-radio__icon--disabled {\n  cursor: not-allowed;\n  color: var(--td-radio-icon-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-radio__icon-circle {\n  width: var(--td-radio-icon-size, 48rpx);\n  height: var(--td-radio-icon-size, 48rpx);\n  box-sizing: border-box;\n}\n.t-radio__icon-circle::after {\n  content: '';\n  width: calc(200% - 6rpx);\n  height: calc(200% - 6rpx);\n  border-radius: 50%;\n  border: 3px solid var(--td-radio-icon-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%) scale(0.5);\n  box-sizing: border-box;\n}\n.t-radio__icon-circle--disabled::after {\n  background: var(--td-radio-icon-disabled-bg-color, var(--td-bg-color-component-disabled, var(--td-gray-color-2, #eeeeee)));\n}\n.t-radio__icon-line::before,\n.t-radio__icon-line::after {\n  content: '';\n  display: block;\n  position: absolute;\n  width: 5rpx;\n  border-radius: 2rpx;\n  background: var(--td-radio-icon-checked-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  transform-origin: top center;\n}\n.t-radio__icon-line::before {\n  height: 16rpx;\n  left: 8rpx;\n  top: 22rpx;\n  transform: rotate(-45deg);\n}\n.t-radio__icon-line::after {\n  height: 26rpx;\n  right: 8rpx;\n  top: 14rpx;\n  transform: rotate(45deg);\n}\n.t-radio__icon-line--disabled::before,\n.t-radio__icon-line--disabled::after {\n  background: var(--td-radio-icon-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-radio__icon-dot {\n  width: calc((var(--td-radio-icon-size, 48rpx) - 6rpx) * 2);\n  height: calc((var(--td-radio-icon-size, 48rpx) - 6rpx) * 2);\n  border: 6rpx solid var(--td-radio-icon-checked-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  border-radius: 50%;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%) scale(0.5);\n  box-sizing: border-box;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.t-radio__icon-dot::after {\n  content: '';\n  display: block;\n  width: var(--td-radio-icon-size, 48rpx);\n  height: var(--td-radio-icon-size, 48rpx);\n  background: var(--td-radio-icon-checked-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  border-radius: 50%;\n}\n.t-radio__icon-dot--disabled {\n  border-color: var(--td-radio-icon-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-radio__icon-dot--disabled::after {\n  background: var(--td-radio-icon-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-radio__image {\n  line-height: var(--td-radio-icon-size, 48rpx);\n}\n.t-radio-icon__image {\n  height: var(--td-radio-icon-size, 48rpx);\n  width: var(--td-radio-icon-size, 48rpx);\n  vertical-align: sub;\n}\n.t-radio__content {\n  flex: 1;\n}\n.t-radio__content:empty {\n  display: none;\n}\n.t-radio__title {\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  overflow: hidden;\n  color: var(--td-radio-label-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  line-height: var(--td-radio-label-line-height, 48rpx);\n}\n.t-radio__title--checked {\n  color: var(--td-radio-label-checked-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n}\n.t-radio__title--disabled {\n  cursor: not-allowed;\n  color: var(--td-radio-label-disabled-color, var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26))));\n}\n.t-radio__description {\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  overflow: hidden;\n  color: var(--td-radio-content-color, var(--td-text-color-secondary, var(--td-font-gray-2, rgba(0, 0, 0, 0.6))));\n  font-size: var(--td-radio-content-font-size, 28rpx);\n  line-height: var(--td-radio-content-line-height, 44rpx);\n}\n.t-radio__description--checked {\n  color: var(--td-radio-content-checked-color, var(--td-text-color-secondary, var(--td-font-gray-2, rgba(0, 0, 0, 0.6))));\n}\n.t-radio__description--disabled {\n  cursor: not-allowed;\n  color: var(--td-radio-content-disabled-color, var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26))));\n}\n.t-radio__description:empty {\n  display: none;\n}\n.t-radio__title + .t-radio__description {\n  margin-top: 8rpx;\n}\n.t-radio__border {\n  position: absolute;\n  bottom: 0;\n  height: 1px;\n  background: var(--td-radio-border-color, var(--td-component-stroke, var(--td-gray-color-3, #e7e7e7)));\n  left: 96rpx;\n  right: 0;\n  transform: scaleY(0.5);\n}\n.t-radio__border--right {\n  left: 32rpx;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio/type.d.ts",
    "content": "export interface TdRadioProps<T = RadioValue> {\n    allowUncheck?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    block?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    checked?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    defaultChecked?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    content?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    contentDisabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    icon?: {\n        type: null;\n        value?: 'circle' | 'line' | 'dot' | Array<string>;\n    };\n    label?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    maxContentRow?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    maxLabelRow?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    name?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    placement?: {\n        type: StringConstructor;\n        value?: 'left' | 'right';\n    };\n    readonly?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    value?: {\n        type: null;\n        value?: T;\n    };\n}\nexport declare type RadioValue = string | number | boolean;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio-group/props.d.ts",
    "content": "import { TdRadioGroupProps } from './type';\ndeclare const props: TdRadioGroupProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio-group/props.js",
    "content": "const props = {\n    allowUncheck: {\n        type: Boolean,\n        value: false,\n    },\n    borderless: {\n        type: Boolean,\n        value: false,\n    },\n    disabled: {\n        type: null,\n        value: undefined,\n    },\n    icon: {\n        type: null,\n        value: 'circle',\n    },\n    keys: {\n        type: Object,\n    },\n    name: {\n        type: String,\n        value: '',\n    },\n    options: {\n        type: Array,\n    },\n    placement: {\n        type: String,\n        value: 'left',\n    },\n    value: {\n        type: null,\n        value: null,\n    },\n    defaultValue: {\n        type: null,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio-group/radio-group.d.ts",
    "content": "import { SuperComponent, RelationsOptions } from '../common/src/index';\nexport default class RadioGroup extends SuperComponent {\n    externalClasses: string[];\n    data: {\n        prefix: string;\n        classPrefix: string;\n        radioOptions: any[];\n    };\n    relations: RelationsOptions;\n    properties: import(\"./type\").TdRadioGroupProps<import(\"./type\").RadioValue>;\n    controlledProps: {\n        key: string;\n        event: string;\n    }[];\n    observers: {\n        value(v: any): void;\n        options(): void;\n        disabled(v: any): void;\n    };\n    methods: {\n        getChildren(): any;\n        updateValue(value: any): void;\n        handleRadioChange(e: any): void;\n        initWithOptions(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio-group/radio-group.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport config from '../common/config';\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-radio-group`;\nlet RadioGroup = class RadioGroup extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`];\n        this.data = {\n            prefix,\n            classPrefix: name,\n            radioOptions: [],\n        };\n        this.relations = {\n            '../radio/radio': {\n                type: 'descendant',\n                linked(target) {\n                    const { value, disabled } = this.data;\n                    target.setData({\n                        checked: value === target.data.value,\n                    });\n                    target.setDisabled(disabled);\n                },\n            },\n        };\n        this.properties = props;\n        this.controlledProps = [\n            {\n                key: 'value',\n                event: 'change',\n            },\n        ];\n        this.observers = {\n            value(v) {\n                this.getChildren().forEach((item) => {\n                    item.setData({\n                        checked: v === item.data.value,\n                    });\n                });\n            },\n            options() {\n                this.initWithOptions();\n            },\n            disabled(v) {\n                var _a;\n                if ((_a = this.data.options) === null || _a === void 0 ? void 0 : _a.length) {\n                    this.initWithOptions();\n                    return;\n                }\n                this.getChildren().forEach((item) => {\n                    item.setDisabled(v);\n                });\n            },\n        };\n        this.methods = {\n            getChildren() {\n                let items = this.$children;\n                if (!(items === null || items === void 0 ? void 0 : items.length)) {\n                    items = this.selectAllComponents(`.${prefix}-radio-option`);\n                }\n                return items;\n            },\n            updateValue(value) {\n                this._trigger('change', { value });\n            },\n            handleRadioChange(e) {\n                const { checked } = e.detail;\n                const { value, index, allowUncheck } = e.target.dataset;\n                this._trigger('change', checked === false && allowUncheck ? { value: null, index } : { value, index });\n            },\n            initWithOptions() {\n                const { options, value, keys, disabled } = this.data;\n                if (!(options === null || options === void 0 ? void 0 : options.length) || !Array.isArray(options)) {\n                    this.setData({\n                        radioOptions: [],\n                    });\n                    return;\n                }\n                const optionsValue = [];\n                try {\n                    options.forEach((element) => {\n                        var _a, _b, _c;\n                        const typeName = typeof element;\n                        if (typeName === 'number' || typeName === 'string') {\n                            optionsValue.push({\n                                label: `${element}`,\n                                value: element,\n                                checked: value === element,\n                                disabled,\n                            });\n                        }\n                        else if (typeName === 'object') {\n                            optionsValue.push(Object.assign(Object.assign({}, element), { label: element[(_a = keys === null || keys === void 0 ? void 0 : keys.label) !== null && _a !== void 0 ? _a : 'label'], value: element[(_b = keys === null || keys === void 0 ? void 0 : keys.value) !== null && _b !== void 0 ? _b : 'value'], checked: value === element[(_c = keys === null || keys === void 0 ? void 0 : keys.value) !== null && _c !== void 0 ? _c : 'value'], disabled: element.disabled || disabled }));\n                        }\n                    });\n                    this.setData({\n                        radioOptions: optionsValue,\n                    });\n                }\n                catch (error) {\n                    console.error('error', error);\n                }\n            },\n        };\n    }\n};\nRadioGroup = __decorate([\n    wxComponent()\n], RadioGroup);\nexport default RadioGroup;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio-group/radio-group.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-radio\": \"../radio/radio\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio-group/radio-group.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view style=\"{{_._style([style, customStyle])}}\" class=\"{{classPrefix}} class {{prefix}}-class\" aria-role=\"radiogroup\">\n  <slot />\n  <block wx:for=\"{{radioOptions}}\" wx:key=\"value\">\n    <t-radio\n      class=\"{{prefix}}-radio-option\"\n      data-index=\"{{index}}\"\n      data-value=\"{{item.value}}\"\n      data-allow-uncheck=\"{{item.allowUncheck || allowUncheck}}\"\n      block=\"{{item.block || true}}\"\n      label=\"{{item.label || ''}}\"\n      value=\"{{item.value}}\"\n      checked=\"{{item.checked || false}}\"\n      content=\"{{item.content || ''}}\"\n      allow-uncheck=\"{{item.allowUncheck || allowUncheck}}\"\n      content-disabled=\"{{item.contentDisabled || false}}\"\n      readonly=\"{{item.readonly || false}}\"\n      disabled=\"{{item.disabled || false}}\"\n      icon=\"{{item.icon || icon}}\"\n      placement=\"{{item.placement || placement}}\"\n      max-content-row=\"{{item.maxContentRow || 5}}\"\n      max-label-row=\"{{item.maxLabelRow || 3}}\"\n      name=\"{{item.name || ''}}\"\n      borderless=\"{{borderless}}\"\n      bind:change=\"handleRadioChange\"\n    />\n  </block>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio-group/radio-group.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio-group/type.d.ts",
    "content": "import { KeysType } from '../common/common';\nexport interface TdRadioGroupProps<T = RadioValue> {\n    allowUncheck?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    borderless?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    icon?: {\n        type: null;\n        value?: 'circle' | 'line' | 'dot' | Array<string>;\n    };\n    keys?: {\n        type: ObjectConstructor;\n        value?: KeysType;\n    };\n    name?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    options?: {\n        type: ArrayConstructor;\n        value?: Array<RadioOption>;\n    };\n    placement?: {\n        type: StringConstructor;\n        value?: 'left' | 'right';\n    };\n    value?: {\n        type: null;\n        value?: T;\n    };\n    defaultValue?: {\n        type: null;\n        value?: T;\n    };\n}\nexport declare type RadioOption = string | number | RadioOptionObj;\nexport interface RadioOptionObj {\n    label?: string;\n    value?: string | number;\n    readonly?: boolean;\n    disabled?: boolean;\n    allowUncheck?: boolean;\n}\nexport declare type RadioValue = string | number | boolean;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/radio-group/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n\n### Slider Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ncolors | Array | [] | `deprecated`。Typescript：`Array<string>` | N\ndisabled | Boolean | undefined | \\- | N\ndisabled-color | Array | [] | `deprecated`。Typescript：`Array<string>` | N\nlabel | String / Boolean | false | Typescript：`string \\| boolean` | N\nmarks | Object / Array | {} | Typescript：`Record<number, string> \\| Array<number>` | N\nmax | Number | 100 | \\- | N\nmin | Number | 0 | \\- | N\nrange | Boolean | false | \\- | N\nshow-extreme-value | Boolean | false | \\- | N\nstep | Number | 1 | \\- | N\ntheme | String | default | `0.30.0`。options: default/capsule | N\nvalue | Number / Array | 0 | Typescript：`SliderValue` `type SliderValue = number \\| Array<number>`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/slider/type.ts) | N\ndefault-value | Number / Array | undefined | uncontrolled property。Typescript：`SliderValue` `type SliderValue = number \\| Array<number>`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/slider/type.ts) | N\nvertical | Boolean | false | \\- | N\n\n### Slider Events\n\nname | params | description\n-- | -- | --\nchange | `(value: SliderValue)` | \\-\ndragend | `(value: SliderValue, e: TouchEvent)` | \\-\ndragstart | `(e: TouchEvent)` | \\-\n### Slider External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-bar | \\-\nt-class-bar-active | \\-\nt-class-bar-disabled | \\-\nt-class-cursor | \\-\n\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-slider-active-color | @brand-color | - \n--td-slider-bar-height | 8rpx | - \n--td-slider-bar-width | 8rpx | - \n--td-slider-capsule-bar-color | @bg-color-component | - \n--td-slider-capsule-bar-heihgt | 48rpx | - \n--td-slider-capsule-bar-width | 48rpx | - \n--td-slider-capsule-line-heihgt | 36rpx | - \n--td-slider-default-color | @bg-color-component | - \n--td-slider-default-color | @bg-color-component-disabled | - \n--td-slider-disabled-color | @brand-color-disabled | - \n--td-slider-disabled-text-color | @text-color-disabled | - \n--td-slider-dot-bg-color | #fff | - \n--td-slider-dot-color | @component-border | - \n--td-slider-dot-disabled-bg-color | #fff | - \n--td-slider-dot-disabled-border-color | #f3f3f3 | - \n--td-slider-dot-size | 40rpx | - \n--td-slider-text-color | @text-color-primary | - \n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/README.md",
    "content": "---\ntitle: Slider 滑动选择器\ndescription: 用于选择横轴上的数值、区间、档位。\nspline: data\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-95%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-94%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-82%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-slider\": \"tdesign-miniprogram/slider/slider\"\n}\n```\n\n## 代码演示\n\n<img src=\"https://tdesign.gtimg.com/miniprogram/readme/slider.png\" width=\"375px\" height=\"50%\">\n\n<a href=\"https://developers.weixin.qq.com/s/2p6gkime7CSn\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 组件类型\n\n单游标滑块\n\n{{ base }}\n\n双游标滑块\n\n{{ range }}\n\n带数值滑动选择器\n\n{{ label }}\n\n带刻度滑动选择器\n\n{{ step }}\n\n### 组件状态\n\n滑块禁用状态\n\n{{ disabled }}\n\n#### 特殊样式\n\n胶囊型滑块\n\n{{ capsule }}\n\n#### 垂直状态\n\n垂直方向的滑块\n\n{{ vertical }}\n\n\n## API\n\n\n### Slider Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ncolors | Array | [] | 已废弃。颜色，[已选择, 未选择]。TS 类型：`Array<string>` | N\ndisabled | Boolean | undefined | 是否禁用组件 | N\ndisabled-color | Array | [] | 已废弃。禁用状态滑动条的颜色，[已选, 未选]。TS 类型：`Array<string>` | N\nlabel | String / Boolean | false | 滑块当前值文本。<br />值为 true 显示默认文案；值为 false 不显示滑块当前值文本；<br />值为 `${value}%` 则表示组件会根据占位符渲染文案；<br />值类型为函数时，参数 `value` 标识滑块值，参数 `position=start` 表示范围滑块的起始值，参数 `position=end` 表示范围滑块的终点值。TS 类型：`string \\| boolean` | N\nmarks | Object / Array | {} | 刻度标记，示例：`[0, 10, 40, 200]` 或者 `{ 5:  '5¥', 10: '10%' }`。TS 类型：`Record<number, string> \\| Array<number>` | N\nmax | Number | 100 | 滑块范围最大值 | N\nmin | Number | 0 | 滑块范围最小值 | N\nrange | Boolean | false | 双游标滑块 | N\nshow-extreme-value | Boolean | false | 是否边界值 | N\nstep | Number | 1 | 步长 | N\ntheme | String | default | `0.30.0`。滑块风格。可选项：default/capsule | N\nvalue | Number / Array | 0 | 滑块值。TS 类型：`SliderValue` `type SliderValue = number \\| Array<number>`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/slider/type.ts) | N\ndefault-value | Number / Array | undefined | 滑块值。非受控属性。TS 类型：`SliderValue` `type SliderValue = number \\| Array<number>`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/slider/type.ts) | N\nvertical | Boolean | false | 是否是垂直的滑块（渲染垂直滑块时，默认高度为400rpx，可通过修改`--td-slider-bar-height`来自定义高度） | N\n\n### Slider Events\n\n名称 | 参数 | 描述\n-- | -- | --\nchange | `(value: SliderValue)` | 滑块值变化时触发\ndragend | `(value: SliderValue, e: TouchEvent)` | 结束拖动时触发\ndragstart | `(e: TouchEvent)` | 开始拖动时触发\n### Slider External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-bar | 滑道底部样式类\nt-class-bar-active | 滑道激活态样式类\nt-class-bar-disabled | 滑道禁用态样式类\nt-class-cursor | 游标样式类\n\n## FAQ\n\n当 slider 外层使用 `hidden` 包裹，需要在 `hidden = false` 时，重新调用组件的 `init` 方法，才能正常渲染（在t-popup/t-dialog中同理）。如下：\n\n```html\n<t-slider id=\"slider\" />\n```\n\n```js\nconst $slider = this.selectComponent('#slider');\n\n$slider.init();\n```\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-slider-active-color | @brand-color | - \n--td-slider-bar-height | 8rpx | vertical为true时默认为400rpx \n--td-slider-bar-width | 8rpx | vertical为true时有效 \n--td-slider-capsule-bar-color | @bg-color-component | - \n--td-slider-capsule-bar-heihgt | 48rpx | - \n--td-slider-capsule-bar-width | 48rpx | vertical为true时有效 \n--td-slider-capsule-line-heihgt | 36rpx | - \n--td-slider-default-color | @bg-color-component | - \n--td-slider-default-color | @bg-color-component-disabled | - \n--td-slider-disabled-color | @brand-color-disabled | - \n--td-slider-disabled-text-color | @text-color-disabled | - \n--td-slider-dot-bg-color | #fff | - \n--td-slider-dot-color | @component-border | - \n--td-slider-dot-disabled-bg-color | #fff | - \n--td-slider-dot-disabled-border-color | #f3f3f3 | - \n--td-slider-dot-size | 40rpx | - \n--td-slider-text-color | @text-color-primary | - \n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/props.d.ts",
    "content": "import { TdSliderProps } from './type';\ndeclare const props: TdSliderProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/props.js",
    "content": "const props = {\n    disabled: {\n        type: null,\n        value: undefined,\n    },\n    label: {\n        type: null,\n        value: false,\n    },\n    marks: {\n        type: null,\n        value: {},\n    },\n    max: {\n        type: Number,\n        value: 100,\n    },\n    min: {\n        type: Number,\n        value: 0,\n    },\n    range: {\n        type: Boolean,\n        value: false,\n    },\n    showExtremeValue: {\n        type: Boolean,\n        value: false,\n    },\n    step: {\n        type: Number,\n        value: 1,\n    },\n    theme: {\n        type: String,\n        value: 'default',\n    },\n    value: {\n        type: null,\n        value: null,\n    },\n    defaultValue: {\n        type: null,\n        value: 0,\n    },\n    vertical: {\n        type: Boolean,\n        value: false,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/slider.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\nimport { SuperComponent } from '../common/src/index';\nimport type { SliderValue } from './type';\ndeclare type dataType = {\n    sliderStyles: string;\n    classPrefix: string;\n    initialLeft: number | null;\n    initialRight: number | null;\n    activeLeft: number;\n    activeRight: number;\n    maxRange: number;\n    lineLeft: number;\n    lineRight: number;\n    dotTopValue: number[];\n    blockSize: number;\n    isScale: boolean;\n    scaleArray: any[];\n    scaleTextArray: any[];\n    _value: SliderValue;\n    prefix: string;\n    isVisibleToScreenReader: boolean;\n    identifier: number[];\n    __inited: boolean;\n};\nexport default class Slider extends SuperComponent {\n    externalClasses: string[];\n    options: {\n        pureDataPattern: RegExp;\n    };\n    properties: import(\"./type\").TdSliderProps;\n    controlledProps: {\n        key: string;\n        event: string;\n    }[];\n    data: dataType;\n    observers: {\n        value(newValue: SliderValue): void;\n        _value(newValue: SliderValue): void;\n        marks(val: any): void;\n    };\n    lifetimes: {\n        created(): void;\n        attached(): void;\n    };\n    injectPageScroll(): void;\n    observerScrollTop(rest: any): void;\n    toggleA11yTips(): void;\n    renderLine(val: any): void;\n    triggerValue(value?: SliderValue): void;\n    handlePropsChange(newValue: SliderValue): void;\n    handleMark(marks: any): void;\n    setSingleBarWidth(value: number): void;\n    init(): Promise<void>;\n    stepValue(value: number): number;\n    onSingleLineTap(e: WechatMiniprogram.TouchEvent): void;\n    getSingleChangeValue(e: WechatMiniprogram.TouchEvent): number;\n    convertPosToValue(posValue: number, dir: 0 | 1): number;\n    onLineTap(e: WechatMiniprogram.TouchEvent): void;\n    onTouchStart(e: WechatMiniprogram.TouchEvent): void;\n    onTouchMoveLeft(e: WechatMiniprogram.TouchEvent): void;\n    onTouchMoveRight(e: WechatMiniprogram.TouchEvent): void;\n    setLineStyle(left: number, right: number): void;\n    onTouchEnd(e: WechatMiniprogram.TouchEvent): void;\n    getPagePosition(touch: any): any;\n}\nexport {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/slider.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport config from '../common/config';\nimport { trimSingleValue, trimValue } from './tool';\nimport props from './props';\nimport { getRect } from '../common/utils';\nimport Bus from '../common/bus';\nconst { prefix } = config;\nconst name = `${prefix}-slider`;\nlet Slider = class Slider extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [\n            `${prefix}-class`,\n            `${prefix}-class-bar`,\n            `${prefix}-class-bar-active`,\n            `${prefix}-class-bar-disabled`,\n            `${prefix}-class-cursor`,\n        ];\n        this.options = {\n            pureDataPattern: /^__/,\n        };\n        this.properties = props;\n        this.controlledProps = [\n            {\n                key: 'value',\n                event: 'change',\n            },\n        ];\n        this.data = {\n            sliderStyles: '',\n            classPrefix: name,\n            initialLeft: null,\n            initialRight: null,\n            activeLeft: 0,\n            activeRight: 0,\n            maxRange: 0,\n            lineLeft: 0,\n            lineRight: 0,\n            dotTopValue: [0, 0],\n            _value: 0,\n            blockSize: 20,\n            isScale: false,\n            scaleArray: [],\n            scaleTextArray: [],\n            prefix,\n            isVisibleToScreenReader: false,\n            identifier: [-1, -1],\n            __inited: false,\n        };\n        this.observers = {\n            value(newValue) {\n                this.handlePropsChange(newValue);\n            },\n            _value(newValue) {\n                this.bus.on('initial', () => this.renderLine(newValue));\n                this.toggleA11yTips();\n            },\n            marks(val) {\n                this.bus.on('initial', () => this.handleMark(val));\n            },\n        };\n        this.lifetimes = {\n            created() {\n                this.bus = new Bus();\n            },\n            attached() {\n                const { value } = this.properties;\n                if (!value)\n                    this.handlePropsChange(0);\n                this.init();\n                this.injectPageScroll();\n            },\n        };\n    }\n    injectPageScroll() {\n        const { range, vertical } = this.properties;\n        if (!range || !vertical)\n            return;\n        const pages = getCurrentPages() || [];\n        let curPage = null;\n        if (pages && pages.length - 1 >= 0) {\n            curPage = pages[pages.length - 1];\n        }\n        if (!curPage)\n            return;\n        const originPageScroll = curPage === null || curPage === void 0 ? void 0 : curPage.onPageScroll;\n        curPage.onPageScroll = (rest) => {\n            originPageScroll === null || originPageScroll === void 0 ? void 0 : originPageScroll.call(this, rest);\n            this.observerScrollTop(rest);\n        };\n    }\n    observerScrollTop(rest) {\n        const { scrollTop } = rest || {};\n        this.pageScrollTop = scrollTop;\n    }\n    toggleA11yTips() {\n        this.setData({\n            isVisibleToScreenReader: true,\n        });\n        setTimeout(() => {\n            this.setData({\n                isVisibleToScreenReader: false,\n            });\n        }, 2000);\n    }\n    renderLine(val) {\n        const { min, max, range } = this.properties;\n        const { maxRange } = this.data;\n        if (range) {\n            const left = (maxRange * (val[0] - Number(min))) / (Number(max) - Number(min));\n            const right = (maxRange * (Number(max) - val[1])) / (Number(max) - Number(min));\n            this.setLineStyle(left, right);\n        }\n        else {\n            this.setSingleBarWidth(val);\n        }\n    }\n    triggerValue(value) {\n        if (this.preval === value)\n            return;\n        this.preval = value;\n        this._trigger('change', {\n            value: trimValue(value, this.properties),\n        });\n    }\n    handlePropsChange(newValue) {\n        const value = trimValue(newValue, this.properties);\n        const setValueAndTrigger = () => {\n            this.setData({\n                _value: value,\n            });\n        };\n        if (this.data.maxRange === 0) {\n            this.init().then(setValueAndTrigger);\n            return;\n        }\n        setValueAndTrigger();\n    }\n    handleMark(marks) {\n        const calcPos = (arr) => {\n            const { max, theme } = this.properties;\n            const { blockSize, maxRange } = this.data;\n            const margin = theme === 'capsule' ? blockSize / 2 : 0;\n            return arr.map((item) => ({\n                val: item,\n                left: Math.round((item / Number(max)) * maxRange) + margin,\n            }));\n        };\n        if ((marks === null || marks === void 0 ? void 0 : marks.length) && Array.isArray(marks)) {\n            this.setData({\n                isScale: true,\n                scaleArray: calcPos(marks),\n                scaleTextArray: [],\n            });\n        }\n        if (Object.prototype.toString.call(marks) === '[object Object]') {\n            const scaleArray = Object.keys(marks).map((item) => Number(item));\n            const scaleTextArray = scaleArray.map((item) => marks[item]);\n            this.setData({\n                isScale: scaleArray.length > 0,\n                scaleArray: calcPos(scaleArray),\n                scaleTextArray,\n            });\n        }\n    }\n    setSingleBarWidth(value) {\n        const { max, min, theme } = this.properties;\n        const { maxRange, blockSize } = this.data;\n        const halfBlock = theme === 'capsule' ? Number(blockSize) / 2 : 0;\n        const percentage = (Number(value) - Number(min)) / (Number(max) - Number(min));\n        const width = percentage * maxRange + halfBlock;\n        this.setData({\n            lineBarWidth: `${width}px`,\n        });\n    }\n    init() {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (this.data.__inited)\n                return;\n            const line = yield getRect(this, '#sliderLine');\n            const { blockSize } = this.data;\n            const { theme, vertical } = this.properties;\n            const halfBlock = Number(blockSize) / 2;\n            const { top, bottom, right, left } = line;\n            let maxRange = vertical ? bottom - top : right - left;\n            let initialLeft = vertical ? top : left;\n            let initialRight = vertical ? bottom : right;\n            if (initialLeft === 0 && initialRight === 0)\n                return;\n            if (theme === 'capsule') {\n                maxRange = maxRange - Number(blockSize) - 6;\n                initialLeft -= halfBlock;\n                initialRight -= halfBlock;\n            }\n            this.setData({\n                maxRange,\n                initialLeft,\n                initialRight,\n                __inited: true,\n            });\n            this.bus.emit('initial');\n        });\n    }\n    stepValue(value) {\n        const { step, min, max } = this.properties;\n        const decimal = String(step).indexOf('.') > -1 ? String(step).length - String(step).indexOf('.') - 1 : 0;\n        const closestStep = trimSingleValue(Number((Math.round(value / Number(step)) * Number(step)).toFixed(decimal)), Number(min), Number(max));\n        return closestStep;\n    }\n    onSingleLineTap(e) {\n        const { disabled } = this.properties;\n        if (disabled)\n            return;\n        const isSingleLineTap = this.data.identifier[0] === -1;\n        if (isSingleLineTap) {\n            const [touch] = e.changedTouches;\n            this.data.identifier[0] = touch.identifier;\n        }\n        const value = this.getSingleChangeValue(e);\n        if (isSingleLineTap) {\n            this.data.identifier[0] = -1;\n        }\n        this.triggerValue(value);\n    }\n    getSingleChangeValue(e) {\n        const { min, max, theme, vertical } = this.properties;\n        const { initialLeft, maxRange, blockSize } = this.data;\n        const touch = e.changedTouches.find((item) => item.identifier === this.data.identifier[0]);\n        const pagePosition = this.getPagePosition(touch);\n        let offset = 0;\n        if (theme === 'capsule') {\n            offset = Number(blockSize);\n            if (vertical) {\n                offset *= 2;\n            }\n            offset += 6;\n        }\n        else if (vertical) {\n            offset = Number(blockSize);\n        }\n        const currentLeft = pagePosition - initialLeft - offset;\n        let value = 0;\n        if (currentLeft <= 0) {\n            value = Number(min);\n        }\n        else if (currentLeft >= maxRange) {\n            value = Number(max);\n        }\n        else {\n            value = (currentLeft / maxRange) * (Number(max) - Number(min)) + Number(min);\n        }\n        return this.stepValue(value);\n    }\n    convertPosToValue(posValue, dir) {\n        const { maxRange } = this.data;\n        const { max, min } = this.properties;\n        return dir === 0\n            ? (posValue / maxRange) * (Number(max) - Number(min)) + Number(min)\n            : Number(max) - (posValue / maxRange) * (Number(max) - Number(min));\n    }\n    onLineTap(e) {\n        const { disabled, theme, vertical } = this.properties;\n        const { initialLeft, initialRight, maxRange, blockSize } = this.data;\n        if (disabled)\n            return;\n        const [touch] = e.changedTouches;\n        const pagePosition = this.getPagePosition(touch);\n        const halfBlock = theme === 'capsule' ? Number(blockSize) / 2 : 0;\n        const currentLeft = pagePosition - initialLeft;\n        const currentRight = -(pagePosition - initialRight);\n        if (currentLeft < 0 || currentRight > maxRange + Number(blockSize))\n            return;\n        Promise.all([getRect(this, '#leftDot'), getRect(this, '#rightDot')]).then(([leftDot, rightDot]) => {\n            const pageScrollTop = this.pageScrollTop || 0;\n            const leftDotPosition = vertical ? leftDot.top + pageScrollTop : leftDot.left;\n            const distanceLeft = Math.abs(pagePosition - leftDotPosition - halfBlock);\n            const rightDotPosition = vertical ? rightDot.top + pageScrollTop : rightDot.left;\n            const distanceRight = Math.abs(rightDotPosition - pagePosition + halfBlock);\n            const isMoveLeft = distanceLeft < distanceRight;\n            let offset = 0;\n            if (theme === 'capsule') {\n                offset = Number(blockSize);\n                if (vertical) {\n                    offset *= 2;\n                }\n                offset += 6;\n            }\n            else if (vertical) {\n                offset = Number(blockSize);\n            }\n            if (isMoveLeft) {\n                const left = pagePosition - initialLeft - offset;\n                const leftValue = this.convertPosToValue(left, 0);\n                this.triggerValue([this.stepValue(leftValue), this.data._value[1]]);\n            }\n            else {\n                let right = -(pagePosition - initialRight);\n                if (vertical) {\n                    right += offset / 2;\n                }\n                const rightValue = this.convertPosToValue(right, 1);\n                this.triggerValue([this.data._value[0], this.stepValue(rightValue)]);\n            }\n        });\n    }\n    onTouchStart(e) {\n        this.triggerEvent('dragstart', { e });\n        const [touch] = e.changedTouches;\n        if (e.currentTarget.id === 'rightDot') {\n            this.data.identifier[1] = touch.identifier;\n        }\n        else {\n            this.data.identifier[0] = touch.identifier;\n        }\n    }\n    onTouchMoveLeft(e) {\n        const { disabled, theme, vertical } = this.properties;\n        const { initialLeft, _value, blockSize } = this.data;\n        if (disabled)\n            return;\n        const touch = e.changedTouches.find((item) => item.identifier === this.data.identifier[0]);\n        const pagePosition = this.getPagePosition(touch);\n        let offset = 0;\n        if (theme === 'capsule') {\n            offset += Number(blockSize);\n        }\n        if (vertical) {\n            offset += Number(blockSize) + 6;\n        }\n        const currentLeft = pagePosition - initialLeft - offset;\n        const newData = [..._value];\n        const leftValue = this.convertPosToValue(currentLeft, 0);\n        newData[0] = this.stepValue(leftValue);\n        this.triggerValue(newData);\n    }\n    onTouchMoveRight(e) {\n        const { disabled, vertical } = this.properties;\n        const { initialRight, _value, blockSize } = this.data;\n        if (disabled)\n            return;\n        const touch = e.changedTouches.find((item) => item.identifier === this.data.identifier[1]);\n        const pagePosition = this.getPagePosition(touch);\n        let offset = 0;\n        if (vertical) {\n            offset += Number(blockSize) / 2 + 6;\n        }\n        const currentRight = -(pagePosition - initialRight - offset);\n        const newData = [..._value];\n        const rightValue = this.convertPosToValue(currentRight, 1);\n        newData[1] = this.stepValue(rightValue);\n        this.triggerValue(newData);\n    }\n    setLineStyle(left, right) {\n        const { theme } = this.properties;\n        const { blockSize, maxRange } = this.data;\n        const halfBlock = theme === 'capsule' ? Number(blockSize) / 2 : 0;\n        const [a, b] = this.data._value;\n        const cut = (v) => parseInt(v, 10);\n        this.setData({\n            dotTopValue: [a, b],\n        });\n        if (left + right <= maxRange) {\n            this.setData({\n                lineLeft: cut(left + halfBlock),\n                lineRight: cut(right + halfBlock),\n            });\n        }\n        else {\n            this.setData({\n                lineLeft: cut(maxRange + halfBlock - right),\n                lineRight: cut(maxRange - left + halfBlock * 1.5),\n            });\n        }\n    }\n    onTouchEnd(e) {\n        this.triggerEvent('dragend', { e, value: this.data._value });\n        if (e.currentTarget.id === 'rightDot') {\n            this.data.identifier[1] = -1;\n        }\n        else {\n            this.data.identifier[0] = -1;\n        }\n    }\n    getPagePosition(touch) {\n        const { pageX, pageY } = touch;\n        const { vertical } = this.properties;\n        return vertical ? pageY : pageX;\n    }\n};\nSlider = __decorate([\n    wxComponent()\n], Slider);\nexport default Slider;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/slider.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/slider.wxml",
    "content": "<wxs src=\"./slider.wxs\" module=\"t\" />\n<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  style=\"{{_._style([style, customStyle])}}\"\n  class=\"{{_.cls(classPrefix, [['top', label || scaleTextArray.length], ['disabled', disabled], ['range', range]])}} class {{prefix}}-class {{vertical ? classPrefix + '--vertical' : ''}}\"\n>\n  <block wx:if=\"{{!range}}\">\n    <text wx:if=\"{{showExtremeValue}}\" class=\"{{classPrefix}}__value {{classPrefix}}__value--min\">\n      {{ label ? t.getValue(label, min) : min}}\n    </text>\n    <view\n      id=\"sliderLine\"\n      class=\"{{_.cls(classPrefix + '__bar', [['disabled', disabled], theme, ['marks', isScale && theme == 'capsule']])}} {{prefix}}-class-bar\"\n      bind:tap=\"onSingleLineTap\"\n    >\n      <block wx:if=\"{{isScale}}\">\n        <view\n          class=\"{{_.cls(classPrefix + '__scale-item', [['active', _value >= item.val], ['disabled', disabled], theme, ['hidden', (index == 0 || index == scaleArray.length - 1) && theme == 'capsule' || value == item.val]])}}\"\n          wx:for=\"{{scaleArray}}\"\n          wx:key=\"index\"\n          style=\"{{vertical ? 'top' :  'left'}}:{{item.left}}px; {{vertical ? 'transform: translate(-50%, -50%);' : 'transform: translateX(-50%);'}}\"\n          aria-hidden=\"{{true}}\"\n        >\n          <view wx:if=\"{{scaleTextArray.length}}\" class=\"{{_.cls(classPrefix + '__scale-desc', [theme])}}\">\n            {{scaleTextArray[index]}}\n          </view>\n        </view>\n      </block>\n      <view\n        class=\"{{_.cls(classPrefix + '__line', [['disabled', disabled], theme, 'single'])}} {{prefix}}-class-bar-active\"\n        style=\"{{vertical ? 'height' : 'width'}}: {{lineBarWidth}}\"\n      >\n        <view\n          id=\"singleDot\"\n          class=\"{{classPrefix}}__dot {{prefix}}-class-cursor\"\n          catch:touchstart=\"onTouchStart\"\n          catch:touchmove=\"onSingleLineTap\"\n          catch:touchend=\"onTouchEnd\"\n          catch:touchcancel=\"onTouchEnd\"\n        >\n          <view\n            wx:if=\"{{label || isVisibleToScreenReader}}\"\n            class=\"{{_.cls(classPrefix+'__dot-value', [['sr-only', !label]])}}\"\n            aria-role=\"alert\"\n            aria-live=\"assertive\"\n            aria-hidden=\"{{!isVisibleToScreenReader}}\"\n          >\n            {{t.getValue(label, _value) || _value}}\n          </view>\n          <view\n            class=\"{{classPrefix}}__dot-slider\"\n            aria-role=\"slider\"\n            aria-disabled=\"{{disabled}}\"\n            aria-valuemax=\"{{max}}\"\n            aria-valuemin=\"{{min}}\"\n            aria-valuenow=\"{{_value}}\"\n            aria-valuetext=\"{{t.getValue(label, _value) || _value}}\"\n          ></view>\n        </view>\n      </view>\n    </view>\n    <!-- <view wx:if=\"{{label}}\" class=\"{{classPrefix}}__value {{classPrefix}}__value--right\">\n      <text class=\"{{classPrefix}}__value--text\"> {{t.getValue(label, _value)}}</text>\n    </view> -->\n    <text wx:if=\"{{showExtremeValue}}\" class=\"{{classPrefix}}__value {{classPrefix}}__value--max\">\n      {{ label ? t.getValue(label, max) : max}}\n    </text>\n  </block>\n  <!-- range选择器自定义 -->\n  <block wx:if=\"{{range}}\">\n    <view wx:if=\"{{showExtremeValue}}\" class=\"{{classPrefix}}__range-extreme {{classPrefix}}__range-extreme--min\">\n      {{min}}\n    </view>\n    <view\n      id=\"sliderLine\"\n      bind:tap=\"onLineTap\"\n      class=\"{{_.cls(classPrefix + '__bar', [['disabled', disabled], theme, ['marks', isScale && theme == 'capsule']])}} {{prefix}}-class-bar\"\n    >\n      <block wx:if=\"{{isScale}}\">\n        <view\n          class=\"{{_.cls(classPrefix + '__scale-item', [['active', dotTopValue[1] >= item.val && item.val >= dotTopValue[0]], ['disabled', disabled], theme, ['hidden', (index == 0 || index == scaleArray.length - 1) && theme == 'capsule' || value == item.val]])}}\"\n          wx:for=\"{{scaleArray}}\"\n          wx:for-index=\"index\"\n          wx:key=\"index\"\n          style=\"{{vertical ? 'top' :  'left'}}:{{item.left}}px; {{vertical ? 'transform: translate(-50%, -50%);' : 'transform: translateX(-50%);'}}\"\n          aria-hidden=\"{{true}}\"\n        >\n          <view wx:if=\"{{scaleTextArray.length}}\" class=\"{{_.cls(classPrefix + '__scale-desc', [theme])}}\"\n            >{{scaleTextArray[index]}}</view\n          >\n        </view>\n      </block>\n      <view\n        class=\"{{_.cls(classPrefix + '__line', [['disabled', disabled], theme])}} {{prefix}}-class-bar-active\"\n        style=\"{{vertical ? 'top' : 'left'}}: {{lineLeft}}px; {{vertical ? 'bottom' : 'right'}}: {{lineRight}}px\"\n      >\n        <view\n          id=\"leftDot\"\n          catch:touchstart=\"onTouchStart\"\n          catch:touchmove=\"onTouchMoveLeft\"\n          catch:touchend=\"onTouchEnd\"\n          catch:touchcancel=\"onTouchEnd\"\n          class=\"{{classPrefix}}__dot {{classPrefix}}__dot--left {{prefix}}-class-cursor\"\n        >\n          <view\n            wx:if=\"{{label || isVisibleToScreenReader}}\"\n            class=\"{{_.cls(classPrefix+'__dot-value', [['sr-only', !label]])}}\"\n            aria-role=\"alert\"\n            aria-live=\"assertive\"\n            aria-hidden=\"{{!isVisibleToScreenReader}}\"\n          >\n            {{t.getValue(label, dotTopValue[0]) || dotTopValue[0]}}\n          </view>\n          <view\n            class=\"{{classPrefix}}__dot-slider\"\n            aria-role=\"slider\"\n            aria-disabled=\"{{disabled}}\"\n            aria-valuemax=\"{{max}}\"\n            aria-valuemin=\"{{min}}\"\n            aria-valuenow=\"{{dotTopValue[0]}}\"\n            aria-valuetext=\"{{t.getValue(label, dotTopValue[0]) || dotTopValue[0]}}\"\n          ></view>\n        </view>\n        <view\n          id=\"rightDot\"\n          catch:touchstart=\"onTouchStart\"\n          catch:touchmove=\"onTouchMoveRight\"\n          catch:touchend=\"onTouchEnd\"\n          catch:touchcancel=\"onTouchEnd\"\n          class=\"{{classPrefix}}__dot {{classPrefix}}__dot--right {{prefix}}-class-cursor\"\n        >\n          <view\n            wx:if=\"{{label || isVisibleToScreenReader}}\"\n            class=\"{{_.cls(classPrefix+'__dot-value', [['sr-only', !label]])}}\"\n            aria-role=\"alert\"\n            aria-live=\"assertive\"\n            aria-hidden=\"{{!isVisibleToScreenReader}}\"\n          >\n            {{t.getValue(label, dotTopValue[1]) || dotTopValue[1]}}\n          </view>\n          <view\n            class=\"{{classPrefix}}__dot-slider\"\n            aria-role=\"slider\"\n            aria-disabled=\"{{disabled}}\"\n            aria-valuemax=\"{{max}}\"\n            aria-valuemin=\"{{min}}\"\n            aria-valuenow=\"{{dotTopValue[1]}}\"\n            aria-valuetext=\"{{t.getValue(label, dotTopValue[1]) || dotTopValue[1]}}\"\n          >\n          </view>\n        </view>\n      </view>\n    </view>\n    <view wx:if=\"{{showExtremeValue}}\" class=\"{{classPrefix}}__range-extreme {{classPrefix}}__range-extreme--max\">\n      {{max}}\n    </view>\n  </block>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/slider.wxs",
    "content": "var REGEXP = getRegExp('[$][{value}]{7}');\n\nfunction getValue(label, value) {\n  if (label && label === 'true') return value;\n  if (REGEXP.test(label)) return label.replace(REGEXP, value);\n}\n\nmodule.exports = {\n  getValue: getValue,\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/slider.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-slider {\n  width: 100%;\n  font-size: 14px;\n  display: flex;\n  align-items: center;\n}\n.t-slider--disabled .t-slider__value,\n.t-slider--disabled .t-slider__range-extreme,\n.t-slider--disabled .t-slider__dot-value,\n.t-slider--disabled .t-slider__scale-desc {\n  color: var(--td-slider-disabled-text-color, var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26))));\n}\n.t-slider--disabled .t-slider__dot {\n  background-color: var(--td-slider-dot-disabled-bg-color, #fff);\n  border-color: var(--td-slider-dot-disabled-border-color, #f3f3f3);\n}\n.t-slider--top {\n  padding-top: 40rpx;\n}\n.t-slider__line {\n  position: absolute;\n  top: 0;\n  height: var(--td-slider-bar-height, 8rpx);\n  border-radius: calc(var(--td-slider-bar-height, 8rpx) / 2);\n  background-color: var(--td-slider-active-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-slider__line--disabled {\n  background-color: var(--td-slider-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-slider__line--capsule {\n  height: var(--td-slider-capsule-line-heihgt, 36rpx);\n}\n.t-slider__line--capsule.t-slider__line--single {\n  border-top-left-radius: calc(var(--td-slider-capsule-line-heihgt, 36rpx) / 2);\n  border-bottom-left-radius: calc(var(--td-slider-capsule-line-heihgt, 36rpx) / 2);\n}\n.t-slider__dot {\n  border-radius: 50%;\n  border: 2rpx solid var(--td-slider-dot-color, var(--td-component-border, var(--td-gray-color-4, #dcdcdc)));\n  position: absolute;\n  top: 50%;\n  right: 0;\n  transform: translate3d(50%, -50%, 0);\n  z-index: 2;\n  background-color: var(--td-slider-dot-bg-color, #fff);\n  width: var(--td-slider-dot-size, 40rpx);\n  height: var(--td-slider-dot-size, 40rpx);\n  box-shadow: var(--td-shadow-1, 0 1px 10px rgba(0, 0, 0, 0.05), 0 4px 5px rgba(0, 0, 0, 0.08), 0 2px 4px -1px rgba(0, 0, 0, 0.12));\n  box-sizing: border-box;\n}\n.t-slider__dot--left {\n  left: 0;\n  transform: translate3d(-50%, -50%, 0);\n}\n.t-slider__dot-value {\n  position: relative;\n  left: 50%;\n  transform: translateX(-50%);\n  top: -52rpx;\n  text-align: center;\n  width: 96rpx;\n  height: 44rpx;\n  line-height: 44rpx;\n}\n.t-slider__value,\n.t-slider__range-extreme,\n.t-slider__dot-value {\n  color: var(--td-slider-text-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n}\n.t-slider__value--sr-only,\n.t-slider__range-extreme--sr-only,\n.t-slider__dot-value--sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  clip-path: inset(50%);\n  border: 0;\n}\n.t-slider__dot-slider {\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  left: 0;\n  top: 0;\n}\n.t-slider__value--min {\n  margin-left: 32rpx;\n}\n.t-slider__value--max {\n  margin-right: 32rpx;\n}\n.t-slider__value--right {\n  flex-basis: 80rpx;\n}\n.t-slider__value--right__value--text {\n  margin-right: 32rpx;\n  text-align: right;\n  display: block;\n}\n.t-slider__bar {\n  margin: 16rpx 32rpx;\n  flex: 10;\n  background-clip: content-box;\n  height: var(--td-slider-bar-height, 8rpx);\n  border-radius: calc(var(--td-slider-bar-height, 8rpx) / 2);\n  position: relative;\n  background-color: var(--td-slider-default-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-slider__bar--capsule {\n  height: var(--td-slider-capsule-bar-heihgt, 48rpx);\n  border-radius: calc(var(--td-slider-capsule-bar-heihgt, 48rpx) / 2);\n  background-color: var(--td-slider-capsule-bar-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  border: 6rpx solid var(--td-slider-capsule-bar-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  box-sizing: border-box;\n}\n.t-slider__bar--marks {\n  background-color: var(--td-slider-default-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-slider__bar--disabled {\n  background-color: var(--td-slider-default-color, var(--td-bg-color-component-disabled, var(--td-gray-color-2, #eeeeee)));\n}\n.t-slider__range-extreme--min {\n  margin-left: 32rpx;\n  text-align: left;\n}\n.t-slider__range-extreme--max {\n  margin-right: 32rpx;\n  text-align: right;\n}\n.t-slider__scale-item {\n  background-color: var(--td-slider-default-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  width: var(--td-slider-bar-height, 8rpx);\n  height: 16rpx;\n  width: 16rpx;\n  border-radius: 50%;\n  position: absolute;\n  top: 50%;\n  margin-top: -8rpx;\n  z-index: 1;\n}\n.t-slider__scale-item--active {\n  background-color: var(--td-slider-active-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-slider__scale-item--disabled {\n  background-color: var(--td-slider-default-color, var(--td-bg-color-component-disabled, var(--td-gray-color-2, #eeeeee)));\n}\n.t-slider__scale-item--active.t-slider__scale-item--disabled {\n  background-color: var(--td-slider-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-slider__scale-item--capsule {\n  height: var(--td-slider-capsule-line-heihgt, 36rpx);\n  width: 4rpx;\n  border-radius: 0;\n  background-color: var(--td-slider-capsule-bar-color, var(--td-bg-color-component, var(--td-gray-color-3, #e7e7e7)));\n  margin-top: calc(-0.5 * var(--td-slider-capsule-line-heihgt, 36rpx));\n}\n.t-slider__scale-item--hidden {\n  background-color: transparent;\n}\n.t-slider__scale-desc {\n  position: absolute;\n  left: 50%;\n  color: var(--td-slider-text-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  transform: translateX(-50%);\n  bottom: 32rpx;\n}\n.t-slider__scale-desc--capsule {\n  bottom: 46rpx;\n}\n.t-slider--vertical {\n  --td-slider-bar-height: 400rpx;\n  height: var(--td-slider-bar-height, 8rpx);\n  justify-content: center;\n  position: relative;\n}\n.t-slider--vertical .t-slider__bar {\n  flex: none;\n  height: 100%;\n  width: var(--td-slider-bar-width, 8rpx);\n}\n.t-slider--vertical .t-slider__bar--capsule {\n  width: var(--td-slider-capsule-bar-width, 48rpx);\n  border-radius: calc(var(--td-slider-capsule-bar-width, 48rpx) / 2);\n}\n.t-slider--vertical .t-slider__line {\n  width: 100%;\n  height: unset;\n  left: 0;\n  border-radius: calc(var(--td-slider-bar-width, 8rpx) / 2);\n}\n.t-slider--vertical .t-slider__line--capsule.t-slider__line--single {\n  border-top-left-radius: calc(var(--td-slider-capsule-line-heihgt, 36rpx) / 2);\n  border-top-right-radius: calc(var(--td-slider-capsule-line-heihgt, 36rpx) / 2);\n}\n.t-slider--vertical .t-slider__dot {\n  left: 50%;\n  top: 100%;\n  transform: translate(-50%, -50%);\n}\n.t-slider--vertical .t-slider__dot--left {\n  top: 0;\n  transform: translate(-50%, -50%);\n  left: 50%;\n}\n.t-slider--vertical .t-slider__dot--right {\n  left: 50%;\n  transform: translate(-50%, -50%);\n  top: 100%;\n}\n.t-slider--vertical .t-slider__dot-value {\n  left: 54rpx;\n  top: 50%;\n  transform: translate(0, -50%);\n  width: auto;\n}\n.t-slider--vertical .t-slider__range-extreme {\n  position: absolute;\n  left: 50%;\n  transform: translateX(-50%);\n  margin: 0;\n}\n.t-slider--vertical .t-slider__range-extreme--min {\n  top: 0;\n}\n.t-slider--vertical .t-slider__range-extreme--max {\n  bottom: 0;\n}\n.t-slider--vertical .t-slider__scale-item {\n  left: 50%;\n  margin-top: 0;\n}\n.t-slider--vertical .t-slider__scale-item--capsule {\n  height: 4rpx;\n  width: var(--td-slider-capsule-line-heihgt, 36rpx);\n}\n.t-slider--vertical .t-slider__scale-desc {\n  top: 50%;\n  transform: translateY(-50%);\n  bottom: unset;\n  left: 38rpx;\n}\n.t-slider--vertical .t-slider__scale-desc--capsule {\n  left: 52rpx;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/tool.d.ts",
    "content": "export declare const trimSingleValue: (value: any, min: number, max: number) => number;\nexport declare const trimValue: (value: number | number[], props: any) => number | number[];\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/tool.js",
    "content": "export const trimSingleValue = (value, min, max) => {\n    if (value < min) {\n        return min;\n    }\n    if (value > max) {\n        return max;\n    }\n    return value;\n};\nexport const trimValue = (value, props) => {\n    const { min, max, range } = props;\n    if (range && Array.isArray(value)) {\n        value[0] = trimSingleValue(value[0], min, max);\n        value[1] = trimSingleValue(value[1], min, max);\n        return value[0] <= value[1] ? value : [value[1], value[0]];\n    }\n    if (range) {\n        return [min, max];\n    }\n    if (!range) {\n        return trimSingleValue(value, min, max);\n    }\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/type.d.ts",
    "content": "export interface TdSliderProps {\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    label?: {\n        type: null;\n        value?: string | boolean;\n    };\n    marks?: {\n        type: null;\n        value?: Record<number, string> | Array<number>;\n    };\n    max?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    min?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    range?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    showExtremeValue?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    step?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n    theme?: {\n        type: StringConstructor;\n        value?: 'default' | 'capsule';\n    };\n    value?: {\n        type: null;\n        value?: SliderValue;\n    };\n    defaultValue?: {\n        type: null;\n        value?: SliderValue;\n    };\n    vertical?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n}\nexport declare type SliderValue = number | Array<number>;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/slider/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Sticky Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ncontainer | Function | - | \\- | N\ndisabled | Boolean | false | \\- | N\noffset-top | String / Number | 0 | \\- | N\nz-index | Number | 99 | \\- | N\n\n### Sticky Events\n\nname | params | description\n-- | -- | --\nscroll | `(detail: { scrollTop: number, isFixed: boolean })` | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts)\n### Sticky External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-content | \\-\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/README.md",
    "content": "---\ntitle: Sticky 吸顶\ndescription: 用于常驻页面顶部的信息、操作展示。\nspline: data\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-87%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-90%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-84%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-79%25-red\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-sticky\": \"tdesign-miniprogram/sticky/sticky\"\n}\n```\n\n## 代码演示\n\n将内容包裹在 `Sticky` 组件内\n\n<img src=\"https://tdesign.gtimg.com/miniprogram/readme/sticky.gif\" width=\"375px\" height=\"50%\">\n\n\n<a href=\"https://developers.weixin.qq.com/s/mJ7HTiml7NSM\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 基础吸顶\n\n{{ base }}\n\n\n### 吸顶距离\n\n{{ offset }}\n\n### 指定容器\n\n{{ container }}\n\n\n\n## API\n\n### Sticky Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ncontainer | Function | - | 函数返回容器对应的 NodesRef 节点，将对应节点指定为组件的外部容器，滚动时组件会始终保持在容器范围内，当组件即将超出容器底部时，会返回原位置。 | N\ndisabled | Boolean | false | 是否禁用组件 | N\noffset-top | String / Number | 0 | 吸顶时与顶部的距离，单位`px` | N\nz-index | Number | 99 | 吸顶时的 z-index | N\n\n### Sticky Events\n\n名称 | 参数 | 描述\n-- | -- | --\nscroll | `(detail: { scrollTop: number, isFixed: boolean })` | 滚动时触发，scrollTop: 距离顶部位置，isFixed: 是否吸顶。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts)\n### Sticky External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-content | 内容样式类\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/index.d.ts",
    "content": "export * from './props';\nexport * from './type';\nexport * from './sticky';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/index.js",
    "content": "export * from './props';\nexport * from './type';\nexport * from './sticky';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/props.d.ts",
    "content": "import { TdStickyProps } from './type';\ndeclare const props: TdStickyProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/props.js",
    "content": "const props = {\n    container: {\n        type: null,\n    },\n    disabled: {\n        type: Boolean,\n        value: false,\n    },\n    offsetTop: {\n        type: null,\n        value: 0,\n    },\n    zIndex: {\n        type: Number,\n        value: 99,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/sticky.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nimport type { TdStickyProps } from './type';\nexport interface StickyProps extends TdStickyProps {\n}\nexport default class Sticky extends SuperComponent {\n    externalClasses: string[];\n    properties: TdStickyProps;\n    behaviors: string[];\n    observers: {\n        'offsetTop, disabled, container'(): void;\n    };\n    data: {\n        prefix: string;\n        classPrefix: string;\n        containerStyle: string;\n        contentStyle: string;\n    };\n    ready(): void;\n    methods: {\n        onScroll(event?: {\n            scrollTop: number;\n        }): void;\n        setDataAfterDiff(data: {\n            isFixed: boolean;\n            height?: number;\n            transform?: number;\n        }): void;\n        getContainerRect(): Promise<WechatMiniprogram.BoundingClientRectCallbackResult>;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/sticky.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport props from './props';\nimport config from '../common/config';\nimport pageScrollMixin from '../mixins/page-scroll';\nimport { getRect } from '../common/utils';\nconst { prefix } = config;\nconst name = `${prefix}-sticky`;\nconst ContainerClass = `.${name}`;\nlet Sticky = class Sticky extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`, `${prefix}-class-content`];\n        this.properties = props;\n        this.behaviors = [pageScrollMixin()];\n        this.observers = {\n            'offsetTop, disabled, container'() {\n                this.onScroll();\n            },\n        };\n        this.data = {\n            prefix,\n            classPrefix: name,\n            containerStyle: '',\n            contentStyle: '',\n        };\n        this.methods = {\n            onScroll(event) {\n                const { scrollTop } = event || {};\n                const { container, offsetTop, disabled } = this.properties;\n                if (disabled) {\n                    this.setDataAfterDiff({\n                        isFixed: false,\n                        transform: 0,\n                    });\n                    return;\n                }\n                this.scrollTop = scrollTop || this.scrollTop;\n                if (typeof container === 'function') {\n                    Promise.all([getRect(this, ContainerClass), this.getContainerRect()]).then(([root, container]) => {\n                        if (!root || !container)\n                            return;\n                        if (offsetTop + root.height > container.height + container.top) {\n                            this.setDataAfterDiff({\n                                isFixed: false,\n                                transform: container.height - root.height,\n                            });\n                        }\n                        else if (offsetTop >= root.top) {\n                            this.setDataAfterDiff({\n                                isFixed: true,\n                                height: root.height,\n                                transform: 0,\n                            });\n                        }\n                        else {\n                            this.setDataAfterDiff({ isFixed: false, transform: 0 });\n                        }\n                    });\n                    return;\n                }\n                getRect(this, ContainerClass).then((root) => {\n                    if (!root)\n                        return;\n                    if (offsetTop >= root.top) {\n                        this.setDataAfterDiff({ isFixed: true, height: root.height });\n                        this.transform = 0;\n                    }\n                    else {\n                        this.setDataAfterDiff({ isFixed: false });\n                    }\n                });\n            },\n            setDataAfterDiff(data) {\n                const { offsetTop } = this.properties;\n                const { containerStyle: prevContainerStyle, contentStyle: prevContentStyle } = this.data;\n                const { isFixed, height, transform } = data;\n                wx.nextTick(() => {\n                    let containerStyle = '';\n                    let contentStyle = '';\n                    if (isFixed) {\n                        containerStyle += `height:${height}px;`;\n                        contentStyle += `position:fixed;top:${offsetTop}px;left:0;right:0;`;\n                    }\n                    if (transform) {\n                        const translate = `translate3d(0, ${transform}px, 0)`;\n                        contentStyle += `-webkit-transform:${translate};transform:${translate};`;\n                    }\n                    if (prevContainerStyle !== containerStyle || prevContentStyle !== contentStyle) {\n                        this.setData({ containerStyle, contentStyle });\n                    }\n                    this.triggerEvent('scroll', {\n                        scrollTop: this.scrollTop,\n                        isFixed,\n                    });\n                });\n            },\n            getContainerRect() {\n                const nodesRef = this.properties.container();\n                return new Promise((resolve) => nodesRef.boundingClientRect(resolve).exec());\n            },\n        };\n    }\n    ready() {\n        this.onScroll();\n    }\n};\nSticky = __decorate([\n    wxComponent()\n], Sticky);\nexport default Sticky;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/sticky.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/sticky.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  class=\"{{classPrefix}} class {{prefix}}-class\"\n  style=\"{{_._style(['z-index:' + zIndex, containerStyle, style, customStyle])}}\"\n>\n  <view\n    class=\"{{classPrefix}}__content {{prefix}}-class-content\"\n    style=\"{{_._style(['z-index:' + zIndex, contentStyle]) }}\"\n  >\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/sticky.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-sticky {\n  position: relative;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/type.d.ts",
    "content": "export interface TdStickyProps {\n    container?: {\n        type: undefined;\n        value?: null;\n    };\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    offsetTop?: {\n        type: null;\n        value?: string | number;\n    };\n    zIndex?: {\n        type: NumberConstructor;\n        value?: number;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/sticky/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/switch/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Switch Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\ncustom-value | Array | [true, false] | Typescript：`Array<SwitchValue>` | N\ndisabled | Boolean | undefined | \\- | N\nicon | Array | [] | `0.27.0`。Typescript：`string[]` | N\nlabel | Array | [] | `0.27.0`。Typescript：`string[]` | N\nloading | Boolean | false | `0.27.0` | N\nsize | String | medium | `0.27.0`。options: small/medium/large | N\nvalue | String / Number / Boolean | null | Typescript：`SwitchValue` `type SwitchValue = string \\| number \\| boolean`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/switch/type.ts) | N\ndefault-value | String / Number / Boolean | undefined | uncontrolled property。Typescript：`SwitchValue` `type SwitchValue = string \\| number \\| boolean`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/switch/type.ts) | N\n\n### Switch Events\n\nname | params | description\n-- | -- | --\nchange | `(value: SwitchValue)` | \\-\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-switch-checked-color | @brand-color | - \n--td-switch-checked-disabled-color | @brand-color-disabled | - \n--td-switch-dot-border-color | @bg-color-secondarycontainer | - \n--td-switch-dot-horizontal-margin | 6rpx | - \n--td-switch-dot-large-size | 52rpx | - \n--td-switch-dot-plain-horizontal-margin | 10rpx | - \n--td-switch-dot-plain-large-size | 44rpx | - \n--td-switch-dot-plain-size | 36rpx | - \n--td-switch-dot-plain-small-size | 28rpx | - \n--td-switch-dot-shadow | @shadow-1 | - \n--td-switch-dot-size | 44rpx | - \n--td-switch-dot-small-size | 36rpx | - \n--td-switch-height | 56rpx | - \n--td-switch-icon-large-size | 48rpx | - \n--td-switch-icon-size | 40rpx | - \n--td-switch-icon-small-size | 32rpx | - \n--td-switch-label-checked-color | @switch-checked-color | - \n--td-switch-label-color | @font-gray-4 | - \n--td-switch-label-font-size | 28rpx | - \n--td-switch-label-large-font-size | 32rpx | - \n--td-switch-label-small-font-size | 24rpx | - \n--td-switch-large-height | 64rpx | - \n--td-switch-large-radius | calc(@switch-large-height / 2) | - \n--td-switch-large-width | 104rpx | - \n--td-switch-radius | calc(@switch-height / 2) | - \n--td-switch-small-height | 48rpx | - \n--td-switch-small-radius | calc(@switch-small-height / 2) | - \n--td-switch-small-width | 78rpx | - \n--td-switch-unchecked-color | @font-gray-4 | - \n--td-switch-unchecked-disabled-color | @bg-color-component-disabled | - \n--td-switch-width | 90rpx | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/switch/README.md",
    "content": "---\ntitle: Switch 开关\ndescription: 用于控制某个功能的开启和关闭。\nspline: form\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-100%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-82%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-switch\": \"tdesign-miniprogram/switch/switch\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/ea6Lpim37ISs\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 基础开关\n\n{{ base }}\n\n### 带描述开关\n\n{{ label }}\n\n### 自定义颜色\n\n{{ color }}\n\n### 开关状态\n\n{{ status }}\n\n### 尺寸\n\n{{ size }}\n\n## API\n\n### Switch Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\ncustom-value | Array | [true, false] | 用于自定义开关的值，[打开时的值，关闭时的值]。默认为 [true, false]。示例：[1, 0]、['open', 'close']。TS 类型：`Array<SwitchValue>` | N\ndisabled | Boolean | undefined | 是否禁用组件。优先级：Switch.disabled > Form.disabled | N\nicon | Array | [] | `0.27.0`。开关的图标；[打开时的图标，关闭时的图标]。TS 类型：`string[]` | N\nlabel | Array | [] | `0.27.0`。开关的标签；[打开时的标签，关闭时的标签]。TS 类型：`string[]` | N\nloading | Boolean | false | `0.27.0`。是否处于加载中状态 | N\nsize | String | medium | `0.27.0`。开关尺寸。可选项：small/medium/large | N\nvalue | String / Number / Boolean | null | 开关值。TS 类型：`SwitchValue` `type SwitchValue = string \\| number \\| boolean`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/switch/type.ts) | N\ndefault-value | String / Number / Boolean | undefined | 开关值。非受控属性。TS 类型：`SwitchValue` `type SwitchValue = string \\| number \\| boolean`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/switch/type.ts) | N\n\n### Switch Events\n\n名称 | 参数 | 描述\n-- | -- | --\nchange | `(value: SwitchValue)` | 数据发生变化时触发\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-switch-checked-color | @brand-color | - \n--td-switch-checked-disabled-color | @brand-color-disabled | - \n--td-switch-dot-border-color | @bg-color-secondarycontainer | - \n--td-switch-dot-horizontal-margin | 6rpx | - \n--td-switch-dot-large-size | 52rpx | - \n--td-switch-dot-plain-horizontal-margin | 10rpx | - \n--td-switch-dot-plain-large-size | 44rpx | - \n--td-switch-dot-plain-size | 36rpx | - \n--td-switch-dot-plain-small-size | 28rpx | - \n--td-switch-dot-shadow | @shadow-1 | - \n--td-switch-dot-size | 44rpx | - \n--td-switch-dot-small-size | 36rpx | - \n--td-switch-height | 56rpx | - \n--td-switch-icon-large-size | 48rpx | - \n--td-switch-icon-size | 40rpx | - \n--td-switch-icon-small-size | 32rpx | - \n--td-switch-label-checked-color | @switch-checked-color | - \n--td-switch-label-color | @font-gray-4 | - \n--td-switch-label-font-size | 28rpx | - \n--td-switch-label-large-font-size | 32rpx | - \n--td-switch-label-small-font-size | 24rpx | - \n--td-switch-large-height | 64rpx | - \n--td-switch-large-radius | calc(@switch-large-height / 2) | - \n--td-switch-large-width | 104rpx | - \n--td-switch-radius | calc(@switch-height / 2) | - \n--td-switch-small-height | 48rpx | - \n--td-switch-small-radius | calc(@switch-small-height / 2) | - \n--td-switch-small-width | 78rpx | - \n--td-switch-unchecked-color | @font-gray-4 | - \n--td-switch-unchecked-disabled-color | @bg-color-component-disabled | - \n--td-switch-width | 90rpx | -"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/switch/props.d.ts",
    "content": "import { TdSwitchProps } from './type';\ndeclare const props: TdSwitchProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/switch/props.js",
    "content": "const props = {\n    customValue: {\n        type: Array,\n        value: [true, false],\n    },\n    disabled: {\n        type: null,\n        value: undefined,\n    },\n    icon: {\n        type: Array,\n        value: [],\n    },\n    label: {\n        type: Array,\n        value: [],\n    },\n    loading: {\n        type: Boolean,\n        value: false,\n    },\n    size: {\n        type: String,\n        value: 'medium',\n    },\n    value: {\n        type: null,\n        value: null,\n    },\n    defaultValue: {\n        type: null,\n        value: null,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/switch/switch.d.ts",
    "content": "import { SuperComponent } from '../common/src/index';\nexport default class Switch extends SuperComponent {\n    externalClasses: string[];\n    behaviors: string[];\n    properties: import(\"./type\").TdSwitchProps<import(\"./type\").SwitchValue>;\n    data: {\n        prefix: string;\n        classPrefix: string;\n        checked: boolean;\n    };\n    controlledProps: {\n        key: string;\n        event: string;\n    }[];\n    observers: {\n        value(val: any): void;\n    };\n    methods: {\n        handleSwitch(): void;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/switch/switch.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { wxComponent, SuperComponent } from '../common/src/index';\nimport config from '../common/config';\nimport props from './props';\nconst { prefix } = config;\nconst name = `${prefix}-switch`;\nlet Switch = class Switch extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = ['t-class', 't-class-label', 't-class-body', 't-class-dot'];\n        this.behaviors = ['wx://form-field'];\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n            checked: false,\n        };\n        this.controlledProps = [\n            {\n                key: 'value',\n                event: 'change',\n            },\n        ];\n        this.observers = {\n            value(val) {\n                const [activeValue] = this.data.customValue;\n                this.setData({\n                    checked: val === activeValue,\n                });\n            },\n        };\n        this.methods = {\n            handleSwitch() {\n                const { loading, disabled, value, customValue } = this.data;\n                const [activeValue, inactiveValue] = customValue;\n                if (loading || disabled)\n                    return;\n                this._trigger('change', {\n                    value: value === activeValue ? inactiveValue : activeValue,\n                });\n            },\n        };\n    }\n};\nSwitch = __decorate([\n    wxComponent()\n], Switch);\nexport default Switch;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/switch/switch.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-icon\": \"../icon/icon\",\n    \"t-loading\": \"../loading/loading\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/switch/switch.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  style=\"{{_._style([style, customStyle])}}\"\n  class=\"class {{ prefix }}-class {{classPrefix}}\"\n  bind:tap=\"handleSwitch\"\n  aria-checked=\"{{checked}}\"\n  aria-disabled=\"{{disabled}}\"\n  aria-role=\"switch\"\n>\n  <view\n    class=\"{{_.cls(classPrefix + '__body', [['checked', checked], ['disabled', disabled || loading], size])}} {{prefix}}-class-body\"\n  >\n    <view\n      class=\"{{_.cls(classPrefix + '__dot', [['checked', checked], ['plain', label.length != 2 && icon.length != 2 && !loading], size])}} {{prefix}}-class-dot\"\n      aria-hidden=\"{{true}}\"\n    >\n      <view\n        wx:if=\"{{label}}\"\n        class=\"{{_.cls(classPrefix + '__label', [['checked', checked], ['disabled', disabled], size])}} {{prefix}}-class-label\"\n      >\n        <t-loading wx:if=\"{{loading}}\" inherit-color size=\"32rpx\" />\n        <text wx:elif=\"{{label.length == 2}}\">{{checked ? label[0] : label[1]}}</text>\n        <t-icon\n          wx:elif=\"{{icon.length == 2}}\"\n          name=\"{{checked ? icon[0] : icon[1]}}\"\n          t-class=\"{{_.cls(classPrefix + '__icon', [['checked', checked], size])}}\"\n        />\n      </view>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/switch/switch.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-switch {\n  display: flex;\n  align-items: center;\n  overflow: hidden;\n}\n.t-switch__label {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-wrap: nowrap;\n  font-size: var(--td-switch-label-font-size, 28rpx);\n  color: var(--td-switch-label-color, var(--td-bg-color-secondarycontainer-active, var(--td-gray-color-4, #dcdcdc)));\n  overflow: hidden;\n}\n.t-switch__label--checked {\n  color: var(--td-switch-label-checked-color, var(--td-switch-checked-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9))));\n}\n.t-switch__label--disabled {\n  color: var(--td-switch-unchecked-disabled-color, var(--td-bg-color-component-disabled, var(--td-gray-color-2, #eeeeee)));\n}\n.t-switch__label--checked.t-switch__label--disabled {\n  color: var(--td-switch-checked-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-switch__label--large {\n  font-size: var(--td-switch-label-large-font-size, 32rpx);\n}\n.t-switch__label--small {\n  font-size: var(--td-switch-label-small-font-size, 24rpx);\n}\n.t-switch__label:empty {\n  display: none;\n}\n.t-switch__icon {\n  font-size: var(--td-switch-icon-size, 40rpx);\n}\n.t-switch__icon--large {\n  font-size: var(--td-switch-icon-large-size, 48rpx);\n}\n.t-switch__icon--small {\n  font-size: var(--td-switch-icon-small-size, 32rpx);\n}\n.t-switch__loading {\n  color: var(--td-switch-label-checked-color, var(--td-switch-checked-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9))));\n}\n.t-switch__body {\n  vertical-align: middle;\n  width: var(--td-switch-width, 90rpx);\n  height: var(--td-switch-height, 56rpx);\n  border-radius: var(--td-switch-radius, calc(var(--td-switch-height, 56rpx) / 2));\n  background-color: var(--td-switch-unchecked-color, var(--td-bg-color-secondarycontainer-active, var(--td-gray-color-4, #dcdcdc)));\n  position: relative;\n  transition: all 0.3s ease;\n  overflow: hidden;\n}\n.t-switch__body--checked {\n  background-color: var(--td-switch-checked-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-switch__body--disabled {\n  background-color: var(--td-switch-unchecked-disabled-color, var(--td-bg-color-component-disabled, var(--td-gray-color-2, #eeeeee)));\n}\n.t-switch__body--checked.t-switch__body--disabled {\n  background-color: var(--td-switch-checked-disabled-color, var(--td-brand-color-disabled, var(--td-primary-color-3, #b5c7ff)));\n}\n.t-switch__body--large {\n  width: var(--td-switch-large-width, 104rpx);\n  height: var(--td-switch-large-height, 64rpx);\n  border-radius: var(--td-switch-large-radius, calc(var(--td-switch-large-height, 64rpx) / 2));\n}\n.t-switch__body--small {\n  width: var(--td-switch-small-width, 78rpx);\n  height: var(--td-switch-small-height, 48rpx);\n  border-radius: var(--td-switch-small-radius, calc(var(--td-switch-small-height, 48rpx) / 2));\n}\n.t-switch__dot {\n  position: absolute;\n  left: var(--td-switch-dot-horizontal-margin, 6rpx);\n  top: 50%;\n  width: var(--td-switch-dot-size, 44rpx);\n  height: var(--td-switch-dot-size, 44rpx);\n  border-radius: 50%;\n  background-color: var(--td-text-color-anti, var(--td-font-white-1, #ffffff));\n  transition: all 0.3s;\n  transform: translateY(-50%);\n  box-shadow: var(--td-switch-dot-shadow, var(--td-shadow-1, 0 1px 10px rgba(0, 0, 0, 0.05), 0 4px 5px rgba(0, 0, 0, 0.08), 0 2px 4px -1px rgba(0, 0, 0, 0.12)));\n}\n.t-switch__dot:after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 200%;\n  height: 200%;\n  border: 1px solid var(--td-switch-dot-border-color, var(--td-gray-color-4, #dcdcdc));\n  border-radius: 50%;\n  transform: scale(0.5);\n  transform-origin: 0 0;\n  box-sizing: border-box;\n}\n.t-switch__dot--large {\n  width: var(--td-switch-dot-large-size, 52rpx);\n  height: var(--td-switch-dot-large-size, 52rpx);\n}\n.t-switch__dot--small {\n  width: var(--td-switch-dot-small-size, 36rpx);\n  height: var(--td-switch-dot-small-size, 36rpx);\n}\n.t-switch__dot--checked {\n  left: calc(var(--td-switch-width, 90rpx) - var(--td-switch-dot-size, 44rpx) - var(--td-switch-dot-horizontal-margin, 6rpx));\n}\n.t-switch__dot--large.t-switch__dot--checked {\n  left: calc(var(--td-switch-large-width, 104rpx) - var(--td-switch-dot-large-size, 52rpx) - var(--td-switch-dot-horizontal-margin, 6rpx));\n}\n.t-switch__dot--small.t-switch__dot--checked {\n  left: calc(var(--td-switch-small-width, 78rpx) - var(--td-switch-dot-small-size, 36rpx) - var(--td-switch-dot-horizontal-margin, 6rpx));\n}\n.t-switch__dot--plain:not(.t-switch__dot--checked) {\n  width: var(--td-switch-dot-plain-size, 36rpx);\n  height: var(--td-switch-dot-plain-size, 36rpx);\n  left: var(--td-switch-dot-plain-horizontal-margin, 10rpx);\n}\n.t-switch__dot--large.t-switch__dot--plain:not(.t-switch__dot--checked) {\n  width: var(--td-switch-dot-plain-large-size, 44rpx);\n  height: var(--td-switch-dot-plain-large-size, 44rpx);\n}\n.t-switch__dot--small.t-switch__dot--plain:not(.t-switch__dot--checked) {\n  width: var(--td-switch-dot-plain-small-size, 28rpx);\n  height: var(--td-switch-dot-plain-small-size, 28rpx);\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/switch/type.d.ts",
    "content": "export interface TdSwitchProps<T = SwitchValue> {\n    customValue?: {\n        type: ArrayConstructor;\n        value?: Array<SwitchValue>;\n    };\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    icon?: {\n        type: ArrayConstructor;\n        value?: string[];\n    };\n    label?: {\n        type: ArrayConstructor;\n        value?: string[];\n    };\n    loading?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    size?: {\n        type: StringConstructor;\n        value?: 'small' | 'medium' | 'large';\n    };\n    value?: {\n        type: null;\n        value?: SwitchValue;\n    };\n    defaultValue?: {\n        type: null;\n        value?: SwitchValue;\n    };\n}\nexport declare type SwitchValue = string | number | boolean;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/switch/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tab-panel/props.d.ts",
    "content": "import { TdTabPanelProps } from './type';\ndeclare const props: TdTabPanelProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tab-panel/props.js",
    "content": "const props = {\n    badgeProps: {\n        type: Object,\n    },\n    disabled: {\n        type: Boolean,\n        value: false,\n    },\n    icon: {\n        type: null,\n    },\n    label: {\n        type: String,\n        value: '',\n    },\n    panel: {\n        type: String,\n    },\n    value: {\n        type: null,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tab-panel/tab-panel.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\nimport { SuperComponent, RelationsOptions } from '../common/src/index';\nexport default class TabPanel extends SuperComponent {\n    externalClasses: string[];\n    relations: RelationsOptions;\n    options: {\n        multipleSlots: boolean;\n    };\n    properties: import(\"./type\").TdTabPanelProps;\n    data: {\n        prefix: string;\n        classPrefix: string;\n        active: boolean;\n        hide: boolean;\n        id: string;\n    };\n    setId(id: any): void;\n    observers: {\n        'label, badgeProps, disabled, icon, panel, value'(): void;\n    };\n    getComputedName(): string;\n    update(): void;\n    render(active: Boolean, parent: WechatMiniprogram.Component.TrivialInstance): void;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tab-panel/tab-panel.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport props from './props';\nimport config from '../common/config';\nconst { prefix } = config;\nconst name = `${prefix}-tab-panel`;\nlet TabPanel = class TabPanel extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.externalClasses = [`${prefix}-class`];\n        this.relations = {\n            '../tabs/tabs': {\n                type: 'ancestor',\n            },\n        };\n        this.options = {\n            multipleSlots: true,\n        };\n        this.properties = props;\n        this.data = {\n            prefix,\n            classPrefix: name,\n            active: false,\n            hide: true,\n            id: '',\n        };\n        this.observers = {\n            'label, badgeProps, disabled, icon, panel, value'() {\n                this.update();\n            },\n        };\n    }\n    setId(id) {\n        this.setData({ id });\n    }\n    getComputedName() {\n        if (this.properties.value != null) {\n            return `${this.properties.value}`;\n        }\n        return `${this.index}`;\n    }\n    update() {\n        var _a;\n        (_a = this.$parent) === null || _a === void 0 ? void 0 : _a.updateTabs();\n    }\n    render(active, parent) {\n        this.initialized = this.initialized || active;\n        this.setData({\n            active,\n            hide: !parent.data.animation && !active,\n        });\n    }\n};\nTabPanel = __decorate([\n    wxComponent()\n], TabPanel);\nexport default TabPanel;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tab-panel/tab-panel.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tab-panel/tab-panel.wxml",
    "content": "<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view\n  class=\"class {{prefix}}-class {{classPrefix}} {{active ? classPrefix + '--active': classPrefix + '--inactive'}}\"\n  style=\"{{_._style([style, customStyle, (hide ? 'display: none' : '')])}}\"\n  id=\"{{id}}\"\n  aria-role=\"tabpanel\"\n>\n  <view wx:if=\"{{panel}}\">{{panel}}</view>\n  <slot />\n  <slot name=\"panel\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tab-panel/tab-panel.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-tab-panel {\n  flex-shrink: 0;\n  width: 100%;\n  height: 100%;\n  box-sizing: border-box;\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n}\n.t-tab-panel--active {\n  height: auto;\n}\n.t-tab-panel--inactive {\n  height: 0;\n  overflow: visible;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tab-panel/type.d.ts",
    "content": "import { TabValue } from '../tabs/index';\nexport interface TdTabPanelProps {\n    badgeProps?: {\n        type: ObjectConstructor;\n        value?: object;\n    };\n    disabled?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    icon?: {\n        type: null;\n        value?: string | object;\n    };\n    label?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    panel?: {\n        type: StringConstructor;\n        value?: string;\n    };\n    value?: {\n        type: null;\n        value?: TabValue;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tab-panel/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/README.en-US.md",
    "content": ":: BASE_DOC ::\n\n## API\n\n### Tabs Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nanimation | Object | - | Typescript：`TabAnimation` `type TabAnimation = { duration: number } & Record<string, any>`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N\nmiddle | Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nshow-bottom-line | Boolean | true | \\- | N\nspace-evenly | Boolean | true | \\- | N\nsplit | Boolean | true | \\- | N\nsticky | Boolean | false | \\- | N\nsticky-props | Object | - | Typescript：`StickyProps`，[Sticky API Documents](./sticky?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N\nswipeable | Boolean | true | \\- | N\ntheme | String | line | options: line/tag/card | N\nvalue | String / Number | - | Typescript：`TabValue` `type TabValue = string \\| number`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N\ndefault-value | String / Number | undefined | uncontrolled property。Typescript：`TabValue` `type TabValue = string \\| number`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N\n\n### Tabs Events\n\nname | params | description\n-- | -- | --\nchange | `(value: TabValue, label: string)` | \\-\nclick | `(value: TabValue, label: string)` | \\-\nscroll | `(scrollTop: number, isFixed: boolean)` | \\-\n### Tabs External Classes\n\nclassName | Description\n-- | --\nt-class | \\-\nt-class-active | \\-\nt-class-content | \\-\nt-class-item | \\-\nt-class-track | \\-\n\n\n### TabPanel Props\n\nname | type | default | description | required\n-- | -- | -- | -- | --\nstyle | Object | - | CSS(Cascading Style Sheets) | N\ncustom-style | Object | - | CSS(Cascading Style Sheets)，used to set style on virtual component | N\nbadge-props | Object | - | \\- | N\ndisabled | Boolean | false | \\- | N\nicon | String / Object | - | \\- | N\nlabel | String | - | \\- | N\npanel | String / Slot | - | [see more ts definition](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nvalue | String / Number | - | Typescript：`TabValue`，[Tabs API Documents](./tabs?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tab-panel/type.ts) | N\n\n### CSS Variables\n\nThe component provides the following CSS variables, which can be used to customize styles.\nName | Default Value | Description \n-- | -- | --\n--td-tab-border-color | @component-stroke | - \n--td-tab-font-size | 28rpx | - \n--td-tab-icon-size | 36rpx | - \n--td-tab-item-active-color | @brand-color | - \n--td-tab-item-color | @font-gray-1 | - \n--td-tab-item-disabled-color | @font-gray-4 | - \n--td-tab-item-height | 96rpx | - \n--td-tab-item-tag-active-bg | @brand-color-light | - \n--td-tab-item-tag-bg | @bg-color-secondarycontainer | - \n--td-tab-item-tag-height | 64rpx | - \n--td-tab-item-vertical-height | 108rpx | - \n--td-tab-item-vertical-width | 208rpx | - \n--td-tab-nav-bg-color | @bg-color-container | - \n--td-tab-track-color | @brand-color | - \n--td-tab-track-radius | 8rpx | - \n--td-tab-track-thickness | 6rpx | - \n--td-tab-track-width | 32rpx | -\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/README.md",
    "content": "---\ntitle: Tabs 选项卡\ndescription: 用于内容分类后的展示切换。\nspline: navigation\nisComponent: true\n---\n\n<span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20lines-93%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20functions-88%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20statements-90%25-blue\" /></span><span class=\"coverages-badge\" style=\"margin-right: 10px\"><img src=\"https://img.shields.io/badge/coverages%3A%20branches-80%25-blue\" /></span>\n## 引入\n\n全局引入，在 miniprogram 根目录下的`app.json`中配置，局部引入，在需要引入的页面或组件的`index.json`中配置。\n\n```json\n\"usingComponents\": {\n  \"t-tabs\": \"tdesign-miniprogram/tabs/tabs\",\n  \"t-tab-panel\": \"tdesign-miniprogram/tab-panel/tab-panel\"\n}\n```\n\n## 代码演示\n\n<a href=\"https://developers.weixin.qq.com/s/YR98fimt7MSV\" title=\"在开发者工具中预览效果\" target=\"_blank\" rel=\"noopener noreferrer\"> 在开发者工具中预览效果 </a>\n\n<blockquote style=\"background-color: #d9e1ff; font-size: 15px; line-height: 26px;margin: 16px 0 0;padding: 16px; border-radius: 6px; color: #0052d9\" >\n<p>Tips: 请确保开发者工具为打开状态。导入开发者工具后，依次执行：npm i > 构建npm包 > 勾选 \"将JS编译成ES5\"</p>\n</blockquote>\n\n### 基础选项卡\n\n{{ base }}\n\n### 等距选项卡\n\n{{ scroll }}\n\n### 带图标选项卡\n\n{{ with-icon }}\n\n### 带徽章选项卡\n\n{{ with-badge }}\n\n### 带内容区选项卡\n\n{{ with-content }}\n\n### 选项卡状态\n\n{{ status }}\n\n### 选项卡尺寸\n\n{{ size }}\n\n### 选项卡样式\n\n使用 theme 属性可以变换风格，支持 line = 线条（默认）；tag = 标签；card = 卡片\n\n{{ theme }}\n\n<!-- 横向选项卡支持超过屏幕滑动 -->\n\n<img src=\"https://tdesign.gtimg.com/miniprogram/readme/tabs-3.png\" width=\"375px\" height=\"50%\">\n\n\n### 受控用法\n\n```html\n<t-tabs value=\"{{value}}\" bind:change=\"onTabsChange\">\n  <t-tab-panel label=\"标签页一\" value=\"0\">标签一内容</t-tab-panel>\n  <t-tab-panel label=\"标签页二\" value=\"1\">标签二内容</t-tab-panel>\n</t-tabs>\n```\n\n```js\nPage({\n  data: {\n    value: '0',\n  },\n  onTabsChange(e) {\n    this.setData({ value: e.detail.value })\n  },\n});\n```\n\n### 与 Popup 使用\n\n```html\n <t-popup visible=\"{{visible}}\" bind:visible-change=\"onVisibleChange\">\n  <t-tabs id=\"tabs\" defaultValue=\"{{0}}\" bind:change=\"onTabsChange\" bind:click=\"onTabsClick\" t-class=\"custom-tabs\">\n    <t-tab-panel label=\"标签页一\" value=\"0\">标签一内容</t-tab-panel>\n    <t-tab-panel label=\"标签页二\" value=\"1\">标签二内容</t-tab-panel>\n    <t-tab-panel label=\"标签页三\" value=\"2\">标签三内容</t-tab-panel>\n  </t-tabs>\n</t-popup>\n```\n\n```js\nPage({\n  data: {\n    visible: false\n  },\n  showPopup() {\n    this.setData({\n      visible: true\n    }, () => {\n      const tabs = this.selectComponent('tabs');\n\n      tabs.setTrack(); // 这一步很重要，因为小程序的无法正确执行生命周期，所以需要手动设置下 tabs 的滑块\n    })\n  }\n})\n```\n\n## API\n\n### Tabs Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nanimation | Object | - | 动画效果设置。其中 duration 表示动画时长。（单位：秒）。TS 类型：`TabAnimation` `type TabAnimation = { duration: number } & Record<string, any>`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N\nmiddle | Slot | - | 中间内容，介于头部和内容之间。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nshow-bottom-line | Boolean | true | 是否展示底部激活线条 | N\nspace-evenly | Boolean | true | 选项卡头部空间是否均分 | N\nsplit | Boolean | true | `1.1.10`。是否展示分割线 | N\nsticky | Boolean | false | 是否开启粘性布局 | N\nsticky-props | Object | - | 透传至 Sticky 组件。TS 类型：`StickyProps`，[Sticky API Documents](./sticky?tab=api)。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N\nswipeable | Boolean | true | 是否可以滑动切换 | N\ntheme | String | line | 标签的样式。可选项：line/tag/card | N\nvalue | String / Number | - | 激活的选项卡值。TS 类型：`TabValue` `type TabValue = string \\| number`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N\ndefault-value | String / Number | undefined | 激活的选项卡值。非受控属性。TS 类型：`TabValue` `type TabValue = string \\| number`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N\n\n### Tabs Events\n\n名称 | 参数 | 描述\n-- | -- | --\nchange | `(value: TabValue, label: string)` | 激活的选项卡发生变化时触发\nclick | `(value: TabValue, label: string)` | 点击选项卡时触发\nscroll | `(scrollTop: number, isFixed: boolean)` | 页面滚动时触发\n### Tabs External Classes\n\n类名 | 描述\n-- | --\nt-class | 根节点样式类\nt-class-active | 激活态样式类\nt-class-content | 内容样式类\nt-class-item | 选项样式类\nt-class-track | 滚动条样式类\n\n\n### TabPanel Props\n\n名称 | 类型 | 默认值 | 描述 | 必传\n-- | -- | -- | -- | --\nstyle | Object | - | 样式 | N\ncustom-style | Object | - | 样式，一般用于开启虚拟化组件节点场景 | N\nbadge-props | Object | - | 透传至 Badge 组件 | N\ndisabled | Boolean | false | 是否禁用当前选项卡 | N\nicon | String / Object | - | `1.0.0-rc.1`。图标，传对象则透传至 Icon | N\nlabel | String | - | 选项卡名称 | N\npanel | String / Slot | - | 用于自定义选项卡面板内容。[通用类型定义](https://github.com/Tencent/tdesign-miniprogram/blob/develop/src/common/common.ts) | N\nvalue | String / Number | - | 选项卡的值，唯一标识。TS 类型：`TabValue`，[Tabs API Documents](./tabs?tab=api)。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tab-panel/type.ts) | N\n\n### CSS Variables\n\n组件提供了下列 CSS 变量，可用于自定义样式。\n名称 | 默认值 | 描述 \n-- | -- | --\n--td-tab-border-color | @component-stroke | - \n--td-tab-font-size | 28rpx | - \n--td-tab-icon-size | 36rpx | - \n--td-tab-item-active-color | @brand-color | - \n--td-tab-item-color | @font-gray-1 | - \n--td-tab-item-disabled-color | @font-gray-4 | - \n--td-tab-item-height | 96rpx | - \n--td-tab-item-tag-active-bg | @brand-color-light | - \n--td-tab-item-tag-bg | @bg-color-secondarycontainer | - \n--td-tab-item-tag-height | 64rpx | - \n--td-tab-item-vertical-height | 108rpx | - \n--td-tab-item-vertical-width | 208rpx | - \n--td-tab-nav-bg-color | @bg-color-container | - \n--td-tab-track-color | @brand-color | - \n--td-tab-track-radius | 8rpx | - \n--td-tab-track-thickness | 6rpx | - \n--td-tab-track-width | 32rpx | -\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/index.d.ts",
    "content": "export * from './tabs';\nexport * from './type';\nexport * from './props';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/index.js",
    "content": "export * from './tabs';\nexport * from './type';\nexport * from './props';\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/props.d.ts",
    "content": "import { TdTabsProps } from './type';\ndeclare const props: TdTabsProps;\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/props.js",
    "content": "const props = {\n    animation: {\n        type: Object,\n    },\n    externalClasses: {\n        type: Array,\n    },\n    showBottomLine: {\n        type: Boolean,\n        value: true,\n    },\n    spaceEvenly: {\n        type: Boolean,\n        value: true,\n    },\n    split: {\n        type: Boolean,\n        value: true,\n    },\n    sticky: {\n        type: Boolean,\n        value: false,\n    },\n    stickyProps: {\n        type: Object,\n    },\n    swipeable: {\n        type: Boolean,\n        value: true,\n    },\n    theme: {\n        type: String,\n        value: 'line',\n    },\n    value: {\n        type: null,\n        value: null,\n    },\n    defaultValue: {\n        type: null,\n    },\n};\nexport default props;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/tabs.d.ts",
    "content": "import { SuperComponent, RelationsOptions } from '../common/src/index';\nimport { TdTabsProps } from './type';\nexport interface TabsProps extends TdTabsProps {\n}\nexport default class Tabs extends SuperComponent {\n    options: {\n        pureDataPattern: RegExp;\n    };\n    behaviors: string[];\n    externalClasses: string[];\n    relations: RelationsOptions;\n    properties: TdTabsProps;\n    controlledProps: {\n        key: string;\n        event: string;\n    }[];\n    observers: {\n        value(name: any): void;\n    };\n    data: {\n        prefix: string;\n        classPrefix: string;\n        tabs: any[];\n        currentLabels: any[];\n        currentIndex: number;\n        trackStyle: string;\n        offset: number;\n        scrollLeft: number;\n        tabID: string;\n        placement: string;\n    };\n    lifetimes: {\n        created(): void;\n        attached(): void;\n    };\n    initChildId(): void;\n    methods: {\n        onScroll(e: any): void;\n        updateTabs(cb: any): void;\n        setCurrentIndexByName(name: any): void;\n        setCurrentIndex(index: number): void;\n        getCurrentName(): any;\n        calcScrollOffset(containerWidth: number, targetLeft: number, targetWidth: number, offset: number): number;\n        getTabHeight(): Promise<any>;\n        getTrackSize(): Promise<number>;\n        setTrack(): Promise<void>;\n        onTabTap(event: any): void;\n        onTouchStart(event: any): void;\n        onTouchMove(event: any): void;\n        onTouchEnd(): void;\n        onTouchScroll(event: WechatMiniprogram.CustomEvent): void;\n        changeIndex(index: any): void;\n        getAvailableTabIndex(deltaX: number): any;\n    };\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/tabs.js",
    "content": "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nimport { SuperComponent, wxComponent } from '../common/src/index';\nimport props from './props';\nimport config from '../common/config';\nimport touch from '../mixins/touch';\nimport { getRect, uniqueFactory } from '../common/utils';\nimport { getObserver } from '../common/wechat';\nconst { prefix } = config;\nconst name = `${prefix}-tabs`;\nconst getUniqueID = uniqueFactory('tabs');\nlet Tabs = class Tabs extends SuperComponent {\n    constructor() {\n        super(...arguments);\n        this.options = {\n            pureDataPattern: /^currentLabels$/,\n        };\n        this.behaviors = [touch];\n        this.externalClasses = [\n            `${prefix}-class`,\n            `${prefix}-class-item`,\n            `${prefix}-class-active`,\n            `${prefix}-class-track`,\n            `${prefix}-class-content`,\n        ];\n        this.relations = {\n            '../tab-panel/tab-panel': {\n                type: 'descendant',\n                linked(target) {\n                    this.children.push(target);\n                    this.initChildId();\n                    target.index = this.children.length - 1;\n                    this.updateTabs();\n                },\n                unlinked(target) {\n                    this.children = this.children.filter((item) => item.index !== target.index);\n                    this.updateTabs(() => this.setTrack());\n                    this.initChildId();\n                },\n            },\n        };\n        this.properties = props;\n        this.controlledProps = [\n            {\n                key: 'value',\n                event: 'change',\n            },\n        ];\n        this.observers = {\n            value(name) {\n                if (name !== this.getCurrentName()) {\n                    this.setCurrentIndexByName(name);\n                }\n            },\n        };\n        this.data = {\n            prefix,\n            classPrefix: name,\n            tabs: [],\n            currentLabels: [],\n            currentIndex: -1,\n            trackStyle: '',\n            offset: 0,\n            scrollLeft: 0,\n            tabID: '',\n            placement: 'top',\n        };\n        this.lifetimes = {\n            created() {\n                this.children = this.children || [];\n            },\n            attached() {\n                wx.nextTick(() => {\n                    this.setTrack();\n                });\n                getRect(this, `.${name}`).then((rect) => {\n                    this.containerWidth = rect.width;\n                });\n                this.setData({\n                    tabID: getUniqueID(),\n                });\n            },\n        };\n        this.methods = {\n            onScroll(e) {\n                const { scrollLeft } = e.detail;\n                this.setData({\n                    scrollLeft,\n                });\n            },\n            updateTabs(cb) {\n                const { children } = this;\n                const tabs = children.map((child) => child.data);\n                tabs.forEach((item) => {\n                    if (typeof item.icon === 'string') {\n                        item.icon = { name: item.icon };\n                    }\n                });\n                this.setData({ tabs }, cb);\n                this.setCurrentIndexByName(this.properties.value);\n            },\n            setCurrentIndexByName(name) {\n                const { children } = this;\n                const index = children.findIndex((child) => child.getComputedName() === `${name}`);\n                if (index > -1) {\n                    this.setCurrentIndex(index);\n                }\n            },\n            setCurrentIndex(index) {\n                if (index <= -1 || index >= this.children.length)\n                    return;\n                const Labels = [];\n                this.children.forEach((child, idx) => {\n                    const isActive = index === idx;\n                    if (isActive !== child.data.active || !child.initialized) {\n                        child.render(isActive, this);\n                    }\n                    Labels.push(child.data.label);\n                });\n                const { currentIndex, currentLabels } = this.data;\n                if (currentIndex === index && currentLabels.join('') === Labels.join(''))\n                    return;\n                this.setData({\n                    currentIndex: index,\n                    currentLabels: Labels,\n                }, () => {\n                    this.setTrack();\n                });\n            },\n            getCurrentName() {\n                if (this.children) {\n                    const activeTab = this.children[this.data.currentIndex];\n                    if (activeTab) {\n                        return activeTab.getComputedName();\n                    }\n                }\n            },\n            calcScrollOffset(containerWidth, targetLeft, targetWidth, offset) {\n                return offset + targetLeft - (1 / 2) * containerWidth + targetWidth / 2;\n            },\n            getTabHeight() {\n                return getRect(this, `.${name}`);\n            },\n            getTrackSize() {\n                return new Promise((resolve, reject) => {\n                    if (this.trackWidth) {\n                        resolve(this.trackWidth);\n                        return;\n                    }\n                    getRect(this, `.${prefix}-tabs__track`)\n                        .then((res) => {\n                        if (res) {\n                            this.trackWidth = res.width;\n                            resolve(this.trackWidth);\n                        }\n                    })\n                        .catch(reject);\n                });\n            },\n            setTrack() {\n                return __awaiter(this, void 0, void 0, function* () {\n                    const { children } = this;\n                    if (!children)\n                        return;\n                    const { currentIndex } = this.data;\n                    if (currentIndex <= -1)\n                        return;\n                    try {\n                        const res = yield getRect(this, `.${prefix}-tabs__item`, true);\n                        const rect = res[currentIndex];\n                        if (!rect)\n                            return;\n                        let count = 0;\n                        let distance = 0;\n                        let totalSize = 0;\n                        res.forEach((item) => {\n                            if (count < currentIndex) {\n                                distance += item.width;\n                                count += 1;\n                            }\n                            totalSize += item.width;\n                        });\n                        if (this.containerWidth) {\n                            const offset = this.calcScrollOffset(this.containerWidth, rect.left, rect.width, this.data.scrollLeft);\n                            const maxOffset = totalSize - this.containerWidth;\n                            this.setData({\n                                offset: Math.min(Math.max(offset, 0), maxOffset),\n                            });\n                        }\n                        else if (!this._hasObserved) {\n                            this._hasObserved = true;\n                            getObserver(this, `.${name}`).then(() => this.setTrack());\n                        }\n                        if (this.data.theme === 'line') {\n                            const trackLineWidth = yield this.getTrackSize();\n                            distance += (rect.width - trackLineWidth) / 2;\n                        }\n                        this.setData({\n                            trackStyle: `-webkit-transform: translateX(${distance}px);\n            transform: translateX(${distance}px);\n          `,\n                        });\n                    }\n                    catch (err) {\n                        this.triggerEvent('error', err);\n                    }\n                });\n            },\n            onTabTap(event) {\n                const { index } = event.currentTarget.dataset;\n                this.changeIndex(index);\n            },\n            onTouchStart(event) {\n                if (!this.properties.swipeable)\n                    return;\n                this.touchStart(event);\n            },\n            onTouchMove(event) {\n                if (!this.properties.swipeable)\n                    return;\n                this.touchMove(event);\n            },\n            onTouchEnd() {\n                if (!this.properties.swipeable)\n                    return;\n                const { direction, deltaX, offsetX } = this;\n                const minSwipeDistance = 50;\n                if (direction === 'horizontal' && offsetX >= minSwipeDistance) {\n                    const index = this.getAvailableTabIndex(deltaX);\n                    if (index !== -1) {\n                        this.changeIndex(index);\n                    }\n                }\n            },\n            onTouchScroll(event) {\n                this._trigger('scroll', event.detail);\n            },\n            changeIndex(index) {\n                const currentTab = this.data.tabs[index];\n                const { value, label } = currentTab;\n                if (!(currentTab === null || currentTab === void 0 ? void 0 : currentTab.disabled) && index !== this.data.currentIndex) {\n                    this._trigger('change', { value, label });\n                }\n                this._trigger('click', { value, label });\n            },\n            getAvailableTabIndex(deltaX) {\n                const step = deltaX > 0 ? -1 : 1;\n                const { currentIndex, tabs } = this.data;\n                const len = tabs.length;\n                for (let i = step; currentIndex + step >= 0 && currentIndex + step < len; i += step) {\n                    const newIndex = currentIndex + i;\n                    if (newIndex >= 0 && newIndex < len && tabs[newIndex]) {\n                        if (!tabs[newIndex].disabled) {\n                            return newIndex;\n                        }\n                    }\n                    else {\n                        return currentIndex;\n                    }\n                }\n                return -1;\n            },\n        };\n    }\n    initChildId() {\n        this.children.forEach((item, index) => {\n            item.setId(`${this.data.tabID}_panel_${index}`);\n        });\n    }\n};\nTabs = __decorate([\n    wxComponent()\n], Tabs);\nexport default Tabs;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/tabs.json",
    "content": "{\n  \"component\": true,\n  \"styleIsolation\": \"apply-shared\",\n  \"usingComponents\": {\n    \"t-sticky\": \"../sticky/sticky\",\n    \"t-badge\": \"../badge/badge\",\n    \"t-icon\": \"../icon/icon\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/tabs.wxml",
    "content": "<import src=\"../common/template/badge.wxml\" />\n<import src=\"../common/template/icon.wxml\" />\n<wxs src=\"./tabs.wxs\" module=\"filters\" />\n<wxs src=\"../common/utils.wxs\" module=\"_\" />\n\n<view style=\"{{_._style([style, customStyle])}}\" class=\"{{_.cls(classPrefix, [placement])}} class {{prefix}}-class\">\n  <t-sticky\n    t-class=\"{{_.cls(classPrefix + '__sticky', [placement])}}\"\n    disabled=\"{{ !sticky }}\"\n    z-index=\"{{ stickyProps.zIndex || '1' }}\"\n    offset-top=\"{{ stickyProps.offsetTop || 0 }}\"\n    container=\"{{ stickyProps.container }}\"\n    bind:scroll=\"onTouchScroll\"\n  >\n    <view class=\"{{_.cls(classPrefix + '__wrapper', [theme])}}\">\n      <scroll-view\n        class=\"{{_.cls(classPrefix + '__scroll', [placement, ['split', split]])}}\"\n        enhanced\n        enable-flex\n        scroll-left=\"{{offset}}\"\n        scroll-x=\"{{true}}\"\n        scroll-anchoring\n        scroll-with-animation\n        enable-passive\n        show-scrollbar=\"{{false}}\"\n        type=\"list\"\n        bind:scroll=\"onScroll\"\n      >\n        <view class=\"{{_.cls(classPrefix + '__nav', [placement, ['evenly', spaceEvenly]])}}\" aria-role=\"tablist\">\n          <view\n            wx:for=\"{{tabs}}\"\n            wx:key=\"index\"\n            data-index=\"{{index}}\"\n            class=\"{{_.cls(classPrefix + '__item', [theme, ['evenly', spaceEvenly], placement, ['disabled', item.disabled], ['active', currentIndex === index]])}} {{currentIndex === index ? prefix + '-class-active' : ''}} {{prefix}}-class-item\"\n            bind:tap=\"onTabTap\"\n            aria-role=\"tab\"\n            aria-controls=\"{{tabID + '_panel_' + index}}\"\n            aria-selected=\"{{currentIndex === index}}\"\n            aria-disabled=\"{{item.disabled}}\"\n            aria-label=\"{{ ariaLabel || (item.badgeProps.dot || item.badgeProps.count ? item.label + _.getBadgeAriaLabel({ ...item.badgeProps }) : '') }}\"\n          >\n            <view\n              class=\"{{_.cls(classPrefix + '__item-inner', [theme, ['active', currentIndex === index]])}}\"\n              aria-hidden=\"{{ item.badgeProps.dot || item.badgeProps.count }}\"\n            >\n              <template wx:if=\"{{item.icon}}\" is=\"icon\" data=\"{{ tClass: classPrefix + '__icon', ...item.icon }}\" />\n              <block wx:if=\"{{item.badgeProps}}\">\n                <template\n                  is=\"badge\"\n                  data=\"{{ ...item.badgeProps, content: item.label, tClass: _.cls(classPrefix + '__badge', [ ['disabled', item.disabled], ['active', currentIndex === index]])}}\"\n                />\n              </block>\n              <block wx:else>{{item.label}}</block>\n            </view>\n            <view wx:if=\"{{theme == 'card' && currentIndex - 1 == index}}\" class=\"{{classPrefix}}__item-prefix\" />\n            <view wx:if=\"{{theme == 'card' && currentIndex + 1 == index}}\" class=\"{{classPrefix}}__item-suffix\" />\n          </view>\n          <view\n            wx:if=\"{{theme == 'line' && showBottomLine}}\"\n            class=\"{{_.cls(classPrefix + '__track', [placement])}} {{prefix}}-class-track\"\n            style=\"{{trackStyle}}\"\n          />\n        </view>\n      </scroll-view>\n    </view>\n  </t-sticky>\n  <slot name=\"middle\" />\n  <view\n    class=\"{{_.cls(classPrefix + '__content', [['animated', animation]])}}\"\n    bind:touchstart=\"onTouchStart\"\n    bind:touchmove=\"onTouchMove\"\n    bind:touchend=\"onTouchEnd\"\n    bind:touchcancel=\"onTouchEnd\"\n  >\n    <view\n      class=\"{{classPrefix}}__content-inner {{prefix}}-class-content\"\n      style=\"{{ filters.animate({duration: animation.duration, currentIndex:currentIndex}) }}\"\n    >\n      <slot />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/tabs.wxs",
    "content": "/* eslint-disable */\n\nfunction animate(options) {\n  var result = [];\n\n  if (options.duration) {\n    result.push('transition-duration: ' + options.duration + 's');\n    result.push('transform: translate3d( ' + -100 * options.currentIndex + '%,0, 0)');\n  }\n\n  return result.join(';');\n}\n\nmodule.exports = {\n  animate: animate,\n};\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/tabs.wxss",
    "content": ".t-float-left {\n  float: left;\n}\n.t-float-right {\n  float: right;\n}\n@keyframes tdesign-fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n.hotspot-expanded.relative {\n  position: relative;\n}\n.hotspot-expanded::after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  transform: scale(1.5);\n}\n.t-tabs {\n  position: relative;\n  font-size: var(--td-tab-font-size, 28rpx);\n  background: var(--td-tab-nav-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n  flex-wrap: wrap;\n}\n.t-tabs__wrapper {\n  display: flex;\n  overflow: hidden;\n  background: var(--td-tab-nav-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n}\n.t-tabs__wrapper--card {\n  background: var(--td-tab-item-tag-bg, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n  --td-tab-border-color: transparent;\n}\n.t-tabs__item {\n  position: relative;\n  display: flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  font-weight: 400;\n  color: var(--td-tab-item-color, var(--td-text-color-primary, var(--td-font-gray-1, rgba(0, 0, 0, 0.9))));\n  padding: 0 var(--td-spacer-2, 32rpx);\n  box-sizing: border-box;\n  white-space: nowrap;\n  overflow: hidden;\n  height: var(--td-tab-item-height, 96rpx);\n}\n.t-tabs__item--active {\n  font-weight: 600;\n  color: var(--td-tab-item-active-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-tabs__item--disabled {\n  color: var(--td-tab-item-disabled-color, var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26))));\n}\n.t-tabs__item--evenly {\n  flex: 1 0 auto;\n}\n.t-tabs__item-inner {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.t-tabs__item-inner--tag {\n  width: 100%;\n  text-align: center;\n  padding: 0 var(--td-spacer-2, 32rpx);\n  line-height: var(--td-tab-item-tag-height, 64rpx);\n  border-radius: calc(var(--td-tab-item-tag-height, 64rpx) / 2);\n  background-color: var(--td-tab-item-tag-bg, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n}\n.t-tabs__item-inner--active.t-tabs__item-inner--tag {\n  background-color: var(--td-tab-item-tag-active-bg, var(--td-brand-color-light, var(--td-primary-color-1, #f2f3ff)));\n}\n.t-tabs__item--tag:not(.t-tabs__item--evenly) {\n  padding: 0 calc(var(--td-spacer, 16rpx) / 2);\n}\n.t-tabs__item--tag:not(.t-tabs__item--evenly):first-child {\n  margin-left: var(--td-spacer, 16rpx);\n}\n.t-tabs__item--tag:not(.t-tabs__item--evenly):last-child {\n  padding-right: var(--td-spacer-1, 24rpx);\n}\n.t-tabs__item--tag {\n  padding: 0 var(--td-spacer, 16rpx);\n}\n.t-tabs__item--card.t-tabs__item--active {\n  background-color: var(--td-tab-nav-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n  border-radius: var(--td-radius-large, 18rpx) var(--td-radius-large, 18rpx) 0 0;\n}\n.t-tabs__item--card.t-tabs__item--active:first-child {\n  border-top-left-radius: 0;\n}\n.t-tabs__item--card.t-tabs__item--active:last-child {\n  border-top-right-radius: 0;\n}\n.t-tabs__item--card.t-tabs__item--pre {\n  border-bottom-right-radius: var(--td-radius-large, 18rpx);\n}\n.t-tabs__item-prefix,\n.t-tabs__item-suffix {\n  position: absolute;\n  bottom: 0;\n  width: 18rpx;\n  height: 18rpx;\n  background-color: var(--td-tab-nav-bg-color, var(--td-bg-color-container, var(--td-font-white-1, #ffffff)));\n}\n.t-tabs__item-prefix::after,\n.t-tabs__item-suffix::after {\n  content: '';\n  display: block;\n  width: 100%;\n  height: 100%;\n  background-color: var(--td-tab-item-tag-bg, var(--td-bg-color-secondarycontainer, var(--td-gray-color-1, #f3f3f3)));\n}\n.t-tabs__item-prefix {\n  right: 0;\n}\n.t-tabs__item-prefix::after {\n  border-bottom-right-radius: var(--td-radius-large, 18rpx);\n}\n.t-tabs__item-suffix {\n  left: 0;\n}\n.t-tabs__item-suffix::after {\n  border-bottom-left-radius: var(--td-radius-large, 18rpx);\n}\n.t-tabs__badge--active {\n  --td-badge-content-text-color: var(--td-tab-item-active-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n}\n.t-tabs__badge--disabled {\n  --td-badge-content-text-color: var(--td-tab-item-disabled-color, var(--td-text-color-disabled, var(--td-font-gray-4, rgba(0, 0, 0, 0.26))));\n}\n.t-tabs__icon {\n  font-size: var(--td-tab-icon-size, 36rpx);\n  margin-right: calc(var(--td-spacer, 16rpx) / 4);\n}\n.t-tabs__content {\n  overflow: hidden;\n}\n.t-tabs__nav {\n  position: relative;\n  user-select: none;\n  display: flex;\n  flex-wrap: nowrap;\n  align-items: center;\n}\n.t-tabs__nav.t-tabs__nav--evenly {\n  width: 100%;\n}\n.t-tabs__track {\n  position: absolute;\n  font-weight: 600;\n  z-index: 1;\n  transition-duration: 0.3s;\n  background-color: var(--td-tab-track-color, var(--td-brand-color, var(--td-primary-color-7, #0052d9)));\n  left: 0;\n  bottom: 1rpx;\n  width: var(--td-tab-track-width, 32rpx);\n  height: var(--td-tab-track-thickness, 6rpx);\n  border-radius: var(--td-tab-track-radius, 8rpx);\n}\n.t-tabs__scroll {\n  position: relative;\n  height: var(--td-tab-item-height, 96rpx);\n}\n.t-tabs__scroll--split {\n  position: relative;\n}\n.t-tabs__scroll--split::after {\n  content: '';\n  display: block;\n  position: absolute;\n  top: unset;\n  bottom: 0;\n  left: unset;\n  right: unset;\n  background-color: var(--td-tab-border-color, var(--td-component-stroke, var(--td-gray-color-3, #e7e7e7)));\n}\n.t-tabs__scroll--split::after {\n  height: 1px;\n  left: 0;\n  right: 0;\n  transform: scaleY(0.5);\n}\n.t-tabs__scroll::-webkit-scrollbar {\n  display: none;\n}\n.t-tabs__content {\n  width: 100%;\n}\n.t-tabs__content-inner {\n  display: block;\n}\n.t-tabs__content--animated .t-tabs__content-inner {\n  position: relative;\n  width: 100%;\n  height: 100%;\n  display: flex;\n  will-change: left;\n  transition-property: transform;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/type.d.ts",
    "content": "import { StickyProps } from '../sticky/index';\nexport interface TdTabsProps {\n    animation?: {\n        type: ObjectConstructor;\n        value?: TabAnimation;\n    };\n    externalClasses?: {\n        type: ArrayConstructor;\n        value?: ['t-class', 't-class-item', 't-class-active', 't-class-track'];\n    };\n    showBottomLine?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    spaceEvenly?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    split?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    sticky?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    stickyProps?: {\n        type: ObjectConstructor;\n        value?: StickyProps;\n    };\n    swipeable?: {\n        type: BooleanConstructor;\n        value?: boolean;\n    };\n    theme?: {\n        type: StringConstructor;\n        value?: 'line' | 'tag' | 'card';\n    };\n    value?: {\n        type: null;\n        value?: TabValue;\n    };\n    defaultValue?: {\n        type: null;\n        value?: TabValue;\n    };\n}\nexport declare type TabAnimation = {\n    duration: number;\n} & Record<string, any>;\nexport declare type TabValue = string | number;\n"
  },
  {
    "path": "miniprogram/packageChatTool/components/tdesign-miniprogram/tabs/type.js",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/packageChatTool/entry.js",
    "content": "wx.cloud.init({\n  env: 'release-b86096',\n  traceUser: true,\n})\n\nconst enterOptions = wx.getEnterOptionsSync()\n"
  },
  {
    "path": "miniprogram/packageChatTool/pages/activity_create/index.js",
    "content": "// pages/activity_create/index.js\nimport { getChatToolInfo } from '../../util'\n\n// const defaultShareImage = 'https://p9.itc.cn/q_70/images03/20211124/d7dce66b866c4ccd805190a4925ff707.png'\n\nfunction checkTitle(str) {\n  const regex = /^[\\u4e00-\\u9fa5a-zA-Z0-9]+$/\n  let actualLength = 0\n  for (let i = 0; i < str.length; i++) {\n    actualLength += /[\\u4e00-\\u9fa5]/.test(str[i]) ? 2 : 1\n  }\n  if (actualLength === 0 || actualLength > 30) {\n    return false\n  }\n  return regex.test(str)\n}\n\nPage({\n\n  data: {\n    title: '',\n    shareImage: '',\n    shareImageCloudFile: '',\n    limitNumber: false,\n    number: 0,\n    dateTextStart: '2024-10-11',\n    dateTextEnd: '2025-12-11',\n\n    mode: '',\n    dateVisible: false,\n    date: new Date().getTime(), // 支持时间戳传入\n\n    // 指定选择区间起始值\n    start: '2024-01-01 00:00:00',\n    end: '2030-09-09 12:12:12',\n\n    dateOption: 'Start',\n    participant: [],\n    activityId: '',\n    useAssigner: true,\n  },\n\n  onLoad(options) {\n    this.createActivityID()\n\n    getChatToolInfo()\n      .then(resp => {\n        console.info()\n      })\n  },\n\n  createActivityID() {\n    return wx.cloud.callFunction({\n      name: 'openapi',\n      data: {\n        action: 'createActivityId',\n      }\n    }).then(resp => {\n      if (resp.result) {\n        this.data.activityId = resp.result.activityId\n      }\n    }).catch(err => {\n      console.error('createActivityId fail : ', err)\n    })\n  },\n\n  onTitleChange(e) {\n    this.data.title = e.detail.value\n  },\n\n  showStartPicker(e) {\n    this.data.dateOption = 'Start'\n    this.showPicker(e)\n  },\n\n  showEndPicker(e) {\n    this.data.dateOption = 'End'\n    this.showPicker(e)\n  },\n\n  showPicker(e) {\n    const { mode } = e.currentTarget.dataset\n    this.setData({\n      mode,\n      [`${mode}Visible`]: true,\n    })\n  },\n  hidePicker() {\n    const { mode } = this.data\n    this.setData({\n      [`${mode}Visible`]: false,\n    })\n  },\n  onConfirm(e) {\n    const { value } = e.detail\n    const { mode, dateOption } = this.data\n\n    console.log('confirm', value)\n\n    this.setData({\n      [mode]: value,\n      [`${mode}Text${dateOption}`]: value,\n    })\n\n    this.hidePicker()\n  },\n\n  onColumnChange(e) {\n    console.log('pick', e.detail.value)\n  },\n\n  chooseShareImage() {\n    const that = this\n    wx.chooseImage({\n      count: 1,\n      success(res) {\n        const shareImage = res.tempFilePaths[0]\n        that.setData({\n          shareImage,\n        })\n\n        wx.showLoading({\n          title: '上传中...',\n        })\n\n        wx.cloud.uploadFile({\n          cloudPath: `image-${Date.now()}.png`, // 上传至云端的路径\n          filePath: shareImage,\n          success: res => {\n            // 返回文件 ID\n            console.log('uploadFile: ', res.fileID)\n            that.setData({\n              shareImageCloudFile: res.fileID\n            })\n          },\n          fail: console.error,\n          complete(res) {\n            wx.hideLoading()\n          }\n        })\n      }\n    })\n  },\n\n  changeLimitNumber() {\n    this.setData({\n      limitNumber: !this.data.limitNumber\n    })\n  },\n\n  changeAssigner() {\n    this.setData({\n      useAssigner: !this.data.useAssigner\n    })\n    if (!this.data.useAssigner) {\n      this.setData({\n        participant: []\n      })\n    }\n  },\n\n  onNumberChange(e) {\n    this.setData({\n      number: e.detail.value\n    })\n  },\n\n  chooseParticipant() {\n    const that = this\n    const { limitNumber, number } = this.data\n    wx.selectGroupMembers({\n      maxSelectCount: limitNumber ? number : -1,\n      success(res) {\n        that.setData({\n          participant: res.members\n        })\n      },\n      complete(res) {\n        console.info('selectGroupMembers: ', res)\n      }\n    })\n  },\n\n  async publish() {\n    const {\n      title,\n      shareImage,\n      dateTextStart,\n      dateTextEnd,\n      participant,\n      activityId,\n      shareImageCloudFile,\n      useAssigner,\n    } = this.data\n\n    if (!checkTitle(title)) {\n      wx.showToast({\n        title: '标题只能为中英文数字，长度小于30',\n        icon: 'none'\n      })\n      return\n    }\n\n    if (!title || !dateTextStart || !dateTextEnd || !shareImage) {\n      wx.showToast({\n        icon: 'none',\n        title: '表单未填写完',\n      })\n      return\n    }\n\n    if (useAssigner && !participant.length) {\n      wx.showToast({\n        icon: 'none',\n        title: '参与者不能为空',\n      })\n      return\n    }\n\n    if (!activityId) {\n      this.createActivityID(() => {\n        this.publish()\n      })\n    }\n\n    const that = this\n    const coverImage = shareImageCloudFile\n\n    wx.showLoading({})\n\n    getChatToolInfo()\n      .then(resp => {\n        wx.cloud.callFunction({\n          name: 'quickstartFunctions',\n          data: {\n            type: 'addRecord',\n            activityId,\n            roomid: resp.roomid,\n            chatType: resp.chatType,\n            title,\n            coverImage,\n            startTime: dateTextStart,\n            endTime: dateTextEnd,\n            participant,\n            signIn: [],\n          }\n        }).then(resp => {\n          const params = {\n            withShareTicket: true,\n            isUpdatableMessage: true,\n            activityId,\n            participant,\n            useForChatTool: true,\n            chooseType: useAssigner ? 1 : 2,\n            templateInfo: {\n              templateId: '4A68CBB88A92B0A9311848DBA1E94A199B166463'\n            }\n          }\n          wx.updateShareMenu({\n            ...params,\n            success(res) {\n              wx.shareAppMessageToGroup({\n                title,\n                path: `packageChatTool/pages/activity_detail/index?activityId=${activityId}`,\n                imageUrl: shareImage,\n                complete(res) {\n                  console.info('shareAppMessageToGroup: ', res)\n                }\n              })\n            },\n            fail(res) {\n              console.info('updateShareMenu fail: ', res)\n              wx.showToast({\n                title: '分享失败',\n                icon: 'none'\n              })\n            },\n            complete(res) {\n              wx.hideLoading({})\n\n              that.data.activityId = ''\n              that.createActivityID()\n              console.info('updateShareMenu complete: ', res)\n            }\n          })\n        })\n      }).catch((err) => {\n        console.error('publish fail: ', err)\n        wx.showToast({\n          icon: 'none',\n          title: '发布失败',\n        })\n      })\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageChatTool/pages/activity_create/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"t-switch\": \"../../components/tdesign-miniprogram/switch/switch\",\n    \"t-slider\": \"../../components/tdesign-miniprogram/slider/slider\",\n    \"t-navbar\": \"../../components/tdesign-miniprogram/navbar/navbar\",\n    \"t-cell\": \"../../components/tdesign-miniprogram/cell/cell\",\n    \"t-cell-group\": \"../../components/tdesign-miniprogram/cell-group/cell-group\",\n    \"t-button\": \"../../components/tdesign-miniprogram/button/button\",\n    \"t-image\": \"../../components/tdesign-miniprogram/image/image\",\n    \"t-icon\": \"../../components/tdesign-miniprogram/icon/icon\"\n  },\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageChatTool/pages/activity_create/index.wxml",
    "content": "<scroll-view type=\"list\" class=\"page-container\" scroll-y>\n\t<view class=\"block\">\n\t\t<t-navbar\n\t\t left-arrow\n\t\t t-class-placeholder=\"t-navbar-placeholder\"\n\t\t t-class-content=\"t-navbar-content\"\n\t\t title=\"创建活动\"\n\t\t t-class-title=\"nav-title\"\n\t\t/>\n\t</view>\n\n\t<view class=\"card\">\n\t\t<view class=\"card-title\">基础设置</view>\n\t\t<input class=\"cell\" placeholder=\"输入标题\" bind:input=\"onTitleChange\" />\n\t</view>\n\n\t<view wx:if=\"{{false}}\" class=\"card\">\n\t\t<view class=\"card-title\">时间设置</view>\n\t\t<t-cell\n\t\t title=\"开始时间\"\n\t\t hover\n\t\t note=\"{{dateTextStart || ''}}\"\n\t\t arrow\n\t\t data-mode=\"date\"\n\t\t bindtap=\"showStartPicker\"\n\t\t class=\"test\"\n\t\t t-class=\"panel-item\"\n\t\t/>\n\t\t<t-cell\n\t\t title=\"结束时间\"\n\t\t hover\n\t\t note=\"{{dateTextEnd || ''}}\"\n\t\t arrow\n\t\t data-mode=\"date\"\n\t\t bindtap=\"showEndPicker\"\n\t\t class=\"test\"\n\t\t t-class=\"panel-item\"\n\t\t/>\n\t</view>\n\n\t<view class=\"card\">\n    <view class=\"card-title\">高级设置</view>\n    <t-cell title=\"指定参与人\" hover>\n\t\t\t<t-switch bind:change=\"changeAssigner\" defaultValue=\"{{true}}\" slot=\"note\" />\n    </t-cell>\n    <block wx:if=\"{{useAssigner}}\">\n      <t-cell title=\"限制参与人数\">\n        <t-switch bind:change=\"changeLimitNumber\" defaultValue=\"{{false}}\" slot=\"note\" />\n      </t-cell>\n  \n      <view wx:if=\"{{limitNumber}}\" style=\"margin-top: 20px;\">\n        <t-slider value=\"{{number}}\" min=\"1\" max=\"20\" label=\"${number}\" bind:change=\"onNumberChange\" />\n      </view>\n  \n      <t-button\n       style=\"margin-top: 20px;\"\n       class=\"btn\"\n       bind:tap=\"chooseParticipant\"\n       theme=\"primary\"\n       size=\"large\"\n       block\n      >选择参与人{{participant.length ? '(已选 ' + participant.length + ' 人)' : ''}}\n      </t-button>\n    </block>\n\t</view>\n\n\t<view class=\"card\">\n\t\t<view class=\"card-title\">分享设置</view>\n\t\t<t-cell bind:tap=\"chooseShareImage\" title=\"自定义分享图\" hover>\n\t\t\t<view slot=\"note\">\n\t\t\t\t<t-icon wx:if=\"{{!shareImage}}\" name=\"image-add\" size=\"48rpx\" />\n\t\t\t\t<t-image\n\t\t\t\t wx:else\n\t\t\t\t src=\"{{shareImage}}\"\n\t\t\t\t mode=\"aspectFill\"\n\t\t\t\t width=\"48\"\n\t\t\t\t height=\"48\"\n\t\t\t\t/>\n\t\t\t</view>\n\n\t\t</t-cell>\n\t</view>\n\n\t<view class=\"card\" style=\"margin-bottom: 30px;\">\n    <t-button\n     class=\"btn\"\n\t\t bind:tap=\"publish\"\n\t\t theme=\"primary\"\n\t\t size=\"large\"\n\t\t block\n\t\t>发布\n\t\t</t-button>\n\t</view>\n\n</scroll-view>\n\n"
  },
  {
    "path": "miniprogram/packageChatTool/pages/activity_create/index.wxss",
    "content": "/* pages/activity_create/index.wxss */\n\npage {\n  background: rgb(237, 237, 237);\n  height: 100vh;\n  --td-navbar-bg-color: rgb(237, 237, 237);\n}\n\n.center {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.page-container {\n  height: 100%;\n  width: 100%;\n  box-sizing: border-box;\n}\n\n\n.card {\n  margin: 0 32rpx;\n  margin-bottom: 32rpx;\n}\n.card-title {\n  padding: 32rpx 0;\n  color: rgb(112, 107, 107);\n}\n\n.cell {\n  background-color: #fff;\n  height: 48rpx;\n  line-height: 48rpx;\n  padding: 32rpx;\n}\n\n.btn {\n  width: 100% !important;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/pages/activity_detail/index.js",
    "content": "// pages/activity_create/index.js\nimport { getChatToolInfo } from '../../util'\n\nconst roleType = ['unkown', 'owner', 'participant', 'nonParticipant']\n\nconst activityStatus = ['未开始', '进行中', '已结束']\n\nconst { envVersion } = wx.getAccountInfoSync().miniProgram\n\nconst getVersionType = () => {\n  if (envVersion === 'release') {\n    return 0\n  } else if (envVersion === 'develop') {\n    return 1\n  } else if (envVersion === 'trial') {\n    return 2\n  }\n\n  return 0\n}\n\nPage({\n\n  data: {\n    isOwner: false,\n    members: [],\n    role: roleType[0],\n    activityId: '',\n    activityInfo: {},\n    signIn: [],\n    notSignIn: [],\n    participant: [],\n\n    signInStatus: false,\n    activityStatusStar: '',\n\n    showProgress: false,\n    percent: '0',\n\n    groupInfo: null,\n    progressImage: '',\n    showBackBtn: false,\n    triggered: false,\n  },\n\n  onLoad(options) {\n    this.data.activityId = options.activityId\n    this.fetchActivity()\n\n    const pages = getCurrentPages()\n    this.setData({\n      showBackBtn: pages.length > 1\n    })\n  },\n\n  onBack() {\n    wx.navigateBack({ delta: 1 })\n  },\n\n  onRefresh() {\n    if (this._freshing) return\n    this._freshing = true\n\n    this.fetchActivity().then(() => {\n      this.setData({\n        triggered: false,\n      })\n      this._freshing = false\n    })\n  },\n\n  onRestore(e) {\n    console.log('onRestore:', e)\n  },\n\n  onAbort(e) {\n    console.log('onAbort', e)\n  },\n\n  onGoHome() {\n    wx.reLaunch({\n      url: '/packageAPI/pages/chattool/activity_assist/activity_assist',\n      complete(res) {\n        console.info('relaunch', res)\n      }\n    })\n  },\n\n  refreshData(activityInfo, groupInfo, useFake = true) {\n    const {\n      participant,\n      signIn,\n      creator,\n    } = activityInfo\n\n    const notSignIn = participant.filter(i => !signIn.includes(i))\n\n    const { groupOpenID, roomid, openid } = groupInfo\n\n    const percent = participant.length ? Math.ceil(signIn.length / participant.length * 100) : 0\n    const isOwner = creator === openid\n\n    let role\n    if (roomid !== activityInfo.roomid) {\n      role = roleType[3]\n    } else {\n      role = participant.includes(groupOpenID)\n        ? roleType[2]\n        : (isOwner ? roleType[1] : roleType[3])\n    }\n\n    if (participant.length === 0) {\n      role = roleType[2]\n    }\n\n    this.setData({\n      role,\n      isOwner,\n      signInStatus: signIn.includes(groupOpenID),\n      activityInfo,\n      members: signIn,\n      signIn,\n      notSignIn,\n      participant,\n      percent\n    })\n\n    this.updateProgressImage()\n  },\n\n  async fetchActivity() {\n    const that = this\n\n    await getChatToolInfo().then(groupInfo => {\n      that.data.groupInfo = groupInfo\n\n      wx.cloud.callFunction({\n        name: 'quickstartFunctions',\n        data: {\n          type: 'selectRecord',\n          activityId: this.data.activityId,\n        }\n      }).then(resp => {\n        if (resp.result.success) {\n          const activityInfo = resp.result.activityInfo\n          that.refreshData(activityInfo, groupInfo)\n        } else {\n          wx.showToast({\n            title: '活动未找到',\n            icon: 'none'\n          })\n        }\n      }).catch(err => {\n        console.info('fetchActivity fail: ', err)\n      })\n    })\n  },\n\n  onTabsChange(e) {\n    const type = e.detail.value\n    this.setData({\n      members: this.data[type]\n    })\n  },\n\n  notifyNotSignIn() {\n    const { activityId, notSignIn, activityInfo } = this.data\n    if (!activityInfo._id) return\n\n    wx.notifyGroupMembers({\n      title: activityInfo.title,\n      type: 'participate',\n      members: notSignIn,\n      entrancePath: `packageChatTool/pages/activity_detail/index?activityId=${activityId}`,\n      complete(res) {\n        console.info('notifyGroupMembers: ', res)\n      }\n    })\n  },\n\n  signIn() {\n    const that = this\n    const { signIn, activityInfo, groupInfo } = this.data\n    const { roomid, groupOpenID } = groupInfo\n\n    if (signIn.includes(groupOpenID)) {\n      wx.showToast({\n        title: '已签到',\n        icon: 'none'\n      })\n      return\n    }\n\n    wx.cloud.callFunction({\n      name: 'quickstartFunctions',\n      data: {\n        type: 'signIn',\n        roomid,\n        groupOpenID,\n        activityId: this.data.activityId,\n      }\n    }).then(resp => {\n      if (resp.result.success) {\n        const { signIn } = activityInfo\n        signIn.push(groupOpenID)\n        that.refreshData(activityInfo, groupInfo, false)\n        that.updateChatToolMsg({\n          targetState: 1,\n          parameterList: [{\n            groupOpenID,\n            state: 1,\n          }]\n        })\n      } else {\n        wx.showToast({\n          title: '报名失败',\n          icon: 'none'\n        })\n      }\n    }).catch(err => {\n      console.info('signIn fail: ', err)\n    })\n  },\n\n  remindExpiration() {\n    this.updateChatToolMsg({\n      targetState: 2,\n    })\n    wx.showToast({\n      title: '已触发',\n      icon: 'none'\n    })\n  },\n\n  earlyTerminate() {\n    this.updateChatToolMsg({\n      targetState: 3,\n    })\n    wx.showToast({\n      title: '已触发',\n      icon: 'none'\n    })\n  },\n\n  updateChatToolMsg(params = {}) {\n    const { targetState, parameterList } = params\n    // const templateId = '2A84254B945674A2F88CE4970782C402795EB607' // 参与\n    const templateId = '4A68CBB88A92B0A9311848DBA1E94A199B166463' // 完成\n\n    wx.cloud.callFunction({\n      name: 'openapi',\n      data: {\n        action: 'updateChatToolMsg',\n        activityId: this.data.activityId,\n        targetState: targetState || 1,\n        templateId,\n        parameterList: parameterList || [],\n        versionType: getVersionType()\n      }\n    }).then(resp => {\n      console.info('updateChatToolMsg: ', resp)\n    }).catch(err => {\n      console.info('updateChatToolMsg Fail: ', err)\n    })\n  },\n\n  updateProgressImage() {\n    const that = this\n    setTimeout(() => {\n      this.createSelectorQuery()\n        .select('#target')\n        .node()\n        .exec(res => {\n          const node = res[0].node\n          node.takeSnapshot({\n            type: 'file',\n            format: 'png',\n            success: (res) => {\n              const imagePath = res.tempFilePath\n              console.info('snapshot: ', imagePath)\n              that.data.progressImage = imagePath\n            },\n            fail(res) {\n              console.info('takeSnapshot fail: ', res)\n              wx.showToast({\n                title: '分享进度失败',\n                icon: 'none'\n              })\n            }\n          })\n        })\n    }, 20)\n  },\n\n  sendProgress() {\n    const { progressImage, activityId } = this.data\n    const entrancePath = `packageChatTool/pages/activity_detail/index?activityId=${activityId}`\n    wx.shareImageToGroup({\n      imagePath: progressImage,\n      needShowEntrance: true,\n      entrancePath,\n      complete(res) {\n        console.info('shareImageToGroup: ', res)\n      }\n    })\n  },\n\n  share() {\n    const { activityInfo, activityId } = this.data\n    if (!activityInfo._id) return\n\n    wx.cloud.downloadFile({\n      fileID: activityInfo.coverImage,\n      success: res => {\n        wx.shareAppMessageToGroup({\n          title: activityInfo.title,\n          imageUrl: res.tempFilePath,\n          path: `packageChatTool/pages/activity_detail/index?activityId=${activityId}`,\n        })\n      },\n      fail: console.error\n    })\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageChatTool/pages/activity_detail/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"t-switch\": \"../../components/tdesign-miniprogram/switch/switch\",\n    \"t-slider\": \"../../components/tdesign-miniprogram/slider/slider\",\n    \"t-navbar\": \"../../components/tdesign-miniprogram/navbar/navbar\",\n    \"t-cell\": \"../../components/tdesign-miniprogram/cell/cell\",\n    \"t-cell-group\": \"../../components/tdesign-miniprogram/cell-group/cell-group\",\n    \"t-button\": \"../../components/tdesign-miniprogram/button/button\",\n    \"t-image\": \"../../components/tdesign-miniprogram/image/image\",\n    \"t-icon\": \"../../components/tdesign-miniprogram/icon/icon\",\n    \"t-tabs\": \"../../components/tdesign-miniprogram/tabs/tabs\",\n    \"t-tab-panel\": \"../../components/tdesign-miniprogram/tab-panel/tab-panel\",\n    \"t-progress\": \"../../components/tdesign-miniprogram/progress/progress\",\n    \"t-loading\": \"../../components/tdesign-miniprogram/loading/loading\"\n  },\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageChatTool/pages/activity_detail/index.wxml",
    "content": "<scroll-view\n type=\"list\"\n refresher-enabled\n refresher-triggered=\"{{triggered}}\"\n refresher-threshold=\"{{80}}\"\n bind:refresherrefresh=\"onRefresh\"\n bind:refresherrestore=\"onRestore\"\n bind:refresherabort=\"onAbort\"\n class=\"page-container\"\n scroll-y\n>\n\t<view class=\"block\">\n\t\t<t-navbar\n\t\t t-class-placeholder=\"t-navbar-placeholder\"\n\t\t t-class-content=\"t-navbar-content\"\n\t\t title=\"活动详情\"\n\t\t t-class-title=\"nav-title\"\n\t\t>\n\t\t\t<view slot=\"capsule\" class=\"custom-capsule\">\n\t\t\t\t<t-icon\n\t\t\t\t wx:if=\"{{showBackBtn}}\"\n\t\t\t\t size=\"40rpx\"\n\t\t\t\t bind:tap=\"onBack\"\n\t\t\t\t aria-role=\"button\"\n\t\t\t\t aria-label=\"返回\"\n\t\t\t\t name=\"chevron-left\"\n\t\t\t\t class=\"custom-capsule__icon back\"\n\t\t\t\t/>\n\t\t\t\t<t-icon\n\t\t\t\t size=\"40rpx\"\n\t\t\t\t bind:tap=\"onGoHome\"\n\t\t\t\t aria-role=\"button\"\n\t\t\t\t aria-label=\"首页\"\n\t\t\t\t name=\"home\"\n\t\t\t\t class=\"custom-capsule__icon home\"\n\t\t\t\t/>\n\t\t\t</view>\n\t\t</t-navbar>\n\t</view>\n\n\t<view class=\"card\">\n\t\t<view class=\"card-title\">活动标题</view>\n\t\t<t-cell\n\t\t title=\"{{activityInfo.title}}\"\n\t\t hover\n\t\t bind:tap=\"share\"\n\t\t right-icon=\"share\"\n\t\t/>\n\t</view>\n\n\t<block wx:if=\"{{!activityInfo._id}}\">\n\t\t<view class=\"center\" style=\"height: 200px;\">\n\t\t\t<t-loading theme=\"spinner\" size=\"40rpx\" class=\"wrapper\" />\n\t\t</view>\n\t</block>\n\n\t<block wx:else>\n\t\t<block wx:if=\"{{role === 'owner' || (role === 'participant' && signInStatus)}}\">\n\t\t\t<view class=\"card\">\n\t\t\t\t<view class=\"card-title\">签到情况</view>\n\t\t\t\t<t-tabs\n\t\t\t\t defaultValue=\"{{'signIn'}}\"\n\t\t\t\t bind:change=\"onTabsChange\"\n\t\t\t\t bind:click=\"onTabsClick\"\n\t\t\t\t t-class=\"custom-tabs\"\n        >\n          <block wx:if=\"{{participant.length === 0}}\">\n            <t-tab-panel label=\"已签到(全体成员为参与者)\" value=\"signIn\" />\n          </block>\n          <block wx:else>\n            <t-tab-panel label=\"已签到 {{signIn.length >= participant.length ? '(全部签到)' : ''}}\" value=\"signIn\" />\n            <t-tab-panel wx:if=\"{{ signIn.length < participant.length }}\" label=\"未签到\" value=\"notSignIn\" />\n          </block>\n\t\t\t\t</t-tabs>\n\t\t\t\t<view class=\"member-list\">\n\t\t\t\t\t<open-data-list type=\"groupMembers\" members=\"{{members}}\">\n\t\t\t\t\t\t<view class=\"userinfo\" slot:index>\n\t\t\t\t\t\t\t<open-data-item class=\"avatar \" type=\"userAvatar\" index=\"{{index}}\" />\n\t\t\t\t\t\t\t<open-data-item class=\"\" type=\"userNickName\" index=\"{{index}}\" />\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</open-data-list>\n\t\t\t\t</view>\n\t\t\t</view>\n\n\t\t\t<view class=\"card\" wx:if=\"{{notSignIn.length}}\">\n        <t-button\n         class=\"btn\"\n\t\t\t\t bind:tap=\"notifyNotSignIn\"\n\t\t\t\t theme=\"primary\"\n\t\t\t\t size=\"large\"\n\t\t\t\t block\n\t\t\t\t>提醒未参与用户\n\t\t\t\t</t-button>\n\t\t\t</view>\n\n\t\t\t<view class=\"card\" wx:if=\"{{participant.length}}\">\n        <t-button\n         class=\"btn\"\n\t\t\t\t bind:tap=\"sendProgress\"\n\t\t\t\t theme=\"primary\"\n\t\t\t\t size=\"large\"\n\t\t\t\t block\n\t\t\t\t>发送签到进度\n\t\t\t\t</t-button>\n\t\t\t</view>\n\t\t</block>\n\n\t\t<block wx:if=\"{{role === 'participant' && !signInStatus}}\">\n\t\t\t<view class=\"card\">\n\t\t\t\t<view class=\"card-title\">活动签到</view>\n        <t-button\n         class=\"btn\"\n\t\t\t\t bind:tap=\"signIn\"\n\t\t\t\t theme=\"primary\"\n\t\t\t\t size=\"large\"\n\t\t\t\t block\n\t\t\t\t>签到\n\t\t\t\t</t-button>\n\t\t\t</view>\n\t\t</block>\n\n\t\t<block wx:if=\"{{role === 'nonParticipant'}}\">\n\t\t\t<view class=\"card\">\n\t\t\t\t<view class=\"card-title\">活动签到</view>\n        <t-button\n         class=\"btn\"\n\t\t\t\t theme=\"light\"\n\t\t\t\t disabled\n\t\t\t\t size=\"large\"\n\t\t\t\t block\n\t\t\t\t>未参与该活动\n\t\t\t\t</t-button>\n\t\t\t</view>\n\t\t</block>\n\n\t\t<block wx:if=\"{{role === 'unkown'}}\">\n\t\t\t<view class=\"card\">\n\t\t\t\t<view class=\"card-title\">活动签到</view>\n        <t-button\n         class=\"btn\"\n\t\t\t\t theme=\"light\"\n\t\t\t\t disabled\n\t\t\t\t size=\"large\"\n\t\t\t\t block\n\t\t\t\t>获取活动信息失败\n\t\t\t\t</t-button>\n\t\t\t</view>\n\t\t</block>\n\n  </block>\n  \n  <block wx:if=\"{{isOwner}}\">\n    <view class=\"card\">\n      <view class=\"card-title\">系统消息指令</view>\n      <t-button\n       class=\"btn\"\n       bind:tap=\"remindExpiration\"\n       theme=\"primary\"\n       size=\"large\"\n       block\n      >触发即将结束\n      </t-button>\n\n      <t-button\n       class=\"btn\"\n       style=\"margin-top: 24rpx;\"\n       bind:tap=\"earlyTerminate\"\n       theme=\"primary\"\n       size=\"large\"\n       block\n      >触发活动结束\n      </t-button>\n\n    </view>\n  </block>\n\n</scroll-view>\n\n<snapshot id=\"target\" style=\"position: absolute; left: 1000px; width: 100%; height: 300px;\">\n\t<view style=\"height: 300px;\" class=\"center\">\n\t\t<t-progress theme=\"circle\" percentage=\"{{percent}}\" />\n\t</view>\n</snapshot>\n\n\n"
  },
  {
    "path": "miniprogram/packageChatTool/pages/activity_detail/index.wxss",
    "content": "/* pages/activity_create/index.wxss */\n\n.custom-capsule {\n  width: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.custom-capsule__icon {\n  flex: 1;\n  position: relative;\n}\n\n.custom-capsule__icon.home:before {\n  content: '';\n  display: block;\n  position: absolute;\n  left: -1px;\n  top: 50%;\n  transform: translateY(-50%);\n  width: 1px;\n  height: 18px;\n  background: #e7e7e7;\n}\n\n\npage {\n  background: rgb(237, 237, 237);\n  height: 100vh;\n  --td-navbar-bg-color: rgb(237, 237, 237);\n}\n\n.center {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.page-container {\n  height: 100%;\n  width: 100%;\n  box-sizing: border-box;\n}\n\n.card {\n  margin: 0 32rpx;\n  margin-bottom: 32rpx;\n}\n.card-title {\n  padding: 32rpx 0;\n  padding-top: 0;\n  color: rgb(112, 107, 107);\n}\n\n.card-content {\n  background-color: #fff;\n}\n\n.cell {\n  background-color: #fff;\n  height: 48rpx;\n  line-height: 48rpx;\n  padding: 32rpx;\n}\n\n.member-list {\n  background-color: #fff;\n  padding-top: 32rpx;\n}\n\n.userinfo {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  padding: 10px;\n  /* border-bottom: 0.5px solid #ccc; */\n}\n.avatar {\n  margin-right: 32rpx;\n  width: 56px;\n  height: 56px;\n}\n\n.btn {\n  width: 100% !important;\n}\n"
  },
  {
    "path": "miniprogram/packageChatTool/util.js",
    "content": "export function getChatToolInfo() {\n  return new Promise((resolve, reject) => {\n    wx.getChatToolInfo({\n      success(res) {\n        const cloudID = res.cloudID\n        wx.cloud.callFunction({\n          name: 'quickstartFunctions',\n          data: {\n            type: 'getGroupEnterInfo',\n            groupInfo: wx.cloud.CloudID(cloudID)\n          }\n        }).then(resp => {\n          const groupInfo = resp.result.groupInfo\n          if (groupInfo && groupInfo.data) {\n            const openid = resp.result.openid\n            const opengid = groupInfo.data.opengid\n            const openSingleRoomID = groupInfo.data.open_single_roomid\n            const groupOpenID = groupInfo.data.group_openid\n            const data = {\n              openid,\n              groupOpenID,\n              roomid: opengid || openSingleRoomID,\n              chatType: groupInfo.data.chat_type\n            }\n            resolve(data)\n          } else {\n            reject()\n          }\n        }).catch(err => {\n          reject(err)\n        })\n      },\n      fail(res) {\n        reject(res)\n      },\n      complete(res) {\n        console.info('getChatToolInfo complete: ', res)\n      }\n    })\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/database/crud/crud.js",
    "content": "// 参考文档：https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database.html\n\nconst app = getApp()\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '基本操作',\n      path: 'packageCloud/pages/database/crud/crud'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    openid: '',\n    todoListFetched: false,\n    todoList: [],\n    searchContent: '',\n    newContent: '',\n    filtered: false,\n    loading: false\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    if (app.globalData.openid) {\n      this.setData({\n        openid: app.globalData.openid\n      })\n      this.queryTodoList()\n    } else {\n      wx.showLoading({\n        title: '正在初始化...'\n      })\n      app.getUserOpenIdViaCloud()\n        .then(openid => {\n          this.setData({\n            openid\n          })\n          wx.hideLoading()\n          this.queryTodoList()\n          return openid\n        }).catch(err => {\n          console.error(err)\n          wx.hideLoading()\n          wx.showToast({\n            icon: 'none',\n            title: '初始化失败，请检查网络'\n          })\n        })\n    }\n  },\n\n  onShow() {\n    if (this.data.openid) {\n      this.queryTodoList()\n    }\n  },\n\n  createTodo() {\n    if (this.data.loading) {\n      return\n    }\n    const { newContent } = this.data\n    if (!newContent) {\n      return\n    }\n\n    this.setData({ loading: true })\n    const db = wx.cloud.database()\n    db.collection('todos').add({\n      data: {\n        description: newContent,\n        done: false,\n      },\n      success: res => {\n        // 在返回结果中会包含新创建的记录的 _id\n        this.setData({\n          todoList: [\n            ...this.data.todoList,\n            {\n              _id: res._id,\n              _openid: this.data.openid,\n              description: newContent,\n              done: false,\n            }\n          ],\n          newContent: ''\n        })\n        wx.showToast({\n          title: '新增记录成功',\n        })\n        console.log('[数据库] [新增记录] 成功，记录 _id: ', res._id)\n      },\n      fail: err => {\n        wx.showToast({\n          icon: 'none',\n          title: '新增记录失败'\n        })\n        console.error('[数据库] [新增记录] 失败：', err)\n      },\n      complete: () => {\n        this.setData({ loading: false })\n      }\n    })\n  },\n\n  queryTodoList() {\n    wx.showLoading({\n      title: '正在查询...'\n    })\n    const db = wx.cloud.database()\n    db.collection('todos').where({\n      _openid: this.data.openid\n    }).get({\n      success: res => {\n        this.setData({\n          todoListFetched: true,\n          todoList: res.data,\n          filtered: false\n        })\n        console.log('[数据库] [查询记录] 成功: ', res)\n      },\n      fail: err => {\n        wx.showToast({\n          icon: 'none',\n          title: '查询记录失败'\n        })\n        console.error('[数据库] [查询记录] 失败：', err)\n      },\n      complete: () => {\n        wx.hideLoading()\n      }\n    })\n  },\n\n  searchTodo() {\n    const { searchContent } = this.data\n    if (!searchContent) {\n      this.queryTodoList()\n      return\n    }\n\n    const db = wx.cloud.database()\n    let descriptionCondition = searchContent\n    const execResult = /^\\/([\\s\\S]*)\\//.exec(searchContent)\n    if (execResult) {\n      const reStr = execResult[1].trim().replace(/\\s+/g, '|')\n      descriptionCondition = db.RegExp({\n        regexp: reStr\n      })\n    }\n    wx.showLoading({\n      title: '正在查询...'\n    })\n    db.collection('todos').where({\n      _openid: this.data.openid,\n      description: descriptionCondition\n    }).get({\n      success: res => {\n        this.setData({\n          todoList: res.data,\n          filtered: true\n        })\n        console.log('[数据库] [查询记录] 成功: ', res)\n      },\n      fail: err => {\n        wx.showToast({\n          icon: 'none',\n          title: '查询记录失败'\n        })\n        console.error('[数据库] [查询记录] 失败：', err)\n      },\n      complete: () => {\n        wx.hideLoading()\n      }\n    })\n  },\n\n  toggleComplete(e) {\n    if (this.data.loading) {\n      return\n    }\n    const { id: todoId, index } = e.currentTarget.dataset\n    const todo = this.data.todoList[index]\n\n    this.setData({ loading: true })\n    const db = wx.cloud.database()\n    db.collection('todos').doc(todoId).update({\n      data: { done: !todo.done },\n      success: () => {\n        this.setData({\n          [`todoList[${index}].done`]: !todo.done\n        })\n      },\n      fail: err => {\n        wx.showToast({\n          icon: 'none',\n          title: '更新失败',\n        })\n        console.error('[数据库] [更新记录] 失败：', err)\n      },\n      complete: () => {\n        this.setData({ loading: false })\n      }\n    })\n  },\n\n  toDetail(e) {\n    const { id: todoId } = e.currentTarget.dataset\n    wx.navigateTo({\n      url: `/page/cloud/pages/crud-detail/crud-detail?todoId=${todoId}`,\n    })\n  },\n\n  onInputSearchContent(e) {\n    this.setData({\n      searchContent: e.detail.value\n    })\n  },\n\n  onInputNewContent(e) {\n    this.setData({\n      newContent: e.detail.value\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/database/crud/crud.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"基本操作\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/database/crud/crud.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'CRUD'}}\" />\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\" style=\"margin-right: 5px\">\n            <icon type=\"search\" size=\"20\"></icon>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" placeholder=\"精确搜索或使用正则表达式搜索\" value=\"{{searchContent}}\" bindinput=\"onInputSearchContent\" bindconfirm=\"searchTodo\"/>\n          </view>\n        </view>\n      </view>\n\n      <view class=\"weui-cells__title\">Todo List</view>\n      <view class=\"weui-cells weui-cells_after-title\" wx:if=\"{{openid}}\">\n        <view wx:for=\"{{todoList}}\" wx:key=\"_id\" class=\"weui-cell weui-cell_access\" hover-class=\"weui-cell_active\" data-id=\"{{item._id}}\" bindtap=\"toDetail\">\n          <view class=\"weui-cell__hd\" data-id=\"{{item._id}}\" data-index=\"{{index}}\" catchtap=\"toggleComplete\" style=\"margin-right: 5px\">\n            <icon type=\"circle\" wx:if=\"{{!item.done}}\"></icon>\n            <icon type=\"success\" wx:else></icon>\n          </view>\n          <view class=\"weui-cell__bd\">{{item.description}}</view>\n          <view class=\"weui-cell__ft weui-cell__ft_in-access\"></view>\n        </view>\n\n        <view class=\"weui-cell weui-cell_input\" wx:if=\"{{todoList.length < 5 && !filtered}}\">\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" placeholder=\"添加新的 Todo\" value=\"{{newContent}}\" focus=\"{{todoListFetched && !todoList.length}}\" bindinput=\"onInputNewContent\" bindconfirm=\"createTodo\" />\n          </view>\n        </view>\n      </view>\n\n      <view class=\"page-body-info\" wx:if=\"{{!todoList.length && filtered}}\">\n        <text class=\"page-body-text\">无数据</text>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageCloud/pages/database/crud/crud.wxss",
    "content": "\n\n.page-body-info {\n  padding: 15px 0 15px 0;\n}\n\n.page-body-text {\n  padding: 0 15px;\n  text-align: center;\n}\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/database/db-permission/db-permission.js",
    "content": "// 参考文档：https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/permission.html\n\nconst app = getApp()\n\nconst sliderWidth = 96\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '权限管理',\n      path: 'packageCloud/pages/database/db-permission/db-permission'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    openid: '',\n    permissions: ['仅创建者可写，所有人可读', '仅创建者可读写', '仅管理端可写，所有人可读', '仅管理端可读写'],\n    currentPermissionIndex: 0,\n    tabs: [\n      ['我的个性签名', '阿白的个性签名'],\n      ['我的邮箱', '阿绿的邮箱'],\n      [],\n      [],\n    ],\n    activeTabIndex: 0,\n    sliderOffset: 0,\n    sliderLeft: 0,\n\n    querying: false,\n    updating: false,\n\n    hasMyWhatsUp: false,\n    myWhatsUp: '',\n    adminWhatsUp: '',\n    myEmail: '',\n    adminEmail: '',\n    hasProduct: false,\n    product: {},\n    serverData: '',\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    if (app.globalData.openid) {\n      this.setData({\n        openid: app.globalData.openid\n      })\n    } else {\n      wx.showLoading({\n        title: '正在初始化...'\n      })\n      app.getUserOpenIdViaCloud()\n        .then(openid => {\n          this.setData({\n            openid\n          })\n          wx.hideLoading()\n          return openid\n        }).catch(err => {\n          console.error(err)\n          wx.hideLoading()\n          wx.showModal({\n            content: '初始化失败，请检查网络',\n            showCancel: false\n          })\n        })\n    }\n    const {\n      myWhatsUp, adminWhatsUp, myEmail, adminEmail\n    } = app.globalData\n    this.setData({\n      hasMyWhatsUp: !!myWhatsUp,\n      myWhatsUp: myWhatsUp || '',\n      adminWhatsUp: adminWhatsUp || '',\n      myEmail: myEmail || '',\n      adminEmail: adminEmail || '',\n    })\n\n    this.initTabs()\n  },\n\n  initTabs() {\n    const currentPermissionIndex = this.data.currentPermissionIndex\n    const tabLength = this.data.tabs[currentPermissionIndex].length\n    const that = this\n    wx.getSystemInfo({\n      success(res) {\n        that.setData({\n          sliderLeft: (res.windowWidth / tabLength - sliderWidth) / 2,\n          sliderOffset: (res.windowWidth / tabLength) * that.data.activeTabIndex\n        })\n      }\n    })\n  },\n\n  onTabClick(e) {\n    this.setData({\n      sliderOffset: e.currentTarget.offsetLeft,\n      activeTabIndex: Number(e.currentTarget.id)\n    })\n  },\n\n  onPermissionChange(e) {\n    const oldIndex = this.data.currentPermissionIndex\n    const newIndex = Number(e.detail.value)\n    if (oldIndex !== newIndex) {\n      this.setData({\n        currentPermissionIndex: Number(newIndex),\n        activeTabIndex: 0\n      })\n      this.initTabs()\n    }\n  },\n\n  bindInput(e) {\n    const { name } = e.currentTarget.dataset\n    this.setData({\n      [name]: e.detail.value\n    })\n  },\n\n  showErrorModal(name, err) {\n    let errMsg = `${name}失败`\n    if (err.toString().indexOf('permission denied') >= 0) {\n      errMsg += '：无权限操作'\n    }\n    wx.showModal({\n      content: errMsg,\n      showCancel: false\n    })\n  },\n\n  // 根据 openid 获取第一条数据\n  queryOneByOpenId(collection, openid, options = {\n    showLoading: false,\n    showError: false,\n    success: null,\n    fail: null\n  }) {\n    const {\n      showLoading, showError, success: successCallback, fail: failCallback\n    } = options\n    if (showLoading) {\n      this.setData({\n        querying: true\n      })\n    }\n    const db = wx.cloud.database()\n    const _openid = openid || this.data.openid\n    db.collection(collection).where({\n      _openid\n    }).get({\n      success: res => {\n        console.log('[数据库] [查询记录] 成功: ', res)\n        const resFirstData = res.data[0] || {}\n        // 返回的不是要查询用户的记录，是由于没有读权限，视为查询失败\n        if (resFirstData._openid && resFirstData._openid !== _openid) {\n          const err = new Error('database permission denied')\n          if (showError) this.showErrorModal('获取', err)\n          if (failCallback) failCallback.call(this, err)\n        } else if (successCallback) {\n          successCallback.call(this, res.data[0])\n        }\n      },\n      fail: err => {\n        if (showError) this.showErrorModal('获取', err)\n        console.error('[数据库] [查询记录] 失败：', err)\n        if (failCallback) failCallback.call(this, err)\n      },\n      complete: () => {\n        if (showLoading) {\n          this.setData({\n            querying: false\n          })\n        }\n      }\n    })\n  },\n\n  // 根据 openid 更新数据\n  updateOneByOpenId(collection, openid, data, options = {\n    showLoading: false,\n    showError: false,\n    success: null,\n    fail: null\n  }) {\n    const {\n      showLoading, showError, success: successCallback, fail: failCallback\n    } = options\n    if (showLoading) {\n      this.setData({\n        updating: true\n      })\n    }\n    const db = wx.cloud.database()\n    // 限制每人仅存一条记录，先查询是否已存在记录\n    this.queryOneByOpenId(collection, openid || '', {\n      success: dbData => {\n        if (dbData) { // 已有数据，进行更新操作\n          db.collection(collection).doc(dbData._id).update({\n            data,\n            success: res => {\n              console.log('[数据库] [更新记录] 成功: ', res)\n              if (successCallback) successCallback.call(this, res.stats)\n            },\n            fail: err => {\n              if (showError) this.showErrorModal('设置', err)\n              console.error('[数据库] [更新记录] 失败：', err)\n              if (failCallback) failCallback.call(this, err)\n            },\n            complete: () => {\n              if (showLoading) {\n                this.setData({\n                  updating: false\n                })\n              }\n            }\n          })\n        } else if (!openid || openid === this.data.openid) { // 还没有插入过数据且要操作的是自己的数据，进行新增操作\n          db.collection(collection).add({\n            data,\n            success: res => {\n              console.log('[数据库] [新增记录] 成功：', res)\n              if (successCallback) successCallback.call(this, { _id: res._id })\n            },\n            fail: err => {\n              if (showError) this.showErrorModal('设置', err)\n              console.error('[数据库] [新增记录] 失败：', err)\n              if (failCallback) failCallback.call(this, err)\n            },\n            complete: () => {\n              if (showLoading) {\n                this.setData({\n                  updating: false\n                })\n              }\n            }\n          })\n        } else {\n          const err = new Error('database permission denied')\n          if (showError) this.showErrorModal('设置', err)\n          if (failCallback) failCallback.call(this, err)\n          if (showLoading) {\n            this.setData({\n              updating: false\n            })\n          }\n        }\n      },\n      fail: err => {\n        if (showError) this.showErrorModal('设置', err)\n        if (failCallback) failCallback.call(this, err)\n        if (showLoading) {\n          this.setData({\n            updating: false\n          })\n        }\n      }\n    })\n  },\n\n  // perm1：仅创建者可写，所有人可读\n\n  queryMyWhatsUp() {\n    this.queryOneByOpenId('perm1', '', {\n      showLoading: true,\n      showError: true,\n      success: data => {\n        const content = (data && data.whatsUp) || ''\n        wx.showModal({\n          title: '获取成功',\n          content: content ? `个性签名为：${content}` : '个性签名为空',\n          showCancel: false\n        })\n      }\n    })\n  },\n\n  updateMyWhatsUp() {\n    const data = {\n      whatsUp: this.data.myWhatsUp\n    }\n    this.updateOneByOpenId('perm1', '', data, {\n      showLoading: true,\n      showError: true,\n      success: () => {\n        app.globalData.myWhatsUp = this.data.myWhatsUp\n        this.setData({\n          hasMyWhatsUp: true\n        })\n        wx.showModal({\n          content: '设置成功',\n          showCancel: false\n        })\n      }\n    })\n  },\n\n  queryAdminWhatsUp() {\n    this.queryOneByOpenId('perm1', 'kiki', {\n      showLoading: true,\n      showError: true,\n      success: data => {\n        const content = (data && data.whatsUp) || ''\n        wx.showModal({\n          title: '获取成功',\n          content: content ? `个性签名为：${content}` : '个性签名为空',\n          showCancel: false\n        })\n      }\n    })\n  },\n\n  updateAdminWhatsUp() {\n    const data = {\n      whatsUp: this.data.adminWhatsUp\n    }\n    this.updateOneByOpenId('perm1', 'kiki', data, {\n      showLoading: true,\n      showError: true,\n      success: res => {\n        if (res.updated === 0) {\n          wx.showModal({\n            content: '设置失败：无权限操作',\n            showCancel: false\n          })\n        } else {\n          app.globalData.adminWhatsUp = this.data.adminWhatsUp\n          wx.showModal({\n            content: '设置成功',\n            showCancel: false\n          })\n        }\n      }\n    })\n  },\n\n  // perm2：仅创建者可读写\n\n  queryMyEmail() {\n    this.queryOneByOpenId('perm2', '', {\n      showLoading: true,\n      showError: true,\n      success: data => {\n        const content = (data && data.email) || ''\n        wx.showModal({\n          title: '获取成功',\n          content: content ? `邮箱为：${content}` : '邮箱为空',\n          showCancel: false\n        })\n      }\n    })\n  },\n\n  updateMyEmail() {\n    const data = {\n      email: this.data.myEmail\n    }\n    this.updateOneByOpenId('perm2', '', data, {\n      showLoading: true,\n      showError: true,\n      success: () => {\n        app.globalData.myEmail = this.data.myEmail\n        wx.showModal({\n          content: '设置成功',\n          showCancel: false\n        })\n      }\n    })\n  },\n\n  queryAdminEmail() {\n    this.queryOneByOpenId('perm2', 'popo', {\n      showLoading: true,\n      showError: true,\n      success: data => {\n        const content = (data && data.email) || ''\n        wx.showModal({\n          title: '获取成功',\n          content: content ? `邮箱为：${content}` : '邮箱为空',\n          showCancel: false\n        })\n      }\n    })\n  },\n\n  updateAdminEmail() {\n    const data = {\n      email: this.data.adminEmail\n    }\n    this.updateOneByOpenId('perm2', 'popo', data, {\n      showLoading: true,\n      showError: true,\n      success: () => {\n        app.globalData.adminEmail = this.data.adminEmail\n        wx.showModal({\n          content: '设置成功',\n          showCancel: false\n        })\n      }\n    })\n  },\n\n  // perm3：仅管理端可写，所有人可读\n\n  queryProduct() {\n    this.queryOneByOpenId('perm3', 'admin', {\n      showLoading: true,\n      showError: true,\n      success: data => {\n        const price = (data && data.price) || null\n        wx.showModal({\n          title: '获取成功',\n          content: price !== null ? `商品价格为：${price}` : '商品价格暂未设置',\n          showCancel: false\n        })\n      }\n    })\n  },\n\n  updateProductPrice() {\n    const data = {\n      price: parseInt(this.data.product.price, 10)\n    }\n    this.updateOneByOpenId('perm3', 'admin', data, {\n      showLoading: true,\n      showError: true,\n      success: () => {\n        wx.showModal({\n          content: '设置成功',\n          showCancel: false\n        })\n      }\n    })\n  },\n\n  // perm4：仅管理端可读写\n\n  queryServerData() {\n    this.queryOneByOpenId('perm4', 'server', {\n      showLoading: true,\n      showError: true,\n      success: data => {\n        const content = (data && data.serverData) || ''\n        wx.showModal({\n          title: '获取成功',\n          content: content ? `后台流水数据为：${content}` : '后台流水数据为空',\n          showCancel: false\n        })\n      }\n    })\n  },\n\n  updateServerData() {\n    const data = {\n      data: this.data.serverData\n    }\n    this.updateOneByOpenId('perm4', 'server', data, {\n      showLoading: true,\n      showError: true,\n      success: () => {\n        wx.showModal({\n          content: '设置成功',\n          showCancel: false\n        })\n      }\n    })\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/database/db-permission/db-permission.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"权限管理\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/database/db-permission/db-permission.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'Permission'}}\" />\n\n  <view class=\"page-body\" wx:if=\"{{openid}}\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_select\">\n          <view class=\"weui-cell__hd weui-cell__hd_in-select-after\">\n            <view class=\"weui-label\">权限类型</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <picker bindchange=\"onPermissionChange\" value=\"{{currentPermissionIndex}}\" range=\"{{permissions}}\">\n              <view class=\"weui-select permission-select\" weui-select_in-select-after>{{permissions[currentPermissionIndex]}}</view>\n            </picker>\n          </view>\n        </view>\n      </view>\n\n      <view class=\"weui-panel\">\n        <view class=\"weui-panel__bd\">\n\n          <block wx:if=\"{{currentPermissionIndex === 0}}\">\n            <view class=\"weui-tab\">\n              <view class=\"weui-navbar\">\n                <block wx:for=\"{{tabs[currentPermissionIndex]}}\" wx:key=\"*this\">\n                  <view id=\"{{index}}\" class=\"weui-navbar__item {{activeTabIndex === index ? 'weui-bar__item_on' : ''}}\" bindtap=\"onTabClick\">\n                    <view class=\"weui-navbar__title\">{{item}}</view>\n                  </view>\n                </block>\n                <view class=\"weui-navbar__slider\" style=\"left: {{sliderLeft}}px; transform: translateX({{sliderOffset}}px); -webkit-transform: translateX({{sliderOffset}}px);\"></view>\n              </view>\n              <view class=\"weui-tab__panel\">\n                <view class=\"weui-tab__content\" hidden=\"{{activeTabIndex !== 0}}\">\n                  <view class=\"weui-cells weui-cells_after-title input-area\">\n                    <view class=\"weui-cell weui-cell_input\">\n                      <view class=\"weui-cell__bd\">\n                        <input class=\"weui-input\" placeholder=\"请输入个性签名\" value=\"{{myWhatsUp}}\" focus=\"{{!hasMyWhatsUp}}\" data-name=\"myWhatsUp\" bindinput=\"bindInput\" bindconfirm=\"updateMyWhatsUp\" />\n                      </view>\n                    </view>\n                  </view>\n\n                  <view class=\"btn-area\">\n                    <button type=\"primary\" bindtap=\"updateMyWhatsUp\" loading=\"{{updating}}\">设置个性签名</button>\n                    <button bindtap=\"queryMyWhatsUp\" loading=\"{{querying}}\">获取个性签名</button>\n                  </view>\n                </view>\n\n                <view class=\"weui-tab__content\" hidden=\"{{activeTabIndex !== 1}}\">\n                  <view class=\"weui-cells weui-cells_after-title input-area\">\n                    <view class=\"weui-cell weui-cell_input\">\n                      <view class=\"weui-cell__bd\">\n                        <input class=\"weui-input\" placeholder=\"请输入个性签名\" value=\"{{adminWhatsUp}}\" data-name=\"adminWhatsUp\" bindinput=\"bindInput\" />\n                      </view>\n                    </view>\n                  </view>\n\n                  <view class=\"btn-area\">\n                    <button type=\"primary\" bindtap=\"updateAdminWhatsUp\" loading=\"{{updating}}\">设置个性签名</button>\n                    <button bindtap=\"queryAdminWhatsUp\" loading=\"{{querying}}\">获取个性签名</button>\n                  </view>\n                </view>\n              </view>\n            </view>\n          </block>\n\n          <block wx:elif=\"{{currentPermissionIndex === 1}}\">\n            <view class=\"weui-tab\">\n              <view class=\"weui-navbar\">\n                <block wx:for=\"{{tabs[currentPermissionIndex]}}\" wx:key=\"*this\">\n                  <view id=\"{{index}}\" class=\"weui-navbar__item {{activeTabIndex === index ? 'weui-bar__item_on' : ''}}\" bindtap=\"onTabClick\">\n                    <view class=\"weui-navbar__title\">{{item}}</view>\n                  </view>\n                </block>\n                <view class=\"weui-navbar__slider\" style=\"left: {{sliderLeft}}px; transform: translateX({{sliderOffset}}px); -webkit-transform: translateX({{sliderOffset}}px);\"></view>\n              </view>\n              <view class=\"weui-tab__panel\">\n                <view class=\"weui-tab__content\" hidden=\"{{activeTabIndex !== 0}}\">\n                  <view class=\"weui-cells weui-cells_after-title input-area\">\n                    <view class=\"weui-cell weui-cell_input\">\n                      <view class=\"weui-cell__bd\">\n                        <input class=\"weui-input\" placeholder=\"请输入邮箱\" value=\"{{myEmail}}\" data-name=\"myEmail\" bindinput=\"bindInput\" />\n                      </view>\n                    </view>\n                  </view>\n\n                  <view class=\"btn-area\">\n                    <button type=\"primary\" bindtap=\"updateMyEmail\" loading=\"{{updating}}\">设置邮箱</button>\n                    <button bindtap=\"queryMyEmail\" loading=\"{{querying}}\">获取邮箱</button>\n                  </view>\n                </view>\n\n                <view class=\"weui-tab__content\" hidden=\"{{activeTabIndex !== 1}}\">\n                  <view class=\"weui-cells weui-cells_after-title input-area\">\n                    <view class=\"weui-cell weui-cell_input\">\n                      <view class=\"weui-cell__bd\">\n                        <input class=\"weui-input\" placeholder=\"请输入邮箱\" value=\"{{adminEmail}}\" data-name=\"adminEmail\" bindinput=\"bindInput\" />\n                      </view>\n                    </view>\n                  </view>\n\n                  <view class=\"btn-area\">\n                    <button type=\"primary\" bindtap=\"updateAdminEmail\" loading=\"{{updating}}\">设置邮箱</button>\n                    <button bindtap=\"queryAdminEmail\" loading=\"{{querying}}\">获取邮箱</button>\n                  </view>\n                </view>\n              </view>\n            </view>\n          </block>\n\n          <block wx:elif=\"{{currentPermissionIndex === 2}}\">\n            <view>\n              <view class=\"weui-cells weui-cells_after-title input-area\">\n                <view class=\"weui-cell weui-cell_input\">\n                  <view class=\"weui-cell__bd\">\n                    <input class=\"weui-input\" placeholder=\"请输入商品价格\" value=\"{{product.price}}\" data-name=\"product.price\" bindinput=\"bindInput\" />\n                  </view>\n                </view>\n              </view>\n\n              <view class=\"btn-area\">\n                <button type=\"primary\" bindtap=\"updateProductPrice\" loading=\"{{updating}}\">设置商品价格</button>\n                <button bindtap=\"queryProduct\" loading=\"{{querying}}\">获取商品价格</button>\n              </view>\n            </view>\n          </block>\n\n          <block wx:elif=\"{{currentPermissionIndex === 3}}\">\n            <view>\n              <view class=\"weui-cells weui-cells_after-title input-area\">\n                <view class=\"weui-cell weui-cell_input\">\n                  <view class=\"weui-cell__bd\">\n                    <input class=\"weui-input\" placeholder=\"请输入后台流水数据\" value=\"{{serverData}}\" data-name=\"serverData\" bindinput=\"bindInput\" />\n                  </view>\n                </view>\n              </view>\n\n              <view class=\"btn-area\">\n                <button type=\"primary\" bindtap=\"updateServerData\" loading=\"{{updating}}\">设置后台流水数据</button>\n                <button bindtap=\"queryServerData\" loading=\"{{querying}}\">获取后台流水数据</button>\n              </view>\n            </view>\n          </block>\n\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageCloud/pages/database/db-permission/db-permission.wxss",
    "content": "\n\n.permission-select {\n  display: flex;\n  align-items: center;\n  height: initial;\n  line-height: initial;\n}\n.weui-panel {\n  margin-top: 30px;\n}\n.input-area {\n  margin-top: 30px;\n}\n.btn-area {\n  margin-bottom: 30px;\n}\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/database/server-date/server-date.js",
    "content": "const util = require('../../../../util/util.js')\n\n// 参考文档：https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-client-api/database/db.serverDate.html\n\nconst app = getApp()\nconst collection = 'serverDate'\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '服务端时间',\n      path: 'packageCloud/pages/database/server-date/server-date'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    openid: '',\n    loading: false,\n    clientDate: null,\n    serverDate: null,\n    clientDateFormatted: '',\n    serverDateFormatted: '',\n    delta: 0\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    if (app.globalData.openid) {\n      this.setData({\n        openid: app.globalData.openid\n      })\n    } else {\n      wx.showLoading({\n        title: '正在初始化...'\n      })\n      app.getUserOpenIdViaCloud()\n        .then(openid => {\n          this.setData({\n            openid\n          })\n          wx.hideLoading()\n          return openid\n        }).catch(err => {\n          console.error(err)\n          wx.hideLoading()\n          wx.showToast({\n            icon: 'none',\n            title: '初始化失败，请检查网络'\n          })\n        })\n    }\n  },\n\n  showError() {\n    wx.showToast({\n      icon: 'none',\n      title: '插入失败'\n    })\n  },\n\n  completeTask() {\n    this.setData({\n      loading: false\n    })\n  },\n\n  // 如果已有记录则更新，否则插入\n  insertOrUpdateData(existedData, data) {\n    const db = wx.cloud.database()\n    if (existedData._id) {\n      db.collection(collection).doc(existedData._id).update({ data })\n        .then(res => {\n          this.setCompletedData(existedData._id)\n          return res\n        })\n        .catch(err => {\n          this.showError()\n          console.error('[数据库] [更新记录] 失败：', err)\n          this.completeTask()\n        })\n    } else {\n      db.collection(collection).add({ data })\n        .then(res => {\n          this.setCompletedData(res._id)\n          return res\n        })\n        .catch(err => {\n          this.showError()\n          console.error('[数据库] [新增记录] 失败：', err)\n          this.completeTask()\n        })\n    }\n  },\n\n  // 查询已插入/更新的数据中记录的服务端时间\n  setCompletedData(id) {\n    const db = wx.cloud.database()\n    db.collection(collection).doc(id).get()\n      .then(res => {\n        this.setData({\n          delta: Math.abs(res.data.time - this.data.clientDate), // 大致的时间差\n          serverDate: res.data.time, // 服务端时间\n          clientDateFormatted: util.formatDateTime(this.data.clientDate, true),\n          serverDateFormatted: util.formatDateTime(res.data.time, true)\n        })\n        wx.showToast({\n          title: '插入成功',\n        })\n        this.completeTask()\n        return res\n      })\n      .catch(err => {\n        this.showError()\n        console.error('[数据库] [查询记录] 失败：', err)\n        this.completeTask()\n      })\n  },\n\n  insertData() {\n    const db = wx.cloud.database()\n    const data = {\n      time: db.serverDate()\n    }\n    this.setData({\n      loading: true\n    })\n    db.collection(collection).where({\n      _openid: this.data.openid\n    }).get()\n      .then(res => {\n        this.data.clientDate = new Date() // 客户端时间\n        console.log('[数据库] [查询记录] 成功: ', res)\n        const resFirstData = res.data[0] || {}\n        this.insertOrUpdateData(resFirstData, data)\n        return res\n      })\n      .catch(err => {\n        this.showError()\n        console.error('[数据库] [查询记录] 失败：', err)\n        this.completeTask()\n      })\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/database/server-date/server-date.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"服务端时间\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/database/server-date/server-date.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'db.serverDate'}}\"/>\n\n  <view class=\"page-body\" wx:if=\"{{openid}}\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info\">\n        <view class=\"page-body-title\">服务端时间</view>\n        <block wx:if=\"{{!serverDate}}\">\n          <text class=\"page-body-text\">很多时候我们希望记录数据的创建时间</text>\n          <text class=\"page-body-text\">在小程序端使用 Date 对象创建的是客户端时间（可被任意修改），而非服务端时间</text>\n          <text class=\"page-body-text\">这时可以使用云开发提供的 serverDate 对象，在请求被处理时会自动转换成服务端时间</text>\n        </block>\n        <block wx:else>\n          <block>\n            <text class=\"page-body-text\">客户端时间</text>\n            <text class=\"context-value\">{{clientDateFormatted}}</text>\n          </block>\n          <block>\n            <text class=\"page-body-text\">服务端时间</text>\n            <text class=\"context-value\">{{serverDateFormatted}}</text>\n          </block>\n          <block>\n            <text class=\"page-body-text\">时间差距</text>\n            <text class=\"context-value\">{{delta}} 毫秒</text>\n          </block>\n        </block>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"insertData\" loading=\"{{loading}}\">插入数据</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/database/server-date/server-date.wxss",
    "content": ".page-body-info {\n  padding-bottom: 0;\n  height: 280px;\n}\n.page-body-text {\n  padding: 0 15px;\n  text-align: center;\n}\n.context-value {\n  font-size: 19px;\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/nouse/crud-detail/crud-detail.js",
    "content": "const app = getApp()\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '基本操作',\n      path: 'packageCloud/pages/crud/crud'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    openid: '',\n    todoId: '',\n    description: '',\n    done: false,\n    updating: false,\n    deleting: false\n  },\n\n  onLoad(options) {\n    const { todoId } = options\n    this.setData({\n      todoId\n    })\n    if (app.globalData.openid) {\n      this.setData({\n        openid: app.globalData.openid\n      })\n      this.queryTodo()\n    } else {\n      wx.showLoading({\n        title: '正在初始化...'\n      })\n      app.getUserOpenIdViaCloud()\n        .then(openid => {\n          this.setData({\n            openid\n          })\n          wx.hideLoading()\n          this.queryTodo()\n          return openid\n        }).catch(err => {\n          console.error(err)\n          wx.hideLoading()\n        })\n    }\n  },\n\n  queryTodo() {\n    wx.showLoading({\n      title: '正在查询...'\n    })\n    const db = wx.cloud.database()\n    db.collection('todos').doc(this.data.todoId).get({\n      success: res => {\n        this.setData({\n          description: res.data.description,\n          done: res.data.done\n        })\n        console.log('[数据库] [查询记录] 成功: ', res)\n      },\n      fail: err => {\n        wx.showToast({\n          icon: 'none',\n          title: '查询记录失败'\n        })\n        console.error('[数据库] [查询记录] 失败：', err)\n      },\n      complete: () => {\n        wx.hideLoading()\n      }\n    })\n  },\n\n  updateTodo() {\n    if (this.data.updating || !this.data.todoId) {\n      return\n    }\n    const { todoId, description } = this.data\n    if (!description) {\n      return\n    }\n\n    this.setData({ updating: true })\n    const db = wx.cloud.database()\n    db.collection('todos').doc(todoId).update({\n      data: {\n        description\n      },\n      success: () => {\n        console.log('he')\n        wx.showToast({\n          title: '更新成功',\n        })\n        wx.navigateBack()\n      },\n      fail: err => {\n        wx.showToast({\n          icon: 'none',\n          title: '更新失败',\n        })\n        console.error('[数据库] [更新记录] 失败：', err)\n      },\n      complete: () => {\n        this.setData({ updating: false })\n      }\n    })\n  },\n\n  removeTodo() {\n    if (this.data.deleting || !this.data.todoId) {\n      return\n    }\n    const { todoId } = this.data\n\n    this.setData({ deleting: true })\n    const db = wx.cloud.database()\n    db.collection('todos').doc(todoId).remove({\n      success: () => {\n        wx.showToast({\n          title: '删除成功',\n        })\n        wx.navigateBack()\n      },\n      fail: err => {\n        wx.showToast({\n          icon: 'none',\n          title: '删除失败',\n        })\n        console.error('[数据库] [删除记录] 失败：', err)\n      },\n      complete: () => {\n        this.setData({ deleting: false })\n      }\n    })\n  },\n\n  onInputContent(e) {\n    this.setData({\n      description: e.detail.value\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/nouse/crud-detail/crud-detail.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"基本操作\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/nouse/crud-detail/crud-detail.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'CRUD'}}\" />\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">内容</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__bd\">\n            <input class=\"weui-input\" placeholder=\"请输入内容\" value=\"{{description}}\" bindinput=\"onInputContent\" />\n          </view>\n        </view>\n      </view>\n\n      <view class=\"btn-area\">\n        <button type=\"primary\" size=\"40\" bindtap=\"updateTodo\" loading=\"{{updating}}\">更新 Todo</button>\n        <button type=\"warn\" size=\"40\" bindtap=\"removeTodo\" loading=\"{{deleting}}\">删除 Todo</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageCloud/pages/nouse/crud-detail/crud-detail.wxss",
    "content": "\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/nouse/doc-web-view/doc-web-view.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '小程序云开发文档',\n      path: 'packageCloud/pages/doc-web-view/doc-web-view'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/nouse/doc-web-view/doc-web-view.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"小程序云开发文档\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/nouse/doc-web-view/doc-web-view.wxml",
    "content": "<web-view src=\"https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html\"></web-view>\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/nouse/doc-web-view/doc-web-view.wxss",
    "content": "/* miniprogram/page/cloud/pages/doc-web-view/doc-web-view.wxss */"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/get-wx-context/get-wx-context.js",
    "content": "// 参考文档：https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-server-api/utils/getWXContext.html\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'WXContext',\n      path: 'packageCloud/pages/scf/get-wx-context/get-wx-context'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    hasWXContext: false,\n    wxContext: {},\n    loading: false\n  },\n\n  getWXContext() {\n    this.setData({\n      loading: true\n    })\n    wx.cloud.callFunction({\n      name: 'wxContext',\n      data: {},\n      success: res => {\n        console.log('[云函数] [wxContext] wxContext: ', res.result)\n        this.setData({\n          hasWXContext: true,\n          wxContext: res.result,\n          loading: false\n        })\n      },\n      fail: err => {\n        console.error('[云函数] [wxContext] 调用失败', err)\n      }\n    })\n  },\n\n  clear() {\n    this.setData({\n      hasWXContext: false,\n      wxContext: {}\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/get-wx-context/get-wx-context.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"WXContext\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/get-wx-context/get-wx-context.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'getWXContext'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info\">\n        <view class=\"page-body-title\">WXContext</view>\n        <block wx:if=\"{{!hasWXContext}}\">\n          <text class=\"page-body-text\">云函数是在云端（服务器端）运行的函数</text>\n          <text class=\"page-body-text\">点击绿色按钮可调用云函数获取微信调用上下文</text>\n          <text class=\"page-body-text\">返回内容包括用户 OpenID、小程序 AppID 以及用户 UnionID（满足 UnionID 获取条件时）</text>\n        </block>\n        <block wx:else>\n          <block>\n            <text class=\"page-body-text\">OpenID</text>\n            <text class=\"context-value\">{{wxContext.openid}}</text>\n          </block>\n          <block>\n            <text class=\"page-body-text\">AppID</text>\n            <text class=\"context-value\">{{wxContext.appid}}</text>\n          </block>\n          <block wx:if=\"{{wxContext.unionid}}\">\n            <text class=\"page-body-text\">UnionID</text>\n            <text class=\"context-value\">{{wxContext.unionid}}</text>\n          </block>\n        </block>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"getWXContext\" loading=\"{{loading}}\">获取 WXContext</button>\n        <button bindtap=\"clear\">清空</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/get-wx-context/get-wx-context.wxss",
    "content": ".page-body-info {\n  padding-bottom: 0;\n  height: 260px;\n}\n.page-body-text {\n  padding: 0 15px;\n  text-align: center;\n}\n.context-value {\n  font-size: 19px;\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/scf-database/scf-database.js",
    "content": "// 参考文档：https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-server-api/database/\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '云函数操作数据库',\n      path: 'packageCloud/pages/scf/scf-database/scf-database'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    serverDataClient: '',\n    serverDataClientError: false,\n    serverDataCloud: '',\n    serverDataCloudError: false,\n    clientLoading: false,\n    cloudLoading: false,\n    theme: 'light'\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  queryServerDataViaClient() {\n    const db = wx.cloud.database()\n    this.setData({\n      clientLoading: true,\n      serverDataClient: '',\n      serverDataClientError: false\n    })\n    db.collection('perm4').where({\n      _openid: 'server'\n    }).get({\n      success: res => {\n        const resFirstData = (res.data && res.data[0]) || {}\n        this.setData({\n          serverDataClient: resFirstData.data\n        })\n        console.log('[数据库] [查询记录] 成功: ', res)\n      },\n      fail: err => {\n        this.setData({\n          serverDataClientError: true\n        })\n        console.error('[数据库] [查询记录] 失败：', err)\n      },\n      complete: () => {\n        this.setData({\n          clientLoading: false\n        })\n      }\n    })\n  },\n\n  queryServerDataViaCloudFunction() {\n    this.setData({\n      cloudLoading: true,\n      serverDataCloud: '',\n      serverDataCloudError: false\n    })\n    wx.cloud.callFunction({\n      name: 'getServerDataDemo',\n      data: {},\n      success: res => {\n        console.log('[云函数] [getServerDataDemo] res: ', res.result)\n        const resFirstData = (res.result.data && res.result.data[0]) || {}\n        this.setData({\n          serverDataCloud: resFirstData.data\n        })\n      },\n      fail: err => {\n        this.setData({\n          serverDataCloudError: true\n        })\n        console.error('[云函数] [getServerDataDemo] 调用失败', err)\n      },\n      complete: () => {\n        this.setData({\n          cloudLoading: false\n        })\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/scf-database/scf-database.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"云函数操作数据库\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/scf-database/scf-database.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'Database'}}\" />\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">\n        <view>云函数为管理端，通过调用云函数可操作原先在小程序端无法操作的数据。</view>\n        <view>后台流水数据：权限为仅管理端可写</view>\n      </view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"page-body-info\">\n          <view class=\"progress-figure\">\n            <image wx:if=\"{{theme === 'dark'}}\" src=\"/page/API/resources/kind/device_dark.png\" class=\"progress-icon\"></image>\n            <image wx:else src=\"/page/API/resources/kind/device.png\" class=\"progress-icon\"></image>\n            <text class=\"progress-line lg {{clientLoading && 'pending'}} {{serverDataClient && 'success'}} {{serverDataClientError && 'fail'}}\"></text>\n            <image wx:if=\"{{theme === 'dark'}}\" src=\"/page/cloud/resources/kind/database_dark.png\" class=\"progress-icon\"></image>\n            <image wx:else src=\"/page/cloud/resources/kind/database.png\" class=\"progress-icon\"></image>\n          </view>\n\n          <view class=\"data-area\">\n            <view class=\"data-text\" wx:if=\"{{serverDataClient}}\">\n              <icon type=\"success\"></icon>\n              <text>获取成功</text>\n            </view>\n            <view class=\"data-text\" wx:elif=\"{{serverDataClientError}}\">\n              <icon type=\"warn\" color=\"#F43530\"></icon>\n              <text>获取失败</text>\n            </view>\n          </view>\n\n          <view class=\"btn-area\">\n            <button bindtap=\"queryServerDataViaClient\" loading=\"{{clientLoading}}\">小程序端获取后台流水数据</button>\n          </view>\n        </view>\n      </view>\n\n      <view class=\"weui-cells__title\"></view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"page-body-info\">\n          <view class=\"progress-figure\">\n            <image wx:if=\"{{theme === 'dark'}}\" src=\"/page/API/resources/kind/device_dark.png\" class=\"progress-icon\"></image>\n            <image wx:else src=\"/page/API/resources/kind/device.png\" class=\"progress-icon\"></image>\n            <text class=\"progress-line {{cloudLoading && 'pending'}} {{serverDataCloud && 'success'}} {{serverDataCloudError && 'fail'}}\"></text>\n            <image wx:if=\"{{theme === 'dark'}}\" src=\"/page/cloud/resources/kind/scf_dark.png\" class=\"progress-icon\"></image>\n            <image wx:else src=\"/page/cloud/resources/kind/scf.png\" class=\"progress-icon\"></image>\n            <text class=\"progress-line {{cloudLoading && 'pending'}} {{serverDataCloud && 'success'}} {{serverDataCloudError && 'fail'}}\"></text>\n            <image wx:if=\"{{theme === 'dark'}}\" src=\"/page/cloud/resources/kind/database_dark.png\" class=\"progress-icon\"></image>\n            <image wx:else src=\"/page/cloud/resources/kind/database.png\" class=\"progress-icon\"></image>\n          </view>\n\n          <view class=\"data-area\">\n            <view class=\"data-text\" wx:if=\"{{serverDataCloud}}\">\n              <icon type=\"success\"></icon>\n              <text>获取成功</text>\n            </view>\n            <view class=\"data-text\" wx:elif=\"{{serverDataCloudError}}\">\n              <icon type=\"warn\" color=\"#F43530\"></icon>\n              <text>获取失败</text>\n            </view>\n          </view>\n\n          <view class=\"btn-area\">\n            <button bindtap=\"queryServerDataViaCloudFunction\" loading=\"{{cloudLoading}}\">调用云函数获取后台流水数据</button>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/scf-database/scf-database.wxss",
    "content": "\n\n.page-body-info {\n  padding-bottom: 15px;\n}\n.progress-figure {\n  font-size: 16px;\n}\n.progress-icon {\n  width: 30px;\n  height: 30px;\n}\n.progress-line {\n  border-top: 2px solid #2F2F2F;\n  padding: 0 30px;\n  margin: 0 10px;\n}\n.progress-line.pending {\n  border-top-style: dashed;\n}\n.progress-line.success {\n  border-top-color: #0bb20c;\n}\n.progress-line.fail {\n  border-top-color: #e64340;\n}\n.progress-line.lg {\n  padding: 0 50px;\n}\n.data-area {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  margin-top: 15px;\n  height: 15px;\n}\n.data-area .data-text {\n  display: flex;\n  align-items: center;\n}\n.data-area .data-text icon {\n  margin-right: 5px;\n}\n.btn-area {\n  margin-top: 15px;\n}\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/scf-openapi/scf-openapi.js",
    "content": "// 参考文档：https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-server-api/database/\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '云函数中使用微信开放能力',\n      path: 'packageCloud/pages/scf/scf-openapi/scf-openapi'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    sendTemplateMessageResult: '',\n    sendTemplateMessageError: false,\n    getWXACodeResult: '',\n    getWXACodeError: false,\n    sendTemplateMessageLoading: false,\n    getWXACodeLoading: false,\n    theme: 'light'\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  sendTemplateMessageViaCloudFunction(e) {\n    this.setData({\n      sendTemplateMessageResult: '',\n      sendTemplateMessageError: false,\n      sendTemplateMessageLoading: true,\n    })\n    wx.cloud.callFunction({\n      name: 'openapi',\n      data: {\n        action: 'sendTemplateMessage',\n        formId: e.detail.formId,\n      },\n      // eslint-disable-next-line\n    }).then((res) => {\n      this.setData({\n        sendTemplateMessageResult: res,\n        sendTemplateMessageLoading: false,\n      })\n      console.log('[云调用] [发送模板消息] 成功: ', res)\n    }).catch(err => {\n      this.setData({\n        sendTemplateMessageError: true,\n        sendTemplateMessageLoading: false,\n      })\n      console.error('[云调用] [发送模板消息] 失败: ', err)\n    })\n  },\n\n  getWXACodeViaCloudFunction() {\n    this.setData({\n      getWXACodeResult: '',\n      getWXACodeError: false,\n      getWXACodeLoading: true,\n    })\n    wx.cloud.callFunction({\n      name: 'openapi',\n      data: {\n        action: 'getWXACode'\n      }\n      // eslint-disable-next-line\n    }).then(res => {\n      this.setData({\n        getWXACodeResult: res,\n        getWXACodeLoading: false,\n      })\n      console.log('[云调用] [获取小程序码]] 成功: ', res)\n    }).catch(err => {\n      this.setData({\n        getWXACodeError: true,\n        getWXACodeLoading: false,\n      })\n      console.error('[云调用] [获取小程序码] 失败: ', err)\n    })\n  },\n\n  queryServerDataViaClient() {\n    const db = wx.cloud.database()\n    this.setData({\n      clientLoading: true,\n      serverDataClient: '',\n      serverDataClientError: false\n    })\n    db.collection('perm4').where({\n      _openid: 'server'\n    }).get({\n      success: res => {\n        const resFirstData = (res.data && res.data[0]) || {}\n        this.setData({\n          serverDataClient: resFirstData.data\n        })\n        console.log('[数据库] [查询记录] 成功: ', res)\n      },\n      fail: err => {\n        this.setData({\n          serverDataClientError: true\n        })\n        console.error('[数据库] [查询记录] 失败：', err)\n      },\n      complete: () => {\n        this.setData({\n          clientLoading: false\n        })\n      }\n    })\n  },\n\n  queryServerDataViaCloudFunction() {\n    this.setData({\n      cloudLoading: true,\n      serverDataCloud: '',\n      serverDataCloudError: false\n    })\n    wx.cloud.callFunction({\n      name: 'getServerDataDemo',\n      data: {},\n      success: res => {\n        console.log('[云函数] [getServerDataDemo] res: ', res.result)\n        const resFirstData = (res.result.data && res.result.data[0]) || {}\n        this.setData({\n          serverDataCloud: resFirstData.data\n        })\n      },\n      fail: err => {\n        this.setData({\n          serverDataCloudError: true\n        })\n        console.error('[云函数] [getServerDataDemo] 调用失败', err)\n      },\n      complete: () => {\n        this.setData({\n          cloudLoading: false\n        })\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/scf-openapi/scf-openapi.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"云调用\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/scf-openapi/scf-openapi.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: '云函数中使用微信开放能力'}}\" />\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">\n        <view>云调用是云开发提供的基于云函数使用小程序开放接口的能力</view>\n      </view>\n\n      <view class=\"weui-cells__title\">\n        <view>发送模板消息需在手机上测试</view>\n      </view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"page-body-info\">\n          <view class=\"progress-figure\">\n            <image wx:if=\"{{theme === 'dark'}}\" src=\"/page/API/resources/kind/device_dark.png\" class=\"progress-icon\"></image>\n            <image wx:else src=\"/page/API/resources/kind/device.png\" class=\"progress-icon\"></image>\n            <text class=\"progress-line {{sendTemplateMessageLoading && 'pending'}} {{sendTemplateMessageResult && 'success'}} {{sendTemplateMessageError && 'fail'}}\"></text>\n            <image wx:if=\"{{theme === 'dark'}}\" src=\"/page/cloud/resources/kind/scf_dark.png\" class=\"progress-icon\"></image>\n            <image wx:else src=\"/page/cloud/resources/kind/scf.png\" class=\"progress-icon\"></image>\n            <text class=\"progress-line {{sendTemplateMessageLoading && 'pending'}} {{sendTemplateMessageResult && 'success'}} {{sendTemplateMessageError && 'fail'}}\"></text>\n            <image wx:if=\"{{theme === 'dark'}}\" src=\"/page/API/resources/kind/device_dark.png\" class=\"progress-icon\"></image>\n            <image wx:else src=\"/page/API/resources/kind/device.png\" class=\"progress-icon\"></image>\n          </view>\n\n          <view class=\"data-area\">\n            <view class=\"data-text\" wx:if=\"{{sendTemplateMessageResult}}\">\n              <icon type=\"success\"></icon>\n              <text>发送模板消息成功，返回微信主窗口查看</text>\n            </view>\n            <view class=\"data-text\" wx:elif=\"{{sendTemplateMessageError}}\">\n              <icon type=\"warn\" color=\"#F43530\"></icon>\n              <text>发送失败</text>\n            </view>\n          </view>\n\n          <view class=\"btn-area\">\n            <form bindsubmit=\"sendTemplateMessageViaCloudFunction\" report-submit>\n              <button form-type=\"submit\" loading=\"{{cloudLoading}}\">发送模板消息</button>\n            </form>\n          </view>\n        </view>\n      </view>\n\n      <view class=\"weui-cells__title\"></view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"page-body-info\">\n          <view class=\"progress-figure\">\n            <image wx:if=\"{{theme === 'dark'}}\" src=\"/page/API/resources/kind/device_dark.png\" class=\"progress-icon\"></image>\n            <image wx:else src=\"/page/API/resources/kind/device.png\" class=\"progress-icon\"></image>\n            <text class=\"progress-line {{getWXACodeLoading && 'pending'}} {{getWXACodeResult && 'success'}} {{getWXACodeError && 'fail'}}\"></text>\n            <image wx:if=\"{{theme === 'dark'}}\" src=\"/page/cloud/resources/kind/scf_dark.png\" class=\"progress-icon\"></image>\n            <image wx:else src=\"/page/cloud/resources/kind/scf.png\" class=\"progress-icon\"></image>\n          </view>\n\n          <view class=\"progress-figure\" wx:if=\"{{getWXACodeResult}}\">\n            <image src=\"{{getWXACodeResult.result}}\" mode=\"aspectFit\"></image>\n          </view>\n\n          <view class=\"data-area\">\n            <view class=\"data-text\" wx:if=\"{{getWXACodeResult}}\">\n              <icon type=\"success\"></icon>\n              <text>获取成功</text>\n            </view>\n            <view class=\"data-text\" wx:elif=\"{{getWXACodeError}}\">\n              <icon type=\"warn\" color=\"#F43530\"></icon>\n              <text>获取失败</text>\n            </view>\n          </view>\n\n          <view class=\"btn-area\">\n            <button bindtap=\"getWXACodeViaCloudFunction\" loading=\"{{cloudLoading}}\">获取小程序码</button>\n          </view>\n        </view>\n      </view>\n\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/scf-openapi/scf-openapi.wxss",
    "content": "\n\n.page-body-info {\n  padding-bottom: 15px;\n}\n.progress-figure {\n  font-size: 16px;\n}\n.progress-icon {\n  width: 30px;\n  height: 30px;\n}\n.progress-line {\n  border-top: 2px solid #2F2F2F;\n  padding: 0 30px;\n  margin: 0 10px;\n}\n.progress-line.pending {\n  border-top-style: dashed;\n}\n.progress-line.success {\n  border-top-color: #0bb20c;\n}\n.progress-line.fail {\n  border-top-color: #e64340;\n}\n.progress-line.lg {\n  padding: 0 50px;\n}\n.data-area {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  margin-top: 15px;\n  height: 15px;\n}\n.data-area .data-text {\n  display: flex;\n  align-items: center;\n}\n.data-area .data-text icon {\n  margin-right: 5px;\n}\n.btn-area {\n  margin-top: 15px;\n}\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/scf-storage/scf-storage.js",
    "content": "const demoImageFileId = require('../../../../config').demoImageFileId\n\n// 参考文档：https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-server-api/storage/\n\nconst app = getApp()\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '云函数操作存储',\n      path: 'packageCloud/pages/scf/scf-storage/scf-storage'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    fileTempURLDone: false,\n    fileId: '',\n    tempFileURL: '',\n    loading: false\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    this.setData({\n      fileId: app.globalData.fileId || demoImageFileId\n    })\n  },\n\n  getTempFileURL() {\n    const fileId = this.data.fileId\n    if (!fileId) {\n      return\n    }\n\n    this.setData({\n      loading: true\n    })\n    wx.cloud.callFunction({\n      name: 'getTempFileURL',\n      data: {\n        fileIdList: [fileId]\n      },\n      success: res => {\n        console.log('[云函数] [getTempFileURL] res: ', res.result)\n        if (res.result.length) {\n          this.setData({\n            fileTempURLDone: true,\n            tempFileURL: res.result[0].tempFileURL\n          })\n        }\n      },\n      fail: err => {\n        console.error('[云函数] [getTempFileURL] 调用失败', err)\n      },\n      complete: () => {\n        this.setData({\n          loading: false\n        })\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/scf-storage/scf-storage.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"云函数操作存储\"\n}\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/scf-storage/scf-storage.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'Storage'}}\" />\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <block wx:if=\"{{fileTempURLDone}}\">\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">文件 ID</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <textarea class=\"weui-textarea\" value=\"{{fileId}}\" style=\"height: 3.3em\" disabled />\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">临时链接</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <textarea class=\"weui-textarea\" value=\"{{tempFileURL}}\" style=\"height: 3.3em\" disabled />\n            </view>\n          </view>\n\n          <view class=\"weui-cell\">\n            <view class=\"page-section-ctn\">\n              <image src=\"{{tempFileURL}}\" class=\"image\" mode=\"aspectFit\"></image>\n            </view>\n          </view>\n        </view>\n        \n      </block>\n\n      <block wx:else>\n        <view class=\"weui-cells__title\">云函数亦可操作文件存储，点击按钮换取临时链接</view>\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">文件 ID</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <textarea class=\"weui-textarea\" value=\"{{fileId}}\" style=\"height: 3.3em\" disabled />\n            </view>\n          </view>\n        </view>\n\n        <view class=\"btn-area\">\n          <button type=\"primary\" size=\"40\" bindtap=\"getTempFileURL\" loading=\"{{loading}}\">通过云函数换取临时链接</button>\n        </view>\n      </block>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageCloud/pages/scf/scf-storage/scf-storage.wxss",
    "content": "\n\n.page-section-ctn {\n  text-align: center;\n  margin: 0 auto;\n  width: 100%;\n}\n\n.image {\n  max-width: 100%;\n}\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/cloud-file-component/cloud-file-component.js",
    "content": "const { demoImageFileId, demoVideoFileId } = require('../../../../config')\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '组件支持',\n      path: 'packageCloud/pages/storage/cloud-file-component/cloud-file-component'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    imageFileId: demoImageFileId,\n    videoFileId: demoVideoFileId\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/cloud-file-component/cloud-file-component.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"组件支持\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/cloud-file-component/cloud-file-component.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'Component Support'}}\" />\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">小程序组件支持传入云文件 ID</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">文件 ID</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <textarea class=\"weui-textarea\" value=\"{{imageFileId}}\" style=\"height: 3.3em\" disabled />\n          </view>\n        </view>\n\n        <view class=\"weui-cell\">\n          <view class=\"page-section-ctn\">\n            <image src=\"{{imageFileId}}\" class=\"image\" mode=\"aspectFit\"></image>\n          </view>\n        </view>\n      </view>\n\n      <view class=\"weui-cells__title\"></view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">文件 ID</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <textarea class=\"weui-textarea\" value=\"{{videoFileId}}\" style=\"height: 3.3em\" disabled />\n          </view>\n        </view>\n\n        <view class=\"weui-cell\">\n          <view class=\"page-section-ctn\">\n            <video src=\"{{videoFileId}}\" show-center-play-btn=\"{{false}}\"></video>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/cloud-file-component/cloud-file-component.wxss",
    "content": "\n\n.page-section-ctn {\n  text-align: center;\n  margin: 0 auto;\n  width: 100%;\n}\n\n.image {\n  max-width: 100%;\n}\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/delete-file/delete-file.js",
    "content": "// 参考文档：https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-client-api/storage/deleteFile.html\n\nconst app = getApp()\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '删除文件',\n      path: 'packageCloud/pages/storage/delete-file/delete-file'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    fileId: '',\n    loading: false\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    this.setData({\n      fileId: app.globalData.fileId || ''\n    })\n  },\n\n  onShow() {\n    this.setData({\n      fileId: app.globalData.fileId || ''\n    })\n  },\n\n  deleteFile() {\n    const fileId = this.data.fileId\n    if (!fileId) {\n      return\n    }\n    const self = this\n\n    this.setData({\n      loading: true\n    })\n    wx.cloud.deleteFile({\n      fileList: [fileId],\n      success: res => {\n        console.log('[删除文件] 成功：', res)\n        if (res.fileList && res.fileList.length) {\n          self.setData({\n            fileId: ''\n          })\n        }\n        app.globalData.fileId = ''\n        wx.showToast({\n          title: '删除成功'\n        })\n      },\n      fail: err => {\n        console.error('[删除文件] 失败：', err)\n      },\n      complete: () => {\n        self.setData({\n          loading: false\n        })\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/delete-file/delete-file.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"删除文件\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/delete-file/delete-file.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'deleteFile'}}\" />\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <block wx:if=\"{{!fileId}}\">\n        <view class=\"page-section-ctn\">\n          <text class=\"page-body-text\">还未上传过文件，请先点击按钮上传</text>\n        </view>\n        \n        <view class=\"btn-area\">\n          <navigator url=\"/page/cloud/pages/upload-file/upload-file?from=delete-file\">\n            <button type=\"primary\" size=\"40\">上传文件</button>\n          </navigator>\n        </view>\n      </block>\n\n      <block wx:else>\n        <view class=\"weui-cells__title\">点击按钮即可删除指定文件</view>\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">文件 ID</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <textarea class=\"weui-textarea\" value=\"{{fileId}}\" style=\"height: 3.3em\" disabled />\n            </view>\n          </view>\n        </view>\n\n        <view class=\"btn-area\">\n          <button type=\"primary\" size=\"40\" bindtap=\"deleteFile\" loading=\"{{loading}}\">删除文件</button>\n        </view>\n      </block>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/delete-file/delete-file.wxss",
    "content": "\n\n.page-section-ctn {\n  text-align: center;\n  margin: 100px auto 0;\n  width: 100%;\n}\n\n.page-body-text {\n  color: #bbb;\n  font-size: 14px;\n  line-height: 20px;\n  text-align: center;\n}\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/download-file/download-file.js",
    "content": "const demoImageFileId = require('../../../../config').demoImageFileId\n\n// 参考文档：https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-client-api/storage/downloadFile.html\n\nconst app = getApp()\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '下载文件',\n      path: 'packageCloud/pages/storage/download-file/download-file'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    fileDownloaded: false,\n    fileId: '',\n    filePath: '',\n    loading: false\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    this.setData({\n      fileId: app.globalData.fileId || demoImageFileId\n    })\n  },\n\n  downloadFile() {\n    const fileId = this.data.fileId\n    if (!fileId) {\n      return\n    }\n    const self = this\n\n    this.setData({\n      loading: true\n    })\n    wx.cloud.downloadFile({\n      fileID: fileId,\n      success: res => {\n        console.log('[下载文件] 成功：', res)\n        self.setData({\n          fileDownloaded: true,\n          filePath: res.tempFilePath\n        })\n      },\n      fail: err => {\n        console.error('[下载文件] 失败：', err)\n      },\n      complete: () => {\n        self.setData({\n          loading: false\n        })\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/download-file/download-file.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"下载文件\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/download-file/download-file.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'downloadFile'}}\" />\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <block wx:if=\"{{fileDownloaded}}\">\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">文件 ID</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <textarea class=\"weui-textarea\" value=\"{{fileId}}\" style=\"height: 3.3em\" disabled />\n            </view>\n          </view>\n\n          <view class=\"weui-cell\">\n            <view class=\"page-section-ctn\">\n              <image src=\"{{filePath}}\" class=\"image\" mode=\"aspectFit\"></image>\n            </view>\n          </view>\n        </view>\n        \n      </block>\n\n      <block wx:else>\n        <view class=\"weui-cells__title\">点击按钮即可从云端存储下载指定云文件</view>\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">文件 ID</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <textarea class=\"weui-textarea\" value=\"{{fileId}}\" style=\"height: 3.3em\" disabled />\n            </view>\n          </view>\n        </view>\n\n        <view class=\"btn-area\">\n          <button type=\"primary\" size=\"40\" bindtap=\"downloadFile\" loading=\"{{loading}}\">下载文件</button>\n        </view>\n      </block>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/download-file/download-file.wxss",
    "content": "\n\n.page-section-ctn {\n  text-align: center;\n  margin: 0 auto;\n  width: 100%;\n}\n\n.image {\n  max-width: 100%;\n}\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/get-temp-file-url/get-temp-file-url.js",
    "content": "const demoImageFileId = require('../../../../config').demoImageFileId\n\n// 参考文档：https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-client-api/storage/getTempFileURL.html\n\nconst app = getApp()\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '获取临时链接',\n      path: 'packageCloud/pages/storage/get-temp-file-url/get-temp-file-url'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    fileTempURLDone: false,\n    fileId: '',\n    tempFileURL: '',\n    // maxAge: 0,\n    loading: false\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    this.setData({\n      fileId: app.globalData.fileId || demoImageFileId\n    })\n  },\n\n  getTempFileURL() {\n    const fileId = this.data.fileId\n    if (!fileId) {\n      return\n    }\n    const self = this\n\n    this.setData({\n      loading: true\n    })\n    wx.cloud.getTempFileURL({\n      fileList: [fileId],\n      success: res => {\n        console.log('[换取临时链接] 成功：', res)\n        if (res.fileList && res.fileList.length) {\n          self.setData({\n            fileTempURLDone: true,\n            tempFileURL: res.fileList[0].tempFileURL,\n            // maxAge: res.fileList[0].maxAge\n          })\n        }\n      },\n      fail: err => {\n        console.error('[换取临时链接] 失败：', err)\n      },\n      complete: () => {\n        self.setData({\n          loading: false\n        })\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/get-temp-file-url/get-temp-file-url.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"换取临时链接\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/get-temp-file-url/get-temp-file-url.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'getTempFileURL'}}\" />\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <block wx:if=\"{{fileTempURLDone}}\">\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">文件 ID</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <textarea class=\"weui-textarea\" value=\"{{fileId}}\" style=\"height: 3.3em\" disabled />\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">临时链接</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <textarea class=\"weui-textarea\" value=\"{{tempFileURL}}\" style=\"height: 3.3em\" disabled />\n            </view>\n          </view>\n\n          <view class=\"weui-cell\">\n            <view class=\"page-section-ctn\">\n              <image src=\"{{tempFileURL}}\" class=\"image\" mode=\"aspectFit\"></image>\n            </view>\n          </view>\n        </view>\n        \n      </block>\n\n      <block wx:else>\n        <view class=\"weui-cells__title\">点击按钮即可根据文件 ID 换取临时网络链接</view>\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">文件 ID</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <textarea class=\"weui-textarea\" value=\"{{fileId}}\" style=\"height: 3.3em\" disabled />\n            </view>\n          </view>\n        </view>\n\n        <view class=\"btn-area\">\n          <button type=\"primary\" size=\"40\" bindtap=\"getTempFileURL\" loading=\"{{loading}}\">换取临时链接</button>\n        </view>\n      </block>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/get-temp-file-url/get-temp-file-url.wxss",
    "content": "\n\n.page-section-ctn {\n  text-align: center;\n  margin: 0 auto;\n  width: 100%;\n}\n\n.image {\n  max-width: 100%;\n}\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/upload-file/upload-file.js",
    "content": "// 参考文档：https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-client-api/storage/uploadFile.html\n\nconst app = getApp()\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '上传文件',\n      path: 'packageCloud/pages/storage/upload-file/upload-file'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    fileUploaded: false,\n    fileId: '',\n    filePath: '',\n    fromOtherPage: false\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad(options) {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    if (options.from) {\n      this.setData({\n        fromOtherPage: true\n      })\n    }\n  },\n\n  chooseImage() {\n    const self = this\n\n    wx.chooseImage({\n      count: 1,\n      sizeType: ['compressed'],\n      sourceType: ['album'],\n      success(res) {\n        console.log('chooseImage success, temp path is', res.tempFilePaths[0])\n        const filePath = res.tempFilePaths[0]\n        wx.showLoading({\n          title: '上传中'\n        })\n        app.getUserOpenIdViaCloud()\n          .then(openid => {\n            const cloudPath = `upload/${openid}${filePath.match(/\\.[^.]+?$/)[0]}`\n            console.log('cloudPath', cloudPath)\n            wx.cloud.uploadFile({\n              cloudPath,\n              filePath,\n              success: res => {\n                console.log('[上传文件] 成功：', res)\n                app.globalData.fileId = res.fileID\n                self.setData({\n                  fileUploaded: true,\n                  fileId: res.fileID,\n                  filePath\n                })\n                wx.hideLoading()\n              },\n              fail: err => {\n                console.error('[上传文件] 失败：', err)\n                wx.hideLoading()\n                wx.showToast({\n                  icon: 'none',\n                  title: '上传失败',\n                })\n              }\n            })\n            return openid\n          })\n          .catch(err => {\n            console.error(err)\n            wx.hideLoading()\n          })\n      },\n      fail({ errMsg }) {\n        console.log('chooseImage fail, err is', errMsg)\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/upload-file/upload-file.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"上传文件\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/upload-file/upload-file.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'uploadFile'}}\" />\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <block wx:if=\"{{fileUploaded}}\">\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">文件 ID</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <textarea class=\"weui-textarea\" value=\"{{fileId}}\" style=\"height: 3.3em\" disabled />\n            </view>\n          </view>\n\n          <view class=\"weui-cell page-section-ctn\">\n            <image src=\"{{filePath}}\" class=\"image\" mode=\"aspectFit\"></image>\n          </view>\n        </view>\n\n        <view class=\"btn-area\" wx:if=\"{{fromOtherPage}}\">\n          <navigator open-type=\"navigateBack\">\n            <button type=\"primary\" size=\"40\">返回</button>\n          </navigator>\n        </view>\n      </block>\n\n      <block wx:else>\n        <view class=\"page-body-info\">\n          <view class=\"image-plus image-plus-nb\" bindtap=\"chooseImage\">\n            <view class=\"image-plus-horizontal\"></view>\n            <view class=\"image-plus-vertical\"></view>\n          </view>\n          <view class=\"image-plus-text\">选择图片</view>\n        </view>\n      </block>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageCloud/pages/storage/upload-file/upload-file.wxss",
    "content": "\n\n.image {\n  width: 100%;\n  height: 330px;\n}\n\n.page-body-info {\n  display: flex;\n  box-sizing: border-box;\n  padding: 15px;\n  height: 410px;\n  border-top: 1px solid var(--weui-FG-3);\n  border-bottom: 1px solid var(--weui-FG-3);\n  align-items: center;\n  justify-content: center;\n}\n\n.page-section-ctn {\n  text-align: center;\n  margin: 0 auto;\n  width: 100%;\n}\n\n.image {\n  max-width: 100%;\n}\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/user/user-authentication/user-authentication.js",
    "content": "const app = getApp()\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '用户鉴权',\n      path: 'packageCloud/pages/user/user-authentication/user-authentication'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    openid: '',\n    loading: false\n  },\n\n  onGetOpenid() {\n    this.setData({\n      loading: true\n    })\n    app.getUserOpenIdViaCloud()\n      .then(openid => {\n        this.setData({\n          openid,\n          loading: false\n        })\n        return openid\n      })\n      .catch(err => {\n        console.error(err)\n      })\n  },\n\n  clear() {\n    this.setData({\n      openid: '',\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/user/user-authentication/user-authentication.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"用户鉴权\"\n}"
  },
  {
    "path": "miniprogram/packageCloud/pages/user/user-authentication/user-authentication.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'User Authentication'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-body-info\">\n        <view class=\"page-body-title\">OpenID</view>\n        <block wx:if=\"{{!openid}}\">\n          <text class=\"page-body-text\">点击绿色按钮可通过云开发获取用户 OpenID</text>\n          <text class=\"page-body-text\">使用云开发，无需自己部署服务端并维护复杂的鉴权机制，在小程序端简单调用即可通过云端获取天然可信任的用户登录态</text>\n        </block>\n        <block wx:else>\n          <text class=\"openid\">{{openid}}</text>\n        </block>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"onGetOpenid\" loading=\"{{loading}}\">获取 OpenID</button>\n        <button bindtap=\"clear\">清空</button>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageCloud/pages/user/user-authentication/user-authentication.wxss",
    "content": ".page-body-info {\n  padding-bottom: 0;\n  height: 230px;\n}\n.page-body-text {\n  padding: 0 15px;\n  text-align: center;\n}\n.openid {\n  margin-top: 10px;\n  font-size: 19px;\n}"
  },
  {
    "path": "miniprogram/packageCloud/resources/db_dump/perm1.json",
    "content": "{\"_openid\":\"kiki\",\"whatsUp\":\"心情美美哒\"}\n"
  },
  {
    "path": "miniprogram/packageCloud/resources/db_dump/perm2.json",
    "content": "{\"_openid\":\"popo\",\"email\":\"popo@weixin.qq.com\"}\n"
  },
  {
    "path": "miniprogram/packageCloud/resources/db_dump/perm3.json",
    "content": "{\"_openid\":\"admin\",\"price\":\"58\",\"name\":\"微信气泡狗抱枕\"}\n"
  },
  {
    "path": "miniprogram/packageCloud/resources/db_dump/perm4.json",
    "content": "{\"_openid\":\"server\",\"data\":\"DEMO_SERVER_DATA\"}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/canvas/canvas/canvas.js",
    "content": "import { compareVersion } from '../../../../util/util'\n\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    theme: 'light',\n\n  },\n  onReady() {\n    // 解决基础库小于 2.7.0 的兼容问题\n    const { SDKVersion } = wx.getSystemInfoSync()\n    if (compareVersion(SDKVersion, '2.7.0') < 0) {\n      console.log('123')\n      this.setData({\n        canIUse: false,\n      })\n    } else {\n      // canvas\n      this.position = {\n        x: 150,\n        y: 150,\n        vx: 2,\n        vy: 2\n      }\n\n      this.drawBall()\n      this.interval = setInterval(this.drawBall, 17)\n    }\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/canvas/canvas/canvas.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/canvas/canvas/canvas.wxml",
    "content": "<!--packageComponent/pages/canvas/canvas/canvas.wxml-->\n<text>packageComponent/pages/canvas/canvas/canvas.wxml</text>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/canvas/canvas/canvas.wxss",
    "content": "/* packageComponent/pages/canvas/canvas/canvas.wxss */"
  },
  {
    "path": "miniprogram/packageComponent/pages/canvas/canvas-2d/canvas-2d.js",
    "content": "import { compareVersion } from '../../../../util/util'\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'canvas',\n      path: 'packageComponent/pages/canvas/canvas-2d/canvas-2d'\n    }\n  },\n  data: {\n    theme: 'light',\n    canIUse: true,\n  },\n  onShow() {\n    setTimeout(() => {\n      this._onReady()\n    }, 200)\n  },\n  _onReady() {\n    // 解决基础库小于 2.7.0 的兼容问题\n    const { SDKVersion } = wx.getSystemInfoSync()\n    console.log(SDKVersion)\n    if (compareVersion(SDKVersion, '2.7.0') < 0) {\n      console.log('123')\n      this.setData({\n        canIUse: false,\n      })\n    } else {\n      // canvas2D\n      this.position2D = {\n        x: 150,\n        y: 150,\n        vx: 2,\n        vy: 2\n      }\n      this.x = -100\n      wx.createSelectorQuery()\n        .select('#canvas2D')\n        .fields({\n          node: true,\n          size: true,\n        })\n        .exec(this.init.bind(this))\n    }\n  },\n\n  init(res) {\n    const width = res[0].width\n    const height = res[0].height\n\n    const canvas = res[0].node\n    // 不支持2d\n    if (!canvas) {\n      this.setData({\n        canIUse: false,\n      })\n      return\n    }\n    const ctx = canvas.getContext('2d')\n\n    const dpr = wx.getSystemInfoSync().pixelRatio\n    canvas.width = width * dpr\n    canvas.height = height * dpr\n    ctx.scale(dpr, dpr)\n\n    const renderLoop = () => {\n      this.render(canvas, ctx)\n      canvas.requestAnimationFrame(renderLoop)\n    }\n    canvas.requestAnimationFrame(renderLoop)\n\n    const img = canvas.createImage()\n    img.onload = () => {\n      this._img = img\n    }\n    img.src = './car.png'\n  },\n\n  render(canvas, ctx) {\n    ctx.clearRect(0, 0, 305, 305)\n    this.drawBall2D(ctx)\n    this.drawCar(ctx)\n  },\n\n  drawBall2D(ctx) {\n    const p = this.position2D\n    p.x += p.vx\n    p.y += p.vy\n    if (p.x >= 300) {\n      p.vx = -2\n    }\n    if (p.x <= 7) {\n      p.vx = 2\n    }\n    if (p.y >= 300) {\n      p.vy = -2\n    }\n    if (p.y <= 7) {\n      p.vy = 2\n    }\n\n    function ball(x, y) {\n      ctx.beginPath()\n      ctx.arc(x, y, 5, 0, Math.PI * 2)\n      ctx.fillStyle = '#1aad19'\n      ctx.strokeStyle = 'rgba(1,1,1,0)'\n      ctx.fill()\n      ctx.stroke()\n    }\n\n    ball(p.x, 150)\n    ball(150, p.y)\n    ball(300 - p.x, 150)\n    ball(150, 300 - p.y)\n    ball(p.x, p.y)\n    ball(300 - p.x, 300 - p.y)\n    ball(p.x, 300 - p.y)\n    ball(300 - p.x, p.y)\n  },\n\n  drawCar(ctx) {\n    if (!this._img) return\n    if (this.x > 350) {\n      this.x = -100\n    }\n    ctx.drawImage(this._img, this.x++, 150 - 25, 100, 50)\n    ctx.restore()\n  },\n\n  onUnload() {\n    // clearInterval(this.interval)\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/canvas/canvas-2d/canvas-2d.json",
    "content": "{\n  \"navigationBarTitleText\": \"canvas 2d\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/canvas/canvas-2d/canvas-2d.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"canvas 2d\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'canvas 2d'}}\"/>\n\n  <view class=\"page-body\">\n    <block wx:if=\"{{canIUse}}\">\n      <view class=\"page-section\">\n        <view class=\"page-section-spacing\">\n          <view class=\"page-body-wrapper\">\n            <canvas type=\"2d\" id=\"canvas2D\" class=\"canvas\"></canvas>    \n          </view>\n        </view>\n      </view>\n    </block>\n    <view wx:else style=\"margin: 15px; text-align:center\">\n      微信版本过低，暂不支持本功能\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n</scroll-view>\n\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/canvas/canvas-2d/canvas-2d.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.canvas {\n  width: 305px;\n  height: 305px;\n  background-color: #f7f7f7;\n  margin-top: 30px;\n}\n\n[data-weui-theme=dark] .canvas {\n  background-color: #1f1f1f;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/canvas/webgl/webgl.js",
    "content": "import { compareVersion } from '../../../../util/util'\n\n// WebGL\nconst vs = `\n  precision mediump float;\n\n  attribute vec2 vertPosition;\n  attribute vec3 vertColor;\n  varying vec3 fragColor;\n\n  void main() {\n    gl_Position = vec4(vertPosition, 0.0, 1.0);\n    fragColor = vertColor;\n  }\n`\n\nconst fs = `\n  precision mediump float;\n\n  varying vec3 fragColor;\n  void main() {\n    gl_FragColor = vec4(fragColor, 1.0);\n  }\n`\n\nconst triangleVertices = [\n  0.0, 0.5, 1.0, 1.0, 0.0,\n  -0.5, -0.5, 0.7, 0.0, 1.0,\n  0.5, -0.5, 0.1, 1.0, 0.6\n]\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'canvas',\n      path: 'packageComponent/pages/canvas/webgl/webgl'\n    }\n  },\n  data: {\n    theme: 'light',\n    canIUse: true,\n  },\n  onReady() {\n    // 解决基础库小于 2.7.0 的兼容问题\n    const { SDKVersion } = wx.getSystemInfoSync()\n    if (compareVersion(SDKVersion, '2.7.0') < 0) {\n      console.log('123')\n      this.setData({\n        canIUse: false,\n      })\n    } else {\n    // WebGL\n      wx.createSelectorQuery()\n        .select('#canvasWebGL')\n        .node()\n        .exec((res) => {\n          const canvas = res[0].node\n          this.renderWebGL(canvas)\n        })\n    }\n  },\n\n  renderWebGL(canvas) {\n    // 不支持webgl\n    if (!canvas) {\n      this.setData({\n        canIUse: false,\n      })\n      return\n    }\n    const gl = canvas.getContext('webgl')\n    if (!gl) {\n      console.error('gl init failed', gl)\n      return\n    }\n    gl.viewport(0, 0, 305, 305)\n    const vertShader = gl.createShader(gl.VERTEX_SHADER)\n    gl.shaderSource(vertShader, vs)\n    gl.compileShader(vertShader)\n\n    const fragShader = gl.createShader(gl.FRAGMENT_SHADER)\n    gl.shaderSource(fragShader, fs)\n    gl.compileShader(fragShader)\n\n    const prog = gl.createProgram()\n    gl.attachShader(prog, vertShader)\n    gl.attachShader(prog, fragShader)\n    gl.deleteShader(vertShader)\n    gl.deleteShader(fragShader)\n    gl.linkProgram(prog)\n    gl.useProgram(prog)\n\n    const draw = () => {\n      const triangleVertexBufferObject = gl.createBuffer()\n      gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexBufferObject)\n      gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices), gl.STATIC_DRAW)\n\n      const positionAttribLocation = gl.getAttribLocation(prog, 'vertPosition')\n      const colorAttribLocation = gl.getAttribLocation(prog, 'vertColor')\n      gl.vertexAttribPointer(\n        positionAttribLocation,\n        2,\n        gl.FLOAT,\n        gl.FALSE,\n        5 * Float32Array.BYTES_PER_ELEMENT,\n        0\n      )\n      gl.vertexAttribPointer(\n        colorAttribLocation,\n        3,\n        gl.FLOAT,\n        gl.FALSE,\n        5 * Float32Array.BYTES_PER_ELEMENT,\n        2 * Float32Array.BYTES_PER_ELEMENT\n      )\n\n      gl.enableVertexAttribArray(positionAttribLocation)\n      gl.enableVertexAttribArray(colorAttribLocation)\n      gl.drawArrays(gl.TRIANGLES, 0, 3)\n      canvas.requestAnimationFrame(draw)\n    }\n\n    canvas.requestAnimationFrame(draw)\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/canvas/webgl/webgl.json",
    "content": "{\n  \"navigationBarTitleText\": \"webgl\",\n  \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/canvas/webgl/webgl.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'webgl'}}\"/>\n\n  <view class=\"page-body\">\n    <block wx:if=\"{{canIUse}}\">\n      <view class=\"page-section\">\n        <view class=\"page-body-wrapper\">\n          <canvas class=\"canvas\" type=\"webgl\" id=\"canvasWebGL\"></canvas>\n        </view>\n      </view>\n    </block>\n    <view wx:else style=\"margin: 15px; text-align:center\">\n      微信版本过低，暂不支持本功能\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/canvas/webgl/webgl.wxss",
    "content": "/* @import '../../../common//lib/weui.wxss'; */\n\n.canvas {\n  width: 305px;\n  height: 305px;\n  background-color: var(--weui-BG-1);\n  margin-top: 30px;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/icon/icon.js",
    "content": "Page({\n  data: {\n    theme: 'light'\n  },\n  onShareAppMessage() {\n    return {\n      title: 'icon',\n      path: 'packageComponent/pages/content/icon/icon'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/icon/icon.json",
    "content": "{\n    \"navigationBarTitleText\": \"icon\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/icon/icon.wxml",
    "content": "<import src=\"../../../../common/head.wxml\"/>\n<import src=\"../../../../common/foot.wxml\"/>\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'icon'}}\"/>\n\n  <view class=\"icon-box\">\n    <icon class=\"icon-box-img\" type=\"success\" size=\"93\"></icon>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">成功</view>\n      <view class=\"icon-box-desc\">用于表示操作顺利完成</view>\n    </view>\n  </view>\n  <view class=\"icon-box\">\n    <icon class=\"icon-box-img\" type=\"info\" size=\"93\"></icon>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">提示</view>\n      <view class=\"icon-box-desc\">用于表示信息提示；也常用于缺乏条件的操作拦截，提示用户所需信息</view>\n    </view>\n  </view>\n  <view class=\"icon-box\">\n    <icon class=\"icon-box-img\" type=\"warn\" size=\"93\" color=\"#C9C9C9\"></icon>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">普通警告</view>\n      <view class=\"icon-box-desc\">用于表示操作后将引起一定后果的情况；也用于表示由于系统原因而造成的负向结果</view>\n    </view>\n  </view>\n  <view class=\"icon-box\">\n    <icon class=\"icon-box-img\" type=\"warn\" size=\"93\"></icon>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">强烈警告</view>\n      <view class=\"icon-box-desc\">用于表示由于用户原因造成的负向结果；也用于表示操作后将引起不可挽回的严重后果的情况</view>\n    </view>\n  </view>\n  <view class=\"icon-box\">\n    <icon class=\"icon-box-img\" type=\"waiting\" size=\"93\"></icon>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">等待</view>\n      <view class=\"icon-box-desc\">用于表示等待，告知用户结果需等待</view>\n    </view>\n  </view>\n  <view class=\"icon-box\">\n    <view class=\"icon-small-wrp\">\n      <icon class=\"icon-small\" type=\"success_no_circle\" size=\"23\"></icon>\n    </view>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">多选控件图标_已选择</view>\n      <view class=\"icon-box-desc\">用于多选控件中，表示已选择该项目</view>\n    </view>\n  </view>\n  <view class=\"icon-box\">\n    <view class=\"icon-small-wrp\">\n      <icon class=\"icon-small\" type=\"circle\" size=\"23\"></icon>\n    </view>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">多选控件图标_未选择</view>\n      <view class=\"icon-box-desc\">用于多选控件中，表示该项目可被选择，但还未选择</view>\n    </view>\n  </view>\n  <view class=\"icon-box\">\n    <view class=\"icon-small-wrp\">\n      <icon class=\"icon-small\" type=\"warn\" size=\"23\"></icon>\n    </view>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">错误提示</view>\n      <view class=\"icon-box-desc\">用于在表单中表示出现错误</view>\n    </view>\n  </view>\n  <view class=\"icon-box\">\n    <view class=\"icon-small-wrp\">\n      <icon class=\"icon-small\" type=\"success\" size=\"23\"></icon>\n    </view>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">单选控件图标_已选择</view>\n      <view class=\"icon-box-desc\">用于单选控件中，表示已选择该项目</view>\n    </view>\n  </view>\n  <view class=\"icon-box\">\n    <view class=\"icon-small-wrp\">\n      <icon class=\"icon-small\" type=\"download\" size=\"23\"></icon>\n    </view>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">下载</view>\n      <view class=\"icon-box-desc\">用于表示可下载</view>\n    </view>\n  </view>\n  <view class=\"icon-box\">\n    <view class=\"icon-small-wrp\">\n      <icon class=\"icon-small\" type=\"info_circle\" size=\"23\"></icon>\n    </view>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">提示</view>\n      <view class=\"icon-box-desc\">用于在表单中表示有信息提示</view>\n    </view>\n  </view>\n  <view class=\"icon-box\">\n    <view class=\"icon-small-wrp\">\n      <icon class=\"icon-small\" type=\"cancel\" size=\"23\"></icon>\n    </view>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">停止或关闭</view>\n      <view class=\"icon-box-desc\">用于在表单中，表示关闭或停止</view>\n    </view>\n  </view>\n  <view class=\"icon-box\">\n    <view class=\"icon-small-wrp\">\n      <icon class=\"icon-small\" type=\"search\" size=\"14\"></icon>\n    </view>\n    <view class=\"icon-box-ctn\">\n      <view class=\"icon-box-title\">搜索</view>\n      <view class=\"icon-box-desc\">用于搜索控件中，表示可搜索</view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/icon/icon.wxss",
    "content": ".container {\n  display: block;\n}\n.icon-box{\n  margin-bottom: 20px;\n  padding: 0 38px;\n  display: flex;\n  align-items: center;\n}\n.icon-box-img{\n  margin-right: 28px;\n}\n.icon-box-ctn{\n  flex-shrink: 100;\n}\n.icon-box-title{\n  font-size: 17px;\n}\n.icon-box-desc{\n  margin-top: 6px;\n  font-size: 13px;\n  color: #888;\n}\n\n.icon-small-wrp{\n  margin-right: 28px;\n  width: 93px;\n  height: 93px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/progress/progress.js",
    "content": "Page({\n  data: {\n    theme: 'light'\n  },\n  onShareAppMessage() {\n    return {\n      title: 'progress',\n      path: 'packageComponent/pages/content/progress/progress'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/progress/progress.json",
    "content": "{\n    \"navigationBarTitleText\": \"progress\",\n    \"navigationStyle\": \"default\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/progress/progress.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'progress'}}\"/>\n  <view class=\"page-body\">\n    <view class=\"page-section page-section-gap\">\n\n      <view class=\"progress-box\">\n        <progress percent=\"20\" show-info stroke-width=\"3\"/>\n      </view>\n\n      <view class=\"progress-box\">\n        <progress percent=\"40\" active stroke-width=\"3\" />\n        <icon class=\"progress-cancel\" type=\"cancel\"></icon>\n      </view>\n\n      <view class=\"progress-box\">\n        <progress percent=\"60\" active stroke-width=\"3\" />\n      </view>\n\n      <view class=\"progress-box\">\n        <progress percent=\"80\" color=\"#10AEFF\" active stroke-width=\"3\" />\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/progress/progress.wxss",
    "content": "progress{\n  width: 100%;\n}\n.progress-box{\n  display: flex;\n  height: 25px;\n  margin-bottom: 30px;\n}\n.progress-cancel{\n  margin-left: 20px;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/rich-text/rich-text.js",
    "content": "const htmlSnip = `<div class=\"div_class\">\n  <h1>Title</h1>\n  <p class=\"p\">\n    Life is&nbsp;<i>like</i>&nbsp;a box of\n    <b>&nbsp;chocolates</b>.\n  </p>\n</div>\n`\n\nconst nodeSnip = `Page({\n  data: {\n    theme: 'light',\n    nodes: [{\n      name: 'div',\n      attrs: {\n        class: 'div_class',\n        style: 'line-height: 60px; color: red;'\n      },\n      children: [{\n        type: 'text',\n        text: 'You never know what you're gonna get.'\n      }]\n    }]\n  }\n})\n`\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'rich-text',\n      path: 'packageComponent/pages/content/rich-text/rich-text'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    htmlSnip,\n    nodeSnip,\n    renderedByHtml: false,\n    renderedByNode: false,\n    nodes: [{\n      name: 'div',\n      attrs: {\n        class: 'div_class',\n        style: 'line-height: 60px; color: #1AAD19;'\n      },\n      children: [{\n        type: 'text',\n        text: 'You never know what you\\'re gonna get.'\n      }]\n    }]\n  },\n  renderHtml() {\n    this.setData({\n      renderedByHtml: true\n    })\n  },\n  renderNode() {\n    this.setData({\n      renderedByNode: true\n    })\n  },\n  enterCode(e) {\n    console.log(e.detail.value)\n    this.setData({\n      htmlSnip: e.detail.value\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/rich-text/rich-text.json",
    "content": "{\n  \"navigationBarTitleText\": \"rich-text\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/rich-text/rich-text.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<mp-navigation-bar title=\"rich-text\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'rich-text'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">通过HTML String渲染</view>\n      <view class=\"page-content\">\n        <scroll-view class=\"page-scroll\" scroll-y>{{htmlSnip}}</scroll-view>\n        <button type=\"primary\" bindtap=\"renderHtml\">渲染HTML</button>\n        <block wx:if=\"{{renderedByHtml}}\">\n          <rich-text nodes=\"{{htmlSnip}}\"></rich-text>\n        </block>\n      </view>\n    </view>\n\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">通过节点渲染</view>\n      <view class=\"page-content\">\n        <scroll-view class=\"page-scroll\" scroll-y>{{nodeSnip}}</scroll-view>\n        <button type=\"primary\" bindtap=\"renderNode\">渲染Node</button>\n        <block wx:if=\"{{renderedByNode}}\">\n          <rich-text nodes=\"{{nodes}}\"></rich-text>\n        </block>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/rich-text/rich-text.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n.page-content {\n  width: auto;\n  margin: 15px 0;\n  padding: 0 25px;\n}\n\n.code-fragment {\n  height: 325px;\n}\n\n.code-textarea {\n  width: auto;\n  height: 325px;\n  border: 1px solid #1AAD19;\n}\n\n.p {\n  color: #1AAD19;\n  margin-top: 15px;\n}\n\n.space {\n  display: inline-block;\n  background: red;\n  width: 5px;\n}\n\n.page-scroll {\n  height: 325px;\n  border: 1px solid #1AAD19;\n  white-space: pre;\n  padding: 5px;\n  box-sizing: border-box;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/selection/selection.js",
    "content": "const htmlSnip =\n`<div class=\"div_class\">\n  <h1>Title</h1>\n  <p class=\"p\">\n    Life is&nbsp;<i>like</i>&nbsp;a box of\n    <b>&nbsp;chocolates</b>.\n  </p>\n</div>\n`\nPage({\n  data: {\n    theme: 'light',\n    disableContextMenu: true,\n    showBtn: false,\n    btnX: 0,\n    btnY: 0,\n    selectedString: '',\n    htmlSnip,\n  },\n  onShareAppMessage() {\n    return {\n      title: 'selection',\n      path: 'packageComponent/pages/content/selection/selection'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  selectionChangeHandler(e) {\n    const selection = e.detail\n    if (selection.isCollapsed === false) {\n      this.setData({\n        showBtn: true,\n        selectedString: e.detail.selectedString,\n        btnX: e.detail.firstRangeRect.x,\n        btnY: e.detail.firstRangeRect.y,\n      })\n    } else {\n      this.setData({\n        showBtn: false\n      })\n    }\n  },\n  copySelectedString() {\n    wx.setClipboardData({\n      data: this.data.selectedString,\n      success() {\n        wx.getClipboardData({\n          success(res) {\n            wx.showToast({\n              title: `复制成功:${res.data}`\n            })\n          }\n        })\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/selection/selection.json",
    "content": "{\n    \"navigationBarTitleText\": \"selection\",\n    \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/selection/selection.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n    <template is=\"head\" data=\"{{title: 'selection'}}\" />\n    <view class=\"content\">\n        <scroll-view class=\"scroll-area\" type=\"list\">\n            <text id=\"before-text\" user-select=\"{{true}}\">在 wx-selection 之前的 text</text>\n            <selection bind:selectionchange=\"selectionChangeHandler\" disable-context-menu=\"{{false}}\">\n                <text id=\"text-wrap\" user-select=\"{{true}}\">\n                    <text id=\"text-1\">2011年1月，微信1.0发布。同年5月，微信2.0语音对讲发布</text>\n                    <text id=\"text-2\">\n                        10月，微信3.0新增摇一摇功能\n                        <text id=\"text-3\">2012年3月，微信用户突破1亿。4月份，微信4.0朋友圈发布</text>\n                    </text>\n                    <text id=\"text-4\">同年7月，微信4.2发布公众平台。2013年8月，微信5.0发布微信支付。</text>\n                </text>\n                <text id=\"text-wrap2\" user-select=\"{{true}}\">2014年9月，企业号发布。同月，发布微信卡包</text>\n                <text id=\"text-wrap3\" user-select=\"{{false}}\">\n                    <text id=\"text-31\" user-select=\"{{true}}\">2015年1月，微信第一条朋友圈广告</text>\n                </text>\n                <view>\n                    <text id=\"view-text\" user-select=\"{{true}}\">2016年1月，企业微信发布，2017年1月，小程序发布</text>\n                </view>\n                <rich-text id=\"rich-text-1\" user-select=\"{{true}}\">rich-text</rich-text>\n                <rich-text id=\"rich-text-2\" user-select=\"{{true}}\" nodes=\"{{htmlSnip}}\"></rich-text>\n            </selection>\n            <text id=\"before-text\" user-select=\"{{true}}\">在 selection 之后的 text</text>\n        </scroll-view>\n    </view>\n    <view class=\"button\" wx:if=\"{{showBtn}}\" bind:tap=\"copySelectedString\" style=\"top:{{btnY - 50}}px;left:{{btnX}}px\">\n        点我复制到系统\n    </view>\n    <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/selection/selection.wxss",
    "content": ".scroll-area {\n  flex: 1;\n  overflow-y: hidden;\n}\n.content{\n  flex: 1;\n  padding:0 20px\n}\n.intro {\n  padding: 30px;\n  text-align: center;\n}\n\n.button {\n  position: absolute;\n  background-color: #1aad19;\n  color: white;\n  width: 120px;\n  padding: 10px 20px;\n  font-size: 16px;\n  border-radius: 5px;\n  cursor: pointer;\n  transition: background-color 0.3s;\n}\n\n.button:hover {\n  background-color: #159e14;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/text/text.js",
    "content": "const texts = [\n  '2011年1月，微信1.0发布',\n  '同年5月，微信2.0语音对讲发布',\n  '10月，微信3.0新增摇一摇功能',\n  '2012年3月，微信用户突破1亿',\n  '4月份，微信4.0朋友圈发布',\n  '同年7月，微信4.2发布公众平台',\n  '2013年8月，微信5.0发布微信支付',\n  '2014年9月，企业号发布',\n  '同月，发布微信卡包',\n  '2015年1月，微信第一条朋友圈广告',\n  '2016年1月，企业微信发布',\n  '2017年1月，小程序发布',\n  '......'\n]\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'text',\n      path: 'packageComponent/pages/content/text/text'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    text: '',\n    canAdd: true,\n    canRemove: false,\n    extraLine: []\n  },\n  extraLine: [],\n\n  add() {\n    this.extraLine.push(texts[this.extraLine.length % 12])\n    this.setData({\n      text: this.extraLine.join('\\n'),\n      // text: this.extraLine.join('&#10;'),\n      canAdd: this.extraLine.length < 12,\n      canRemove: this.extraLine.length > 0,\n      extraLine: this.extraLine\n    })\n    setTimeout(() => {\n      this.setData({\n        scrollTop: 99999\n      })\n    }, 0)\n  },\n  remove() {\n    if (this.extraLine.length > 0) {\n      this.extraLine.pop()\n      this.setData({\n        text: this.extraLine.join('\\n'),\n        canAdd: this.extraLine.length < 12,\n        canRemove: this.extraLine.length > 0,\n        extraLine: this.extraLine\n      })\n    }\n    setTimeout(() => {\n      this.setData({\n        scrollTop: 99999\n      })\n    }, 0)\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/text/text.json",
    "content": "{\n  \"navigationBarTitleText\": \"text\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/text/text.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"text\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'text'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section page-section-spacing\">\n      <view class=\"text-box\" scroll-y=\"true\" scroll-top=\"{{scrollTop}}\">\n        <block wx:for=\"{{extraLine}}\">\n          <text>{{item}}</text>\n        </block>\n      </view>\n      <button disabled=\"{{!canAdd}}\" bindtap=\"add\">add line</button>\n      <button disabled=\"{{!canRemove}}\" bindtap=\"remove\">remove line</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/content/text/text.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\nbutton{\n  margin: 20px 0;\n}\n.text-box{\n  margin-bottom: 35px;\n  padding: 20px 0;\n  display: flex;\n  min-height: 150px;\n  background-color: #FFFFFF;\n  justify-content: center;\n  align-items: center;\n  text-align: center;\n  font-size: 15px;\n  color: #353535;\n  line-height: 2;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/doc-web-view/doc-web-view.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '小程序组件文档',\n      path: 'page/component/pages/doc-web-view/doc-web-view'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/doc-web-view/doc-web-view.json",
    "content": "{\n  \"navigationBarTitleText\": \"小程序组件文档\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/doc-web-view/doc-web-view.wxml",
    "content": "<web-view src=\"https://developers.weixin.qq.com/miniprogram/dev/component/\"></web-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/doc-web-view/doc-web-view.wxss",
    "content": "/* miniprogram/page/component/pages/doc-web-view/doc-web-view.wxss */"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/button/button.js",
    "content": "const types = ['default', 'primary', 'warn']\nconst pageObject = {\n  data: {\n    theme: 'light',\n    defaultSize: 'default',\n    primarySize: 'default',\n    warnSize: 'default',\n    disabled: false,\n    plain: false,\n    loading: false,\n    canIUseGetUserProfile: false\n  },\n\n  onShareAppMessage() {\n    return {\n      title: 'button',\n      path: 'packageComponent/pages/form/button/button'\n    }\n  },\n\n  setDisabled() {\n    this.setData({\n      disabled: !this.data.disabled\n    })\n  },\n\n  setPlain() {\n    this.setData({\n      plain: !this.data.plain\n    })\n  },\n\n  setLoading() {\n    this.setData({\n      loading: !this.data.loading\n    })\n  },\n\n  handleContact(e) {\n    console.log(e.detail)\n  },\n\n  handleGetPhoneNumber(e) {\n    console.log(e.detail)\n  },\n\n  handleOpenSetting(e) {\n    console.log(e.detail.authSetting)\n  },\n\n  handleGetUserInfo(e) {\n    console.log('getUserInfo: ', e.detail.userInfo)\n  },\n  handleGetUserProfile(e) {\n    wx.getUserProfile({\n      desc: '用于演示 wx.getUserProfile', // 声明获取用户个人信息后的用途，后续会展示在弹窗中，请谨慎填写\n      success: (res) => {\n        console.log('wx.getUserProfile: ', res.userInfo)\n      }\n    })\n  },\n  handleChooseavatar(e) {\n    console.log('handleChooseavatar', e)\n    const avatarUrl = e.detail.avatarUrl\n    // 把 url 提示出来\n    wx.showToast({\n      title: avatarUrl,\n      icon: 'none',\n      duration: 3000\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    if (wx.getUserProfile) {\n      this.setData({\n        canIUseGetUserProfile: true\n      })\n    }\n  }\n}\n\nfor (let i = 0; i < types.length; ++i) {\n  (function (type) {\n    pageObject[type] = function () {\n      const key = `${type}Size`\n      const changedData = {}\n      changedData[key] = this.data[key] === 'default' ? 'mini' : 'default'\n      this.setData(changedData)\n    }\n  }(types[i]))\n}\n\nPage(pageObject)\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/button/button.json",
    "content": "{\n  \"navigationBarTitleText\": \"button\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/button/button.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"button\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'button'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"btn-area\" id=\"buttonContainer\">\n      <button type=\"primary\">页面主操作 Normal</button>\n      <button type=\"primary\" loading=\"true\">页面主操作 Loading</button>\n      <button type=\"primary\" disabled=\"true\">页面主操作 Disabled</button>\n\n      <button type=\"default\">页面次要操作 Normal</button>\n      <button type=\"default\" disabled=\"true\">页面次要操作 Disabled</button>\n\n      <button type=\"warn\">警告类操作 Normal</button>\n      <button type=\"warn\" disabled=\"true\">警告类操作 Disabled</button>\n\n      <view class=\"button-sp-area\">\n        <button type=\"primary\" plain=\"true\">按钮</button>\n        <button type=\"primary\" disabled=\"true\" plain=\"true\">不可点击的按钮</button>\n\n        <button type=\"default\" plain=\"true\">按钮</button>\n        <button type=\"default\" disabled=\"true\" plain=\"true\">按钮</button>\n\n        <view style=\"flex-direction: row;\">\n          <button class=\"mini-btn\" type=\"primary\" size=\"mini\">按钮</button>\n          <button class=\"mini-btn\" type=\"default\" size=\"mini\">按钮</button>\n          <button class=\"mini-btn\" type=\"warn\" size=\"mini\">按钮</button>\n        </view>\n      </view>\n      <button type=\"primary\" open-type=\"contact\" bindcontact=\"handleContact\" show-message-card=\"{{true}}\" send-message-title=\"临时会话\">打开客服会话</button>\n      <button type=\"primary\" open-type=\"share\">触发用户转发</button>\n      <button type=\"primary\" open-type=\"getPhoneNumber\" bindgetphonenumber=\"handleGetPhoneNumber\">获取用户手机号</button>\n      <button type=\"primary\" open-type=\"getRealtimePhoneNumber\">用户手机号实时验证</button>\n      <button wx:if=\"{{canIUseGetUserProfile}}\" type=\"primary\" lang=\"zh_CN\" bindtap=\"handleGetUserProfile\"> 获取用户信息 </button>\n      <button wx:else type=\"primary\" open-type=\"getUserInfo\" lang=\"zh_CN\" bindgetuserinfo=\"handleGetUserInfo\">获取用户信息</button>\n      <button type=\"primary\" open-type=\"chooseAvatar\" bindchooseavatar=\"handleChooseavatar\">获取用户头像</button>\n      <button type=\"primary\" open-type=\"openSetting\" bindopensetting=\"handleOpenSetting\">打开设置授权页</button>\n      <button type=\"primary\" open-type=\"feedback\">打开意见反馈</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/button/button.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\nbutton{\n  margin-top: 0px;\n  margin-bottom: 15px;\n}\n.button-sp-area{\n  margin: 0 auto;\n  width: 60%;\n}\n.mini-btn{\n  margin-right: 5px;\n}\n\nbutton[loading] {\n  flex-direction: row;\n  align-items: center;\n}\n\nbutton[loading]::before {\n  margin: 0;\n  flex-shrink: 0;\n  font-size: 0;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/checkbox/checkbox.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'checkbox',\n      path: 'packageComponent/pages/form/checkbox/checkbox'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    items: [\n      { value: 'USA', name: '美国' },\n      { value: 'CHN', name: '中国', checked: 'true' },\n      { value: 'BRA', name: '巴西' },\n      { value: 'JPN', name: '日本' },\n      { value: 'ENG', name: '英国' },\n      { value: 'FRA', name: '法国' }\n    ]\n  },\n\n  checkboxChange(e) {\n    console.log('checkbox发生change事件，携带value值为：', e.detail.value)\n\n    const items = this.data.items\n    const values = e.detail.value\n    for (let i = 0, lenI = items.length; i < lenI; ++i) {\n      items[i].checked = false\n\n      for (let j = 0, lenJ = values.length; j < lenJ; ++j) {\n        if (items[i].value === values[j]) {\n          items[i].checked = true\n          break\n        }\n      }\n    }\n\n    this.setData({\n      items\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/checkbox/checkbox.json",
    "content": "{\n    \"navigationBarTitleText\": \"checkbox\",\n    \"componentFramework\": \"glass-easel\",\n    \"renderer\": \"skyline\",\n    \"disableScroll\": true,\n    \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/checkbox/checkbox.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<mp-navigation-bar title=\"checkbox\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n  <view class=\"container page\" data-weui-theme=\"{{theme}}\">\n    <template is=\"head\" data=\"{{title: 'checkbox'}}\" />\n    <view class=\"page-body\">\n      <view class=\"page-section page-section-gap\">\n        <view class=\"page-section-title\">默认样式</view>\n        <label class=\"checkbox\">\n          <checkbox value=\"cb\" checked=\"true\" />\n          选中\n        </label>\n        <label class=\"checkbox\">\n          <checkbox value=\"cb\" />\n          未选中\n        </label>\n      </view>\n      <view class=\"page-section\">\n        <view class=\"page-section-title\">推荐展示样式</view>\n        <view class=\"weui-cells weui-cells_after-title\">\n          <checkbox-group bindchange=\"checkboxChange\">\n            <label class=\"weui-cell weui-check__label\" wx:for=\"{{items}}\" wx:key=\"{{item.value}}\">\n              <view class=\"weui-cell__hd\">\n                <checkbox value=\"{{item.value}}\" checked=\"{{item.checked}}\" />\n              </view>\n              <view class=\"weui-cell__bd\">{{item.name}}</view>\n            </label>\n          </checkbox-group>\n        </view>\n      </view>\n    </view>\n    <template is=\"foot\" />\n  </view>\n</scroll-view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/checkbox/checkbox.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n@import '../../../../common//lib/weui.wxss';\n.checkbox{\n  margin-right: 10px;\n}\n.page-section-content{\n  padding: 0 20px;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/editor/assets/iconfont.wxss",
    "content": "@font-face {font-family: \"iconfont\";\n  src: url('//at.alicdn.com/t/font_945958_zfsfjju1dim.eot?t=1547618146468'); /* IE9 */\n  src: url('//at.alicdn.com/t/font_945958_zfsfjju1dim.eot?t=1547618146468#iefix') format('embedded-opentype'), /* IE6-IE8 */\n  url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAABdkAAsAAAAALvAAABcWAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCKSgrBdLN+ATYCJAOBZAt0AAQgBYRtB4YRG7smRSQnqz4jqjWV7P9bAidjcG3cMssRirV6WRdYIhSPI7KwpqTEWqtc6K4YeK6yr9OvxbcdprxM/yib6gio0BZ+n7Rt/V9XwX9lINMYSgkPeG++5I+ba4GUClKqlqSIS6hYyq38QNv8d5x65OEhRh+sdQE7jL5NnPgnihL75TgDFuUqOW2WuvRY8VkVv8LJj8Zl6Y80f+Xx8HZ7/9/tWGoR13aUWBZEaSABZpQkkIVz9psLXwo4ADJiSk74UeimQCl/LdkLu3A5Lb9fLdiAfKs0jVd6s5bW0vrllU9aXUOpAIbgIBQAP4AF4GQAwNjv66z+twPSe3YyEXkJoUQ7zmyGcJHc2NVJ3y0N0HJgEQJLfBSQrqKmOVa8TZaSWNiEpAWmBqH+vylGDwgxZs4BANAGCCDwC//E1Xjv8RV9Igu2Cl/+HldFYWn3eMChdGNoISXOzb/OdLV8cYCdC0/AGw1beE226f8vwwcrF1k++JYDtkM61rHsAPEEG2Or7ysYCtZdilMAh63AY6e+jmP3qVBzmePWPyDU3kl9GHOfD1sDjzw0JUUixbX+Wp8hgFtelxinUgsImeg1AURf5lWDUKiZim3BSbAlb2vGLpQztwwCn/z74mMcDpJV0LsvzqI6oL+d0InD/qznq9VobgRW78AAXWBCntKlOKD+qsvgPvzOkJgBa0Wm9DtBKi1KPiNGnaXW2aLZ9/6ZPFXz5zLruHXfxERF2tTejuTtxONJF9iLS6Lns9rShlznoJfC2gm2xX10zPS5AVb8KQ8QMjwkL7egkJi0FB+/AJMlLCIqwebg5LJkiEvKyskrKCopq6iqqWtoamnr6OrpGxgaGZuYmplbQDTY9ALkba+XUBMYEFCpIAOlBR4oCkiofOCFMgI3lB0EoRgQgqoDMaglIA21FKSg1gEf1Bbgh2oGAajvgQn1H7BwnQzCuD4PIrhWgSiuf4IEbgywcasFDtzqgBM3B3DhXgeWeE4EBrQIxKEjQBJ6A8hCbwQ56E0gD+0CBWgWFKEbQAm6EZShm0AFuhlUoVtADboV1KHbTANqh2lCbpgWtBWmDW2D6UDbYbrQDpgetBOmD+2CGUAdMEOoE2YE7YYZQ3tgJtBemCl0BGYGeWHm0AmcsACwcl98APALuAfgvdCFePA6xwmWI0lmMIBucnImpQhjJZc8FHMoMUwEpuUSkFKxqXUhZwocJppG7g5lRWlxWeEco+wVN5zisZtVpL9w3/MmkyqHMS3ctynbem5lnk1RccrFpipqksYNMD3MamvcVFj6yWTix1lVdexd2SCkpCOw9pOuQSseVli8owDLTKAdNaS0se2Cp4NS1JQNF06dCWlCOUyC517Nm779nP/w50B+3UrlHq6eFtLRSX57SeoR2WIO5Q3XjCr2eaJbUCO66DgMmTb1BOYkuKlu70buw8ticceQVNc05DQpEuCABw184AcabEQOefRE/hwHIkVepip6kMQZQQo0ebgBAbKfymd6MNotLFMpQYZHhQkUCT7+2fi2InSE4aJe2sP8eAIUiBcdyC27w8VnqyVINaBDhRXwIDeOpOsHs353eqJMqTQx25TYU1RV/vp9Sod+qgNqOMwihEuRkCMSZsoc4vRco56qrzkzhvZnUSwDW1nY70k000Tr+VWu/DFz5vb/oZbf6NktJWx6SaXqra+UeKcpl6s733LySCl+JafnzaJROM8E4dFPE7zDP69EAixFSJj2ZQAoPvxxvGfgh0YmBDx6GkNmdmyHEYlYERlUaqS/Pko8V+ofO1Roslatoyp2g+E4MeoOpETSjpgokoDs9I/vVtUCLfAdPIM/Lg8+/nmid+inc3GQoRHrOxK4/yBer1J4RsDkC5iOkUTP3bfFscn+tv7iTPFqXs9NE64VjsYzLKfPVuRUsVxV0vV4Z3PiatYosFkHE8rbaM6stInu4+vXs2OTSbSjtTfLi3vL83ujdjnaSwirACuBMVaVXCm64lKjsmRJy0BJ7314dfp0m+iRxGdzBR6cZCBcG+P0X8eQOdruuQKlaiJeTY/qmVZzLTO2Hw+3Pi0so+Riq3g1raemAVnCO3NGLDh0LWNk8biRYZFN1B2TImSLE9ejVOnv1Sp1j5qepYSGFlA+83AiQJVEG+CGHsqQSIDlOkvjDovI1NLTprSVuGOylG62X46houlKqqjYNqLrxhr6ZgCzInWW3YkKHK9hqQix+/UciTqZaWwKCewnY25XWn5iPxCoWh3/F9HvzJLF0e7A/JFw+g8A7CdKkSAFyiCJGj9r05XHYChtdBxY0xduMvp0Oxp0Xeo3nCOVqu4vmvnRazMRTgf8SK5EjMtEsUne4DBLj67vIMM1HKYIcsKiDQeWNwvWcmtAj3mjovv9tY4MCFdyozy9+enB68WxvHEECXQLVFSAGhkI9I4JvEj0tKHMWUqx/WzAihA7ihXSPBBIIqwXvMcnMzvdwKPpPnuJI7JlI3LArKhi5605B2eTrzcILtSMeAMzVvC8ysh0wZRAR6RkrcX7NHwbtbGmvJJPCgn9fYVz/pBPE0qQh6MxEt02XYrqsblLQs032qCi+HA1wW5hn9s3LmBruJSVrhHb2wUs3j1sT5fxqLj7JHfU/vsNqkeFJ77BD1d3ii8OBYmVYhlK+zIzhCupUVxvq3U2lhpZMx0lI6WWl/QcWTOqdLpmWo+0WWcDL3/cM5h/0kvF8kLdC3kPr07UQLPRlXlaCKq1NiEKjZ5mZOTADd4oukwbvF2FjkuvH/y6XHz8/cTGLjUfEYnQbV1RGtdiDcG6M+Nb3cXtBiGrFm+T1bNxcAaSKN1hnAuRmiQTaEI1XKpse1AidbJsA5YjXG++jJ18PzHZP3Tr2SneGHSLczJhpSDAt1Iqvbzy+svxumxVNHNaq0iW96hVKmV4TorVaqWrpHjFqrpXLkEp02qR3NO2VzPGEWH/0bIZ4UL7ofeZulOWO+IL+etqvKGDwc8+MitrUOyt1ieNJadcDaAW4dj6SZET+CQmRL62ESmQjaNMPF2l8Boos1MpNBawRRMdD7a1q3G1VVY80qlNGVjjWEXnxoj8dlnWUYGyZj/UdNfL015l+rg49vYUoxIXfKK57+didGA53dRn3QBovyEDxTJ1raZ/3aH304JUpAEicsiBdg5VUcELiSTWNstiQ65ERAruxu8XNSrAZGUYzTTRc1oN4+BD/gHV35on54GrJiwf9ABac8CwO6hpQhDBuhHlFhMAjcgT59ULkNuylmRtG3j4fNovPZEqzS9P9XZFLvUPMNetDsUebGmPFJllMkY2i29cZ2uC0lLtvbSXl5bqEczDz5k2dzKfsq7EOpzhx9H2k53uG4rW1vFaktLeZg0+lDrbX+7zxg6q7tPRnp4nsTiwDOVffcwWyxhStloEnZPSUb5M9JJiPRqSfrZR2ev0Z81oN7coaQ51Yi8LmhJ44YRjj1uEHNFzR60biwfllwn0dskl54ybpKIHnplLMAZe8ZmD0JAWYA/GN373p4tm+T+vuqvpeuXPJp785TqAwIf+H8v/HBxzfdj148Ki48f08rNYifCMXH/9OGp5/BLhWewRdlbIB99aim3KNhH7CM+Ez9wirkdUGIW6ZnhgKME84RnRoss9qg/nplf0mIsVuFjanUyE/Rfa4V+WBdctK5wDq9UV3LbajizMq12Ya41sIf7vYW/ftt2aZE1JtaXetqR0LT6QVDxvuW29fc5qADuDFCMGu92AWDU8mmr1ag0Y5JrQGc+h/AOhc+rYuXPnVMqQqxXz7bODjJ9X9Z0WjGhOaUYEp/v7h+UZ5PUjsF5ksqvNFBKpwcjXSEzTYn52SVi+4ch1MkM+3Pi65YmUT/LSJ9uJeUTSt61PMrK37bOMHcDK8fIJA06iC2LwaB7LwPhEjOm+ZCaJlnSEPES/D7n1Pu4m5NaJkJCTAZYByLJf+UXv9rDbezs7b+/ZjgEK+rZ7t5s7S8skktLyjo4JuaUs606/h/bk4zsADWxW52fXgrK7suC1ivSK6OHoRbAo7El04JOYMC8dgPR1kXujn4TFJYNCYZjTfD27+iio9LOFQlWptIXrfagfLtzpr9JXZWXsaghFqiqVhdOaCivLdRfT+ZaHxT7xSPSIxCcZfr5FPShLj9eZ/MNhf8zHQtqYmcf7efw4zv+TRt5fFGmn/oyR875YsLRw7F9VMZefj4GXC4JeKp3ygtvxzbDJE/IDz3aWjebha0fElJeNg0Rw+SebTaXVaxU2ShSeW7WFyP8EeI9mECN4SYlJ23ErVPq+7fhn1upW+9HDJcURq4jJlUFHk2YznGk9ZQxvHCeRj+0Qjks9gkXFRDwbsbxCZdFGhYrUzznXI3At63DcT7FFFdXiqFCxqlmiDtEL7sLBq7NvJAbW5Tg34yGq9Tm2zeFOcLqyTG6mqrbtWjGzyLyBVH8zq1cBCe051v2fyJfBMo1Fbda88/3UcRZ/W45t/+vyT4A0qy0Kapy8MNnz7hk5lUzJz7zrIalENyxcfVB1MGvADQefzWdUrnPTtQVzrTPWtSUVRy82rx9lEQan+Li/fpnSQpUHwwz+tuzl2v5PIywqOqRchoVrPCpPpoE7kSIPBk7n5+B04GByYSIE36oQDU7MvyjUX/zW8jtXeC9mDRiqye2iHybeM2RdnPS/wvLBS9H+NVKQ5khAys8jyZHC08gGYAwxy3mlr614X5cYY4VihimGuXjTY8/P630E827ZGGIM880/YgX0n/sYAtJ2f2HVhnFMY9u7lnfbGhkuTGsVcsJcjKt/qZ7DcoUcneTCurBpb9BvTOMW15LA+KGdMYWJXuxr7DkVBt8tKQG9nJPrey24xWrT42dxawrGyT3YJMwj57Cm4yUGa7QHLwr2sRYZW1ImMZxcnYS56tZjqRcqknugjeIZc48Ysm7EI4g67omXEvePUNLPHT2J2/VdoD7QsyzQEdi1y+THCRxYnd/Ub+oIsnSUIQi09ZFMGBvGZNZI+rTmeZwJEyL5vOY0LesOGyYiZzTPCMmIqNtitdZuGZMREh4wpjYO9T2dpsRbZYoEhWzhcpkqQbXnmC2BwJcvlCni1bKtuOp8yS0fAVEC70xWd7t9beHyGHgDY+Oq5eVkuQlZfj9fQb1sJ80OtMeMr9iQFSsRm4OytyG6byWPo4YkRs4oVjGPxUZWPBQ17HbqaMRmAxponiuN6GbzD78WHVGucTjXKtc6HGsjhyPXcg+9Q1FDoCUVDucaJa9cyz3quNE7HnFJUOOIysJ8Sp9EDYO1L0/w4uA37Bug6fBvk+kZMHDtcVKSlIgnZEloFzlgCoZ8GxqM+iYqGPoXLnlNf4XTtPWIjPP5uLjpsV3bt9vtXCwVy61e0wVXe8jwIMIgwXBiIi5i7RjJFAb6sqtkZ8lR2Uca2nh6L7uHyo4eozuOBHLk1wLXiACyBaMBE07gLNNMAQ0btfEtXZnJZyrTHVQdcWKcRmvojl/i5TKfTB5f+vKmx3Wa7M6wnnMHJ3yhbw2ahj885z8/Of7ty9L5sxv3I7qAvnGt5zy7plCmq9lHG4fkSxMQzqEf0ASRYoYu0Wyz3EktpHJEJZWta+LXJLRIrQk7xm2uK2lOP3ezcQRvQVHjNiNC/P+CoXkKjcPOUvncFWDMEUaa/JAZby6LI3SKRZD55Vlzzc+xzrK6iim1FaVZLynyDNmzFS8Z8hfZEkPwe+YC6XrVSv/02dLSfENW1dJnEmleY479ucxpSffy5lumprNTbImTIRORiVadm/9qe2mVXqb795+LX//2GT0mAnsfLabSHWvgOASgoIdm61PXxzLsNVbp2pV81PynrjVg52nGKXcVeHFwnbTSql0xS6Nsul8QauwZnz6XMVZdQBc8m8FmuB3WlihSMlIUJZz9KduXXuQmWfbiV6QelUzxkcUFN4ci5gIOyk4yBUiU7g75918zcTcQwaCD56scH3rvHgr2CSJoV9b8U/rKy3G7xl6PYL3Pt15YMADvETTEDAEdLkj+7oNNYF+9chVUxi6pGhoAZ/7HO9+fAcOjDP9F72t0X85Ero5cnQl5+mrIuL4VZNMwHIDJaP0srX6UrPfXk/9s6yHiZYw4hm3KOT++TbuR2IO98NOySsGzXKHb1Ufeb30h+1ktaTq6q+Oie3z6LDpvVaxzLt6iCtcTUSKYipJsgGWsSG/AyzDAW5oFly4Jmrl6DrHU11sSIwMAw0sEzX+HfW2cEUkNmkKSJPNNz7PETdbgc7/tmZNYlLYjzokoqZRnlREpzpmnttbaj+zwTVp/Mb3Ilqd668uQ21+FXIJy75W/IKbxQvlTxd1fBYq4oO6+Prr/xugF5AI/F9myBZkrUPASDFKPPCauydSya8SHi0eFXJQkd/X9+m1XHL02tfnaHH3rbK1K3yP7pRNcnDrOHTuhnT1QOeZhbfxADg7j3RQVV9VF6WyKrtjpcRwl0PXunvi5Tkfpus6OOEDjgscGNGgNqhm4fuooTuBCFs9f2BVr6B0PkWWTJ8aXdHf7MnrHj7XrslIcy14KZjZ2e3L3n8jes8AtUsW5CwoLz/TMOg+ZbBIgArXDocc5XG8wHA7ZL8bhJJQoKlASjnmFMk6qN5QcRpZ21+lAkAgUQd56wHQJKaKXErpxt7DdzUH1EpSwC+8S6jEOczKsfyXA9QdPq9igxwRQ7rou4HkQgqAZAJYbZBUFO4naBHfIbNlm/BZ0FK0noi8FCwD4bu+hMzGWR98VBPRPPTJVF/AQNUEqu9QV99HpMBosRl2oucaPamRen6Bf97uWtsaF6lBj1WQbQl8ouGXS60VpUPq7KCOGTjVlFNqP+KO3vF9UC/5t99AJMn/TYl7BKPeLbE2VST92T5HptwRek8BRETWDVCimEzuCktDQahWlxQT/GZaY+B+RaCou/EYDqkDJ8NI3fVGVAPSvBJdQ6hD87g0IrtT5uNG5f9lnBs37IpVdnvubED0io6v/9OYcPz7uc4dfgJP8IyjE3/F87j+p3KFjAJHV9n4G1btRcWtkf7rqvwZyg8ev/OIyJHA7h8Bf/cvD/naLEtNGLnEKvtVEySE30eBUlUxPd6LFYzrR5nSY6Nbx7vM9IoJDovoM2n5aE4Wg3xMlvy9iyDx/iAnPy0RL3D9sMyBjottrkyI96r23XwUEQZ3l24yU5yIqpO21fY8mOQgksPikzxgiec4uzy7O9e+QMZjIEVfmSqTIiuCr7K2VBZ3zWR18iUrOLHX10/l5sfkOZ8pXe20XAQICaZnc1p2ZKB4rzizakb/+PWQkDgiKLR5m/gwFEd185tKZCw3pHWOtLVbFGq0YV4TwQsbWD7xK5i3hyDk1XqaWd1ZCijhjUxi1J+dkT4UuOyteqeYlY/RtlRZeJUUJRIsRK078bw6UPwv+xKSUSkhYRFRMXEJSSlpGVk5eQVFJWUVVTV1DU0tbR1dP38DQyNjE1MzcwtLKuqMVtT9KrP0JsUaWhk/CabMH/1WRdjgofKhATi2CxnB6Kc7qZla3Xb1rvDmEkOpGHXBFuD7SINgxnJYb5Z0PvcQI6jT0SOp4dn91nRNwSUta6ARsfSrT/P5vrM0kdBlqntqCG1lks6Vi93QlOr5u97aonh1FOcnBq8QdR4wqExkrzaW5f7AmNj1NAZWQ59MgTpjaSWhFdE8Bzh0XaWepES2wsqlbKXHE5wTUKpANbiJqQ1/wLpp3lYWQnFrDTohLqtfi9jptUg3kCLtlZoZno1PtjMaWeGvjTgYTSTOQE0StHQlpoAqaOVCfpXzbpCRQaWD7KwT3FdwTiSlf2LcJ8qJC/TVUrrYJNqlXbggl6/ttgSM2d8kX1mqbHHAnBUpPOkmB6pCGS0w1xScmAefUjxbZ1IAvot2ro1f15aBkAFI/1KCIzd4e') format('woff2'),\n  url('//at.alicdn.com/t/font_945958_zfsfjju1dim.woff?t=1547618146468') format('woff'),\n  url('//at.alicdn.com/t/font_945958_zfsfjju1dim.ttf?t=1547618146468') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */\n  url('//at.alicdn.com/t/font_945958_zfsfjju1dim.svg?t=1547618146468#iconfont') format('svg'); /* iOS 4.1- */\n}\n\n.iconfont {\n  font-family: \"iconfont\" !important;\n  font-size: 16px;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-redo:before {\n  content: \"\\e627\";\n}\n\n.icon-undo:before {\n  content: \"\\e633\";\n}\n\n.icon-indent:before {\n  content: \"\\eb28\";\n}\n\n.icon-outdent:before {\n  content: \"\\e6e8\";\n}\n\n.icon-fontsize:before {\n  content: \"\\e6fd\";\n}\n\n.icon-format-header-1:before {\n  content: \"\\e860\";\n}\n\n.icon-format-header-4:before {\n  content: \"\\e863\";\n}\n\n.icon-format-header-5:before {\n  content: \"\\e864\";\n}\n\n.icon-format-header-6:before {\n  content: \"\\e865\";\n}\n\n.icon-clearup:before {\n  content: \"\\e64d\";\n}\n\n.icon-preview:before {\n  content: \"\\e631\";\n}\n\n.icon-date:before {\n  content: \"\\e63e\";\n}\n\n.icon-fontbgcolor:before {\n  content: \"\\e678\";\n}\n\n.icon-clearedformat:before {\n  content: \"\\e67e\";\n}\n\n.icon-font:before {\n  content: \"\\e684\";\n}\n\n.icon-723bianjiqi_duanhouju:before {\n  content: \"\\e65f\";\n}\n\n.icon-722bianjiqi_duanqianju:before {\n  content: \"\\e660\";\n}\n\n.icon-text_color:before {\n  content: \"\\e72c\";\n}\n\n.icon-format-header-2:before {\n  content: \"\\e75c\";\n}\n\n.icon-format-header-3:before {\n  content: \"\\e75d\";\n}\n\n.icon--checklist:before {\n  content: \"\\e664\";\n}\n\n.icon-baocun:before {\n  content: \"\\ec09\";\n}\n\n.icon-line-height:before {\n  content: \"\\e7f8\";\n}\n\n.icon-quanping:before {\n  content: \"\\ec13\";\n}\n\n.icon-direction-rtl:before {\n  content: \"\\e66e\";\n}\n\n.icon-direction-ltr:before {\n  content: \"\\e66d\";\n}\n\n.icon-selectall:before {\n  content: \"\\e62b\";\n}\n\n.icon-fuzhi:before {\n  content: \"\\ec7a\";\n}\n\n.icon-shanchu:before {\n  content: \"\\ec7b\";\n}\n\n.icon-bianjisekuai:before {\n  content: \"\\ec7c\";\n}\n\n.icon-fengexian:before {\n  content: \"\\ec7f\";\n}\n\n.icon-dianzan:before {\n  content: \"\\ec80\";\n}\n\n.icon-charulianjie:before {\n  content: \"\\ec81\";\n}\n\n.icon-charutupian:before {\n  content: \"\\ec82\";\n}\n\n.icon-wuxupailie:before {\n  content: \"\\ec83\";\n}\n\n.icon-juzhongduiqi:before {\n  content: \"\\ec84\";\n}\n\n.icon-yinyong:before {\n  content: \"\\ec85\";\n}\n\n.icon-youxupailie:before {\n  content: \"\\ec86\";\n}\n\n.icon-youduiqi:before {\n  content: \"\\ec87\";\n}\n\n.icon-zitidaima:before {\n  content: \"\\ec88\";\n}\n\n.icon-xiaolian:before {\n  content: \"\\ec89\";\n}\n\n.icon-zitijiacu:before {\n  content: \"\\ec8a\";\n}\n\n.icon-zitishanchuxian:before {\n  content: \"\\ec8b\";\n}\n\n.icon-zitishangbiao:before {\n  content: \"\\ec8c\";\n}\n\n.icon-zitibiaoti:before {\n  content: \"\\ec8d\";\n}\n\n.icon-zitixiahuaxian:before {\n  content: \"\\ec8e\";\n}\n\n.icon-zitixieti:before {\n  content: \"\\ec8f\";\n}\n\n.icon-zitiyanse:before {\n  content: \"\\ec90\";\n}\n\n.icon-zuoduiqi:before {\n  content: \"\\ec91\";\n}\n\n.icon-zitiyulan:before {\n  content: \"\\ec92\";\n}\n\n.icon-zitixiabiao:before {\n  content: \"\\ec93\";\n}\n\n.icon-zuoyouduiqi:before {\n  content: \"\\ec94\";\n}\n\n.icon-duigoux:before {\n  content: \"\\ec9e\";\n}\n\n.icon-guanbi:before {\n  content: \"\\eca0\";\n}\n\n.icon-shengyin_shiti:before {\n  content: \"\\eca5\";\n}\n\n.icon-Character-Spacing:before {\n  content: \"\\e964\";\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/editor/editor.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'editor',\n      path: 'packageComponent/pages/form/editor/editor'\n    }\n  },\n  data: {\n    formats: {},\n    readOnly: false,\n    placeholder: '开始输入...',\n    editorHeight: 300,\n    keyboardHeight: 0,\n    isIOS: false,\n    safeHeight: 0,\n    toolBarHeight: 50,\n  },\n  readOnlyChange() {\n    this.setData({\n      readOnly: !this.data.readOnly\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    const {\n      platform, safeArea, screenHeight\n    } = wx.getSystemInfoSync()\n    let safeHeight\n    if (safeArea) {\n      safeHeight = (screenHeight - safeArea.bottom)\n    } else {\n      safeHeight = 32\n    }\n    this._safeHeight = safeHeight\n    const isIOS = platform === 'ios'\n    this.setData({ isIOS, safeHeight, toolBarHeight: isIOS ? safeHeight + 50 : 50 })\n    const that = this\n    this.updatePosition(0)\n    let keyboardHeight = 0\n    wx.onKeyboardHeightChange(res => {\n      if (res.height === keyboardHeight) {\n        return\n      }\n      const duration = res.height > 0 ? res.duration * 1000 : 0\n      keyboardHeight = res.height\n      setTimeout(() => {\n        wx.pageScrollTo({\n          scrollTop: 0,\n          success() {\n            that.updatePosition(keyboardHeight)\n            that.editorCtx.scrollIntoView()\n          }\n        })\n      }, duration)\n    })\n  },\n  updatePosition(keyboardHeight) {\n    const toolbarHeight = 50\n    const { windowHeight } = wx.getSystemInfoSync()\n    let editorHeight = windowHeight\n    if (keyboardHeight > 0) {\n      editorHeight = windowHeight - keyboardHeight - toolbarHeight\n    }\n    if (keyboardHeight === 0) {\n      this.setData({\n        editorHeight,\n        keyboardHeight,\n        toolBarHeight: this.data.isIOS ? 50 + this._safeHeight : 50,\n        safeHeight: this._safeHeight,\n      })\n    } else {\n      this.setData({\n        editorHeight,\n        keyboardHeight,\n        toolBarHeight: 50,\n        safeHeight: 0,\n      })\n    }\n  },\n  calNavigationBarAndStatusBar() {\n    const systemInfo = wx.getSystemInfoSync()\n    const { statusBarHeight, platform } = systemInfo\n    const isIOS = platform === 'ios'\n    const navigationBarHeight = isIOS ? 44 : 48\n    return statusBarHeight + navigationBarHeight\n  },\n  onEditorReady() {\n    const that = this\n    wx.createSelectorQuery().select('#editor').context(function (res) {\n      that.editorCtx = res.context\n    }).exec()\n  },\n  blur() {\n    this.editorCtx.blur()\n  },\n  format(e) {\n    const { name, value } = e.target.dataset\n    if (!name) return\n    // console.log('format', name, value)\n    this.editorCtx.format(name, value)\n  },\n  onStatusChange(e) {\n    const formats = e.detail\n    this.setData({ formats })\n  },\n  insertDivider() {\n    this.editorCtx.insertDivider({\n      success() {\n        console.log('insert divider success')\n      }\n    })\n  },\n  clear() {\n    this.editorCtx.clear({\n      success() {\n        console.log('clear success')\n      }\n    })\n  },\n  removeFormat() {\n    this.editorCtx.removeFormat()\n  },\n  insertDate() {\n    const date = new Date()\n    const formatDate = `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`\n    this.editorCtx.insertText({\n      text: formatDate\n    })\n  },\n  insertImage() {\n    const that = this\n    wx.chooseImage({\n      count: 1,\n      success(res) {\n        that.editorCtx.insertImage({\n          src: res.tempFilePaths[0],\n          data: {\n            id: 'abcd',\n            role: 'god'\n          },\n          width: '80%',\n          success() {\n            console.log('insert image success')\n          }\n        })\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/editor/editor.json",
    "content": "{\n  \"navigationBarTitleText\": \"editor\",\n  \"disableScroll\": true,\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/editor/editor.wxml",
    "content": "<view class=\"container\" style=\"height:{{editorHeight}}px;\">\n\t<editor id=\"editor\" class=\"ql-container\" placeholder=\"{{placeholder}}\" bindstatuschange=\"onStatusChange\" bindready=\"onEditorReady\">\n\t</editor>\n</view>\n\n<view class=\"toolbar\" catchtouchend=\"format\" hidden=\"{{false}}\" style=\"bottom: {{isIOS ? keyboardHeight : 0}}px; height: {{toolBarHeight}}px;\">\n\t<i class=\"iconfont icon-charutupian\" catchtouchend=\"insertImage\"></i>\n\t<i class=\"iconfont icon-format-header-2 {{formats.header === 2 ? 'ql-active' : ''}}\" data-name=\"header\" data-value=\"{{2}}\"></i>\n\t<i class=\"iconfont icon-format-header-3 {{formats.header === 3 ? 'ql-active' : ''}}\" data-name=\"header\" data-value=\"{{3}}\"></i>\n\t<i class=\"iconfont icon-zitijiacu {{formats.bold ? 'ql-active' : ''}}\" data-name=\"bold\"></i>\n\t<i class=\"iconfont icon-zitixieti {{formats.italic ? 'ql-active' : ''}}\" data-name=\"italic\"></i>\n\t<i class=\"iconfont icon-zitixiahuaxian {{formats.underline ? 'ql-active' : ''}}\" data-name=\"underline\"></i>\n\t<i class=\"iconfont icon--checklist\" data-name=\"list\" data-value=\"check\"></i>\n\t<i class=\"iconfont icon-youxupailie {{formats.list === 'ordered' ? 'ql-active' : ''}}\" data-name=\"list\" data-value=\"ordered\"></i>\n\t<i class=\"iconfont icon-wuxupailie {{formats.list === 'bullet' ? 'ql-active' : ''}}\" data-name=\"list\" data-value=\"bullet\"></i>\n</view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/editor/editor.wxss",
    "content": "/* @import \"../../../weui/components/weui-wxss/dist/style/weui.wxss\"; */\n@import \"./assets/iconfont.wxss\";\n\npage>view {\n  max-width: 100%;\n}\n\n.container {\n  position: absolute; \n  top: 0; \n  left: 0; \n  width: 100%;\n}\n\n.ql-container {\n  box-sizing: border-box;\n  width: 100%;\n  height: 100%;\n  font-size: 16px;\n  line-height: 1.5;\n  overflow: auto;\n  padding: 10px 10px 20px 10px;\n  border: 1px solid #ECECEC;\n  -webkit-overflow-scrolling: touch; /* 惯性滚动 */\n}\n\n.ql-active {\n  color: #22C704;\n}\n\n.iconfont {\n  display: inline-block;\n  width: 30px;\n  height: 30px;\n  cursor: pointer;\n  font-size: 20px;\n}\n\n.toolbar {\n  box-sizing: border-box;\n  padding: 0 10px;\n  height: 50px;\n  width: 100%;\n  position: fixed;\n  left: 0;\n  right: 100%;\n  bottom: 0;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  border: 1px solid #ECECEC;\n  border-left: none;\n  border-right: none;\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom);\n}\n\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/form/form.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'form',\n      path: 'packageComponent/pages/form/form/form'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    pickerHidden: true,\n    chosen: ''\n  },\n\n  pickerConfirm(e) {\n    this.setData({\n      pickerHidden: true\n    })\n    this.setData({\n      chosen: e.detail.value\n    })\n  },\n\n  pickerCancel() {\n    this.setData({\n      pickerHidden: true\n    })\n  },\n\n  pickerShow() {\n    this.setData({\n      pickerHidden: false\n    })\n  },\n\n  formSubmit(e) {\n    console.log('form发生了submit事件，携带数据为：', e.detail.value)\n  },\n\n  formReset(e) {\n    console.log('form发生了reset事件，携带数据为：', e.detail.value)\n    this.setData({\n      chosen: ''\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/form/form.json",
    "content": "{\n    \"navigationBarTitleText\": \"form\",\n    \"componentFramework\": \"glass-easel\",\n    \"renderer\": \"skyline\",\n    \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/form/form.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<mp-navigation-bar title=\"form\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n  <view class=\"container page\" data-weui-theme=\"{{theme}}\">\n    <template is=\"head\" data=\"{{title: 'form'}}\" />\n    <view class=\"page-body\">\n      <form catchsubmit=\"formSubmit\" catchreset=\"formReset\">\n        <view class=\"page-section page-section-gap\">\n          <view class=\"page-section-title\">switch</view>\n          <view class=\"weui-cell weui-check__label\">\n            <switch name=\"switch\" />\n          </view>\n        </view>\n        <view class=\"page-section page-section-gap\">\n          <view class=\"page-section-title\">radio</view>\n          <radio-group name=\"radio\">\n            <label class=\"weui-cell weui-check__label\">\n              <view class=\"weui-cell__hd\">\n                <radio value=\"radio1\" />\n              </view>\n              <view class=\"weui-cell__bd\">选项一</view>\n            </label>\n            <label class=\"weui-cell weui-check__label\">\n              <view class=\"weui-cell__hd\">\n                <radio value=\"radio2\" />\n              </view>\n              <view class=\"weui-cell__bd\">选项二</view>\n            </label>\n          </radio-group>\n        </view>\n        <view class=\"page-section page-section-gap\">\n          <view class=\"page-section-title\">checkbox</view>\n          <checkbox-group name=\"checkbox\">\n            <label class=\"weui-cell weui-check__label\">\n              <view class=\"weui-cell__hd\">\n                <checkbox value=\"checkbox1\" />\n              </view>\n              <view class=\"weui-cell__bd\">选项一</view>\n            </label>\n            <label class=\"weui-cell weui-check__label\">\n              <view class=\"weui-cell__hd\">\n                <checkbox value=\"checkbox2\" />\n              </view>\n              <view class=\"weui-cell__bd\">选项二</view>\n            </label>\n          </checkbox-group>\n        </view>\n        <view class=\"page-section page-section-gap\">\n          <view class=\"page-section-title\">slider</view>\n          <slider value=\"50\" name=\"slider\" show-value></slider>\n        </view>\n        <view class=\"page-section\">\n          <view class=\"page-section-title\">input</view>\n          <view class=\"weui-cells weui-cells_after-title\">\n            <view class=\"weui-cell weui-cell_input\">\n              <view class=\"weui-cell__bd\">\n                <input class=\"weui-input\" name=\"input\" placeholder=\"这是一个输入框\" />\n              </view>\n            </view>\n          </view>\n        </view>\n        <view class=\"btn-area\">\n          <button type=\"primary\" formType=\"submit\">Submit</button>\n          <button formType=\"reset\">Reset</button>\n        </view>\n      </form>\n    </view>\n    <template is=\"foot\" />\n  </view>\n</scroll-view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/form/form.wxss",
    "content": "@import '../../../../common/lib/weui.wxss';\n@import \"../../../../common/reset.wxss\";\n\nlabel {\n  display: inline-block;\n  min-width: 235px;\n  margin-right: 10px;\n}\nform{\n  width: 100%;\n}\n.picker-text {\n  margin-left: 10px;\n  position: relative;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/input/input.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'input',\n      path: 'packageComponent/pages/form/input/input'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    focus: false,\n    inputValue: '',\n    style: { color: '#F76260', fontSize: 16 },\n  },\n\n  bindKeyInput(e) {\n    this.setData({\n      inputValue: e.detail.value\n    })\n  },\n\n  bindReplaceInput(e) {\n    const value = e.detail.value\n    let pos = e.detail.cursor\n    let left\n    if (pos !== -1) {\n      // 光标在中间\n      left = e.detail.value.slice(0, pos)\n      // 计算光标的位置\n      pos = left.replace(/11/g, '2').length\n    }\n\n    // 直接返回对象，可以对输入进行过滤处理，同时可以控制光标的位置\n    return {\n      value: value.replace(/11/g, '2'),\n      cursor: pos\n    }\n\n    // 或者直接返回字符串,光标在最后边\n    // return value.replace(/11/g,'2'),\n  },\n\n  bindHideKeyboard(e) {\n    if (e.detail.value === '123') {\n      // 收起键盘\n      wx.hideKeyboard()\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/input/input.json",
    "content": "{\n  \"navigationBarTitleText\": \"input\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/input/input.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"input\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'input'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">可以自动聚焦的input</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <input class=\"weui-input\" focus placeholder-style=\"{{style}}\" placeholder=\"将会获取焦点\"/>\n        </view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">控制最大输入长度的input</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <input class=\"weui-input\" maxlength=\"10\" placeholder=\"最大输入长度为10\" />\n        </view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">实时获取输入值：{{inputValue}}</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <input class=\"weui-input\"  maxlength=\"10\" bindinput=\"bindKeyInput\" placeholder=\"输入同步到view中\"/>\n        </view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">控制输入的input</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <input class=\"weui-input\"  bindinput=\"bindReplaceInput\" placeholder=\"连续的两个1会变成2\" />\n        </view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">控制键盘的input</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <input class=\"weui-input\"  bindinput=\"bindHideKeyboard\" placeholder=\"输入123自动收起键盘\" />\n        </view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">数字输入的input</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <input class=\"weui-input\" type=\"number\" placeholder=\"这是一个数字输入框\" />\n        </view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">密码输入的input</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <input class=\"weui-input\" password type=\"text\" placeholder=\"这是一个密码输入框\" />\n        </view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">带小数点的input</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <input class=\"weui-input\" type=\"digit\" placeholder=\"带小数点的数字键盘\"/>\n        </view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">身份证输入的input</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <input class=\"weui-input\" type=\"idcard\" placeholder=\"身份证输入键盘\" />\n        </view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">控制占位符颜色的input</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <input class=\"weui-input\" placeholder-style=\"{{style}}\" placeholder-class=\"placeholder\" placeholder=\"占位符字体是红色的\" />\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/input/input.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.page-section{\n  margin-bottom: 10px;\n}\n\n.placeholder {\n  color: #F76260;\n}\n/* input {\n  border: .5px solid green!important;\n} */\n\n.weui-input {\n  width: 100%;\n  border: 0;\n  outline: 0;\n  background-color: transparent;\n  font-size: inherit;\n  color: inherit;\n  height: 24px;\n  line-height: 1.41176471;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/label/label.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'label',\n      path: 'packageComponent/pages/form/label/label'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    checkboxItems: [\n      { name: 'USA', value: '美国' },\n      { name: 'CHN', value: '中国', checked: 'true' }\n    ],\n    radioItems: [\n      { name: 'USA', value: '美国' },\n      { name: 'CHN', value: '中国', checked: 'true' }\n    ],\n    hidden: false\n  },\n\n  checkboxChange(e) {\n    const checked = e.detail.value\n    const changed = {}\n    for (let i = 0; i < this.data.checkboxItems.length; i++) {\n      if (checked.indexOf(this.data.checkboxItems[i].name) !== -1) {\n        changed[`checkboxItems[${i}].checked`] = true\n      } else {\n        changed[`checkboxItems[${i}].checked`] = false\n      }\n    }\n    this.setData(changed)\n  },\n\n  radioChange(e) {\n    const checked = e.detail.value\n    const changed = {}\n    for (let i = 0; i < this.data.radioItems.length; i++) {\n      if (checked.indexOf(this.data.radioItems[i].name) !== -1) {\n        changed[`radioItems[${i}].checked`] = true\n      } else {\n        changed[`radioItems[${i}].checked`] = false\n      }\n    }\n    this.setData(changed)\n  },\n\n  tapEvent() {\n    console.log('按钮被点击')\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/label/label.json",
    "content": "{\n    \"navigationBarTitleText\": \"label\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/label/label.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'label'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">表单组件在label内</view>\n      <checkbox-group class=\"group\" bindchange=\"checkboxChange\">\n        <view class=\"label-1\" wx:for=\"{{checkboxItems}}\">\n          <label>\n            <checkbox value=\"{{item.name}}\" checked=\"{{item.checked}}\"></checkbox>\n            <text class=\"label-1-text\">{{item.value}}</text>\n          </label>\n        </view>\n      </checkbox-group>\n    </view>\n\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">label用for标识表单组件</view>\n      <radio-group class=\"group\" bindchange=\"radioChange\">\n        <view class=\"label-2\" wx:for=\"{{radioItems}}\">\n          <radio id=\"{{item.name}}\" value=\"{{item.name}}\" checked=\"{{item.checked}}\"></radio>\n          <label class=\"label-2-text\" for=\"{{item.name}}\"><text>{{item.name}}</text></label>\n        </view>\n      </radio-group>\n    </view>\n\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">label内有多个时选中第一个</view>\n      <label class=\"label-3\">\n        <checkbox class=\"checkbox-3\">选项一</checkbox>\n        <checkbox class=\"checkbox-3\">选项二</checkbox>\n        <view class=\"label-3-text\">点击该label下的文字默认选中第一个checkbox</view>\n      </label>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/label/label.wxss",
    "content": ".label-1, .label-2{\n  margin: 15px 0;\n}\n.label-3-text{\n  color: #576B95;\n  font-size: 14px;\n}\n.checkbox-3{\n  display: block;\n  margin: 15px 0;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/picker/picker.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'picker',\n      path: 'packageComponent/pages/form/picker/picker'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    array: ['中国', '美国', '巴西', '日本'],\n    index: 0,\n    date: '2016-09-01',\n    time: '12:01'\n  },\n\n  bindPickerChange(e) {\n    console.log('picker发送选择改变，携带值为', e.detail.value)\n    this.setData({\n      index: e.detail.value\n    })\n  },\n\n  bindDateChange(e) {\n    this.setData({\n      date: e.detail.value\n    })\n  },\n\n  bindTimeChange(e) {\n    this.setData({\n      time: e.detail.value\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/picker/picker.json",
    "content": "{\n    \"navigationBarTitleText\": \"picker\",\n    \"componentFramework\": \"glass-easel\",\n    \"renderer\": \"skyline\",\n    \"disableScroll\": true,\n    \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/picker/picker.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"picker\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'picker'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"weui-cells__title\">地区选择器</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">当前选择</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <picker bindchange=\"bindPickerChange\" value=\"{{index}}\" range=\"{{array}}\">\n              <view class=\"weui-input\">{{array[index]}}</view>\n            </picker>\n          </view>\n        </view>\n      </view>\n\n      <view class=\"weui-cells__title\">时间选择器</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">当前选择</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <picker mode=\"time\" value=\"{{time}}\" start=\"09:01\" end=\"21:01\" bindchange=\"bindTimeChange\">\n              <view class=\"weui-input\">{{time}}</view>\n            </picker>\n          </view>\n        </view>\n      </view>\n\n      <view class=\"weui-cells__title\">日期选择器</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">当前选择</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <picker mode=\"date\" value=\"{{date}}\" start=\"2015-09-01\" end=\"2017-09-01\" bindchange=\"bindDateChange\">\n              <view class=\"weui-input\">{{date}}</view>\n            </picker>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/picker/picker.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.flex-wrp{\n  margin-top: 30px;\n  display:flex;\n  width: 100vw;\n  align-items: center;\n}\n.flex-item{\n  width: 100px;\n  height: 150px;\n  font-size: 13px;\n}\n.flex-item-V{\n  /* skyline不支持auto，改为 align-items: center; */\n  /* margin: 0 auto; */\n  width: 150px;\n  height: 100px;\n}\n\n.picker{\n  padding: 10px 13px;\n  background-color: #FFFFFF;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/picker-view/picker-view.js",
    "content": "const date = new Date()\nconst years = []\nconst months = []\nconst days = []\n\nfor (let i = 1990; i <= date.getFullYear(); i++) {\n  years.push(i)\n}\n\nfor (let i = 1; i <= 12; i++) {\n  months.push(i)\n}\n\nfor (let i = 1; i <= 31; i++) {\n  days.push(i)\n}\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'picker-view',\n      path: 'packageComponent/pages/form/picker-view/picker-view'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    years,\n    year: date.getFullYear(),\n    months,\n    month: 2,\n    days,\n    day: 2,\n    value: [9999, 1, 1],\n    isDaytime: true,\n  },\n\n  bindChange(e) {\n    const val = e.detail.value\n    this.setData({\n      year: this.data.years[val[0]],\n      month: this.data.months[val[1]],\n      day: this.data.days[val[2]],\n      isDaytime: !val[3]\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/picker-view/picker-view.json",
    "content": "{\n  \"navigationBarTitleText\": \"picker-view\",\n  \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/picker-view/picker-view.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'picker-view'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"selected-date\">{{year}}年{{month}}月{{day}}日{{isDaytime ? \"白天\" : \"夜晚\"}}</view>\n    <picker-view indicator-style=\"height: 50px;\" style=\"width: 100%; height: 300px;\" value=\"{{value}}\" bindchange=\"bindChange\">\n      <picker-view-column>\n        <view wx:for=\"{{years}}\" wx:key=\"{{years}}\" style=\"line-height: 50px; text-align: center;\">{{item}}年</view>\n      </picker-view-column>\n      <picker-view-column>\n        <view wx:for=\"{{months}}\" wx:key=\"{{months}}\" style=\"line-height: 50px; text-align: center;\">{{item}}月</view>\n      </picker-view-column>\n      <picker-view-column>\n        <view wx:for=\"{{days}}\" wx:key=\"{{days}}\" style=\"line-height: 50px; text-align: center;\">{{item}}日</view>\n      </picker-view-column>\n      <picker-view-column>\n        <view class=\"icon-container\">\n          <image class=\"picker-icon\" src=\"../../../resources/kind/daytime.png\" />\n        </view>\n        <view class=\"icon-container\">\n          <image class=\"picker-icon\" src=\"../../../resources/kind/night.png\" />\n        </view>\n      </picker-view-column>\n    </picker-view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/picker-view/picker-view.wxss",
    "content": ".selected-date {\n  text-align: center;\n  margin: 15px;\n}\n\n.icon-container {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n}\n\n.picker-icon {\n  width: 25px;\n  height: 25px;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/radio/radio.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'radio',\n      path: 'packageComponent/pages/form/radio/radio'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    items: [\n      { value: 'USA', name: '美国' },\n      { value: 'CHN', name: '中国', checked: 'true' },\n      { value: 'BRA', name: '巴西' },\n      { value: 'JPN', name: '日本' },\n      { value: 'ENG', name: '英国' },\n      { value: 'FRA', name: '法国' },\n    ]\n  },\n\n  radioChange(e) {\n    console.log('radio发生change事件，携带value值为：', e.detail.value)\n\n    const items = this.data.items\n    for (let i = 0, len = items.length; i < len; ++i) {\n      items[i].checked = items[i].value === e.detail.value\n    }\n\n    this.setData({\n      items\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/radio/radio.json",
    "content": "{\n    \"navigationBarTitleText\": \"radio\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/radio/radio.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'radio'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">默认样式</view>\n      <label class=\"radio\">\n        <radio value=\"r1\" checked=\"true\"/>选中\n      </label>\n      <label class=\"radio\">\n        <radio value=\"r2\" />未选中\n      </label>\n    </view>\n\n\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">推荐展示样式</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <radio-group bindchange=\"radioChange\">\n          <label class=\"weui-cell weui-check__label\" wx:for=\"{{items}}\" wx:key=\"{{item.value}}\">\n\n            <view class=\"weui-cell__hd\">\n              <radio value=\"{{item.value}}\" checked=\"true\"/>\n            </view>\n            <view class=\"weui-cell__bd\">{{item.name}}</view>\n          </label>\n        </radio-group>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/radio/radio.wxss",
    "content": "\n\n.radio {\n  margin-right: 10px;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/slider/slider.js",
    "content": "const pageData = {\n  data: {\n    theme: 'light'\n  },\n  onShareAppMessage() {\n    return {\n      title: 'slider',\n      path: 'packageComponent/pages/form/slider/slider'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n}\n\nfor (let i = 1; i < 5; ++i) {\n  (function (index) {\n    pageData[`slider${index}change`] = function (e) {\n      console.log(`slider${index}发生change事件，携带值为`, e.detail.value)\n    }\n  }(i))\n}\n\nPage(pageData)\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/slider/slider.json",
    "content": "{\n    \"navigationBarTitleText\": \"slider\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/slider/slider.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'slider'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">设置step</view>\n      <view class=\"body-view\">\n        <slider value=\"60\" bindchange=\"slider2change\" step=\"5\"/>\n      </view>\n    </view>\n\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">显示当前value</view>\n      <view class=\"body-view\">\n        <slider value=\"50\" bindchange=\"slider3change\" show-value/>\n      </view>\n    </view>\n\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">设置最小/最大值</view>\n      <view class=\"body-view\">\n        <slider value=\"100\" bindchange=\"slider4change\" min=\"50\" max=\"200\" show-value/>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/slider/slider.wxss",
    "content": "/* packageComponent/pages/form/slider/slider.wxss */\n\nslider {\n  margin: 0;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/switch/switch.js",
    "content": "Page({\n  data: {\n    theme: 'light'\n  },\n  onShareAppMessage() {\n    return {\n      title: 'switch',\n      path: 'packageComponent/pages/form/switch/switch'\n    }\n  },\n\n  switch1Change(e) {\n    console.log('switch1 发生 change 事件，携带值为', e.detail.value)\n  },\n\n  switch2Change(e) {\n    console.log('switch2 发生 change 事件，携带值为', e.detail.value)\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/switch/switch.json",
    "content": "{\n    \"navigationBarTitleText\": \"switch\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/switch/switch.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'switch'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">默认样式</view>\n      <view class=\"body-view\">\n        <switch checked bindchange=\"switch1Change\"/>\n        <switch bindchange=\"switch2Change\"/>\n      </view>\n    </view>\n\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">推荐展示样式</view>\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_switch\">\n          <view class=\"weui-cell__bd\">开启中</view>\n          <view class=\"weui-cell__ft\">\n            <switch checked />\n          </view>\n        </view>\n        <view class=\"weui-cell weui-cell_switch\">\n          <view class=\"weui-cell__bd\">关闭</view>\n          <view class=\"weui-cell__ft\">\n            <switch />\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/switch/switch.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageComponent/pages/form/textarea/textarea.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'textarea',\n      path: 'packageComponent/pages/form/textarea/textarea'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    focus: false\n  },\n\n  bindTextAreaBlur(e) {\n    console.log(e.detail.value)\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/textarea/textarea.json",
    "content": "{\n    \"navigationBarTitleText\": \"textarea\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/textarea/textarea.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'textarea'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">输入区域高度自适应，不会出现滚动条</view>\n      <view class=\"textarea-wrp\">\n        <textarea bindblur=\"bindTextAreaBlur\" auto-height />\n      </view>\n    </view>\n\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">这是一个可以自动聚焦的textarea</view>\n      <view class=\"textarea-wrp\">\n        <textarea auto-focus=\"true\" style=\"height: 3em\" />\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/form/textarea/textarea.wxss",
    "content": "textarea {\n    width: 350px;\n    padding: 13px 0;\n}\n.textarea-wrp {\n    padding: 0 13px;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/map/map/map.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'map',\n      path: 'packageComponent/pages/map/map/map'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    latitude: 23.099994,\n    longitude: 113.324520,\n    markers: [{\n      latitude: 23.099994,\n      longitude: 113.324520,\n      name: 'T.I.T 创意园'\n    }],\n    polygons: [{\n      points: [\n        {\n          latitude: 23.099994,\n          longitude: 113.324520,\n        },\n        {\n          latitude: 23.098994,\n          longitude: 113.323520,\n        },\n        {\n          latitude: 23.098994,\n          longitude: 113.325520,\n        }\n      ],\n      strokeWidth: 3,\n      strokeColor: '#FFFFFFAA',\n    }],\n    subKey: 'B5QBZ-7JTLU-DSSVA-2BRJ3-TNXLF-2TBR7',\n    enable3d: false,\n    showCompass: false,\n    enableOverlooking: false,\n    enableZoom: true,\n    enableScroll: true,\n    enableRotate: false,\n    drawPolygon: false,\n    enableSatellite: false,\n    enableTraffic: false\n  },\n  toggle3d() {\n    this.setData({\n      enable3d: !this.data.enable3d\n    })\n  },\n  toggleShowCompass() {\n    this.setData({\n      showCompass: !this.data.showCompass\n    })\n  },\n  toggleOverlooking() {\n    this.setData({\n      enableOverlooking: !this.data.enableOverlooking\n    })\n  },\n  toggleZoom() {\n    this.setData({\n      enableZoom: !this.data.enableZoom\n    })\n  },\n  toggleScroll() {\n    this.setData({\n      enableScroll: !this.data.enableScroll\n    })\n  },\n  toggleRotate() {\n    this.setData({\n      enableRotate: !this.data.enableRotate\n    })\n  },\n  togglePolygon() {\n    this.setData({\n      drawPolygon: !this.data.drawPolygon\n    })\n  },\n  toggleSatellite() {\n    this.setData({\n      enableSatellite: !this.data.enableSatellite\n    })\n  },\n  toggleTraffic() {\n    this.setData({\n      enableTraffic: !this.data.enableTraffic\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/map/map/map.json",
    "content": "{\n  \"navigationBarTitleText\": \"map\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/map/map/map.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"map\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'map'}}\"/>\n\n  <view class=\"page-body\">\n    <view style=\"flex-direction: row; font-size: 14px;\">\n      <text class=\"page-section-title\">当前组件使用了墨渊底图样式，</text>\n      <navigator class=\"navigator\" url=\"/packageComponent/pages/map-styles/map-styles\">查看更多</navigator>\n      <text>。</text>\n    </view>\n    <view class=\"page-section page-section-gap\">\n      <map\n        subkey=\"{{subKey}}\"\n        style=\"width: 100%; height: 300px;\"\n        latitude=\"{{latitude}}\"\n        longitude=\"{{longitude}}\"\n        scale=\"{{18}}\"\n        markers=\"{{markers}}\"\n        enable-3D=\"{{enable3d}}\"\n        show-compass=\"{{showCompass}}\"\n        enable-zoom=\"{{enableZoom}}\"\n        enable-rotate=\"{{enableRotate}}\"\n        enable-satellite=\"{{enableSatellite}}\"\n        enable-traffic=\"{{enableTraffic}}\"\n        enable-overlooking=\"{{enableOverlooking}}\"\n        enable-scroll=\"{{enableScroll}}\"\n        polygons=\"{{drawPolygon ? polygons : []}}\"\n      >\n      </map>\n    </view>\n  </view>\n\n  <view class=\"page-section\">\n    <view class=\"btn-area\">\n      <button  type=\"default\" bindtap=\"toggle3d\">\n        {{ !enable3d ? '启用' : '关闭'}}3D效果\n      </button>\n      <button type=\"default\" bindtap=\"toggleShowCompass\">\n        {{ !showCompass ? '显示' : '关闭' }}指南针\n      </button>\n      <button type=\"default\" bindtap=\"toggleOverlooking\">\n        {{ !enableOverlooking ? '开启' : '关闭' }}俯视支持\n      </button>\n      <button type=\"default\" bindtap=\"toggleRotate\">\n        {{ !enableRotate ? '开启' : '关闭' }}旋转支持\n      </button>\n      <button type=\"default\" bindtap=\"togglePolygon\">\n        {{ !drawPolygon ? '绘制' : '清除' }}多边形\n      </button>\n      <button type=\"default\" bindtap=\"toggleZoom\">\n        {{ !enableZoom ? '开启' : '关闭' }}缩放支持\n      </button>\n      <button type=\"default\" bindtap=\"toggleScroll\">\n        {{ !enableScroll ? '开启' : '关闭' }}拖动支持\n      </button>\n       <button type=\"default\" bindtap=\"toggleSatellite\">\n        {{ !enableSatellite ? '开启' : '关闭' }}卫星图\n      </button>\n       <button type=\"default\" bindtap=\"toggleTraffic\">\n        {{ !enableTraffic ? '开启' : '关闭' }}实时路况\n      </button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/map/map/map.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.page-section-title {\n  margin-bottom: 15px;\n}\n\n.navigator {\n  color: var(--weui-LINK);\n  display: inline-block;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/map-styles/map-styles.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'map底图样式',\n      path: 'page/component/pages/map-styles/map-styles'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/map-styles/map-styles.json",
    "content": "{\n  \"navigationBarTitleText\": \"map底图样式\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/map-styles/map-styles.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'map'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">经典</view>\n      <view class=\"page-section-ctn\">\n        <image class=\"image\" src=\"../../resources/pic/custom_map_template_1.png\"/>\n      </view>\n    </view>\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">墨渊</view>\n      <view class=\"page-section-ctn\">\n        <image class=\"image\" src=\"../../resources/pic/custom_map_template_2.png\"/>\n      </view>\n    </view>\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">白浅</view>\n      <view class=\"page-section-ctn\">\n        <image class=\"image\" src=\"../../resources/pic/custom_map_template_3.png\"/>\n      </view>\n    </view>\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">玉露</view>\n      <view class=\"page-section-ctn\">\n        <image class=\"image\" src=\"../../resources/pic/custom_map_template_4.png\"/>\n      </view>\n    </view>\n    \n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/map-styles/map-styles.wxss",
    "content": ".page-section-ctn {\n  text-align: center;\n}\n\n.image {\n  margin-top: 15px;\n  width: 245px;\n  height: 284px;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/camera/camera.js",
    "content": "const vs = `\n  attribute vec3 aPos;\n  attribute vec2 aVertexTextureCoord;\n  varying highp vec2 vTextureCoord;\n\n  void main(void){\n    gl_Position = vec4(aPos, 1);\n    vTextureCoord = aVertexTextureCoord;\n  }\n`\n\nconst fs = `\n  varying highp vec2 vTextureCoord;\n  uniform sampler2D uSampler;\n\n  void main(void) {\n    gl_FragColor = texture2D(uSampler, vTextureCoord);\n  }\n`\n\nconst vertex = [\n  -1, -1, 0.0,\n  1, -1, 0.0,\n  1, 1, 0.0,\n  -1, 1, 0.0\n]\n\nconst vertexIndice = [\n  0, 1, 2,\n  0, 2, 3\n]\n\nconst texCoords = [\n  0.0, 0.0,\n  1.0, 0.0,\n  1.0, 1.0,\n  0.0, 1.0\n]\nfunction createShader(gl, src, type) {\n  const shader = gl.createShader(type)\n  gl.shaderSource(shader, src)\n  gl.compileShader(shader)\n\n  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n    console.error(`Error compiling shader: ${gl.getShaderInfoLog(shader)}`)\n  }\n  return shader\n}\n\nconst buffers = {}\n\nfunction createRenderer(canvas, width, height) {\n  const gl = canvas.getContext('webgl')\n  if (!gl) {\n    console.error('Unable to get webgl context.')\n    return null\n  }\n\n  const info = wx.getSystemInfoSync()\n  gl.canvas.width = info.pixelRatio * width\n  gl.canvas.height = info.pixelRatio * height\n  gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)\n\n  const vertexShader = createShader(gl, vs, gl.VERTEX_SHADER)\n  const fragmentShader = createShader(gl, fs, gl.FRAGMENT_SHADER)\n\n  const program = gl.createProgram()\n  gl.attachShader(program, vertexShader)\n  gl.attachShader(program, fragmentShader)\n  gl.linkProgram(program)\n\n  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n    console.error('Unable to initialize the shader program.')\n    return null\n  }\n\n  gl.useProgram(program)\n\n  const texture = gl.createTexture()\n  gl.activeTexture(gl.TEXTURE0)\n  gl.bindTexture(gl.TEXTURE_2D, texture)\n  gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true)\n  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)\n  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)\n  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n  gl.bindTexture(gl.TEXTURE_2D, null)\n\n  buffers.vertexBuffer = gl.createBuffer()\n  gl.bindBuffer(gl.ARRAY_BUFFER, buffers.vertexBuffer)\n  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertex), gl.STATIC_DRAW)\n\n  buffers.vertexIndiceBuffer = gl.createBuffer()\n  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffers.vertexIndiceBuffer)\n  gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vertexIndice), gl.STATIC_DRAW)\n\n  const aVertexPosition = gl.getAttribLocation(program, 'aPos')\n  gl.vertexAttribPointer(aVertexPosition, 3, gl.FLOAT, false, 0, 0)\n  gl.enableVertexAttribArray(aVertexPosition)\n\n  buffers.trianglesTexCoordBuffer = gl.createBuffer()\n  gl.bindBuffer(gl.ARRAY_BUFFER, buffers.trianglesTexCoordBuffer)\n  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(texCoords), gl.STATIC_DRAW)\n\n  const vertexTexCoordAttribute = gl.getAttribLocation(program, 'aVertexTextureCoord')\n  gl.enableVertexAttribArray(vertexTexCoordAttribute)\n  gl.vertexAttribPointer(vertexTexCoordAttribute, 2, gl.FLOAT, false, 0, 0)\n\n  const samplerUniform = gl.getUniformLocation(program, 'uSampler')\n  gl.uniform1i(samplerUniform, 0)\n\n  return (arrayBuffer, width, height) => {\n    gl.bindTexture(gl.TEXTURE_2D, texture)\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, arrayBuffer)\n    gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0)\n  }\n}\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'camera',\n      path: 'packageComponent/pages/media/camera/camera'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    src: '',\n    videoSrc: '',\n    position: 'back',\n    mode: 'scanCode',\n    result: {},\n    frameWidth: 0,\n    frameHeight: 0,\n    width: 1280,\n    height: 720,\n    showCanvas: false,\n  },\n\n  onReady() {\n    this.ctx = wx.createCameraContext()\n    // const selector = wx.createSelectorQuery();\n    // selector.select('#webgl')\n    // .node(this.init)\n    // .exec()\n  },\n  init(res) {\n    if (this.listener) {\n      this.listener.stop()\n    }\n    const canvas = res.node\n    let render\n\n    // if (!render || typeof render !== 'function') return\n\n    let initDone = false\n    this.listener = this.ctx.onCameraFrame((frame) => {\n      if (initDone) {\n        render(new Uint8Array(frame.data), frame.width, frame.height)\n      } else {\n        render = createRenderer(canvas, frame.width, frame.height)\n        this.setData({\n          frameWidth: frame.width,\n          frameHeight: frame.height,\n          width: frame.width / 3,\n          height: frame.height / 3,\n        })\n        initDone = true\n      }\n    })\n    this.listener.start()\n  },\n  takePhoto() {\n    this.ctx.takePhoto({\n      quality: 'high',\n      success: (res) => {\n        this.setData({\n          src: res.tempImagePath\n        })\n      }\n    })\n  },\n  startRecord() {\n    this.ctx.startRecord({\n      success: () => {\n        console.log('startRecord')\n      }\n    })\n  },\n  stopRecord() {\n    this.ctx.stopRecord({\n      success: (res) => {\n        this.setData({\n          src: res.tempThumbPath,\n          videoSrc: res.tempVideoPath\n        })\n      }\n    })\n  },\n  togglePosition() {\n    this.setData({\n      position: this.data.position === 'front'\n        ? 'back' : 'front'\n    })\n  },\n  error(e) {\n    console.log(e.detail)\n  },\n\n  handleShowCanvas() {\n    this.setData({\n      showCanvas: !this.data.showCanvas\n    }, () => {\n      if (this.data.showCanvas) {\n        const selector = wx.createSelectorQuery()\n        selector.select('#webgl')\n          .node(this.init)\n          .exec()\n      } else if (this.listener) {\n        this.listener.stop()\n      }\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/camera/camera.json",
    "content": "{\n  \"navigationBarTitleText\": \"camera\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/camera/camera.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"camera\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'camera'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <camera\n        flash=\"off\"\n        device-position=\"{{position}}\"\n        binderror=\"error\"\n        resolution=\"high\"\n        frame-size=\"large\"\n      >\n      </camera>\n       <view wx:if=\"{{showCanvas}}\" class=\"info-container\">\n          <view style=\"margin: 10px 0\">使用实时数据帧在 canvas 组件的展示</view>\n          <view>\n            帧高度：{{ frameHeight }}  帧宽度：{{ frameWidth }}\n          </view>\n          <canvas\n            id=\"webgl\"\n            type=\"webgl\"\n            canvas-id=\"canvas\"\n            style=\"width: {{width}}px; height: {{height}}px;\"\n          >\n          </canvas>\n        </view>\n      <view class=\"btn-area first-btn\">\n        <button bindtap=\"handleShowCanvas\" type=\"primary\">{{showCanvas ? \"关闭实时帧数据模式\": \"开启实时帧数据模式\"}}</button>\n      </view>\n      <view class=\"btn-area\">\n      <button type=\"primary\" bindtap=\"togglePosition\">切换摄像头</button>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"takePhoto\">拍照</button>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"startRecord\">开始录像</button>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"stopRecord\">结束录像</button>\n      </view>\n      <view class=\"btn-area\">\n        <button type=\"primary\">\n          <navigator url=\"/packageComponent/pages/media/camera-scan-code/camera-scan-code\" hover-class=\"none\">\n            <text>扫描一维码</text>\n          </navigator>\n        </button>\n      </view>\n      <view class=\"preview-tips\">点击录像或拍照即可在下方预览效果</view>\n      <image wx:if=\"{{src}}\" mode=\"widthFix\" class=\"photo\" src=\"{{src}}\"></image>\n      <video wx:if=\"{{videoSrc}}\" class=\"video\" src=\"{{videoSrc}}\"></video>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/camera/camera.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\ncamera {\n  height: 250px;\n}\n\n.preview-tips {\n  margin: 10px 0;  \n  text-align: center;\n}\n\n.photo, .video {\n  margin-top: 25px;\n  width: 100%;\n}\n\n/* .btn-area {\n  margin-top: 0;\n} */\n\n.first-btn {\n  margin-top: 15px;\n}\n\nform {\n  margin-top: 15px;\n}\n\n.weui-cell__bd {\n  display: flex;\n  justify-content: flex-start;\n  align-items: center;\n  padding: 10px 0;\n  min-height: 30px;\n}\n\n.info-container {\n  margin: 12px;\n  text-align: center;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/camera-scan-code/camera-scan-code.json",
    "content": "{\n  \"navigationBarTitleText\": \"camera\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/camera-scan-code/camera-scan-code.less",
    "content": "// @import \"../../../../common/lib/weui.wxss\";\n\ncamera {\n  height: 500rpx;\n}\n\n.btn-area {\n  margin-top: 0;\n}\n\nform {\n  margin-top: 30rpx;\n}\n\n.weui-cell__bd {\n  display: flex;\n  justify-content: flex-start;\n  align-items: center;\n  padding: 20rpx 0;\n  min-height: 60rpx;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/camera-scan-code/camera-scan-code.ts",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'camera',\n      path: 'page/component/pages/camera-scan-code/camera-scan-code'\n    }\n  },\n\n  data: {\n    result: {}\n  },\n  onReady() {\n    wx.showModal({\n      title: '提示',\n      content: '将摄像头对准一维码即可扫描',\n      showCancel: false\n    })\n  },\n  scanCode(e) {\n    console.log('scanCode:', e)\n    this.setData({\n      result: e.detail\n    })\n  },\n  navigateBack() {\n    wx.navigateBack()\n  },\n  error(e) {\n    console.log(e.detail)\n  }\n})"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/camera-scan-code/camera-scan-code.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container\">\n  <template is=\"head\" data=\"{{title: 'camera'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-body-wrapper\">\n      <camera\n        mode=\"scanCode\"\n        flash=\"off\"\n        bindscancode=\"scanCode\"\n        binderror=\"error\"\n      >\n      </camera>\n      <view class=\"btn-area\">\n        <button type=\"primary\" bindtap=\"navigateBack\">\n          返回正常模式\n        </button>\n      </view>\n      <form>\n        <view class=\"page-section\">\n          <view class=\"weui-cells weui-cells_after-title\">\n            <view class=\"weui-cell weui-cell_input\">\n              <view class=\"weui-cell__hd\">\n                <view class=\"weui-label\">类型</view>\n              </view>\n              <view class=\"weui-cell__bd\">\n                {{ result.type }}\n              </view>\n            </view>\n            <view class=\"weui-cell weui-cell_input\">\n              <view class=\"weui-cell__hd\">\n                <view class=\"weui-label\">结果</view>\n              </view>\n              <view class=\"weui-cell__bd\">\n                {{ result.result }}\n              </view>\n            </view>\n          </view>\n        </view>\n      </form>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/channel-live/channel-live.js",
    "content": "const app = getApp()\n\nPage({\n  data: {\n    feedId: 'export/UzFfAgtgekIEAQAAAAAAQ3s56WvdaQAAAAstQy6ubaLX4KHWvLEZgBPEjYMcaThvAvSDzNPgMJpU00S4DKmOC1N5VwE8t9F-'\n  },\n  onLoad() {\n    // this.getliveinfo()\n    // this.openlive()\n    console.log('代码片段是一种迷你、可分享的小程序或小游戏项目，可用于分享小程序和小游戏的开发经验、展示组件和 API 的使用、复现开发问题和 Bug 等。可点击以下链接查看代码片段的详细文档：')\n    console.log('https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/devtools.html')\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/channel-live/channel-live.json",
    "content": "{\n  \"usingComponents\": {},\n  \"navigationBarTitleText\": \"channel-live\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/channel-live/channel-live.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"channel-live\" back=\"{{true}}\"></mp-navigation-bar>\n<template is=\"head\" data=\"{{title: 'channel-live'}}\"/>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n  <view class=\"container page\" data-weui-theme=\"{{theme}}\">\n    <view class=\"page-body\">\n      <view class=\"page-section page-section-spacing\">\n  \t    <channel-live\n          style=\"width: 300px; height: 500px\"\n  \t    \tfeed-id=\"export/UzFfAgtgekIEAQAAAAAA7UEOPV-7TQAAAAstQy6ubaLX4KHWvLEZgBPEiYIALRwBBP6BzNPgMIspjeQfphOob7LuGRJz_8UF\"\n  \t    \tfinder-user-name=\"sphiUesg6A9wDtl\"\n  \t    ></channel-live>\n      </view>\n    </view>\n    <template is=\"foot\" />\n  </view> \n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/channel-live/channel-live.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.page-section-title{\n  padding: 0;\n}\n.page-section-title{\n  margin-top: 30px;\n  position: relative;\n}\n.page-foot{\n  margin-top: 25px;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/channel-video/channel-video.js",
    "content": "// packageComponent/pages/media/channel-video/channel-video.ts\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    feedId: 'export/UzFfAgtgekIEAQAAAAAAQ3s56WvdaQAAAAstQy6ubaLX4KHWvLEZgBPEjYMcaThvAvSDzNPgMJpU00S4DKmOC1N5VwE8t9F-'\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/channel-video/channel-video.json",
    "content": "{\n  \"usingComponents\": {},\n  \"navigationBarTitleText\": \"channel-video\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/channel-video/channel-video.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"channel-video\" back=\"{{true}}\"></mp-navigation-bar>\n<template is=\"head\" data=\"{{title: 'channel-video'}}\"/>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n  <view class=\"container page\" data-weui-theme=\"{{theme}}\">\n    <view class=\"page-body\">\n      <view class=\"page-section page-section-spacing channel-video\">\n        <channel-video\n  \t    \tfeed-id=\"{{feedId}}\"\n  \t    \tfinder-user-name=\"sphiUesg6A9wDtl\"\n  \t    \tautoplay=\"{{false}}\"\n  \t    ></channel-video>\n      </view>\n    </view>\n    <template is=\"foot\"/> \n  </view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/channel-video/channel-video.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.page-section-title{\n  padding: 0;\n}\n.page-section-title{\n  margin-top: 30px;\n  position: relative;\n}\n.page-foot{\n  margin-top: 25px;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/image/image.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'image',\n      path: 'packageComponent/pages/media/image/image'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    wx.cloud.getTempFileURL({\n      fileList: [{\n        fileID: 'cloud://release-b86096.7265-release-b86096-1258211818/开发者社区.webp',\n        maxAge: 60 * 60,\n      }]\n    }).then(res => {\n      console.log(res)\n      this.setData({\n        webpImageUrl: res.fileList[0].tempFileURL\n      })\n      return res\n    }).catch(error => {\n      console.log('CLOUD：image 临时链接获取失败', error)\n    })\n  },\n  data: {\n    theme: 'light',\n    imageUrl: 'cloud://release-b86096.7265-release-b86096-1258211818/demo.jpg',\n    webpImageURL: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/image/image.json",
    "content": "{\n  \"navigationBarTitleText\": \"image\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/image/image.wxml",
    "content": "<import src=\"../../../../common/head.wxml\"/>\n<import src=\"../../../../common/foot.wxml\"/>\n\n<mp-navigation-bar title=\"image\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'image'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">Local Image</view>\n      <view class=\"page-section-ctn\">\n        <image class=\"image\" src=\"../../../resources/pic/1.jpg\"/>\n      </view>\n    </view>\n    <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">Internet Image</view>\n      <view class=\"page-section-ctn\">\n        <image class=\"image\" src=\"https://res.wx.qq.com/op_res/gNITiJpSsxIqUDS1yDf91HzMi82cW3Ty5yfvLu_NIkWH3P0vsKDmtdAcpIWMfAJN\"/>\n      </view>\n    </view>\n     <view class=\"page-section page-section-gap\">\n      <view class=\"page-section-title\">Webp Image</view>\n      <view class=\"page-section-ctn\">\n        <image class=\"image\" webp src=\"{{webpImageUrl}}\" mode=\"aspectFit\"/>\n      </view>\n    </view>\n  </view>\n\n  <template is=\"foot\"/>\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/image/image.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.page-section-ctn {\n  text-align: center;\n}\n\n.image {\n  margin-top: 15px;\n  width: 100%;\n  height: 225px;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/live-player/live-player.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'live-player',\n      path: 'packageComponent/pages/media/live-player/live-player'\n    }\n  },\n  data: {\n    theme: 'light',\n    videoSrc: ''\n  },\n  onReady() {\n    this.ctx = wx.createLivePlayerContext('player')\n  },\n  handleScanQRCode() {\n    wx.scanCode({\n      complete: (res) => {\n        const { result } = res\n        this.setData({\n          videoSrc: result\n        })\n      },\n    })\n  },\n  handleLivePlayerStateChange(e) {\n    console.log('live-player code:', e.detail.code)\n  },\n  handleLivePlayerError(e) {\n    console.error('live-player error:', e.detail.errMsg)\n  },\n  handlePlay() {\n    this.ctx.play({\n      success: () => {\n        console.log('play success')\n      },\n      fail: () => {\n        console.log('play fail')\n      }\n    })\n  },\n  handlePause() {\n    this.ctx.pause({\n      success: () => {\n        console.log('pause success')\n      },\n      fail: () => {\n        console.log('pause fail')\n      }\n    })\n  },\n  handleStop() {\n    this.ctx.stop({\n      success: () => {\n        console.log('stop success')\n      },\n      fail: () => {\n        console.log('stop fail')\n      }\n    })\n  },\n  handleResume() {\n    this.ctx.resume({\n      success: () => {\n        console.log('resume success')\n      },\n      fail: () => {\n        console.log('resume fail')\n      }\n    })\n  },\n  handleMute() {\n    this.ctx.mute({\n      success: () => {\n        console.log('mute success')\n      },\n      fail: () => {\n        console.log('mute fail')\n      }\n    })\n  },\n  handleVideoSrcInput(e) {\n    this.setData({\n      videoSrc: e.detail.value\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/live-player/live-player.json",
    "content": "{\n  \"usingComponents\": {},\n  \"navigationBarTitleText\": \"live-player\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/live-player/live-player.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'live-player'}}\"/>\n\n  <view class=\"page-body\">\n\n    <view class=\"page-section\">\n      <live-player id=\"player\" src=\"{{ videoSrc }}\" mode=\"RTC\" autoplay bindstatechange=\"handleLivePlayerStateChange\" binderror=\"handleLivePlayerError\"></live-player>\n    </view>\n\n    <view class=\"page-section\">\n      <view class=\"page-url\">视频地址 (支持flv, rtmp):</view>\n      <input class=\"input\" name=\"input\" placeholder=\"视频播放链接\" value=\"{{ videoSrc }}\" bindinput=\"handleVideoSrcInput\" />\n      <button type=\"primary\" bindtap=\"handleScanQRCode\">\n        扫码\n      </button>\n    </view>\n    <view class=\"page-section\">\n      <button bindtap=\"handlePlay\" class=\"page-body-button\" type=\"primary\">播放</button>\n      <button bindtap=\"handlePause\" class=\"page-body-button\" type=\"primary\">暂停</button>\n      <button bindtap=\"handleStop\" class=\"page-body-button\" type=\"primary\">停止</button>\n      <button bindtap=\"handleResume\" class=\"page-body-button\" type=\"primary\">恢复</button>\n      <button bindtap=\"handleMute\" class=\"page-body-button\" type=\"primary\">静音</button>\n    </view>\n  </view>\n  <template is=\"foot\" />\n</view>\n\n  \n  "
  },
  {
    "path": "miniprogram/packageComponent/pages/media/live-player/live-player.wxss",
    "content": "live-player {\n  display: flex;\n  width: 100%;\n  height: 325px;\n}\n\n.page-body-button {\n  margin-bottom: 15px;\n}\n\n.page-url {\n  margin: 0 auto 15px;\n  width: 90%;\n\n}\n\ninput {\n  width: 90%;\n  margin: 0 auto 15px;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/live-pusher/live-pusher.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'live-pusher',\n      path: 'packageComponent/pages/media/live-pusher/live-pusher'\n    }\n  },\n  data: {\n    theme: 'light',\n    videoSrc: '',\n  },\n  onReady() {\n    this.ctx = wx.createLivePusherContext('pusher')\n  },\n  handleLivePusherStateChange(e) {\n    console.log('live-pusher code:', e.detail.code)\n  },\n  handleLivePusherError(e) {\n    console.error('live-pusher error:', e.detail.errMsg)\n  },\n  handleStart() {\n    this.ctx.start({\n      success: () => {\n        console.log('start success')\n      },\n      fail: () => {\n        console.log('start fail')\n      }\n    })\n  },\n  handleScanQRCode() {\n    wx.scanCode({\n      complete: (res) => {\n        const { result } = res\n        this.setData({\n          videoSrc: result\n        })\n      },\n    })\n  },\n  handlePause() {\n    this.ctx.pause({\n      success: () => {\n        console.log('pause success')\n      },\n      fail: () => {\n        console.log('pause fail')\n      }\n    })\n  },\n  handleStop() {\n    this.ctx.stop({\n      success: () => {\n        console.log('stop success')\n      },\n      fail: () => {\n        console.log('stop fail')\n      }\n    })\n  },\n  handleResume() {\n    this.ctx.resume({\n      success: () => {\n        console.log('resume success')\n      },\n      fail: () => {\n        console.log('resume fail')\n      }\n    })\n  },\n  handleSwitchCamera() {\n    this.ctx.switchCamera({\n      success: () => {\n        console.log('switch camera success')\n      },\n      fail: () => {\n        console.log('switch camera fail')\n      }\n    })\n  },\n  handleVideoSrcInput(e) {\n    this.setData({\n      videoSrc: e.detail.value\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/live-pusher/live-pusher.json",
    "content": "{\n  \"usingComponents\": {},\n  \"navigationBarTitleText\": \"live-pusher\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/live-pusher/live-pusher.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'live-pusher'}}\"/>\n  <view class=\"page-body\">\n    \t<view class=\"page-section\">\n\t\t<live-pusher id=\"pusher\" url=\"{{ videoSrc }}\" mode=\"RTC\" autopush bindstatechange=\"handleLivePusherStateChange\" binderror=\"handleLivePusherError\"></live-pusher>\n\t</view>\n\n\t<view class=\"page-section\">\n\t\t<view class=\"page-url\">视频地址 (支持rtmp):</view>\n\t\t<input name=\"input\" placeholder=\"视频推送链接\" value=\"{{ videoSrc }}\" bindinput=\"handleVideoSrcInput\" />\n     <button type=\"primary\" bindtap=\"handleScanQRCode\">\n        扫码\n      </button>\n\t</view>\n\n\t<view class=\"page-section\">\n\t\t<button bindtap=\"handleStart\" class=\"page-body-button\" type=\"primary\">开始</button>\n\t\t<button bindtap=\"handlePause\" class=\"page-body-button\" type=\"primary\">暂停</button>\n\t\t<button bindtap=\"handleStop\" class=\"page-body-button\" type=\"primary\">停止</button>\n\t\t<button bindtap=\"handleResume\" class=\"page-body-button\" type=\"primary\">恢复</button>\n\t\t<button bindtap=\"handleSwitchCamera\" class=\"page-body-button\" type=\"primary\">切换摄像头</button>\n\t</view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/live-pusher/live-pusher.wxss",
    "content": "live-pusher {\n  display: flex;\n  margin: 11px auto;\n  height: 325px;\n}\n\n.page-body-button {\n  margin-bottom: 15px;\n}\n.page-url {\n  margin: 0 auto 15px;\n  width: 90%;\n}\n\ninput {\n  width: 90%;\n  margin: 0 auto 15px;\n}\n\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/video/picture-in-picture.js",
    "content": "Page({\n  data: {\n    theme: 'light',\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  onReady() {\n\n  },\n  onShareAppMessage() {\n    return {\n      title: '小窗模式',\n      path: 'packageComponent/pages/media/picture-in-picture/picture-in-picture'\n    }\n  },\n  // onShareAppMessage() {\n  //   return {\n  //     title: 'video',\n  //     path: 'packageComponent/pages/media/video/video'\n  //   }\n  // },\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/video/picture-in-picture.json",
    "content": "{\n  \"navigationBarTitleText\": \"video\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/video/picture-in-picture.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: '小窗模式'}}\"/>\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/video/picture-in-picture.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageComponent/pages/media/video/video.js",
    "content": "function getRandomColor() {\n  const rgb = []\n  for (let i = 0; i < 3; ++i) {\n    let color = Math.floor(Math.random() * 256).toString(16)\n    color = color.length === 1 ? `0${color}` : color\n    rgb.push(color)\n  }\n  return `#${rgb.join('')}`\n}\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'video',\n      path: 'packageComponent/pages/media/video/video'\n    }\n  },\n\n  onReady() {\n    this.videoContext = wx.createVideoContext('myVideo')\n  },\n\n  onHide() {\n\n  },\n\n  inputValue: '',\n  data: {\n    theme: 'light',\n    enableAutoRotation: true,\n    src: '',\n    danmuList:\n    [{\n      text: '第 1s 出现的弹幕',\n      color: '#ff0000',\n      time: 1\n    }, {\n      text: '第 3s 出现的弹幕',\n      color: '#ff00ff',\n      time: 3\n    }],\n  },\n\n  bindInputBlur(e) {\n    this.inputValue = e.detail.value\n  },\n\n  bindButtonTap() {\n    const that = this\n    wx.chooseVideo({\n      sourceType: ['album', 'camera'],\n      maxDuration: 60,\n      camera: ['front', 'back'],\n      success(res) {\n        that.setData({\n          src: res.tempFilePath\n        })\n      }\n    })\n  },\n\n  bindVideoEnterPictureInPicture() {\n    console.log('进入小窗模式')\n  },\n\n  bindVideoLeavePictureInPicture() {\n    console.log('退出小窗模式')\n  },\n\n  bindPlayVideo() {\n    this.videoContext.play()\n  },\n  bindSendDanmu() {\n    this.videoContext.sendDanmu({\n      text: this.inputValue,\n      color: getRandomColor()\n    })\n  },\n\n  videoErrorCallback(e) {\n    console.log('视频错误信息:')\n    console.log(e.detail.errMsg)\n  },\n  handleSwitchChange(e) {\n    this.setData({\n      enableAutoRotation: e.detail.value\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/video/video.json",
    "content": "{\n    \"navigationBarTitleText\": \"video\",\n    \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n    \"disableScroll\": true,\n    \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/video/video.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"video\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'video'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <video \n        id=\"myVideo\" \n        src=\"http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400\" \n        binderror=\"videoErrorCallback\" \n        danmu-list=\"{{danmuList}}\" \n        enable-danmu \n        danmu-btn \n        show-casting-button\n        show-screen-lock-button\n        show-center-play-btn='{{false}}' \n        show-play-btn=\"{{true}}\" \n        muted=\"{{true}}\" show-mute-btn=\"{{true}}\"\n        controls\n        picture-in-picture-mode=\"{{['push', 'pop']}}\"\n        bindenterpictureinpicture='bindVideoEnterPictureInPicture'\n        bindleavepictureinpicture='bindVideoLeavePictureInPicture'\n        enable-auto-rotation=\"{{enableAutoRotation}}\"\n      ></video>\n      <view class=\"auto-rotate-container\">\n        <view>开启自动旋转</view>\n        <view>\n          <switch model:checked=\"{{ enableAutoRotation }}\" bindchange=\"handleSwitchChange\" />\n        </view>\n      </view>\n      <view class=\"weui-cells\">\n        <view class=\"weui-cell weui-cell_input\">\n          <view class=\"weui-cell__hd\">\n            <view class=\"weui-label\">弹幕内容</view>\n          </view>\n          <view class=\"weui-cell__bd\">\n            <input bindblur=\"bindInputBlur\" class=\"weui-input\" type=\"text\" placeholder=\"在此处输入弹幕内容\" />\n          </view>\n        </view>\n      </view>\n      <view class=\"btn-area\">\n        <button bindtap=\"bindSendDanmu\" class=\"page-body-button\" type=\"primary\" formType=\"submit\">发送弹幕</button>\n      </view>\n      <view class=\"btn-area\">\n        <navigator url=\"picture-in-picture\" hover-class=\"other-navigator-hover\">\n          <button type=\"primary\" class=\"page-body-button\" bindtap=\"bindPlayVideo\">小窗模式</button>\n        </navigator>\n      </view>\n      \n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/media/video/video.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.page-section {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n}\n\n.auto-rotate-container {\n    width: 100vw;\n    padding: 20px 20px 0;\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n}\n\nvideo {\n    width: 345px;\n}\n\n.weui-cells {\n    width: 100vw;\n    margin-top: 20px;\n    padding: 0 15px;\n    text-align: left;\n}\n\n.weui-label {\n    width: 5em;\n}\n\n.btn-area {\n    display: flex;\n    flex-direction: row;\n    justify-content: center;\n}\n\n.page-body-button {\n    margin: 0;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/nav/navigator/navigate.js",
    "content": "Page({\n  data: {\n    theme: 'light'\n  },\n  onShareAppMessage() {\n    return {\n      title: 'navigatePage',\n      path: 'packageComponent/pages/nav/navigator/navigate'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad(options) {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/nav/navigator/navigate.json",
    "content": "{\n  \"navigationBarTitleText\": \"navigatePage\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/nav/navigator/navigate.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"navigatePage\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: '新建的页面'}}\"/>\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/nav/navigator/navigate.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/nav/navigator/navigator.js",
    "content": "Page({\n  data: {\n    theme: 'light'\n  },\n  onShareAppMessage() {\n    return {\n      title: 'navigator',\n      path: 'packageComponent/pages/nav/navigator/navigator'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/nav/navigator/navigator.json",
    "content": "{\n  \"navigationBarTitleText\": \"navigator\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/nav/navigator/navigator.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"navigator\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'navigator'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"btn-area\">\n      <button type=\"default\">\n        <navigator url=\"navigate?title=navigate\" open-type=\"navigate\" hover-class=\"ohter-navigator\">\n          跳转到新页面\n        </navigator>\n      </button>\n      <button type=\"default\">\n        <navigator url=\"redirect?title=redirect\" open-type=\"redirect\" hover-class=\"other-navigator-hover\">\n          在当前页打开\n        </navigator>\n      </button>\n      <button type=\"default\">\n        <navigator target=\"miniProgram\" hover-class=\"other-navigator-hover\" open-type=\"navigate\" app-id=\"wx4f1b24bdc99fa23b\" version=\"release\">\n          打开小程序\n        </navigator>\n      </button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/nav/navigator/navigator.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\nbutton .ohter-navigator {\n  background-color: #DEDEDE;\n}\nbutton .other-navigator-hover {\n  background-color: #DEDEDE;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/nav/navigator/redirect.js",
    "content": "Page({\n  data: {\n    theme: 'light'\n  },\n  onShareAppMessage() {\n    return {\n      title: 'redirectPage',\n      path: 'packageComponent/pages/nav/navigator/redirect'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad(options) {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    console.log(options)\n    this.setData({\n      title: options.title\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/nav/navigator/redirect.json",
    "content": "{\n  \"navigationBarTitleText\": \"redirectPage\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/nav/navigator/redirect.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"redirectPage\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: '当前页'}}\"/>\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/nav/navigator/redirect.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/obstacle-free/aria-component/aria-component.js",
    "content": "// miniprogram/packageComponent/pages/obstacle-free/aria-component/aria-component.js\nPage({\n  data: {\n    theme: 'light'\n  },\n  onShareAppMessage() {\n    return {\n      title: '无障碍访问',\n      path: 'packageComponent/pages/obstacle-free/aria-component/aria-component'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/obstacle-free/aria-component/aria-component.json",
    "content": "{\n  \"usingComponents\": {},\n  \"navigationBarTitleText\": \"aria-component\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/obstacle-free/aria-component/aria-component.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: '无障碍访问'}}\"/>\n  <view class=\"page-body\">\n   <view class=\"page-section\">\n      <view class=\"page-section-title\">\n        <text>无障碍访问说明</text>\n      </view>\n      <view class=\"page-section-spacing\">\n        <view class=\"text-box\">\n          <text>为了更好地满足视障人士\\n对于小程序的访问需求\\n基础库自2.7.1起，支持部分ARIA标签\\n无障碍特性在读屏模式下可以访问</text>\n        </view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">\n        <text>例子</text>\n      </view>\n      <view class=\"page-section-spacing\">\n        <view aria-role=\"button\" aria-label=\"提交表单\" style=\"text-align: center\">提交</view>\n      </view>\n    </view>\n  </view>\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/obstacle-free/aria-component/aria-component.wxss",
    "content": ".text-box{\n  margin-bottom: 35px;\n  padding: 20px 0;\n  display: flex;\n  min-height: 150px;\n  justify-content: center;\n  align-items: center;\n  text-align: center;\n  font-size: 15px;\n  color: #353535;\n  line-height: 2em;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/official-account/official-account.js",
    "content": "// miniprogram/page/component/pages/official-account/official-account.js\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    theme: 'light',\n\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/official-account/official-account.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/official-account/official-account.wxml",
    "content": "<import src=\"../../../../common/head.wxml\"/>\n<import src=\"../../../../common/foot.wxml\"/>\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'official-account'}}\"/>\n\n  <view class=\"page-body\">\n    <official-account></official-account>\n  </view>\n\n  <template is=\"foot\"/>\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/official-account/official-account.wxss",
    "content": "/* miniprogram/page/component/pages/official-account/official-account.wxss */"
  },
  {
    "path": "miniprogram/packageComponent/pages/open/ad/ad.js",
    "content": "const info = wx.getSystemInfoSync()\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'ad',\n      path: 'packageComponent/pages/open/ad/ad'\n    }\n  },\n\n  data: {\n    index: 0,\n    theme: 'light',\n    platform: info.platform\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    const res = wx.getExptInfoSync(['expt_args_2'])\n    if (res.expt_args_2 === undefined) {\n      // 返回空对象；未命中实验、实验待发布（白名单除外）或者实验结束后会命中该分支\n      /* 业务逻辑，可对齐线上 */\n    } else if (res.expt_args_2 == '0') {\n      /* 对照组业务逻辑 */\n      this.setData({\n        index: 1\n      })\n    } else if (res.expt_args_2 == '1') {\n      /* 实验组1业务逻辑 */\n      this.setData({\n        index: 2\n      })\n    } else if (res.expt_args_2 == '2') {\n      /* 实验组2业务逻辑 */\n      this.setData({\n        index: 3\n      })\n    } else {\n      /* 异常分支逻辑 */\n      console.log('error')\n    }\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/open/ad/ad.json",
    "content": "{\n  \"navigationBarTitleText\": \"ad\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/open/ad/ad.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<view class=\"container page\" data-weui-theme=\"{{ theme }}\">\n\t<template is=\"head\" data=\"{{ title: 'ad' }}\" />\n\t<view class=\"page-body\">\n\t\t<view class=\"page-section page-section-gap\" wx:if=\"{{ index === 0 }}\">\n\t\t\t<view class=\"page-section-title\">Banner-广告</view>\n\t\t\t<ad unit-id=\"adunit-d91230aeba3c61b0\"></ad>\n\t\t</view>\n\t\t<view class=\"page-section page-section-gap\" wx:if=\"{{ index === 1 }}\">\n\t\t\t<view class=\"page-section-title\">Banner 广告</view>\n\t\t\t<ad unit-id=\"adunit-d91230aeba3c61b0\"></ad>\n\t\t</view>\n\t\t<view class=\"page-section page-section-gap\">\n\t\t\t<view class=\"page-section-title\">视频广告</view>\n\t\t\t<ad unit-id=\"adunit-771e4261efbaee00\" ad-type=\"video\" ad-theme=\"white\"></ad>\n\t\t</view>\n\t\t<view class=\"page-section page-section-gap\" wx:if=\"{{ index === 2 }}\">\n\t\t\t<view class=\"page-section-title\">Banner 广告</view>\n\t\t\t<ad unit-id=\"adunit-d91230aeba3c61b0\"></ad>\n\t\t</view>\n\t\t<view class=\"page-section page-section-gap\">\n\t\t\t<view class=\"page-section-title\">原生模板广告 - 横幅</view>\n\t\t\t<ad-custom unit-id=\"adunit-50860e4a62e61914\"></ad-custom>\n\t\t</view>\n\t\t<view class=\"page-section page-section-gap\" wx:if=\"{{ index === 3 }}\">\n\t\t\t<view class=\"page-section-title\">Banner 广告</view>\n\t\t\t<ad unit-id=\"adunit-d91230aeba3c61b0\"></ad>\n\t\t</view>\n\t</view>\n\t<template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/open/ad/ad.wxss",
    "content": "/* packageComponent/pages/open/ad/ad.wxss */\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/open/open-data/open-data.js",
    "content": "Page({\n  data: {\n    theme: 'light'\n  },\n  onShareAppMessage() {\n    return {\n      title: 'open-data',\n      path: 'packageComponent/pages/open/open-data/open-data'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/open/open-data/open-data.json",
    "content": "{\n  \"navigationBarTitleText\": \"open-data\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/open/open-data/open-data.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<!--\n      <open-data type=\"userAvatarUrl\" lang=\"zh_CN\"></open-data>\n      <open-data type=\"userGender\" lang=\"zh_CN\"></open-data>\n      <open-data type=\"userNickName\" lang=\"zh_CN\"></open-data>\n      <open-data type=\"userCity\" lang=\"zh_CN\"></open-data>\n      <open-data type=\"userProvince\" lang=\"zh_CN\"></open-data>\n      <open-data type=\"userCountry\" lang=\"zh_CN\"></open-data>\n      <open-data type=\"userLanguage\" lang=\"zh_CN\"></open-data>\n-->\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'open-data'}}\"/>\n  <view class=\"page-body\">\n    <view class=\"avatar\">\n      <open-data class=\"avatar-img\" type=\"userAvatarUrl\" lang=\"zh_CN\"></open-data>\n    </view>\n    <form>\n      <view class=\"page-section\">\n        <view class=\"weui-cells weui-cells_after-title\">\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">昵称</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <view class=\"weui-input\">\n                <open-data type=\"userNickName\" lang=\"zh_CN\"></open-data>\n              </view>\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">性别</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <view class=\"weui-input\">\n                <open-data type=\"userGender\" lang=\"zh_CN\"></open-data>\n              </view>\n            </view>\n          </view>\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">地区</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <view class=\"weui-input\">\n                <open-data class=\"country\" type=\"userCountry\" lang=\"zh_CN\"></open-data>\n                <open-data class=\"province\" type=\"userProvince\" lang=\"zh_CN\"></open-data>\n                <open-data class=\"city\" type=\"userCity\" lang=\"zh_CN\"></open-data>\n              </view>\n            </view>\n          </view>\n\n\n          <view class=\"weui-cell weui-cell_input\">\n            <view class=\"weui-cell__hd\">\n              <view class=\"weui-label\">语言</view>\n            </view>\n            <view class=\"weui-cell__bd\">\n              <view class=\"weui-input\">\n                <open-data type=\"userLanguage\" lang=\"zh_CN\"></open-data>\n              </view>\n            </view>\n          </view>\n        </view>\n      </view>\n    </form>\n\n  </view>\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/open/open-data/open-data.wxss",
    "content": "\n\n.avatar {\n  display: flex;\n  justify-content: center;\n  margin-bottom: 25px;\n}\n\n.avatar-img {\n  width: 50%;\n  border-radius: 50%;\n}\n\n.country, .province, .city {\n  padding-right: 5px;\n}\n\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/open/web-view/web-view.js",
    "content": "Page({\n  data: {\n    theme: 'light'\n  },\n  onShareAppMessage() {\n    return {\n      title: 'webview',\n      path: 'packageComponent/pages/open/web-view/web-view'\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/open/web-view/web-view.json",
    "content": "{\n    \"navigationBarTitleText\": \"webview\",\n    \"renderer\": \"webview\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/open/web-view/web-view.wxml",
    "content": "<web-view src=\"https://developers.weixin.qq.com/miniprogram/introduction/\"></web-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/open/web-view/web-view.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageComponent/pages/view/cover-view/cover-view.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'cover-view',\n      path: 'packageComponent/pages/view/cover-view/cover-view'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    latitude: 23.099994,\n    longitude: 113.324520,\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/cover-view/cover-view.json",
    "content": "{\n  \"navigationBarTitleText\": \"cover-view\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/cover-view/cover-view.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'cover-view',desc:'目前原生组件均已支持同层渲染，建议使用 view 替代'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section page-section-gap\">\n      <map\n        style=\"width: 100%; height: 300px;\"\n        latitude=\"{{latitude}}\"\n        longitude=\"{{longitude}}\"\n      >\n        <cover-view class=\"cover-view\">\n          <cover-view class=\"container\">\n            <cover-view class=\"flex-wrp\" style=\"flex-direction:row;\">\n              <cover-view class=\"flex-item demo-text-1\"></cover-view>\n              <cover-view class=\"flex-item demo-text-2\"></cover-view>\n              <cover-view class=\"flex-item demo-text-3\"></cover-view>\n            </cover-view>\n          </cover-view>\n        </cover-view>\n      </map>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/cover-view/cover-view.wxss",
    "content": ".cover-view {\n  position: absolute;\n  top: calc(50% - 75px);\n  left: calc(50% - 150px);\n  /* opacity: .7; */\n}\n\n.flex-wrp{\n  display:flex;\n}\n\n.flex-item{\n  width: 100px;\n  height: 150px;\n  font-size: 13px;\n}\n\n.demo-text-1 {\n  background: rgba(26, 173, 25, 0.7);\n}\n\n.demo-text-2 {\n  background: rgba(39, 130, 215, 0.7);\n}\n\n.demo-text-3 {\n  background: rgba(255, 255, 255, 0.7);\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/grid-view/demo-1/demo-1.js",
    "content": "import { generateGridList } from '../../../../../util/util.js'\n\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    crossAxisCount: 4,\n    crossAxisGap: 8,\n    mainAxisGap: 4,\n    gridList: generateGridList(1000, 4),\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad(options) {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/grid-view/demo-1/demo-1.json",
    "content": "{\n    \"usingComponents\": {\n      \"grid-tile\": \"../../../../../components/grid-tile/index\"\n    },\n    \"renderer\": \"skyline\",\n    \"componentFramework\": \"glass-easel\"\n  }"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/grid-view/demo-1/demo-1.wxml",
    "content": "<scroll-view scroll-y style=\"width: 100%; height: 100%;\" type=\"custom\">\n  <grid-view type=\"masonry\" cross-axis-count=\"{{crossAxisCount}}\" cross-axis-gap=\"{{crossAxisGap}}\" main-axis-gap=\"{{mainAxisGap}}\">\n    <grid-tile style=\"display: block;\" wx:for=\"{{gridList}}\" wx:key=\"id\" index=\"{{item.id}}\" height=\"{{100 * item.sub}}\"></grid-tile>\n  </grid-view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/grid-view/demo-1/demo-1.wxss",
    "content": ".header {\n  height: 100px;\n}\n\n.cell {\n  height: 50px; \n  justify-content: center;\n  align-items: center;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/grid-view/demo-2/demo-2.js",
    "content": "// grid-demo-2/index.js\nimport { generateGridList } from '../../../../../util/util.js'\n\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    crossAxisCount: 4,\n    crossAxisGap: 4,\n    mainAxisGap: 4,\n    gridList: generateGridList(1000, 4),\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad(options) {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/grid-view/demo-2/demo-2.json",
    "content": "{\n    \"usingComponents\": {\n      \"grid-tile\": \"../../../../../components/grid-tile/index\"\n    },\n    \"renderer\": \"skyline\",\n    \"componentFramework\": \"glass-easel\"\n  }"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/grid-view/demo-2/demo-2.wxml",
    "content": "<scroll-view scroll-y style=\"width: 100%; height: 100%;\" type=\"custom\">\n  <grid-view type=\"aligned\" cross-axis-count=\"{{crossAxisCount}}\" cross-axis-gap=\"{{crossAxisGap}}\" main-axis-gap=\"{{mainAxisGap}}\">\n    <grid-tile style=\"display: block;\" wx:for=\"{{gridList}}\" wx:key=\"id\" index=\"{{item.id}}\" height=\"{{100 * item.sub}}\"></grid-tile>\n  </grid-view>\n</scroll-view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/grid-view/demo-2/demo-2.wxss",
    "content": ".header {\n  height: 100px;\n}\n\n.cell {\n  height: 50px; \n  justify-content: center;\n  align-items: center;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/grid-view/grid-view.js",
    "content": "const app = getApp()\n\nPage({\n  data: {\n  },\n  onLoad() {\n    console.log('代码片段是一种迷你、可分享的小程序或小游戏项目，可用于分享小程序和小游戏的开发经验、展示组件和 API 的使用、复现开发问题和 Bug 等。可点击以下链接查看代码片段的详细文档：')\n    console.log('https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/devtools.html')\n  },\n\n  go1() {\n    wx.navigateTo({\n      url: './demo-1/demo-1',\n    })\n  },\n\n  goGrid1() {\n    wx.navigateTo({\n      url: './demo-2/demo-2',\n    })\n  },\n\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/grid-view/grid-view.json",
    "content": "{\n    \"navigationBarTitleText\": \"view\",\n    \"componentFramework\": \"glass-easel\",\n    \"renderer\": \"skyline\",\n    \"disableScroll\": true,\n    \"navigationStyle\": \"custom\"\n  }\n  "
  },
  {
    "path": "miniprogram/packageComponent/pages/view/grid-view/grid-view.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<mp-navigation-bar title=\"grid-view\"back=\"{{true}}\"></mp-navigation-bar>\n<view class=\"container page-body\">\n   <view class=\"grid-aligned-title\">\n    <view>grid-view高度由同行最大高度子节点决定</view>\n    <button class=\"btn\" type=\"primary\" bind:tap=\"go1\">grid aligned</button>\n   </view>\n  \n    <view class=\"grid-aligned-title page-body\">\n        <view>grid-view根据子元素高度自动布局</view>\n         <button class=\"btn\" type=\"primary\" bind:tap=\"goGrid1\">grid masonry</button>\n    </view>\n</view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/grid-view/grid-view.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n.container {\n    margin-top: 150px;\n    min-height: 42%;\n  }\n  \n  .btn {\n    margin-top: 15px;\n    line-height: 42px;\n  }\n.grid-aligned-title{\n    font-size: 16px;\n    color: #999999;  \n    padding-left: 15px;\n    margin-bottom: 80px;\n  }\n.grid-masonry-title{\n    font-size: 16px;\n    color: #999999;\n    padding-left: 15px;\n \n  }"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/match-media/match-media.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'match-media',\n      path: 'packageComponent/pages/view/match-media/match-media'\n    }\n  },\n\n  data: {\n    theme: 'light'\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/match-media/match-media.json",
    "content": "{\n    \"navigationBarTitleText\": \"match-media\",\n    \"pageOrientation\": \"auto\",\n    \"renderer\": \"webview\"\n  }"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/match-media/match-media.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n    <template is=\"head\" data=\"{{title: 'movable-view'}}\" />\n    <view class=\"page-body\">\n        <view class=\"page-section page-section-gap\">\n            <view class=\"text\">当页面宽度在 200 ~ 600 px 之间时展示下面方块</view>\n            <match-media min-width=\"200\" max-width=\"600\">\n                <view class=\"content1\"></view>\n            </match-media>\n            <view>当页面高度不小于 150 px 且屏幕方向为纵向时展示下面方块</view>\n            <match-media min-height=\"150\" orientation=\"landscape\">\n                <view class=\"content2\"></view>\n            </match-media>\n        </view>\n    </view>\n    <template is=\"foot\" />\n</view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/match-media/match-media.wxss",
    "content": ".text{\n    margin-bottom: 20px;\n}\n\n.content1 {\n    margin: 30px 0;\n    background-color: aqua;\n    height: 200px;\n}\n\n.content2 {\n    margin: 30px 0;\n    background-color: aquamarine;\n    height: 200px;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/movable-view/movable-view.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'movable-view',\n      path: 'packageComponent/pages/view/movable-view/movable-view'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    x: 0,\n    y: 0,\n    scale: 2,\n  },\n\n  tap() {\n    this.setData({\n      x: 30,\n      y: 30\n    })\n  },\n\n  tap2() {\n    this.setData({\n      scale: 3\n    })\n  },\n\n  onChange(e) {\n    console.log(e.detail)\n  },\n\n  onScale(e) {\n    console.log(e.detail)\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/movable-view/movable-view.json",
    "content": "{\n  \"navigationBarTitleText\": \"movable-view\",\n  \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/movable-view/movable-view.wxml",
    "content": "<import src=\"../../../../common/head.wxml\"/>\n<import src=\"../../../../common/foot.wxml\"/>\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'movable-view'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-section-title first\">movable-view区域小于movable-area</view>\n      <movable-area>\n        <movable-view x=\"{{x}}\" y=\"{{y}}\" direction=\"all\">text</movable-view>\n      </movable-area>\n    </view>\n    <view class=\"btn-area\">\n      <button bindtap=\"tap\" class=\"page-body-button\" type=\"primary\">点击移动到 (30px, 30px)</button>\n    </view>\n\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">movable-view区域大于movable-area</view>\n      <movable-area>\n        <movable-view class=\"max\" direction=\"all\">text</movable-view>\n      </movable-area>\n    </view>\n\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">只可以横向移动</view>\n      <movable-area>\n        <movable-view direction=\"horizontal\">text</movable-view>\n      </movable-area>\n    </view>\n\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">只可以纵向移动</view>\n      <movable-area>\n        <movable-view direction=\"vertical\">text</movable-view>\n      </movable-area>\n    </view>\n\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">可超出边界</view>\n      <movable-area>\n        <movable-view direction=\"all\" out-of-bounds>text</movable-view>\n      </movable-area>\n    </view>\n\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">带有惯性</view>\n      <movable-area>\n        <movable-view direction=\"all\" inertia>text</movable-view>\n      </movable-area>\n    </view>\n\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">可放缩</view>\n      <movable-area scale-area>\n        <movable-view direction=\"all\" bindchange=\"onChange\" bindscale=\"onScale\" scale scale-min=\"0.5\" scale-max=\"4\" scale-value=\"{{scale}}\">text</movable-view>\n      </movable-area>\n    </view>\n\n    <view class=\"btn-area\">\n      <button bindtap=\"tap2\" class=\"page-body-button\" type=\"primary\">点击放大3倍</button>\n    </view>\n  </view>\n  <template is=\"foot\"/>\n  \n</view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/movable-view/movable-view.wxss",
    "content": "movable-view {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  height: 50px;\n  width: 50px;\n  background: #1AAD19;\n  color: #fff;  \n}\n\nmovable-area {\n  height: 200px;\n  width: 200px;\n  margin: 25px 0px 0 25px;\n  background-color: #ccc;\n  overflow: hidden;\n}\n.max {\n  width: 300px;\n  height: 300px;\n}\n.page-section {\n  width: 100%;\n  margin-bottom: 10px;\n}\n\n.page-section-title {\n  margin-top: 25px;\n  font-size: 14px;\n  color: #999999;\n  margin-bottom: 5px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n\n.page-section-title.first {\n  margin-top: 0;\n}\n.btn-area {\n  margin-top: 10px;\n  padding-bottom: 50px;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/page-container/page-container.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'page-container',\n      path: 'packageComponent/pages/view/page-container/page-container'\n    }\n  },\n  data: {\n    theme: 'light',\n    show: false,\n    duration: 300,\n    position: 'right',\n    round: false,\n    overlay: true,\n    customStyle: '',\n    overlayStyle: ''\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  doPopup(position) {\n    let customStyle = ''\n    const duration = this.data.duration\n    switch (position) {\n      case 'top':\n      case 'bottom':\n        customStyle = 'height: 30%;'\n        break\n      case 'right':\n        break\n    }\n    this.setData({\n      position,\n      customStyle,\n      duration\n    }, () => {\n      this.setData({ show: true })\n    })\n  },\n  popup(e) {\n    const position = e.currentTarget.dataset.position\n    this.doPopup(position)\n  },\n  changeRound() {\n    this.setData({ round: !this.data.round })\n    this.doPopup('bottom')\n  },\n  changeOverlay() {\n    this.setData({ overlay: !this.data.overlay })\n    this.doPopup('bottom')\n  },\n  changeOverlayStyle(e) {\n    let overlayStyle = ''\n    const type = e.currentTarget.dataset.type\n    switch (type) {\n      case 'black':\n        overlayStyle = 'background-color: rgba(0, 0, 0, 0.7)'\n        break\n      case 'white':\n        overlayStyle = 'background-color: rgba(255, 255, 255, 0.7)'\n        break\n      case 'blur':\n        overlayStyle = 'background-color: rgba(0, 0, 0, 0.7); filter: blur(4px);'\n    }\n    this.setData({ overlayStyle })\n    this.doPopup('bottom')\n  },\n  exit() {\n    this.setData({ show: false })\n  },\n  onBeforeEnter(res) {\n    console.log(res)\n  },\n  onEnter(res) {\n    console.log(res)\n  },\n  onAfterEnter(res) {\n    console.log(res)\n  },\n  onBeforeLeave(res) {\n    console.log(res)\n  },\n  onLeave(res) {\n    console.log(res)\n  },\n  onAfterLeave(res) {\n    console.log(res)\n  },\n  onClickOverlay(res) {\n    console.log(res)\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/page-container/page-container.json",
    "content": "{\n    \"navigationBarTitleText\": \"page-container\",\n    \"componentFramework\": \"glass-easel\",\n    \"renderer\": \"skyline\",\n    \"disableScroll\": true,\n    \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/page-container/page-container.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<mp-navigation-bar title=\"page-container\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n    <view class=\"container page\" data-weui-theme=\"{{theme}}\">\n        <template is=\"head\" data=\"{{title: 'page-container'}}\" />\n        <view class=\"page-body\">\n            <view class=\"page-section page-section-gap\">\n                <view class=\"title\">弹出位置</view>\n                <view class=\"box\">\n                    <button class=\"btn\" bindtap=\"popup\" data-position=\"right\">右侧弹出</button>\n                    <button class=\"btn\" bindtap=\"popup\" data-position=\"top\">顶部弹出</button>\n                    <button class=\"btn\" bindtap=\"popup\" data-position=\"bottom\">底部弹出</button>\n                    <button class=\"btn\" bindtap=\"popup\" data-position=\"center\">中央弹出</button>\n                </view>\n                <view class=\"title\">弹窗圆角</view>\n                <view class=\"box\">\n                    <button class=\"btn\" bindtap=\"changeRound\">设置{{round ? '直角' : '圆角'}}</button>\n                </view>\n                <view class=\"title\">遮罩层</view>\n                <view class=\"box\">\n                    <button class=\"btn\" bindtap=\"changeOverlay\">设置{{overlay ? '无' : '有'}}遮罩</button>\n                    <button class=\"btn\" bindtap=\"changeOverlayStyle\" data-type=\"black\">\n                        黑色半透明遮罩\n                    </button>\n                    <button class=\"btn\" bindtap=\"changeOverlayStyle\" data-type=\"white\">\n                        白色半透明遮罩\n                    </button>\n                    <button class=\"btn\" bindtap=\"changeOverlayStyle\" data-type=\"blur\">模糊遮罩</button>\n                </view>\n            </view>\n        </view>\n        <template is=\"foot\" />\n    </view>\n</scroll-view>\n<page-container show=\"{{show}}\" round=\"{{round}}\" overlay=\"{{overlay}}\" duration=\"{{duration}}\" position=\"{{position}}\" close-on-slide-down=\"{{false}}\" bindbeforeenter=\"onBeforeEnter\" bindenter=\"onEnter\" bindafterenter=\"onAfterEnter\" bindbeforeleave=\"onBeforeLeave\" bindleave=\"onLeave\" bindafterleave=\"onAfterLeave\" bindclickoverlay=\"onClickOverlay\" custom-style=\"{{customStyle}}\" overlay-style=\"{{overlayStyle}}\">\n    <view class=\"detail-page\">\n        <button type=\"primary\" bindtap=\"exit\">推出</button>\n    </view>\n</page-container>"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/page-container/page-container.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n.title {\n    margin: 0;\n    padding: 0px 16px 16px;\n    color: rgba(69, 90, 100, 0.6);\n    font-weight: normal;\n    font-size: 18px;\n    line-height: 20px;\n    text-align: center;\n  }\n  \n  .btn {\n    display: block;\n    width: 100%;\n    margin: 10px 0;\n    background-color: #fff;\n  }\n.detail-page {\n    width: 100%;\n    height: 100%;\n    min-height: 300px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/root-portal/root-portal.js",
    "content": "const app = getApp()\nPage({\n  data: {\n    items: [{}],\n    show: false,\n  },\n  onLoad() {\n    const items = []\n    for (let i = 0; i < 200; i++) {\n      const item = {}\n      //   const r = Math.floor(255 * Math.random())\n      //   const g = Math.floor(255 * Math.random())\n      //   const b = Math.floor(255 * Math.random())\n      //   item.bg = `background-color: rgb(${r}, ${g}, ${b})`\n\n      const r = Math.floor(Math.random() * (229 - 105) + 105)// 生成固定灰色\n      item.bg = `background-color: rgb(${r}, ${r}, ${r})`\n      items.push(item)\n    }\n    this.setData({ items })\n  },\n  tap() {\n    this.setData({ show: true })\n  },\n  handleStatus(e) {\n    this.setData({ show: false })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/root-portal/root-portal.json",
    "content": "{\n  \"usingComponents\": {\n    \"popup\": \"../../../../components/popup/index\"\n  },\n  \"navigationBarTitleText\": \"root-portal\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/root-portal/root-portal.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<mp-navigation-bar title=\"root-portal\" back=\"{{true}}\"></mp-navigation-bar>\n<template is=\"head\" data=\"{{title: 'root-portal'}}\"/>\n<view style=\"padding: 20px;text-align: center;\">点击下面方块打开全局弹窗</view> \n<scroll-view type=\"list\" scroll-y style=\"width: 100%; overflow: auto; height: 500px;\">\n  <view style=\"background-color: #6bbc7a; height: 200px; position: relative;\" bindtap=\"tap\">\n    <popup show=\"{{show}}\" style=\"display: flex; width: 100%; height: 100%;\">\n      <view class=\"dialog\">我是全局弹窗</view>\n    </popup>\n  </view>\n  <view wx:for=\"{{items}}\" wx:key=\"index\" style=\"height: 50px; {{item.bg}}\" bindtap=\"tap\"></view>\n  <view class=\"item-title\">abc</view>\n</scroll-view>\n<template is=\"foot\"/>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/root-portal/root-portal.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n.dialog {\n    height: 100px;\n    width: 200px;\n    border-radius: 10px;\n    background-color: white;\n    border: .5px solid #EEE;\n    display: flex;\n    flex-direction: row;\n    justify-content: center;\n    align-items: center;\n}\n  "
  },
  {
    "path": "miniprogram/packageComponent/pages/view/scroll-view/scroll-view.js",
    "content": "const order = ['demo1', 'demo2', 'demo3']\n\nPage({\n  data: {\n    theme: 'light'\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    this.animate('#scroll-sample-object1', [{\n      borderRadius: '0',\n      offset: 0,\n    }, {\n      borderRadius: '25%',\n      offset: 0.5,\n    }, {\n      borderRadius: '50%',\n      offset: 1\n    }], 2000, {\n      scrollSource: '#scroll-view_D',\n      timeRange: 2000,\n      startScrollOffset: 0,\n      endScrollOffset: 150,\n    })\n\n    this.animate('#scroll-sample-object2', [{\n      opacity: 1,\n      offset: 0,\n    }, {\n      opacity: 0.5,\n      offset: 0.5,\n    }, {\n      opacity: 0.3,\n      offset: 1\n    }], 2000, {\n      scrollSource: '#scroll-view_D',\n      timeRange: 2000,\n      startScrollOffset: 150,\n      endScrollOffset: 300,\n    })\n\n    this.animate('#scroll-sample-object3', [{\n      background: 'white',\n      offset: 0,\n    }, {\n      background: 'yellow',\n      offset: 1\n    }], 2000, {\n      scrollSource: '#scroll-view_D',\n      timeRange: 2000,\n      startScrollOffset: 300,\n      endScrollOffset: 400,\n    })\n  },\n  onPulling(e) {\n    console.log('onPulling:', e)\n  },\n  onRefresh() {\n    if (this._freshing) return\n    this._freshing = true\n    setTimeout(() => {\n      this.setData({\n        triggered: false,\n      })\n      this._freshing = false\n    }, 3000)\n  },\n  onRestore(e) {\n    console.log('onRestore:', e)\n  },\n  onAbort(e) {\n    console.log('onAbort', e)\n  },\n  onShareAppMessage() {\n    return {\n      title: 'scroll-view',\n      path: 'packageComponent/pages/view/scroll-view/scroll-view'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    toView: 'green',\n    triggered: false,\n  },\n\n  upper(e) {\n    console.log(e)\n  },\n\n  lower(e) {\n    console.log(e)\n  },\n\n  scroll(e) {\n    console.log(e)\n  },\n\n  scrollToTop() {\n    this.setAction({\n      scrollTop: 0\n    })\n  },\n\n  tap() {\n    for (let i = 0; i < order.length; ++i) {\n      if (order[i] === this.data.toView) {\n        this.setData({\n          toView: order[i + 1],\n          scrollTop: (i + 1) * 200\n        })\n        break\n      }\n    }\n  },\n\n  tapMove() {\n    this.setData({\n      scrollTop: this.data.scrollTop + 10\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/scroll-view/scroll-view.json",
    "content": "{\n  \"navigationBarTitleText\": \"scroll-view\",\n  \"pageOrientation\": \"auto\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\",\n  \"componentFramework\": \"glass-easel\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/scroll-view/scroll-view.wxml",
    "content": "\n<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"scroll-view\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'scroll-view'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">\n        <text>Vertical Scroll</text>\n        <text>纵向滚动</text>\n      </view>\n      <view class=\"page-section-spacing\">\n        <scroll-view scroll-y type=\"list\" style=\"height: 150px;\" bindscrolltoupper=\"upper\" bindscrolltolower=\"lower\" bindscroll=\"scroll\" scroll-into-view=\"{{toView}}\" scroll-top=\"{{scrollTop}}\">\n          <view id=\"demo1\" class=\"scroll-view-item demo-text-1\">A</view>\n          <view id=\"demo2\"  class=\"scroll-view-item demo-text-2\">B</view>\n          <view id=\"demo3\" class=\"scroll-view-item demo-text-3\">C</view>\n        </scroll-view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">\n        <text>Horizontal Scroll</text>\n        <text>横向滚动</text>\n      </view>\n      <view class=\"page-section-spacing\">\n        <scroll-view class=\"scroll-view_H\" scroll-x type=\"list\" enable-flex bindscroll=\"scroll\" style=\"width: 100%; height: 150px; flex-direction: row;\">\n          <view id=\"demo1\" class=\"scroll-view-item_H demo-text-1\">A</view>\n          <view id=\"demo2\"  class=\"scroll-view-item_H demo-text-2\">B</view>\n          <view id=\"demo3\" class=\"scroll-view-item_H demo-text-3\">C</view>\n        </scroll-view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">\n        <text>自定义下拉刷新</text>\n        <text>自定义：</text>\n      </view>\n      <view class=\"page-section-spacing\">\n        <scroll-view type=\"list\"\n          scroll-y style=\"width: 100%; height: 400px;\"\n          refresher-enabled=\"{{true}}\"\n          refresher-threshold=\"{{80}}\"\n          refresher-default-style=\"none\"\n          refresher-background=\"lightgreen\"\n          bindrefresherpulling=\"{{refresh.onPulling}}\"\n        >\n          <view slot=\"refresher\" class=\"refresh-container\"\n            style=\"display: block; width: 100%; height: 80px; background: #ECBDF0; display: flex; align-items: center;\"\n          >\n            <view class=\"view1\" style=\"position: absolute; color: white; text-align: center; width: 100%;\">\n              下拉刷新\n            </view>\n          </view>\n\n          <view id=\"demo1\" class=\"scroll-view-item demo-text-1\">A</view>\n          <view id=\"demo2\" class=\"scroll-view-item demo-text-2\">B</view>\n          <view id=\"demo3\" class=\"scroll-view-item demo-text-3\">C</view>\n        </scroll-view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">\n        <text>默认：</text>\n      </view>\n      <view class=\"page-section-spacing\">\n        <scroll-view type=\"list\"\n          scroll-y style=\"width: 100%; height: 400px;\"\n          refresher-enabled=\"{{true}}\"\n          refresher-threshold=\"{{100}}\"\n          refresher-default-style=\"white\"\n          refresher-background=\"lightgreen\"\n          refresher-triggered=\"{{triggered}}\"\n          bindrefresherpulling=\"onPulling\"\n          bindrefresherrefresh=\"onRefresh\"\n          bindrefresherrestore=\"onRestore\"\n          bindrefresherabort=\"onAbort\"\n        >\n          <view id=\"demo1\" class=\"scroll-view-item demo-text-1\">A</view>\n          <view id=\"demo2\"  class=\"scroll-view-item demo-text-2\">B</view>\n          <view id=\"demo3\" class=\"scroll-view-item demo-text-3\">C</view>\n        </scroll-view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">\n        <text>滚动驱动动画</text>\n      </view>\n      <view class=\"page-section-spacing\">\n        <scroll-view type=\"list\"\n         id=\"scroll-view_D\" scroll-y=\"true\" style=\"height: 150px;\" bindscrolltoupper=\"upper\" bindscrolltolower=\"lower\" bindscroll=\"scroll\" scroll-into-view=\"{{toView}}\" scroll-top=\"{{scrollTop}}\">\n          <view class=\"scroll-view-item demo-text-1\" id=\"scroll-sample-object1\">A</view>\n          <view class=\"scroll-view-item demo-text-2\" id=\"scroll-sample-object2\">B</view>\n          <view class=\"scroll-view-item demo-text-3\" id=\"scroll-sample-object3\">C</view>\n        </scroll-view>\n      </view>\n    </view>\n  </view>\n  <template is=\"foot\" />\n</view>\n</scroll-view>\n\n\n<wxs module=\"refresh\"> // 先不切 glass-easel\n\nmodule.exports = {\n  onPulling: function(evt, instance) {\n    var p = Math.min(evt.detail.dy / 80, 1)\n    console.log(p)\n    var view = instance.selectComponent('.refresh-container')\n    view.setStyle({\n      opacity: p,\n      transform: \"scale(\" + p + \")\"\n    })\n  }\n}\n\n</wxs>"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/scroll-view/scroll-view.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.page-section-spacing{\n  margin-top: 30px;\n}\n.scroll-view_H{\n  white-space: nowrap;\n}\n.scroll-view-item{\n  height: 150px;\n}\n.scroll-view-item_H{\n  width: 200px;\n  height: 150px;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/sticky/sticky-header/sticky-header.js",
    "content": "// demo-1/index.js\nimport { generateList } from '../../../../../util/util'\n\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    list: generateList(20),\n  },\n\n  back() {\n    wx.navigateBack({})\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad(options) {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/sticky/sticky-header/sticky-header.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"skyline\",\n  \"componentFramework\": \"glass-easel\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/sticky/sticky-header/sticky-header.wxml",
    "content": "<scroll-view scroll-y style=\"width: 100%; height: 100%;\" type=\"custom\">\n  <sticky-section>\n    <sticky-header>\n      <view class=\"header\" style=\"background-color: #78b5fe;\"></view>\n    </sticky-header>\n    <list-view>\n      <view class=\"cell\" wx:for=\"{{list}}\" wx:key=\"id\" style=\"background-color: {{item.color}};\">\n        list item {{index}}\n      </view>\n    </list-view>\n  </sticky-section>\n  <sticky-section>\n    <sticky-header>\n      <view class=\"header\" style=\"background-color: #6bbc7a;\"></view>\n    </sticky-header>\n    <list-view>\n      <view class=\"cell\" wx:for=\"{{list}}\" wx:key=\"id\" style=\"background-color: {{item.color}};\">\n        list item {{index}}\n      </view>\n    </list-view>\n  </sticky-section>\n</scroll-view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/sticky/sticky-header/sticky-header.wxss",
    "content": ".header {\n  height: 100px;\n}\n\n.cell {\n  height: 50px; \n  justify-content: center;\n  align-items: center;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/sticky/sticky-section/sticky-section.js",
    "content": "// demo-2/index.js\nimport { generateList } from '../../../../../util/util'\n\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    list: generateList(20),\n  },\n\n  back() {\n    wx.navigateBack({})\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad(options) {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/sticky/sticky-section/sticky-section.json",
    "content": "{\n  \"renderer\": \"skyline\",\n  \"componentFramework\": \"glass-easel\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/sticky/sticky-section/sticky-section.wxml",
    "content": "<scroll-view scroll-y style=\"width: 100%; height: 100%;\" type=\"custom\">\n  <sticky-section push-pinned-header=\"{{false}}\">\n    <sticky-header>\n      <view class=\"header\" style=\"background-color:#78b5fe;\"></view>\n    </sticky-header>\n    <list-view>\n      <view class=\"cell\" wx:for=\"{{list}}\" wx:key=\"id\" style=\"background-color: {{item.color}};\">\n        list item {{index}}\n      </view>\n    </list-view>\n  </sticky-section>\n  <sticky-section>\n    <sticky-header>\n      <view class=\"header\" style=\"background-color: #6bbc7a;\"></view>\n    </sticky-header>\n    <list-view>\n      <view class=\"cell\" wx:for=\"{{list}}\" wx:key=\"id\" style=\"background-color: {{item.color}};\">\n        list item {{index}}\n      </view>\n    </list-view>\n  </sticky-section>\n</scroll-view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/sticky/sticky-section/sticky-section.wxss",
    "content": ".header {\n  height: 100px;\n}\n\n.cell {\n  height: 50px; \n  justify-content: center;\n  align-items: center;\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/sticky/sticky.js",
    "content": "const app = getApp()\n\nPage({\n  data: {\n  },\n  onLoad() {\n    console.log('代码片段是一种迷你、可分享的小程序或小游戏项目，可用于分享小程序和小游戏的开发经验、展示组件和 API 的使用、复现开发问题和 Bug 等。可点击以下链接查看代码片段的详细文档：')\n    console.log('https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/devtools.html')\n  },\n\n  go1() {\n    wx.navigateTo({\n      url: './sticky-header/sticky-header',\n    })\n  },\n\n  goGrid1() {\n    wx.navigateTo({\n      url: './sticky-section/sticky-section',\n    })\n  },\n\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/sticky/sticky.json",
    "content": "{\n    \"componentFramework\": \"glass-easel\",\n    \"renderer\": \"skyline\",\n    \"disableScroll\": true,\n    \"navigationStyle\": \"custom\"\n  }\n  "
  },
  {
    "path": "miniprogram/packageComponent/pages/view/sticky/sticky.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<mp-navigation-bar title=\"sticky\" back=\"{{true}}\"></mp-navigation-bar>\n<view class=\"container page-body\">\n   <view class=\"grid-aligned-title\">\n    <view >吸顶布局容器，仅支持作为 scroll-view 自定义模式下的直接子节点或 sticky-section 组件直接子节点</view>\n    <button class=\"btn\" type=\"primary\" bind:tap=\"go1\">sticky-header</button>\n   </view>\n  \n    <view class=\"grid-aligned-title  page-body\">\n        <view>吸顶布局容器，仅支持作为 scroll-view 自定义模式下的直接子节点</view>\n         <button class=\"btn\" type=\"primary\" bind:tap=\"goGrid1\">sticky-section</button>\n    </view>\n</view>"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/sticky/sticky.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n.container {\n    margin-top: 150px;\n    min-height: 42%;\n  }\n  \n  .btn {\n    line-height: 42px;\n    margin-top: 15px;\n  }\n.grid-aligned-title{\n    font-size: 16px;\n    color: #999999;  \n    padding-left: 15px;\n    margin-bottom:80px\n  }\n.grid-masonry-title{\n    font-size: 16px;\n    color: #999999;\n    padding-left: 15px;\n  }\n "
  },
  {
    "path": "miniprogram/packageComponent/pages/view/swiper/swiper.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: 'swiper',\n      path: 'packageComponent/pages/view/swiper/swiper'\n    }\n  },\n\n  data: {\n    theme: 'light',\n    background: ['A', 'B', 'C'],\n    indicatorDots: true,\n    vertical: false,\n    autoplay: false,\n    interval: 2000,\n    duration: 500\n  },\n\n  changeIndicatorDots() {\n    this.setData({\n      indicatorDots: !this.data.indicatorDots,\n    })\n  },\n\n  changeAutoplay() {\n    this.setData({\n      autoplay: !this.data.autoplay\n    })\n  },\n\n  intervalChange(e) {\n    this.setData({\n      interval: e.detail.value\n    })\n  },\n\n  durationChange(e) {\n    this.setData({\n      duration: e.detail.value\n    })\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/swiper/swiper.json",
    "content": "{\n  \"navigationBarTitleText\": \"swiper\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/swiper/swiper.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<mp-navigation-bar title=\"swiper\" back=\"{{true}}\"></mp-navigation-bar>\n<template is=\"head\" data=\"{{title: 'swiper'}}\"/>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n <view class=\"page-body\">\n    <view class=\"page-section page-section-spacing swiper\">\n      <swiper indicator-dots=\"{{indicatorDots}}\"\n        autoplay=\"{{autoplay}}\" interval=\"{{interval}}\" duration=\"{{duration}}\">\n        <block wx:for=\"{{background}}\" wx:key=\"*this\">\n          <swiper-item>\n            <view class=\"swiper-item demo-text-{{index+1}}\">{{item}}</view>\n          </swiper-item>\n        </block>\n      </swiper>\n    </view>\n    <view class=\"page-section\" style=\"margin-top: 20px;margin-bottom: 0;\">\n      <view class=\"weui-cells weui-cells_after-title\">\n        <view class=\"weui-cell weui-cell_switch\">\n          <view class=\"weui-cell__bd\" style=\"width:600rpx;\">指示点 </view>\n          <view class=\"weui-cell__ft\">\n            <radio checked=\"{{indicatorDots}}\"  catchtap=\"changeIndicatorDots\"/>\n          </view>\n        </view>\n        <view class=\"weui-cell_before\"></view>\n        <view class=\"weui-cell weui-cell_switch\">\n          <view class=\"weui-cell__bd\" style=\"width:602rpx;\">自动播放</view>\n          <view class=\"weui-cell__ft\">\n            <radio checked=\"{{autoplay}}\" catchtap=\"changeAutoplay\"/>\n          </view>\n        </view>\n       </view>\n    </view>\n    <!-- slider在skyline模式下暂时不支持  -->\n    <!-- <view class=\"page-section page-section-spacing\">\n       <view class=\"page-section-title\">\n        <text>幻灯片切换时长(ms)</text>\n        <text class=\"swiper-info\">{{duration}}</text>\n      </view>\n      <slider bindchange=\"durationChange\" value=\"{{duration}}\" min=\"500\" max=\"2000\"/>\n      <view class=\"page-section-title\">\n        <text>自动播放间隔时长(ms)</text>\n        <text class=\"swiper-info\">{{interval}}</text>\n      </view>\n      <slider bindchange=\"intervalChange\" value=\"{{interval}}\" min=\"2000\" max=\"10000\" color=\"#e9e9e9\"/>\n    </view>  -->\n  </view>\n\n  <template is=\"foot\"/> \n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/swiper/swiper.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\nbutton{\n  margin-bottom: 15px;\n}\nbutton:last-child{\n  margin-bottom: 0;\n}\n.page-section-title{\n  padding: 0;\n}\n.swiper-item{\n  height: 150px;\n}\n.page-section-title{\n  margin-top: 30px;\n  position: relative;\n}\n.swiper-info{\n  position: absolute;\n  right: 0;\n  color: #353535;\n  font-size: 15px;\n}\n.page-foot{\n  margin-top: 25px;\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/view/view.js",
    "content": "Page({\n  data: {\n    theme: 'light'\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  onShareAppMessage() {\n    return {\n      title: 'view',\n      path: 'packageComponent/pages/view/view/view'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/view/view.json",
    "content": "{\n  \"navigationBarTitleText\": \"view\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/view/view.wxml",
    "content": "<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n<mp-navigation-bar title=\"view\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'view'}}\"/>\n  <view class=\"page-body\">\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">\n        <text>flex-direction: row</text>\n        <text>横向布局</text>\n      </view>\n      <view class=\"page-section-spacing\">\n        <view class=\"flex-wrp\" style=\"flex-direction:row;\">\n          <view class=\"flex-item demo-text-1\">A</view>\n          <view class=\"flex-item demo-text-2\">B</view>\n          <view class=\"flex-item demo-text-3\">C</view>\n        </view>\n      </view>\n    </view>\n    <view class=\"page-section\">\n      <view class=\"page-section-title\">\n        <text>flex-direction: column</text>\n        <text>纵向布局</text>\n      </view>\n      <view class=\"flex-wrp\" style=\"flex-direction:column;\">\n        <view class=\"flex-item flex-item-V demo-text-1\">A</view>\n        <view class=\"flex-item flex-item-V demo-text-2\">B</view>\n        <view class=\"flex-item flex-item-V demo-text-3\">C</view>\n      </view>\n    </view>\n  </view>\n  <template is=\"foot\" />\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/packageComponent/pages/view/view/view.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.flex-wrp{\n  margin-top: 30px;\n  display:flex;\n  width: 100vw;\n  align-items: center;\n}\n.flex-item{\n  width: 100px;\n  height: 150px;\n  font-size: 13px;\n}\n.flex-item-V{\n  /* skyline不支持auto，改为 align-items: center; */\n  /* margin: 0 auto; */\n  width: 150px;\n  height: 100px;\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/base/CustomPage.js",
    "content": "import themeMixin from './behaviors/theme'\n\nconst CustomPage = function (options) {\n  return Page(\n    {\n      ...options,\n      behaviors: [themeMixin].concat(options.behaviors || []),\n      onLoad(query) {\n        const app = getApp()\n        if (this.themeChanged) {\n          this.themeChanged(app.globalData.theme)\n          app.watchThemeChange && app.watchThemeChange(this.themeChanged)\n          options.onLoad && options.onLoad.call(this, query)\n        }\n      },\n      onUnload() {\n        const app = getApp()\n        if (this.themeChanged) {\n          app.unWatchThemeChange && app.unWatchThemeChange(this.themeChanged)\n          options.onUnload && options.onUnload.call(this)\n        }\n      },\n      onShareAppMessage() {\n        const route = this.route\n        const segments = route.split('/')\n        const title = segments[segments.length - 1]\n        return {\n          title,\n          path: route,\n        }\n      },\n    }\n  )\n}\n\nexport default CustomPage\n"
  },
  {
    "path": "miniprogram/packageExtend/base/behaviors/theme.js",
    "content": "module.exports = Behavior({\n  data: {\n    theme: 'light'\n  },\n  methods: {\n    themeChanged(theme) {\n      this.setData({\n        theme\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/components/actionsheet/actionsheet.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ \t// The module cache\n    /** *** */ \tconst installedModules = {}\n    /** *** */\n    /** *** */ \t// The require function\n    /** *** */ \tfunction __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ \t\t// Check if module is in cache\n      /** *** */ \t\tif (installedModules[moduleId]) {\n        /** *** */ \t\t\treturn installedModules[moduleId].exports\n        /** *** */ \t\t}\n      /** *** */ \t\t// Create a new module (and put it into the cache)\n      /** *** */ \t\tconst module = installedModules[moduleId] = {\n        /** *** */ \t\t\ti: moduleId,\n        /** *** */ \t\t\tl: false,\n        /** *** */ \t\t\texports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ \t\t// Execute the module function\n      /** *** */ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ \t\t// Flag the module as loaded\n      /** *** */ \t\tmodule.l = true\n      /** *** */\n      /** *** */ \t\t// Return the exports of the module\n      /** *** */ \t\treturn module.exports\n      /** *** */ \t}\n    /** *** */\n    /** *** */\n    /** *** */ \t// expose the modules object (__webpack_modules__)\n    /** *** */ \t__webpack_require__.m = modules\n    /** *** */\n    /** *** */ \t// expose the module cache\n    /** *** */ \t__webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ \t// define getter function for harmony exports\n    /** *** */ \t__webpack_require__.d = function (exports, name, getter) {\n      /** *** */ \t\tif (!__webpack_require__.o(exports, name)) {\n        /** *** */ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ \t\t}\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// define __esModule on exports\n    /** *** */ \t__webpack_require__.r = function (exports) {\n      /** *** */ \t\tif (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ \t\t}\n      /** *** */ \t\tObject.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// create a fake namespace object\n    /** *** */ \t// mode & 1: value is a module id, require it\n    /** *** */ \t// mode & 2: merge all properties of value into the ns\n    /** *** */ \t// mode & 4: return value when already ns object\n    /** *** */ \t// mode & 8|1: behave like require\n    /** *** */ \t__webpack_require__.t = function (value, mode) {\n      /** *** */ \t\tif (mode & 1) value = __webpack_require__(value)\n      /** *** */ \t\tif (mode & 8) return value\n      /** *** */ \t\tif ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ \t\tconst ns = Object.create(null)\n      /** *** */ \t\t__webpack_require__.r(ns)\n      /** *** */ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ \t\tif (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ \t\treturn ns\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ \t__webpack_require__.n = function (module) {\n      /** *** */ \t\tconst getter = module && module.__esModule\n      /** *** */ \t\t\t? function getDefault() { return module.default }\n      /** *** */ \t\t\t: function getModuleExports() { return module }\n      /** *** */ \t\t__webpack_require__.d(getter, 'a', getter)\n      /** *** */ \t\treturn getter\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// Object.prototype.hasOwnProperty.call\n    /** *** */ \t__webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ \t// __webpack_public_path__\n    /** *** */ \t__webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ \t// Load entry module and return exports\n    /** *** */ \treturn __webpack_require__(__webpack_require__.s = 1)\n    /** *** */ }([\n    /* 0 */,\n    /* 1 */\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n          multipleSlots: true,\n          // 在组件定义时的选项中启用多slot支持\n        },\n        properties: {\n          title: {\n            // 标题\n            type: String,\n            value: ''\n          },\n          showCancel: {\n            // 是否显示取消按钮\n            type: Boolean,\n            value: true\n          },\n          cancelText: {\n            // 取消按钮文案\n            type: String,\n            value: '取消'\n          },\n          maskClass: {\n            // 遮罩层class\n            type: String,\n            value: ''\n          },\n          extClass: {\n            // 弹出窗 class\n            type: String,\n            value: ''\n          },\n          maskClosable: {\n            // 点击遮罩 关闭 actionsheet\n            type: Boolean,\n            value: true\n          },\n          mask: {\n            // 是否需要 遮罩层\n            type: Boolean,\n            value: true\n          },\n          show: {\n            // 是否开启 actionsheet\n            type: Boolean,\n            value: false\n          },\n          actions: {\n            // actions 列表\n            type: Array,\n            value: [],\n            // {text, extClass}\n            observer: '_groupChange'\n          }\n        },\n        methods: {\n          _groupChange(e) {\n            // 支持 一维数组 写法\n            if (e.length > 0 && typeof e[0] !== 'string' && !(e[0] instanceof Array)) {\n              this.setData({\n                actions: [this.data.actions]\n              })\n            }\n          },\n          buttonTap(e) {\n            const {\n              value,\n              groupindex,\n              index\n            } = e.currentTarget.dataset\n            this.triggerEvent('actiontap', {\n              value,\n              groupindex,\n              index\n            })\n          },\n          closeActionSheet(e) {\n            const {\n              type\n            } = e.currentTarget.dataset\n            if (this.data.maskClosable || type) {\n              // 点击 action 里面的 取消\n              this.setData({\n                show: false\n              }) // 关闭回调事件\n              this.triggerEvent('close')\n            }\n          }\n        }\n      })\n      /***/ })\n    /** *** */ ]))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/actionsheet/actionsheet.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/actionsheet/actionsheet.wxml",
    "content": "<wxs module=\"utils\">\n    var join = function(a,b) {\n        return a+b\n    };\n    var isNotSlot = function(v) {\n        return typeof v !== 'string'\n    }\n    module.exports = {\n        join: join,\n        isNotSlot: isNotSlot\n    }\n</wxs>\n\n<view wx:if=\"{{mask}}\" class=\"weui-mask {{show ? '' : 'weui-mask_hidden'}} {{maskClass}}\" bindtap=\"closeActionSheet\"></view>\n<view class=\"weui-actionsheet {{show ? 'weui-actionsheet_toggle' : ''}} {{extClass}}\">\n    <!-- 标题 -->\n    <block  wx:if=\"{{title}}\"> \n        <view class=\"weui-actionsheet__title\">\n            <view class=\"weui-actionsheet__title-text\">{{title}}</view>\n        </view>\n    </block>\n    <slot name=\"title\" wx:else></slot>\n    <view \n        class=\"{{ !showCancel && index === actions.length-1 ? 'weui-actionsheet__action' : 'weui-actionsheet__menu' }}\"\n        wx:key=\"index\"\n        wx:for-item=\"actionItem\" \n        wx:for-index=\"index\"\n        wx:for=\"{{actions}}\"\n    >\n        <block wx:if=\"{{utils.isNotSlot(actionItem)}}\">\n            <view\n                class=\"weui-actionsheet__cell {{item.type === 'warn' ? 'weui-actionsheet__cell_warn' : '' }}\" \n                wx:key=\"actionIndex\" \n                wx:for=\"{{actionItem}}\"\n                wx:for-index=\"actionIndex\"\n                data-groupindex=\"{{index}}\"\n                data-index=\"{{actionIndex}}\" \n                data-value=\"{{item.value}}\"\n                bindtap=\"buttonTap\"\n            >\n                {{item.text}}\n            </view>  \n        </block>\n        <slot name=\"{{actionItem}}\" wx:else></slot>\n    </view>\n    <!-- 取消按钮 -->\n    <view class=\"weui-actionsheet__action\" wx:if=\"{{showCancel}}\">\n        <view class=\"weui-actionsheet__cell\" data-type=\"close\" id=\"iosActionsheetCancel\" bindtap=\"closeActionSheet\">{{cancelText}}</view>\n    </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/components/actionsheet/actionsheet.wxss",
    "content": ".weui-mask.weui-mask_hidden{opacity:0;transform:scale3d(1, 1, 0)}.weui-mask{opacity:1;transform:scale3d(1, 1, 1);transition:all .3s}"
  },
  {
    "path": "miniprogram/packageExtend/components/badge/badge.js",
    "content": "Component({\n  options: {\n  },\n  properties: {\n    extClass: {\n      type: String,\n      value: ''\n    },\n    content: {\n      type: String,\n      value: ''\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/components/badge/badge.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/badge/badge.wxml",
    "content": "<view class=\"weui-badge {{extClass}} {{!content ? 'weui-badge_dot' : ''}}\">{{content}}</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/badge/badge.wxss",
    "content": ".weui-badge{display:inline-block;padding:.15em .4em;min-width:8px;border-radius:18px;background-color:#FA5151;color:#FFFFFF;line-height:1.2;text-align:center;font-size:12px;vertical-align:middle}.weui-badge_dot{padding:.4em;min-width:0}"
  },
  {
    "path": "miniprogram/packageExtend/components/cell/cell.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ \t// The module cache\n    /** *** */ \tconst installedModules = {}\n    /** *** */\n    /** *** */ \t// The require function\n    /** *** */ \tfunction __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ \t\t// Check if module is in cache\n      /** *** */ \t\tif (installedModules[moduleId]) {\n        /** *** */ \t\t\treturn installedModules[moduleId].exports\n        /** *** */ \t\t}\n      /** *** */ \t\t// Create a new module (and put it into the cache)\n      /** *** */ \t\tconst module = installedModules[moduleId] = {\n        /** *** */ \t\t\ti: moduleId,\n        /** *** */ \t\t\tl: false,\n        /** *** */ \t\t\texports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ \t\t// Execute the module function\n      /** *** */ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ \t\t// Flag the module as loaded\n      /** *** */ \t\tmodule.l = true\n      /** *** */\n      /** *** */ \t\t// Return the exports of the module\n      /** *** */ \t\treturn module.exports\n      /** *** */ \t}\n    /** *** */\n    /** *** */\n    /** *** */ \t// expose the modules object (__webpack_modules__)\n    /** *** */ \t__webpack_require__.m = modules\n    /** *** */\n    /** *** */ \t// expose the module cache\n    /** *** */ \t__webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ \t// define getter function for harmony exports\n    /** *** */ \t__webpack_require__.d = function (exports, name, getter) {\n      /** *** */ \t\tif (!__webpack_require__.o(exports, name)) {\n        /** *** */ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ \t\t}\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// define __esModule on exports\n    /** *** */ \t__webpack_require__.r = function (exports) {\n      /** *** */ \t\tif (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ \t\t}\n      /** *** */ \t\tObject.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// create a fake namespace object\n    /** *** */ \t// mode & 1: value is a module id, require it\n    /** *** */ \t// mode & 2: merge all properties of value into the ns\n    /** *** */ \t// mode & 4: return value when already ns object\n    /** *** */ \t// mode & 8|1: behave like require\n    /** *** */ \t__webpack_require__.t = function (value, mode) {\n      /** *** */ \t\tif (mode & 1) value = __webpack_require__(value)\n      /** *** */ \t\tif (mode & 8) return value\n      /** *** */ \t\tif ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ \t\tconst ns = Object.create(null)\n      /** *** */ \t\t__webpack_require__.r(ns)\n      /** *** */ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ \t\tif (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ \t\treturn ns\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ \t__webpack_require__.n = function (module) {\n      /** *** */ \t\tconst getter = module && module.__esModule\n      /** *** */ \t\t\t? function getDefault() { return module.default }\n      /** *** */ \t\t\t: function getModuleExports() { return module }\n      /** *** */ \t\t__webpack_require__.d(getter, 'a', getter)\n      /** *** */ \t\treturn getter\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// Object.prototype.hasOwnProperty.call\n    /** *** */ \t__webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ \t// __webpack_public_path__\n    /** *** */ \t__webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ \t// Load entry module and return exports\n    /** *** */ \treturn __webpack_require__(__webpack_require__.s = 9)\n    /** *** */ }({\n\n    /***/ 9:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n          multipleSlots: true\n        },\n        properties: {\n          hover: {\n            type: Boolean,\n            value: false\n          },\n          link: {\n            type: Boolean,\n            value: false\n          },\n          extClass: {\n            type: String,\n            value: ''\n          },\n          iconClass: {\n            type: String,\n            value: ''\n          },\n          bodyClass: {\n            type: String,\n            value: ''\n          },\n          icon: {\n            type: String,\n            value: ''\n          },\n          title: {\n            type: String,\n            value: ''\n          },\n          value: {\n            type: String,\n            value: ''\n          },\n          showError: {\n            type: Boolean,\n            value: false\n          },\n          prop: {\n            type: String,\n            value: ''\n          },\n          url: {\n            type: String,\n            value: ''\n          },\n          footerClass: {\n            type: String,\n            value: ''\n          },\n          footer: {\n            type: String,\n            value: ''\n          },\n          inline: {\n            type: Boolean,\n            value: true\n          },\n          hasHeader: {\n            type: Boolean,\n            value: true\n          },\n          hasFooter: {\n            type: Boolean,\n            value: true\n          },\n          hasBody: {\n            type: Boolean,\n            value: true\n          }\n        },\n        relations: {\n          '../form/form': {\n            type: 'ancestor'\n          },\n          '../cells/cells': {\n            type: 'ancestor'\n          }\n        },\n        data: {\n          inForm: false\n        },\n        methods: {\n          setError(error) {\n            this.setData({\n              error: error || false\n            })\n          },\n          setInForm() {\n            this.setData({\n              inForm: true\n            })\n          },\n          setOuterClass(className) {\n            this.setData({\n              outerClass: className\n            })\n          },\n          navigateTo: function navigateTo() {\n            const data = this.data\n            if (data.url && data.link) {\n              wx.navigateTo({\n                url: data.url,\n                success: res => {\n                  this.triggerEvent('navigatesuccess', res, {})\n                },\n                fail: fail => {\n                  this.triggerEvent('navigateerror', fail, {})\n                }\n              })\n            }\n          }\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/cell/cell.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"mp-cells\": \"../cells/cells\"\n  },\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/cell/cell.wxml",
    "content": "<block wx:if=\"{{link}}\">\n    <view bindtap=\"navigateTo\" class=\"weui-cell weui-cell_access {{extClass}} {{outerClass}}{{inForm ? ' weui-cell-inform' : ''}}{{inline ? '' : ' .weui-cell_label-block'}}\" hover-class=\"{{hover ? 'weui-cell_active' : ''}}\">\n        <view wx:if=\"{{hasHeader}}\" class=\"weui-cell__hd {{iconClass}}\">\n            <block wx:if=\"{{icon}}\">\n                <image src=\"{{icon}}\" class=\"weui-cell__icon\" mode=\"aspectFit\"></image>\n            </block>\n            <block wx:else>\n                <slot name=\"icon\"></slot>\n            </block>\n            <block wx:if=\"{{inForm}}\">\n                <block wx:if=\"{{title}}\"><view class=\"weui-label\">{{title}}</view></block>\n                <block wx:else>\n                    <slot name=\"title\"></slot>\n                </block>\n            </block>\n            <block wx:else>\n                <block wx:if=\"{{title}}\">{{title}}</block>\n                <block wx:else>\n                    <slot name=\"title\"></slot>\n                </block>\n            </block>\n        </view>\n        <view wx:if=\"{{hasBody}}\" class=\"weui-cell__bd\">\n            <block wx:if=\"{{value}}\">{{value}}</block>\n            <block wx:else>\n                <slot></slot>\n            </block>\n        </view>\n        <view wx:if=\"{{hasFooter}}\" class=\"weui-cell__ft weui-cell__ft_in-access {{footerClass}}\">\n            <block wx:if=\"{{footer}}\">{{footer}}</block>\n            <block wx:else>\n                <slot name=\"footer\"></slot>\n            </block>\n        </view>\n    </view>\n</block>\n<block wx:else>\n    <view bindtap=\"navigateTo\" class=\"weui-cell {{showError && error ? 'weui-cell_warn' : ''}} {{inForm ? 'weui-cell-inform' : ''}} {{extClass}} {{outerClass}}\" hover-class=\"{{hover ? 'weui-cell_active' : ''}}\">\n        <view wx:if=\"{{hasHeader}}\" class=\"weui-cell__hd {{iconClass}}\">\n            <block wx:if=\"{{icon}}\">\n                <image src=\"{{icon}}\" class=\"weui-cell__icon\" mode=\"aspectFit\"></image>\n            </block>\n            <block wx:else>\n                <slot name=\"icon\"></slot>\n            </block>\n            <block wx:if=\"{{inForm}}\">\n                <block wx:if=\"{{title}}\"><view class=\"weui-label\">{{title}}</view></block>\n                <block wx:else>\n                    <slot name=\"title\"></slot>\n                </block>\n            </block>\n            <block wx:else>\n                <block wx:if=\"{{title}}\">{{title}}</block>\n                <block wx:else>\n                    <slot name=\"title\"></slot>\n                </block>\n            </block>\n        </view>\n        <view wx:if=\"{{hasBody}}\" class=\"weui-cell__bd {{bodyClass}}\">\n            <block wx:if=\"{{value}}\">{{value}}</block>\n            <block wx:else>\n                <slot></slot>\n            </block>\n        </view>\n        <view wx:if=\"{{hasFooter}}\" class=\"weui-cell__ft {{footerClass}}\">\n            <block wx:if=\"{{footer}}\">{{footer}}</block>\n            <block wx:else>\n                <slot name=\"footer\"></slot>\n            </block>\n            <icon wx:if=\"{{showError && error}}\" type=\"warn\" size=\"23\" color=\"#E64340\"></icon>\n        </view>\n    </view>\n</block>"
  },
  {
    "path": "miniprogram/packageExtend/components/cell/cell.wxss",
    "content": ".weui-cell_wxss.weui-cell_wxss:before{display:block}"
  },
  {
    "path": "miniprogram/packageExtend/components/cells/cells.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ \t// The module cache\n    /** *** */ \tconst installedModules = {}\n    /** *** */\n    /** *** */ \t// The require function\n    /** *** */ \tfunction __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ \t\t// Check if module is in cache\n      /** *** */ \t\tif (installedModules[moduleId]) {\n        /** *** */ \t\t\treturn installedModules[moduleId].exports\n        /** *** */ \t\t}\n      /** *** */ \t\t// Create a new module (and put it into the cache)\n      /** *** */ \t\tconst module = installedModules[moduleId] = {\n        /** *** */ \t\t\ti: moduleId,\n        /** *** */ \t\t\tl: false,\n        /** *** */ \t\t\texports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ \t\t// Execute the module function\n      /** *** */ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ \t\t// Flag the module as loaded\n      /** *** */ \t\tmodule.l = true\n      /** *** */\n      /** *** */ \t\t// Return the exports of the module\n      /** *** */ \t\treturn module.exports\n      /** *** */ \t}\n    /** *** */\n    /** *** */\n    /** *** */ \t// expose the modules object (__webpack_modules__)\n    /** *** */ \t__webpack_require__.m = modules\n    /** *** */\n    /** *** */ \t// expose the module cache\n    /** *** */ \t__webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ \t// define getter function for harmony exports\n    /** *** */ \t__webpack_require__.d = function (exports, name, getter) {\n      /** *** */ \t\tif (!__webpack_require__.o(exports, name)) {\n        /** *** */ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ \t\t}\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// define __esModule on exports\n    /** *** */ \t__webpack_require__.r = function (exports) {\n      /** *** */ \t\tif (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ \t\t}\n      /** *** */ \t\tObject.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// create a fake namespace object\n    /** *** */ \t// mode & 1: value is a module id, require it\n    /** *** */ \t// mode & 2: merge all properties of value into the ns\n    /** *** */ \t// mode & 4: return value when already ns object\n    /** *** */ \t// mode & 8|1: behave like require\n    /** *** */ \t__webpack_require__.t = function (value, mode) {\n      /** *** */ \t\tif (mode & 1) value = __webpack_require__(value)\n      /** *** */ \t\tif (mode & 8) return value\n      /** *** */ \t\tif ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ \t\tconst ns = Object.create(null)\n      /** *** */ \t\t__webpack_require__.r(ns)\n      /** *** */ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ \t\tif (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ \t\treturn ns\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ \t__webpack_require__.n = function (module) {\n      /** *** */ \t\tconst getter = module && module.__esModule\n      /** *** */ \t\t\t? function getDefault() { return module.default }\n      /** *** */ \t\t\t: function getModuleExports() { return module }\n      /** *** */ \t\t__webpack_require__.d(getter, 'a', getter)\n      /** *** */ \t\treturn getter\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// Object.prototype.hasOwnProperty.call\n    /** *** */ \t__webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ \t// __webpack_public_path__\n    /** *** */ \t__webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ \t// Load entry module and return exports\n    /** *** */ \treturn __webpack_require__(__webpack_require__.s = 8)\n    /** *** */ }({\n\n    /***/ 8:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n          multipleSlots: true\n        },\n        properties: {\n          title: {\n            type: String,\n            value: ''\n          },\n          extClass: {\n            type: String,\n            value: ''\n          },\n          footer: {\n            type: String,\n            value: ''\n          }\n        },\n        data: {\n          firstItem: null,\n          checkboxCount: 0,\n          checkboxIsMulti: false,\n          outerClass: '',\n          childClass: ''\n        },\n        relations: {\n          '../cell/cell': {\n            type: 'descendant',\n\n            linked(target) {\n              if (!this.data.firstItem) {\n                this.data.firstItem = target\n              }\n\n              if (target !== this.data.firstItem) {\n                target.setOuterClass('weui-cell_wxss')\n              }\n            }\n          },\n          '../form-page/form-page': {\n            type: 'ancestor'\n          },\n          '../checkbox-group/checkbox-group': {\n            type: 'descendant',\n            linked(target) {\n              this.setData({\n                checkboxCount: this.data.checkboxCount + 1,\n                checkboxIsMulti: target.data.multi\n              })\n            },\n\n            unlinked(target) {\n              this.setData({\n                checkboxCount: this.data.checkboxCount - 1,\n                checkboxIsMulti: target.data.multi\n              })\n            }\n          }\n        },\n        methods: {\n          setCellMulti(multi) {\n            this.setData({\n              checkboxIsMulti: multi\n            })\n          },\n          setCellsClass(className) {\n            this.setData({\n              childClass: className\n            })\n          },\n\n          setOuterClass(className) {\n            this.setData({\n              outerClass: className\n            })\n          }\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/cells/cells.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/cells/cells.wxml",
    "content": "<view class=\"{{extClass}} weui-cells__group {{outerClass}} {{childClass}}\">\n    <view wx:if=\"{{title}}\" class=\"weui-cells__title\">{{title}}</view>\n    <view class=\"weui-cells weui-cells_after-title {{checkboxCount > 0 && checkboxIsMulti ? 'weui-cells_checkbox' : ''}}\">\n        <slot></slot>\n    </view>\n    <view wx:if=\"{{footer}}\" class=\"weui-cells__tips\">{{footer}}</view>\n    <slot name=\"footer\" wx:else></slot>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/cells/cells.wxss",
    "content": ".weui-cells__group_wxss.weui-cells__group_wxss .weui-cells__title{margin-top:24px}.weui-cells__group_form .weui-cells__tips{margin-top:8px;padding:0 32px;color:var(--weui-FG-1)}"
  },
  {
    "path": "miniprogram/packageExtend/components/checkbox/checkbox.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ \t// The module cache\n    /** *** */ \tconst installedModules = {}\n    /** *** */\n    /** *** */ \t// The require function\n    /** *** */ \tfunction __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ \t\t// Check if module is in cache\n      /** *** */ \t\tif (installedModules[moduleId]) {\n        /** *** */ \t\t\treturn installedModules[moduleId].exports\n        /** *** */ \t\t}\n      /** *** */ \t\t// Create a new module (and put it into the cache)\n      /** *** */ \t\tconst module = installedModules[moduleId] = {\n        /** *** */ \t\t\ti: moduleId,\n        /** *** */ \t\t\tl: false,\n        /** *** */ \t\t\texports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ \t\t// Execute the module function\n      /** *** */ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ \t\t// Flag the module as loaded\n      /** *** */ \t\tmodule.l = true\n      /** *** */\n      /** *** */ \t\t// Return the exports of the module\n      /** *** */ \t\treturn module.exports\n      /** *** */ \t}\n    /** *** */\n    /** *** */\n    /** *** */ \t// expose the modules object (__webpack_modules__)\n    /** *** */ \t__webpack_require__.m = modules\n    /** *** */\n    /** *** */ \t// expose the module cache\n    /** *** */ \t__webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ \t// define getter function for harmony exports\n    /** *** */ \t__webpack_require__.d = function (exports, name, getter) {\n      /** *** */ \t\tif (!__webpack_require__.o(exports, name)) {\n        /** *** */ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ \t\t}\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// define __esModule on exports\n    /** *** */ \t__webpack_require__.r = function (exports) {\n      /** *** */ \t\tif (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ \t\t}\n      /** *** */ \t\tObject.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// create a fake namespace object\n    /** *** */ \t// mode & 1: value is a module id, require it\n    /** *** */ \t// mode & 2: merge all properties of value into the ns\n    /** *** */ \t// mode & 4: return value when already ns object\n    /** *** */ \t// mode & 8|1: behave like require\n    /** *** */ \t__webpack_require__.t = function (value, mode) {\n      /** *** */ \t\tif (mode & 1) value = __webpack_require__(value)\n      /** *** */ \t\tif (mode & 8) return value\n      /** *** */ \t\tif ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ \t\tconst ns = Object.create(null)\n      /** *** */ \t\t__webpack_require__.r(ns)\n      /** *** */ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ \t\tif (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ \t\treturn ns\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ \t__webpack_require__.n = function (module) {\n      /** *** */ \t\tconst getter = module && module.__esModule\n      /** *** */ \t\t\t? function getDefault() { return module.default }\n      /** *** */ \t\t\t: function getModuleExports() { return module }\n      /** *** */ \t\t__webpack_require__.d(getter, 'a', getter)\n      /** *** */ \t\treturn getter\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// Object.prototype.hasOwnProperty.call\n    /** *** */ \t__webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ \t// __webpack_public_path__\n    /** *** */ \t__webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ \t// Load entry module and return exports\n    /** *** */ \treturn __webpack_require__(__webpack_require__.s = 24)\n    /** *** */ }({\n\n    /***/ 24:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n          multipleSlots: true\n        },\n        properties: {\n          multi: {\n            type: Boolean,\n            value: true\n          },\n          checked: {\n            type: Boolean,\n            value: false\n          },\n          value: {\n            type: String,\n            value: ''\n          },\n          label: {\n            type: String,\n            value: 'label'\n          },\n          extClass: {\n            type: String,\n            value: ''\n          }\n        },\n        data: {},\n        relations: {\n          '../checkbox-group/checkbox-group': {\n            type: 'ancestor',\n            linked: function linked(target) {\n              this.data.group = target\n            },\n            unlinked: function unlinked() {\n              this.data.group = null\n            }\n          }\n        },\n        methods: {\n          setMulti: function setMulti(multi) {\n            this.setData({\n              multi\n            })\n          },\n          setOuterClass: function setOuterClass(className) {\n            this.setData({\n              outerClass: className\n            })\n          },\n          checkedChange: function checkedChange(e) {\n            if (this.data.multi) {\n              const checked = !this.data.checked\n              this.setData({\n                checked\n              })\n              if (this.data.group) {\n                this.data.group.checkedChange(checked, this)\n              }\n            } else {\n              const _checked = this.data.checked\n              if (_checked) return\n              this.setData({\n                checked: true\n              })\n              if (this.data.group) {\n                this.data.group.checkedChange(_checked, this)\n              }\n            }\n            this.triggerEvent('change', { value: this.data.value, checked: this.data.checked })\n          }\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/checkbox/checkbox.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"mp-cell\": \"../cell/cell\",\n    \"mp-checkbox-group\": \"../checkbox-group/checkbox-group\"\n  },\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/checkbox/checkbox.wxml",
    "content": "<mp-cell\n  has-footer=\"{{!multi}}\"\n  has-header=\"{{multi}}\"\n  bindtap=\"checkedChange\"\n  ext-class=\"weui-check__label {{outerClass}} {{extClass}} {{!multi ? '^weui-cell_radio' : '^weui-cell_checkbox'}}\">\n\n  <view slot=\"icon\" wx:if=\"{{multi}}\">\n    <checkbox value=\"{{value}}\" checked=\"{{checked}}\" disabled=\"{{disabled}}\" color=\"{{color}}\" class=\"weui-check\">\n    </checkbox>\n    <icon class=\"weui-icon-checked\"></icon>\n\n  </view>\n  <view>{{label}}</view>\n  <view slot=\"footer\" wx:if=\"{{!multi}}\">\n    <radio value=\"{{value}}\" checked=\"{{checked}}\" disabled=\"{{disabled}}\" color=\"{{color}}\" class=\"weui-check\"></radio>\n    <!-- 已勾选 -->\n    <icon class=\"weui-icon-checked\"></icon>\n\n  </view>\n</mp-cell>"
  },
  {
    "path": "miniprogram/packageExtend/components/checkbox/checkbox.wxss",
    "content": ".weui-cell_radio .weui-check+.weui-icon-checked{color:transparent}.weui-check[checked]+.weui-icon-checked{color:var(--weui-BRAND);-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}"
  },
  {
    "path": "miniprogram/packageExtend/components/checkbox-group/checkbox-group.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ \t// The module cache\n    /** *** */ \tconst installedModules = {}\n    /** *** */\n    /** *** */ \t// The require function\n    /** *** */ \tfunction __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ \t\t// Check if module is in cache\n      /** *** */ \t\tif (installedModules[moduleId]) {\n        /** *** */ \t\t\treturn installedModules[moduleId].exports\n        /** *** */ \t\t}\n      /** *** */ \t\t// Create a new module (and put it into the cache)\n      /** *** */ \t\tconst module = installedModules[moduleId] = {\n        /** *** */ \t\t\ti: moduleId,\n        /** *** */ \t\t\tl: false,\n        /** *** */ \t\t\texports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ \t\t// Execute the module function\n      /** *** */ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ \t\t// Flag the module as loaded\n      /** *** */ \t\tmodule.l = true\n      /** *** */\n      /** *** */ \t\t// Return the exports of the module\n      /** *** */ \t\treturn module.exports\n      /** *** */ \t}\n    /** *** */\n    /** *** */\n    /** *** */ \t// expose the modules object (__webpack_modules__)\n    /** *** */ \t__webpack_require__.m = modules\n    /** *** */\n    /** *** */ \t// expose the module cache\n    /** *** */ \t__webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ \t// define getter function for harmony exports\n    /** *** */ \t__webpack_require__.d = function (exports, name, getter) {\n      /** *** */ \t\tif (!__webpack_require__.o(exports, name)) {\n        /** *** */ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ \t\t}\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// define __esModule on exports\n    /** *** */ \t__webpack_require__.r = function (exports) {\n      /** *** */ \t\tif (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ \t\t}\n      /** *** */ \t\tObject.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// create a fake namespace object\n    /** *** */ \t// mode & 1: value is a module id, require it\n    /** *** */ \t// mode & 2: merge all properties of value into the ns\n    /** *** */ \t// mode & 4: return value when already ns object\n    /** *** */ \t// mode & 8|1: behave like require\n    /** *** */ \t__webpack_require__.t = function (value, mode) {\n      /** *** */ \t\tif (mode & 1) value = __webpack_require__(value)\n      /** *** */ \t\tif (mode & 8) return value\n      /** *** */ \t\tif ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ \t\tconst ns = Object.create(null)\n      /** *** */ \t\t__webpack_require__.r(ns)\n      /** *** */ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ \t\tif (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ \t\treturn ns\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ \t__webpack_require__.n = function (module) {\n      /** *** */ \t\tconst getter = module && module.__esModule\n      /** *** */ \t\t\t? function getDefault() { return module.default }\n      /** *** */ \t\t\t: function getModuleExports() { return module }\n      /** *** */ \t\t__webpack_require__.d(getter, 'a', getter)\n      /** *** */ \t\treturn getter\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// Object.prototype.hasOwnProperty.call\n    /** *** */ \t__webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ \t// __webpack_public_path__\n    /** *** */ \t__webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ \t// Load entry module and return exports\n    /** *** */ \treturn __webpack_require__(__webpack_require__.s = 23)\n    /** *** */ }({\n\n    /***/ 23:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        properties: {\n          multi: {\n            type: Boolean,\n            value: true,\n            observer: '_multiChange'\n          },\n          extClass: {\n            type: String,\n            value: ''\n          },\n          prop: {\n            type: String,\n            value: ''\n          }\n        },\n        data: {\n          targetList: [],\n          parentCell: null\n        },\n        relations: {\n          '../checkbox/checkbox': {\n            type: 'descendant',\n            linked: function linked(target) {\n              this.data.targetList.push(target)\n              target.setMulti(this.data.multi)\n              if (!this.data.firstItem) {\n                this.data.firstItem = target\n              }\n              if (target !== this.data.firstItem) {\n                target.setOuterClass('weui-cell_wxss')\n              }\n            },\n            unlinked: function unlinked(target) {\n              let index = -1\n              this.data.targetList.forEach(function (item, idx) {\n                if (item === target) {\n                  index = idx\n                }\n              })\n              this.data.targetList.splice(index, 1)\n              if (!this.data.targetList) {\n                this.data.firstItem = null\n              }\n            }\n          },\n          '../form/form': {\n            type: 'ancestor'\n          },\n          '../cells/cells': {\n            type: 'ancestor',\n            linked: function linked(target) {\n              if (!this.data.parentCell) {\n                this.data.parentCell = target\n              }\n              this.setParentCellsClass()\n            },\n            unlinked: function unlinked(target) {\n              this.data.parentCell = null\n            }\n          }\n        },\n        methods: {\n          checkedChange: function checkedChange(checked, target) {\n            console.log('checked change', checked)\n            if (this.data.multi) {\n              const vals = []\n              this.data.targetList.forEach(function (item) {\n                if (item.data.checked) {\n                  vals.push(item.data.value)\n                }\n              })\n              this.triggerEvent('change', { value: vals })\n            } else {\n              let val = ''\n              this.data.targetList.forEach(function (item) {\n                if (item === target) {\n                  val = item.data.value\n                } else {\n                  item.setData({\n                    checked: false\n                  })\n                }\n              })\n              this.triggerEvent('change', { value: val }, {})\n            }\n          },\n          setParentCellsClass: function setParentCellsClass() {\n            const className = this.data.multi ? 'weui-cells_checkbox' : ''\n            if (this.data.parentCell) {\n              this.data.parentCell.setCellsClass(className)\n            }\n          },\n          _multiChange: function _multiChange(multi) {\n            this.data.targetList.forEach(function (target) {\n              target.setMulti(multi)\n            })\n            if (this.data.parentCell) {\n              this.data.parentCell.setCellMulti(multi)\n            }\n            return multi\n          }\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/checkbox-group/checkbox-group.json",
    "content": "{\n    \"component\": true,\n    \"usingComponents\": {\n        \"mp-cells\": \"../cells/cells\"\n    }\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/checkbox-group/checkbox-group.wxml",
    "content": "<checkbox-group class=\"{{extClass}}\" wx:if=\"{{multi}}\" bindchange=\"checkedChange\">\n    <slot></slot>\n</checkbox-group>\n<radio-group class=\"{{extClass}}\" wx:else bindchange=\"checkedChange\">\n    <slot></slot>\n</radio-group>"
  },
  {
    "path": "miniprogram/packageExtend/components/checkbox-group/checkbox-group.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageExtend/components/col/index.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ \t// The module cache\n    /** *** */ \tconst installedModules = {}\n    /** *** */\n    /** *** */ \t// The require function\n    /** *** */ \tfunction __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ \t\t// Check if module is in cache\n      /** *** */ \t\tif (installedModules[moduleId]) {\n        /** *** */ \t\t\treturn installedModules[moduleId].exports\n        /** *** */ \t\t}\n      /** *** */ \t\t// Create a new module (and put it into the cache)\n      /** *** */ \t\tconst module = installedModules[moduleId] = {\n        /** *** */ \t\t\ti: moduleId,\n        /** *** */ \t\t\tl: false,\n        /** *** */ \t\t\texports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ \t\t// Execute the module function\n      /** *** */ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ \t\t// Flag the module as loaded\n      /** *** */ \t\tmodule.l = true\n      /** *** */\n      /** *** */ \t\t// Return the exports of the module\n      /** *** */ \t\treturn module.exports\n      /** *** */ \t}\n    /** *** */\n    /** *** */\n    /** *** */ \t// expose the modules object (__webpack_modules__)\n    /** *** */ \t__webpack_require__.m = modules\n    /** *** */\n    /** *** */ \t// expose the module cache\n    /** *** */ \t__webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ \t// define getter function for harmony exports\n    /** *** */ \t__webpack_require__.d = function (exports, name, getter) {\n      /** *** */ \t\tif (!__webpack_require__.o(exports, name)) {\n        /** *** */ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ \t\t}\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// define __esModule on exports\n    /** *** */ \t__webpack_require__.r = function (exports) {\n      /** *** */ \t\tif (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ \t\t}\n      /** *** */ \t\tObject.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// create a fake namespace object\n    /** *** */ \t// mode & 1: value is a module id, require it\n    /** *** */ \t// mode & 2: merge all properties of value into the ns\n    /** *** */ \t// mode & 4: return value when already ns object\n    /** *** */ \t// mode & 8|1: behave like require\n    /** *** */ \t__webpack_require__.t = function (value, mode) {\n      /** *** */ \t\tif (mode & 1) value = __webpack_require__(value)\n      /** *** */ \t\tif (mode & 8) return value\n      /** *** */ \t\tif ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ \t\tconst ns = Object.create(null)\n      /** *** */ \t\t__webpack_require__.r(ns)\n      /** *** */ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ \t\tif (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ \t\treturn ns\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ \t__webpack_require__.n = function (module) {\n      /** *** */ \t\tconst getter = module && module.__esModule\n      /** *** */ \t\t\t? function getDefault() { return module.default }\n      /** *** */ \t\t\t: function getModuleExports() { return module }\n      /** *** */ \t\t__webpack_require__.d(getter, 'a', getter)\n      /** *** */ \t\treturn getter\n      /** *** */ \t}\n    /** *** */\n    /** *** */ \t// Object.prototype.hasOwnProperty.call\n    /** *** */ \t__webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ \t// __webpack_public_path__\n    /** *** */ \t__webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ \t// Load entry module and return exports\n    /** *** */ \treturn __webpack_require__(__webpack_require__.s = 12)\n    /** *** */ }({\n\n    /***/ 12:\n    /***/ (function (module, exports, __webpack_require__) {\n      const _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function (obj) { return typeof obj } : function (obj) { return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj }\n\n      Component({\n        properties: {\n          span: {\n            type: Number,\n            value: 24\n          },\n          offset: {\n            type: Number,\n            value: 0\n          },\n          push: {\n            type: Number,\n            value: -1\n          },\n          pull: {\n            type: Number,\n            value: -1\n          },\n          xs: {\n            type: Number,\n            optionalTypes: [Object],\n            value: -1\n          },\n          sm: {\n            type: Number,\n            optionalTypes: [Object],\n            value: -1\n          },\n          md: {\n            type: Number,\n            optionalTypes: [Object],\n            value: -1\n          },\n          lg: {\n            type: Number,\n            optionalTypes: [Object],\n            value: -1\n          },\n          xl: {\n            type: Number,\n            optionalTypes: [Object],\n            value: -1\n          }\n        },\n        data: {\n          classList: ['weui-col'],\n          gutter: 0,\n          paddingLeft: 0,\n          paddingRight: 0\n        },\n        relations: {\n          '../row/index': {\n            type: 'parent',\n            linked: function linked(target) {\n              this.data.gutter = Number(target.data.gutter)\n              this.updateGutter()\n            },\n            linkChanged: function linkChanged(target) {\n              this.data.gutter = Number(target.data.gutter)\n              this.updateGutter()\n            }\n          }\n        },\n        attached: function attached() {\n          this.updateCol()\n        },\n\n        methods: {\n          updateCol: function updateCol() {\n            const classList = ['weui-col']\n            let paddingLeft = void 0\n            let paddingRight = 0\n            classList.push('weui-col-' + this.data.span)\n            classList.push('weui-col-offset-' + this.data.offset)\n            if (this.data.gutter) {\n              paddingLeft = this.data.gutter / 2 + 'px'\n              paddingRight = paddingLeft\n            }\n            if (this.data.push !== -1) {\n              this.data.push && classList.push('weui-col-push-' + this.data.push)\n            }\n            if (this.data.pull !== -1) {\n              this.data.pull && classList.push('weui-col-pull-' + this.data.pull)\n            }\n            this.screenSizeSet('xs', classList)\n            this.screenSizeSet('sm', classList)\n            this.screenSizeSet('md', classList)\n            this.screenSizeSet('lg', classList)\n            this.screenSizeSet('xl', classList)\n            return this.setData({\n              classList\n            })\n          },\n          updateGutter: function updateGutter() {\n            let paddingLeft = void 0\n            let paddingRight = 0\n            if (this.data.gutter) {\n              paddingLeft = this.data.gutter / 2 + 'px'\n              paddingRight = paddingLeft\n            }\n            this.setData({\n              paddingLeft,\n              paddingRight\n            })\n          },\n          screenSizeSet: function screenSizeSet(screen, classList) {\n            if (typeof this.data[screen] === 'number' && this.data[screen] !== -1) {\n              classList.push('weui-col-' + screen + '-' + this.data[screen])\n            } else if (_typeof(this.data[screen]) === 'object') {\n              typeof this.data[screen].offset === 'number' && classList.push('weui-col-' + screen + '-offset-' + this.data[screen].offset)\n              typeof this.data[screen].span === 'number' && classList.push('weui-col-' + screen + '-' + this.data[screen].span)\n            }\n          }\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/col/index.json",
    "content": "{\n    \"component\": true,\n    \"usingComponents\": {}\n  }"
  },
  {
    "path": "miniprogram/packageExtend/components/col/index.wxml",
    "content": "<view class=\"{{classList}}\" style=\"padding-left:{{paddingLeft}};padding-right:{{paddingRight}}\">\n    <slot></slot>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/col/index.wxss",
    "content": ".weui-col-0{display:none}.weui-col-24{width:100%;float:left;display:block}.weui-col-offset-24{margin-left:100%}.weui-col-pull-24{position:relative;right:100%}.weui-col-push-24{position:relative;left:100%}.weui-col-23{width:95.83333333%;float:left;display:block}.weui-col-offset-23{margin-left:95.83333333%}.weui-col-pull-23{position:relative;right:95.83333333%}.weui-col-push-23{position:relative;left:95.83333333%}.weui-col-22{width:91.66666667%;float:left;display:block}.weui-col-offset-22{margin-left:91.66666667%}.weui-col-pull-22{position:relative;right:91.66666667%}.weui-col-push-22{position:relative;left:91.66666667%}.weui-col-21{width:87.5%;float:left;display:block}.weui-col-offset-21{margin-left:87.5%}.weui-col-pull-21{position:relative;right:87.5%}.weui-col-push-21{position:relative;left:87.5%}.weui-col-20{width:83.33333333%;float:left;display:block}.weui-col-offset-20{margin-left:83.33333333%}.weui-col-pull-20{position:relative;right:83.33333333%}.weui-col-push-20{position:relative;left:83.33333333%}.weui-col-19{width:79.16666667%;float:left;display:block}.weui-col-offset-19{margin-left:79.16666667%}.weui-col-pull-19{position:relative;right:79.16666667%}.weui-col-push-19{position:relative;left:79.16666667%}.weui-col-18{width:75%;float:left;display:block}.weui-col-offset-18{margin-left:75%}.weui-col-pull-18{position:relative;right:75%}.weui-col-push-18{position:relative;left:75%}.weui-col-17{width:70.83333333%;float:left;display:block}.weui-col-offset-17{margin-left:70.83333333%}.weui-col-pull-17{position:relative;right:70.83333333%}.weui-col-push-17{position:relative;left:70.83333333%}.weui-col-16{width:66.66666667%;float:left;display:block}.weui-col-offset-16{margin-left:66.66666667%}.weui-col-pull-16{position:relative;right:66.66666667%}.weui-col-push-16{position:relative;left:66.66666667%}.weui-col-15{width:62.5%;float:left;display:block}.weui-col-offset-15{margin-left:62.5%}.weui-col-pull-15{position:relative;right:62.5%}.weui-col-push-15{position:relative;left:62.5%}.weui-col-14{width:58.33333333%;float:left;display:block}.weui-col-offset-14{margin-left:58.33333333%}.weui-col-pull-14{position:relative;right:58.33333333%}.weui-col-push-14{position:relative;left:58.33333333%}.weui-col-13{width:54.16666667%;float:left;display:block}.weui-col-offset-13{margin-left:54.16666667%}.weui-col-pull-13{position:relative;right:54.16666667%}.weui-col-push-13{position:relative;left:54.16666667%}.weui-col-12{width:50%;float:left;display:block}.weui-col-offset-12{margin-left:50%}.weui-col-pull-12{position:relative;right:50%}.weui-col-push-12{position:relative;left:50%}.weui-col-11{width:45.83333333%;float:left;display:block}.weui-col-offset-11{margin-left:45.83333333%}.weui-col-pull-11{position:relative;right:45.83333333%}.weui-col-push-11{position:relative;left:45.83333333%}.weui-col-10{width:41.66666667%;float:left;display:block}.weui-col-offset-10{margin-left:41.66666667%}.weui-col-pull-10{position:relative;right:41.66666667%}.weui-col-push-10{position:relative;left:41.66666667%}.weui-col-9{width:37.5%;float:left;display:block}.weui-col-offset-9{margin-left:37.5%}.weui-col-pull-9{position:relative;right:37.5%}.weui-col-push-9{position:relative;left:37.5%}.weui-col-8{width:33.33333333%;float:left;display:block}.weui-col-offset-8{margin-left:33.33333333%}.weui-col-pull-8{position:relative;right:33.33333333%}.weui-col-push-8{position:relative;left:33.33333333%}.weui-col-7{width:29.16666667%;float:left;display:block}.weui-col-offset-7{margin-left:29.16666667%}.weui-col-pull-7{position:relative;right:29.16666667%}.weui-col-push-7{position:relative;left:29.16666667%}.weui-col-6{width:25%;float:left;display:block}.weui-col-offset-6{margin-left:25%}.weui-col-pull-6{position:relative;right:25%}.weui-col-push-6{position:relative;left:25%}.weui-col-5{width:20.83333333%;float:left;display:block}.weui-col-offset-5{margin-left:20.83333333%}.weui-col-pull-5{position:relative;right:20.83333333%}.weui-col-push-5{position:relative;left:20.83333333%}.weui-col-4{width:16.66666667%;float:left;display:block}.weui-col-offset-4{margin-left:16.66666667%}.weui-col-pull-4{position:relative;right:16.66666667%}.weui-col-push-4{position:relative;left:16.66666667%}.weui-col-3{width:12.5%;float:left;display:block}.weui-col-offset-3{margin-left:12.5%}.weui-col-pull-3{position:relative;right:12.5%}.weui-col-push-3{position:relative;left:12.5%}.weui-col-2{width:8.33333333%;float:left;display:block}.weui-col-offset-2{margin-left:8.33333333%}.weui-col-pull-2{position:relative;right:8.33333333%}.weui-col-push-2{position:relative;left:8.33333333%}.weui-col-1{width:4.16666667%;float:left;display:block}.weui-col-offset-1{margin-left:4.16666667%}.weui-col-pull-1{position:relative;right:4.16666667%}.weui-col-push-1{position:relative;left:4.16666667%}@media screen and (max-width:767px){.weui-col-xs-0{display:none}.weui-col-xs-24{width:100%;float:left;display:block}.weui-col-xs-offset-24{margin-left:100%}.weui-col-xs-pull-24{position:relative;right:100%}.weui-col-xs-push-24{position:relative;left:100%}.weui-col-xs-23{width:95.83333333%;float:left;display:block}.weui-col-xs-offset-23{margin-left:95.83333333%}.weui-col-xs-pull-23{position:relative;right:95.83333333%}.weui-col-xs-push-23{position:relative;left:95.83333333%}.weui-col-xs-22{width:91.66666667%;float:left;display:block}.weui-col-xs-offset-22{margin-left:91.66666667%}.weui-col-xs-pull-22{position:relative;right:91.66666667%}.weui-col-xs-push-22{position:relative;left:91.66666667%}.weui-col-xs-21{width:87.5%;float:left;display:block}.weui-col-xs-offset-21{margin-left:87.5%}.weui-col-xs-pull-21{position:relative;right:87.5%}.weui-col-xs-push-21{position:relative;left:87.5%}.weui-col-xs-20{width:83.33333333%;float:left;display:block}.weui-col-xs-offset-20{margin-left:83.33333333%}.weui-col-xs-pull-20{position:relative;right:83.33333333%}.weui-col-xs-push-20{position:relative;left:83.33333333%}.weui-col-xs-19{width:79.16666667%;float:left;display:block}.weui-col-xs-offset-19{margin-left:79.16666667%}.weui-col-xs-pull-19{position:relative;right:79.16666667%}.weui-col-xs-push-19{position:relative;left:79.16666667%}.weui-col-xs-18{width:75%;float:left;display:block}.weui-col-xs-offset-18{margin-left:75%}.weui-col-xs-pull-18{position:relative;right:75%}.weui-col-xs-push-18{position:relative;left:75%}.weui-col-xs-17{width:70.83333333%;float:left;display:block}.weui-col-xs-offset-17{margin-left:70.83333333%}.weui-col-xs-pull-17{position:relative;right:70.83333333%}.weui-col-xs-push-17{position:relative;left:70.83333333%}.weui-col-xs-16{width:66.66666667%;float:left;display:block}.weui-col-xs-offset-16{margin-left:66.66666667%}.weui-col-xs-pull-16{position:relative;right:66.66666667%}.weui-col-xs-push-16{position:relative;left:66.66666667%}.weui-col-xs-15{width:62.5%;float:left;display:block}.weui-col-xs-offset-15{margin-left:62.5%}.weui-col-xs-pull-15{position:relative;right:62.5%}.weui-col-xs-push-15{position:relative;left:62.5%}.weui-col-xs-14{width:58.33333333%;float:left;display:block}.weui-col-xs-offset-14{margin-left:58.33333333%}.weui-col-xs-pull-14{position:relative;right:58.33333333%}.weui-col-xs-push-14{position:relative;left:58.33333333%}.weui-col-xs-13{width:54.16666667%;float:left;display:block}.weui-col-xs-offset-13{margin-left:54.16666667%}.weui-col-xs-pull-13{position:relative;right:54.16666667%}.weui-col-xs-push-13{position:relative;left:54.16666667%}.weui-col-xs-12{width:50%;float:left;display:block}.weui-col-xs-offset-12{margin-left:50%}.weui-col-xs-pull-12{position:relative;right:50%}.weui-col-xs-push-12{position:relative;left:50%}.weui-col-xs-11{width:45.83333333%;float:left;display:block}.weui-col-xs-offset-11{margin-left:45.83333333%}.weui-col-xs-pull-11{position:relative;right:45.83333333%}.weui-col-xs-push-11{position:relative;left:45.83333333%}.weui-col-xs-10{width:41.66666667%;float:left;display:block}.weui-col-xs-offset-10{margin-left:41.66666667%}.weui-col-xs-pull-10{position:relative;right:41.66666667%}.weui-col-xs-push-10{position:relative;left:41.66666667%}.weui-col-xs-9{width:37.5%;float:left;display:block}.weui-col-xs-offset-9{margin-left:37.5%}.weui-col-xs-pull-9{position:relative;right:37.5%}.weui-col-xs-push-9{position:relative;left:37.5%}.weui-col-xs-8{width:33.33333333%;float:left;display:block}.weui-col-xs-offset-8{margin-left:33.33333333%}.weui-col-xs-pull-8{position:relative;right:33.33333333%}.weui-col-xs-push-8{position:relative;left:33.33333333%}.weui-col-xs-7{width:29.16666667%;float:left;display:block}.weui-col-xs-offset-7{margin-left:29.16666667%}.weui-col-xs-pull-7{position:relative;right:29.16666667%}.weui-col-xs-push-7{position:relative;left:29.16666667%}.weui-col-xs-6{width:25%;float:left;display:block}.weui-col-xs-offset-6{margin-left:25%}.weui-col-xs-pull-6{position:relative;right:25%}.weui-col-xs-push-6{position:relative;left:25%}.weui-col-xs-5{width:20.83333333%;float:left;display:block}.weui-col-xs-offset-5{margin-left:20.83333333%}.weui-col-xs-pull-5{position:relative;right:20.83333333%}.weui-col-xs-push-5{position:relative;left:20.83333333%}.weui-col-xs-4{width:16.66666667%;float:left;display:block}.weui-col-xs-offset-4{margin-left:16.66666667%}.weui-col-xs-pull-4{position:relative;right:16.66666667%}.weui-col-xs-push-4{position:relative;left:16.66666667%}.weui-col-xs-3{width:12.5%;float:left;display:block}.weui-col-xs-offset-3{margin-left:12.5%}.weui-col-xs-pull-3{position:relative;right:12.5%}.weui-col-xs-push-3{position:relative;left:12.5%}.weui-col-xs-2{width:8.33333333%;float:left;display:block}.weui-col-xs-offset-2{margin-left:8.33333333%}.weui-col-xs-pull-2{position:relative;right:8.33333333%}.weui-col-xs-push-2{position:relative;left:8.33333333%}.weui-col-xs-1{width:4.16666667%;float:left;display:block}.weui-col-xs-offset-1{margin-left:4.16666667%}.weui-col-xs-pull-1{position:relative;right:4.16666667%}.weui-col-xs-push-1{position:relative;left:4.16666667%}}@media screen and (max-width:768px){.weui-col-sm-0{display:none}.weui-col-sm-24{width:100%;float:left;display:block}.weui-col-sm-offset-24{margin-left:100%}.weui-col-sm-pull-24{position:relative;right:100%}.weui-col-sm-push-24{position:relative;left:100%}.weui-col-sm-23{width:95.83333333%;float:left;display:block}.weui-col-sm-offset-23{margin-left:95.83333333%}.weui-col-sm-pull-23{position:relative;right:95.83333333%}.weui-col-sm-push-23{position:relative;left:95.83333333%}.weui-col-sm-22{width:91.66666667%;float:left;display:block}.weui-col-sm-offset-22{margin-left:91.66666667%}.weui-col-sm-pull-22{position:relative;right:91.66666667%}.weui-col-sm-push-22{position:relative;left:91.66666667%}.weui-col-sm-21{width:87.5%;float:left;display:block}.weui-col-sm-offset-21{margin-left:87.5%}.weui-col-sm-pull-21{position:relative;right:87.5%}.weui-col-sm-push-21{position:relative;left:87.5%}.weui-col-sm-20{width:83.33333333%;float:left;display:block}.weui-col-sm-offset-20{margin-left:83.33333333%}.weui-col-sm-pull-20{position:relative;right:83.33333333%}.weui-col-sm-push-20{position:relative;left:83.33333333%}.weui-col-sm-19{width:79.16666667%;float:left;display:block}.weui-col-sm-offset-19{margin-left:79.16666667%}.weui-col-sm-pull-19{position:relative;right:79.16666667%}.weui-col-sm-push-19{position:relative;left:79.16666667%}.weui-col-sm-18{width:75%;float:left;display:block}.weui-col-sm-offset-18{margin-left:75%}.weui-col-sm-pull-18{position:relative;right:75%}.weui-col-sm-push-18{position:relative;left:75%}.weui-col-sm-17{width:70.83333333%;float:left;display:block}.weui-col-sm-offset-17{margin-left:70.83333333%}.weui-col-sm-pull-17{position:relative;right:70.83333333%}.weui-col-sm-push-17{position:relative;left:70.83333333%}.weui-col-sm-16{width:66.66666667%;float:left;display:block}.weui-col-sm-offset-16{margin-left:66.66666667%}.weui-col-sm-pull-16{position:relative;right:66.66666667%}.weui-col-sm-push-16{position:relative;left:66.66666667%}.weui-col-sm-15{width:62.5%;float:left;display:block}.weui-col-sm-offset-15{margin-left:62.5%}.weui-col-sm-pull-15{position:relative;right:62.5%}.weui-col-sm-push-15{position:relative;left:62.5%}.weui-col-sm-14{width:58.33333333%;float:left;display:block}.weui-col-sm-offset-14{margin-left:58.33333333%}.weui-col-sm-pull-14{position:relative;right:58.33333333%}.weui-col-sm-push-14{position:relative;left:58.33333333%}.weui-col-sm-13{width:54.16666667%;float:left;display:block}.weui-col-sm-offset-13{margin-left:54.16666667%}.weui-col-sm-pull-13{position:relative;right:54.16666667%}.weui-col-sm-push-13{position:relative;left:54.16666667%}.weui-col-sm-12{width:50%;float:left;display:block}.weui-col-sm-offset-12{margin-left:50%}.weui-col-sm-pull-12{position:relative;right:50%}.weui-col-sm-push-12{position:relative;left:50%}.weui-col-sm-11{width:45.83333333%;float:left;display:block}.weui-col-sm-offset-11{margin-left:45.83333333%}.weui-col-sm-pull-11{position:relative;right:45.83333333%}.weui-col-sm-push-11{position:relative;left:45.83333333%}.weui-col-sm-10{width:41.66666667%;float:left;display:block}.weui-col-sm-offset-10{margin-left:41.66666667%}.weui-col-sm-pull-10{position:relative;right:41.66666667%}.weui-col-sm-push-10{position:relative;left:41.66666667%}.weui-col-sm-9{width:37.5%;float:left;display:block}.weui-col-sm-offset-9{margin-left:37.5%}.weui-col-sm-pull-9{position:relative;right:37.5%}.weui-col-sm-push-9{position:relative;left:37.5%}.weui-col-sm-8{width:33.33333333%;float:left;display:block}.weui-col-sm-offset-8{margin-left:33.33333333%}.weui-col-sm-pull-8{position:relative;right:33.33333333%}.weui-col-sm-push-8{position:relative;left:33.33333333%}.weui-col-sm-7{width:29.16666667%;float:left;display:block}.weui-col-sm-offset-7{margin-left:29.16666667%}.weui-col-sm-pull-7{position:relative;right:29.16666667%}.weui-col-sm-push-7{position:relative;left:29.16666667%}.weui-col-sm-6{width:25%;float:left;display:block}.weui-col-sm-offset-6{margin-left:25%}.weui-col-sm-pull-6{position:relative;right:25%}.weui-col-sm-push-6{position:relative;left:25%}.weui-col-sm-5{width:20.83333333%;float:left;display:block}.weui-col-sm-offset-5{margin-left:20.83333333%}.weui-col-sm-pull-5{position:relative;right:20.83333333%}.weui-col-sm-push-5{position:relative;left:20.83333333%}.weui-col-sm-4{width:16.66666667%;float:left;display:block}.weui-col-sm-offset-4{margin-left:16.66666667%}.weui-col-sm-pull-4{position:relative;right:16.66666667%}.weui-col-sm-push-4{position:relative;left:16.66666667%}.weui-col-sm-3{width:12.5%;float:left;display:block}.weui-col-sm-offset-3{margin-left:12.5%}.weui-col-sm-pull-3{position:relative;right:12.5%}.weui-col-sm-push-3{position:relative;left:12.5%}.weui-col-sm-2{width:8.33333333%;float:left;display:block}.weui-col-sm-offset-2{margin-left:8.33333333%}.weui-col-sm-pull-2{position:relative;right:8.33333333%}.weui-col-sm-push-2{position:relative;left:8.33333333%}.weui-col-sm-1{width:4.16666667%;float:left;display:block}.weui-col-sm-offset-1{margin-left:4.16666667%}.weui-col-sm-pull-1{position:relative;right:4.16666667%}.weui-col-sm-push-1{position:relative;left:4.16666667%}}@media screen and (max-width:992px){.weui-col-md-0{display:none}.weui-col-md-24{width:100%;float:left;display:block}.weui-col-md-offset-24{margin-left:100%}.weui-col-md-pull-24{position:relative;right:100%}.weui-col-md-push-24{position:relative;left:100%}.weui-col-md-23{width:95.83333333%;float:left;display:block}.weui-col-md-offset-23{margin-left:95.83333333%}.weui-col-md-pull-23{position:relative;right:95.83333333%}.weui-col-md-push-23{position:relative;left:95.83333333%}.weui-col-md-22{width:91.66666667%;float:left;display:block}.weui-col-md-offset-22{margin-left:91.66666667%}.weui-col-md-pull-22{position:relative;right:91.66666667%}.weui-col-md-push-22{position:relative;left:91.66666667%}.weui-col-md-21{width:87.5%;float:left;display:block}.weui-col-md-offset-21{margin-left:87.5%}.weui-col-md-pull-21{position:relative;right:87.5%}.weui-col-md-push-21{position:relative;left:87.5%}.weui-col-md-20{width:83.33333333%;float:left;display:block}.weui-col-md-offset-20{margin-left:83.33333333%}.weui-col-md-pull-20{position:relative;right:83.33333333%}.weui-col-md-push-20{position:relative;left:83.33333333%}.weui-col-md-19{width:79.16666667%;float:left;display:block}.weui-col-md-offset-19{margin-left:79.16666667%}.weui-col-md-pull-19{position:relative;right:79.16666667%}.weui-col-md-push-19{position:relative;left:79.16666667%}.weui-col-md-18{width:75%;float:left;display:block}.weui-col-md-offset-18{margin-left:75%}.weui-col-md-pull-18{position:relative;right:75%}.weui-col-md-push-18{position:relative;left:75%}.weui-col-md-17{width:70.83333333%;float:left;display:block}.weui-col-md-offset-17{margin-left:70.83333333%}.weui-col-md-pull-17{position:relative;right:70.83333333%}.weui-col-md-push-17{position:relative;left:70.83333333%}.weui-col-md-16{width:66.66666667%;float:left;display:block}.weui-col-md-offset-16{margin-left:66.66666667%}.weui-col-md-pull-16{position:relative;right:66.66666667%}.weui-col-md-push-16{position:relative;left:66.66666667%}.weui-col-md-15{width:62.5%;float:left;display:block}.weui-col-md-offset-15{margin-left:62.5%}.weui-col-md-pull-15{position:relative;right:62.5%}.weui-col-md-push-15{position:relative;left:62.5%}.weui-col-md-14{width:58.33333333%;float:left;display:block}.weui-col-md-offset-14{margin-left:58.33333333%}.weui-col-md-pull-14{position:relative;right:58.33333333%}.weui-col-md-push-14{position:relative;left:58.33333333%}.weui-col-md-13{width:54.16666667%;float:left;display:block}.weui-col-md-offset-13{margin-left:54.16666667%}.weui-col-md-pull-13{position:relative;right:54.16666667%}.weui-col-md-push-13{position:relative;left:54.16666667%}.weui-col-md-12{width:50%;float:left;display:block}.weui-col-md-offset-12{margin-left:50%}.weui-col-md-pull-12{position:relative;right:50%}.weui-col-md-push-12{position:relative;left:50%}.weui-col-md-11{width:45.83333333%;float:left;display:block}.weui-col-md-offset-11{margin-left:45.83333333%}.weui-col-md-pull-11{position:relative;right:45.83333333%}.weui-col-md-push-11{position:relative;left:45.83333333%}.weui-col-md-10{width:41.66666667%;float:left;display:block}.weui-col-md-offset-10{margin-left:41.66666667%}.weui-col-md-pull-10{position:relative;right:41.66666667%}.weui-col-md-push-10{position:relative;left:41.66666667%}.weui-col-md-9{width:37.5%;float:left;display:block}.weui-col-md-offset-9{margin-left:37.5%}.weui-col-md-pull-9{position:relative;right:37.5%}.weui-col-md-push-9{position:relative;left:37.5%}.weui-col-md-8{width:33.33333333%;float:left;display:block}.weui-col-md-offset-8{margin-left:33.33333333%}.weui-col-md-pull-8{position:relative;right:33.33333333%}.weui-col-md-push-8{position:relative;left:33.33333333%}.weui-col-md-7{width:29.16666667%;float:left;display:block}.weui-col-md-offset-7{margin-left:29.16666667%}.weui-col-md-pull-7{position:relative;right:29.16666667%}.weui-col-md-push-7{position:relative;left:29.16666667%}.weui-col-md-6{width:25%;float:left;display:block}.weui-col-md-offset-6{margin-left:25%}.weui-col-md-pull-6{position:relative;right:25%}.weui-col-md-push-6{position:relative;left:25%}.weui-col-md-5{width:20.83333333%;float:left;display:block}.weui-col-md-offset-5{margin-left:20.83333333%}.weui-col-md-pull-5{position:relative;right:20.83333333%}.weui-col-md-push-5{position:relative;left:20.83333333%}.weui-col-md-4{width:16.66666667%;float:left;display:block}.weui-col-md-offset-4{margin-left:16.66666667%}.weui-col-md-pull-4{position:relative;right:16.66666667%}.weui-col-md-push-4{position:relative;left:16.66666667%}.weui-col-md-3{width:12.5%;float:left;display:block}.weui-col-md-offset-3{margin-left:12.5%}.weui-col-md-pull-3{position:relative;right:12.5%}.weui-col-md-push-3{position:relative;left:12.5%}.weui-col-md-2{width:8.33333333%;float:left;display:block}.weui-col-md-offset-2{margin-left:8.33333333%}.weui-col-md-pull-2{position:relative;right:8.33333333%}.weui-col-md-push-2{position:relative;left:8.33333333%}.weui-col-md-1{width:4.16666667%;float:left;display:block}.weui-col-md-offset-1{margin-left:4.16666667%}.weui-col-md-pull-1{position:relative;right:4.16666667%}.weui-col-md-push-1{position:relative;left:4.16666667%}}@media screen and (max-width:1200px){.weui-col-lg-0{display:none}.weui-col-lg-24{width:100%;float:left;display:block}.weui-col-lg-offset-24{margin-left:100%}.weui-col-lg-pull-24{position:relative;right:100%}.weui-col-lg-push-24{position:relative;left:100%}.weui-col-lg-23{width:95.83333333%;float:left;display:block}.weui-col-lg-offset-23{margin-left:95.83333333%}.weui-col-lg-pull-23{position:relative;right:95.83333333%}.weui-col-lg-push-23{position:relative;left:95.83333333%}.weui-col-lg-22{width:91.66666667%;float:left;display:block}.weui-col-lg-offset-22{margin-left:91.66666667%}.weui-col-lg-pull-22{position:relative;right:91.66666667%}.weui-col-lg-push-22{position:relative;left:91.66666667%}.weui-col-lg-21{width:87.5%;float:left;display:block}.weui-col-lg-offset-21{margin-left:87.5%}.weui-col-lg-pull-21{position:relative;right:87.5%}.weui-col-lg-push-21{position:relative;left:87.5%}.weui-col-lg-20{width:83.33333333%;float:left;display:block}.weui-col-lg-offset-20{margin-left:83.33333333%}.weui-col-lg-pull-20{position:relative;right:83.33333333%}.weui-col-lg-push-20{position:relative;left:83.33333333%}.weui-col-lg-19{width:79.16666667%;float:left;display:block}.weui-col-lg-offset-19{margin-left:79.16666667%}.weui-col-lg-pull-19{position:relative;right:79.16666667%}.weui-col-lg-push-19{position:relative;left:79.16666667%}.weui-col-lg-18{width:75%;float:left;display:block}.weui-col-lg-offset-18{margin-left:75%}.weui-col-lg-pull-18{position:relative;right:75%}.weui-col-lg-push-18{position:relative;left:75%}.weui-col-lg-17{width:70.83333333%;float:left;display:block}.weui-col-lg-offset-17{margin-left:70.83333333%}.weui-col-lg-pull-17{position:relative;right:70.83333333%}.weui-col-lg-push-17{position:relative;left:70.83333333%}.weui-col-lg-16{width:66.66666667%;float:left;display:block}.weui-col-lg-offset-16{margin-left:66.66666667%}.weui-col-lg-pull-16{position:relative;right:66.66666667%}.weui-col-lg-push-16{position:relative;left:66.66666667%}.weui-col-lg-15{width:62.5%;float:left;display:block}.weui-col-lg-offset-15{margin-left:62.5%}.weui-col-lg-pull-15{position:relative;right:62.5%}.weui-col-lg-push-15{position:relative;left:62.5%}.weui-col-lg-14{width:58.33333333%;float:left;display:block}.weui-col-lg-offset-14{margin-left:58.33333333%}.weui-col-lg-pull-14{position:relative;right:58.33333333%}.weui-col-lg-push-14{position:relative;left:58.33333333%}.weui-col-lg-13{width:54.16666667%;float:left;display:block}.weui-col-lg-offset-13{margin-left:54.16666667%}.weui-col-lg-pull-13{position:relative;right:54.16666667%}.weui-col-lg-push-13{position:relative;left:54.16666667%}.weui-col-lg-12{width:50%;float:left;display:block}.weui-col-lg-offset-12{margin-left:50%}.weui-col-lg-pull-12{position:relative;right:50%}.weui-col-lg-push-12{position:relative;left:50%}.weui-col-lg-11{width:45.83333333%;float:left;display:block}.weui-col-lg-offset-11{margin-left:45.83333333%}.weui-col-lg-pull-11{position:relative;right:45.83333333%}.weui-col-lg-push-11{position:relative;left:45.83333333%}.weui-col-lg-10{width:41.66666667%;float:left;display:block}.weui-col-lg-offset-10{margin-left:41.66666667%}.weui-col-lg-pull-10{position:relative;right:41.66666667%}.weui-col-lg-push-10{position:relative;left:41.66666667%}.weui-col-lg-9{width:37.5%;float:left;display:block}.weui-col-lg-offset-9{margin-left:37.5%}.weui-col-lg-pull-9{position:relative;right:37.5%}.weui-col-lg-push-9{position:relative;left:37.5%}.weui-col-lg-8{width:33.33333333%;float:left;display:block}.weui-col-lg-offset-8{margin-left:33.33333333%}.weui-col-lg-pull-8{position:relative;right:33.33333333%}.weui-col-lg-push-8{position:relative;left:33.33333333%}.weui-col-lg-7{width:29.16666667%;float:left;display:block}.weui-col-lg-offset-7{margin-left:29.16666667%}.weui-col-lg-pull-7{position:relative;right:29.16666667%}.weui-col-lg-push-7{position:relative;left:29.16666667%}.weui-col-lg-6{width:25%;float:left;display:block}.weui-col-lg-offset-6{margin-left:25%}.weui-col-lg-pull-6{position:relative;right:25%}.weui-col-lg-push-6{position:relative;left:25%}.weui-col-lg-5{width:20.83333333%;float:left;display:block}.weui-col-lg-offset-5{margin-left:20.83333333%}.weui-col-lg-pull-5{position:relative;right:20.83333333%}.weui-col-lg-push-5{position:relative;left:20.83333333%}.weui-col-lg-4{width:16.66666667%;float:left;display:block}.weui-col-lg-offset-4{margin-left:16.66666667%}.weui-col-lg-pull-4{position:relative;right:16.66666667%}.weui-col-lg-push-4{position:relative;left:16.66666667%}.weui-col-lg-3{width:12.5%;float:left;display:block}.weui-col-lg-offset-3{margin-left:12.5%}.weui-col-lg-pull-3{position:relative;right:12.5%}.weui-col-lg-push-3{position:relative;left:12.5%}.weui-col-lg-2{width:8.33333333%;float:left;display:block}.weui-col-lg-offset-2{margin-left:8.33333333%}.weui-col-lg-pull-2{position:relative;right:8.33333333%}.weui-col-lg-push-2{position:relative;left:8.33333333%}.weui-col-lg-1{width:4.16666667%;float:left;display:block}.weui-col-lg-offset-1{margin-left:4.16666667%}.weui-col-lg-pull-1{position:relative;right:4.16666667%}.weui-col-lg-push-1{position:relative;left:4.16666667%}}@media screen and (max-width:1920px){.weui-col-xl-0{display:none}.weui-col-xl-24{width:100%;float:left;display:block}.weui-col-xl-offset-24{margin-left:100%}.weui-col-xl-pull-24{position:relative;right:100%}.weui-col-xl-push-24{position:relative;left:100%}.weui-col-xl-23{width:95.83333333%;float:left;display:block}.weui-col-xl-offset-23{margin-left:95.83333333%}.weui-col-xl-pull-23{position:relative;right:95.83333333%}.weui-col-xl-push-23{position:relative;left:95.83333333%}.weui-col-xl-22{width:91.66666667%;float:left;display:block}.weui-col-xl-offset-22{margin-left:91.66666667%}.weui-col-xl-pull-22{position:relative;right:91.66666667%}.weui-col-xl-push-22{position:relative;left:91.66666667%}.weui-col-xl-21{width:87.5%;float:left;display:block}.weui-col-xl-offset-21{margin-left:87.5%}.weui-col-xl-pull-21{position:relative;right:87.5%}.weui-col-xl-push-21{position:relative;left:87.5%}.weui-col-xl-20{width:83.33333333%;float:left;display:block}.weui-col-xl-offset-20{margin-left:83.33333333%}.weui-col-xl-pull-20{position:relative;right:83.33333333%}.weui-col-xl-push-20{position:relative;left:83.33333333%}.weui-col-xl-19{width:79.16666667%;float:left;display:block}.weui-col-xl-offset-19{margin-left:79.16666667%}.weui-col-xl-pull-19{position:relative;right:79.16666667%}.weui-col-xl-push-19{position:relative;left:79.16666667%}.weui-col-xl-18{width:75%;float:left;display:block}.weui-col-xl-offset-18{margin-left:75%}.weui-col-xl-pull-18{position:relative;right:75%}.weui-col-xl-push-18{position:relative;left:75%}.weui-col-xl-17{width:70.83333333%;float:left;display:block}.weui-col-xl-offset-17{margin-left:70.83333333%}.weui-col-xl-pull-17{position:relative;right:70.83333333%}.weui-col-xl-push-17{position:relative;left:70.83333333%}.weui-col-xl-16{width:66.66666667%;float:left;display:block}.weui-col-xl-offset-16{margin-left:66.66666667%}.weui-col-xl-pull-16{position:relative;right:66.66666667%}.weui-col-xl-push-16{position:relative;left:66.66666667%}.weui-col-xl-15{width:62.5%;float:left;display:block}.weui-col-xl-offset-15{margin-left:62.5%}.weui-col-xl-pull-15{position:relative;right:62.5%}.weui-col-xl-push-15{position:relative;left:62.5%}.weui-col-xl-14{width:58.33333333%;float:left;display:block}.weui-col-xl-offset-14{margin-left:58.33333333%}.weui-col-xl-pull-14{position:relative;right:58.33333333%}.weui-col-xl-push-14{position:relative;left:58.33333333%}.weui-col-xl-13{width:54.16666667%;float:left;display:block}.weui-col-xl-offset-13{margin-left:54.16666667%}.weui-col-xl-pull-13{position:relative;right:54.16666667%}.weui-col-xl-push-13{position:relative;left:54.16666667%}.weui-col-xl-12{width:50%;float:left;display:block}.weui-col-xl-offset-12{margin-left:50%}.weui-col-xl-pull-12{position:relative;right:50%}.weui-col-xl-push-12{position:relative;left:50%}.weui-col-xl-11{width:45.83333333%;float:left;display:block}.weui-col-xl-offset-11{margin-left:45.83333333%}.weui-col-xl-pull-11{position:relative;right:45.83333333%}.weui-col-xl-push-11{position:relative;left:45.83333333%}.weui-col-xl-10{width:41.66666667%;float:left;display:block}.weui-col-xl-offset-10{margin-left:41.66666667%}.weui-col-xl-pull-10{position:relative;right:41.66666667%}.weui-col-xl-push-10{position:relative;left:41.66666667%}.weui-col-xl-9{width:37.5%;float:left;display:block}.weui-col-xl-offset-9{margin-left:37.5%}.weui-col-xl-pull-9{position:relative;right:37.5%}.weui-col-xl-push-9{position:relative;left:37.5%}.weui-col-xl-8{width:33.33333333%;float:left;display:block}.weui-col-xl-offset-8{margin-left:33.33333333%}.weui-col-xl-pull-8{position:relative;right:33.33333333%}.weui-col-xl-push-8{position:relative;left:33.33333333%}.weui-col-xl-7{width:29.16666667%;float:left;display:block}.weui-col-xl-offset-7{margin-left:29.16666667%}.weui-col-xl-pull-7{position:relative;right:29.16666667%}.weui-col-xl-push-7{position:relative;left:29.16666667%}.weui-col-xl-6{width:25%;float:left;display:block}.weui-col-xl-offset-6{margin-left:25%}.weui-col-xl-pull-6{position:relative;right:25%}.weui-col-xl-push-6{position:relative;left:25%}.weui-col-xl-5{width:20.83333333%;float:left;display:block}.weui-col-xl-offset-5{margin-left:20.83333333%}.weui-col-xl-pull-5{position:relative;right:20.83333333%}.weui-col-xl-push-5{position:relative;left:20.83333333%}.weui-col-xl-4{width:16.66666667%;float:left;display:block}.weui-col-xl-offset-4{margin-left:16.66666667%}.weui-col-xl-pull-4{position:relative;right:16.66666667%}.weui-col-xl-push-4{position:relative;left:16.66666667%}.weui-col-xl-3{width:12.5%;float:left;display:block}.weui-col-xl-offset-3{margin-left:12.5%}.weui-col-xl-pull-3{position:relative;right:12.5%}.weui-col-xl-push-3{position:relative;left:12.5%}.weui-col-xl-2{width:8.33333333%;float:left;display:block}.weui-col-xl-offset-2{margin-left:8.33333333%}.weui-col-xl-pull-2{position:relative;right:8.33333333%}.weui-col-xl-push-2{position:relative;left:8.33333333%}.weui-col-xl-1{width:4.16666667%;float:left;display:block}.weui-col-xl-offset-1{margin-left:4.16666667%}.weui-col-xl-pull-1{position:relative;right:4.16666667%}.weui-col-xl-push-1{position:relative;left:4.16666667%}}.weui-col{box-sizing:border-box}"
  },
  {
    "path": "miniprogram/packageExtend/components/dialog/dialog.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 20)\n    /** *** */ }({\n\n    /***/ 20:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n          multipleSlots: true,\n        },\n        properties: {\n          title: {\n            type: String,\n            value: ''\n          },\n          extClass: {\n            type: String,\n            value: ''\n          },\n          maskClosable: {\n            type: Boolean,\n            value: true\n          },\n          mask: {\n            type: Boolean,\n            value: true\n          },\n          show: {\n            type: Boolean,\n            value: false,\n            observer: '_showChange'\n          },\n          buttons: {\n            type: Array,\n            value: []\n          }\n        },\n        data: {\n          innerShow: false\n        },\n        ready() {\n          const buttons = this.data.buttons\n          const len = buttons.length\n          buttons.forEach((btn, index) => {\n            if (len === 1) {\n              btn.className = 'weui-dialog__btn_primary'\n            } else if (index === 0) {\n              btn.className = 'weui-dialog__btn_default'\n            } else {\n              btn.className = 'weui-dialog__btn_primary'\n            }\n          })\n          this.setData({\n            buttons\n          })\n        },\n\n        methods: {\n          buttonTap(e) {\n            const {\n              index\n            } = e.currentTarget.dataset\n            this.triggerEvent('buttontap', {\n              index,\n              item: this.data.buttons[index]\n            }, {})\n          },\n\n          close() {\n            const data = this.data\n            if (!data.maskClosable) return\n            this.setData({\n              show: false\n            })\n            this.triggerEvent('close', {}, {})\n          },\n\n          stopEvent() {}\n\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/dialog/dialog.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/dialog/dialog.wxml",
    "content": "<view bindtap=\"close\" class=\"weui-mask {{!show ? 'weui-mask_hidden' : '' }}\" wx:if=\"{{mask}}\"></view>\n<view wx:if=\"{{show}}\" bindtap=\"close\" class=\"weui-dialog__wrp {{extClass}}\">\n    <view class=\"weui-dialog\" catchtap=\"stopEvent\">\n      <view class=\"weui-dialog__hd\">\n        <view class=\"weui-dialog__title\">{{title}}\n          <slot name=\"title\"></slot>\n        </view>\n      </view>\n      <view class=\"weui-dialog__bd\">\n        <slot></slot>\n      </view>\n      <view class=\"weui-dialog__ft\">\n        <block wx:if=\"{{buttons && buttons.length}}\">\n          <view wx:for=\"{{buttons}}\" wx:key=\"index\" class=\"weui-dialog__btn {{item.className}} {{item.extClass}}\" data-index=\"{{index}}\" bindtap=\"buttonTap\">{{item.text}}</view>\n          <!-- <view class=\"weui-dialog__btn\" bindtap=\"confirm\">确认</view> -->\n        </block>\n        <slot name=\"footer\" wx:else></slot>\n      </view>\n    </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/packageExtend/components/dialog/dialog.wxss",
    "content": ".weui-dialog.weui-dialog_hidden{opacity:0;transform:scale3d(1, 1, 0)}.weui-dialog{opacity:1;-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1);transition:all .2s ease-in}.weui-mask.weui-mask_hidden{opacity:0;transform:scale3d(1, 1, 0)}.weui-mask{opacity:1;transform:scale3d(1, 1, 1);transition:all .2s ease-in}"
  },
  {
    "path": "miniprogram/packageExtend/components/emoji/emoji.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 2)\n    /** *** */ }([\n    /* 0 */\n    /***/ (function (module, exports, __webpack_require__) {\n      Object.defineProperty(exports, '__esModule', { value: true })\n      exports.default = [{\n        id: 0, cn: '[微笑]', hk: '[微笑]', us: '[Smile]', code: '/::)', web_code: '/微笑', style: 'smiley_0'\n      }, {\n        id: 1, cn: '[撇嘴]', hk: '[撇嘴]', us: '[Grimace]', code: '/::~', web_code: '/撇嘴', style: 'smiley_1'\n      }, {\n        id: 2, cn: '[色]', hk: '[色]', us: '[Drool]', code: '/::B', web_code: '/色', style: 'smiley_2'\n      }, {\n        id: 3, cn: '[发呆]', hk: '[發呆]', us: '[Scowl]', code: '/::|', web_code: '/发呆', style: 'smiley_3'\n      }, {\n        id: 4, cn: '[得意]', hk: '[得意]', us: '[CoolGuy]', code: '/:8-)', web_code: '/得意', style: 'smiley_4'\n      }, {\n        id: 5, cn: '[流泪]', hk: '[流淚]', us: '[Sob]', code: '/::<', web_code: '/流泪', style: 'smiley_5'\n      }, {\n        id: 6, cn: '[害羞]', hk: '[害羞]', us: '[Shy]', code: '/::$', web_code: '/害羞', style: 'smiley_6'\n      }, {\n        id: 7, cn: '[闭嘴]', hk: '[閉嘴]', us: '[Silent]', code: '/::X', web_code: '/闭嘴', style: 'smiley_7'\n      }, {\n        id: 8, cn: '[睡]', hk: '[睡]', us: '[Sleep]', code: '/::Z', web_code: '/睡', style: 'smiley_8'\n      }, {\n        id: 9, cn: '[大哭]', hk: '[大哭]', us: '[Cry]', code: '/::\"(', web_code: '/大哭', style: 'smiley_9'\n      }, {\n        id: 10, cn: '[尴尬]', hk: '[尷尬]', us: '[Awkward]', code: '/::-|', web_code: '/尴尬', style: 'smiley_10'\n      }, {\n        id: 11, cn: '[发怒]', hk: '[發怒]', us: '[Angry]', code: '/::@', web_code: '/发怒', style: 'smiley_11'\n      }, {\n        id: 12, cn: '[调皮]', hk: '[調皮]', us: '[Tongue]', code: '/::P', web_code: '/调皮', style: 'smiley_12'\n      }, {\n        id: 13, cn: '[呲牙]', hk: '[呲牙]', us: '[Grin]', code: '/::D', web_code: '/呲牙', style: 'smiley_13'\n      }, {\n        id: 14, cn: '[惊讶]', hk: '[驚訝]', us: '[Surprise]', code: '/::O', web_code: '/惊讶', style: 'smiley_14'\n      }, {\n        id: 15, cn: '[难过]', hk: '[難過]', us: '[Frown]', code: '/::(', web_code: '/难过', style: 'smiley_15'\n      }, {\n        id: 16, cn: '[酷]', hk: '[酷]', us: '[Ruthless]', code: '/::+', web_code: '/酷', style: 'smiley_16'\n      }, {\n        id: 17, cn: '[冷汗]', hk: '[冷汗]', us: '[Blush]', code: '/:--b', web_code: '/冷汗', style: 'smiley_17'\n      }, {\n        id: 18, cn: '[抓狂]', hk: '[抓狂]', us: '[Scream]', code: '/::Q', web_code: '/抓狂', style: 'smiley_18'\n      }, {\n        id: 19, cn: '[吐]', hk: '[吐]', us: '[Puke]', code: '/::T', web_code: '/吐', style: 'smiley_19'\n      }, {\n        id: 20, cn: '[偷笑]', hk: '[偷笑]', us: '[Chuckle]', code: '/:,@P', web_code: '/偷笑', style: 'smiley_20'\n      }, {\n        id: 21, cn: '[愉快]', hk: '[愉快]', us: '[Joyful]', code: '/:,@-D', web_code: '/可爱', style: 'smiley_21'\n      }, {\n        id: 22, cn: '[白眼]', hk: '[白眼]', us: '[Slight]', code: '/::d', web_code: '/白眼', style: 'smiley_22'\n      }, {\n        id: 23, cn: '[傲慢]', hk: '[傲慢]', us: '[Smug]', code: '/:,@o', web_code: '/傲慢', style: 'smiley_23'\n      }, {\n        id: 24, cn: '[饥饿]', hk: '[饑餓]', us: '[Hungry]', code: '/::g', web_code: '/饥饿', style: 'smiley_24'\n      }, {\n        id: 25, cn: '[困]', hk: '[累]', us: '[Drowsy]', code: '/:|-)', web_code: '/困', style: 'smiley_25'\n      }, {\n        id: 26, cn: '[惊恐]', hk: '[驚恐]', us: '[Panic]', code: '/::!', web_code: '/惊恐', style: 'smiley_26'\n      }, {\n        id: 27, cn: '[流汗]', hk: '[流汗]', us: '[Sweat]', code: '/::L', web_code: '/流汗', style: 'smiley_27'\n      }, {\n        id: 28, cn: '[憨笑]', hk: '[大笑]', us: '[Laugh]', code: '/::>', web_code: '/憨笑', style: 'smiley_28'\n      }, {\n        id: 29, cn: '[悠闲]', hk: '[悠閑]', us: '[Commando]', code: '/::,@', web_code: '/大兵', style: 'smiley_29'\n      }, {\n        id: 30, cn: '[奋斗]', hk: '[奮鬥]', us: '[Determined]', code: '/:,@f', web_code: '/奋斗', style: 'smiley_30'\n      }, {\n        id: 31, cn: '[咒骂]', hk: '[咒罵]', us: '[Scold]', code: '/::-S', web_code: '/咒骂', style: 'smiley_31'\n      }, {\n        id: 32, cn: '[疑问]', hk: '[疑問]', us: '[Shocked]', code: '/:?', web_code: '/疑问', style: 'smiley_32'\n      }, {\n        id: 33, cn: '[嘘]', hk: '[噓]', us: '[Shhh]', code: '/:,@x', web_code: '/嘘', style: 'smiley_33'\n      }, {\n        id: 34, cn: '[晕]', hk: '[暈]', us: '[Dizzy]', code: '/:,@@', web_code: '/晕', style: 'smiley_34'\n      }, {\n        id: 35, cn: '[疯了]', hk: '[瘋了]', us: '[Tormented]', code: '/::8', web_code: '/折磨', style: 'smiley_35'\n      }, {\n        id: 36, cn: '[衰]', hk: '[衰]', us: '[Toasted]', code: '/:,@!', web_code: '/衰', style: 'smiley_36'\n      }, {\n        id: 37, cn: '[骷髅]', hk: '[骷髏頭]', us: '[Skull]', code: '/:!!!', web_code: '/骷髅', style: 'smiley_37'\n      }, {\n        id: 38, cn: '[敲打]', hk: '[敲打]', us: '[Hammer]', code: '/:xx', web_code: '/敲打', style: 'smiley_38'\n      }, {\n        id: 39, cn: '[再见]', hk: '[再見]', us: '[Wave]', code: '/:bye', web_code: '/再见', style: 'smiley_39'\n      }, {\n        id: 40, cn: '[擦汗]', hk: '[擦汗]', us: '[Speechless]', code: '/:wipe', web_code: '/擦汗', style: 'smiley_40'\n      }, {\n        id: 41, cn: '[抠鼻]', hk: '[摳鼻]', us: '[NosePick]', code: '/:dig', web_code: '/抠鼻', style: 'smiley_41'\n      }, {\n        id: 42, cn: '[鼓掌]', hk: '[鼓掌]', us: '[Clap]', code: '/:handclap', web_code: '/鼓掌', style: 'smiley_42'\n      }, {\n        id: 43, cn: '[糗大了]', hk: '[羞辱]', us: '[Shame]', code: '/:&-(', web_code: '/糗大了', style: 'smiley_43'\n      }, {\n        id: 44, cn: '[坏笑]', hk: '[壞笑]', us: '[Trick]', code: '/:B-)', web_code: '/坏笑', style: 'smiley_44'\n      }, {\n        id: 45, cn: '[左哼哼]', hk: '[左哼哼]', us: '[Bah！L]', code: '/:<@', web_code: '/左哼哼', style: 'smiley_45'\n      }, {\n        id: 46, cn: '[右哼哼]', hk: '[右哼哼]', us: '[Bah！R]', code: '/:@>', web_code: '/右哼哼', style: 'smiley_46'\n      }, {\n        id: 47, cn: '[哈欠]', hk: '[哈欠]', us: '[Yawn]', code: '/::-O', web_code: '/哈欠', style: 'smiley_47'\n      }, {\n        id: 48, cn: '[鄙视]', hk: '[鄙視]', us: '[Pooh-pooh]', code: '/:>-|', web_code: '/鄙视', style: 'smiley_48'\n      }, {\n        id: 49, cn: '[委屈]', hk: '[委屈]', us: '[Shrunken]', code: '/:P-(', web_code: '/委屈', style: 'smiley_49'\n      }, {\n        id: 50, cn: '[快哭了]', hk: '[快哭了]', us: '[TearingUp]', code: '/::\"|', web_code: '/快哭了', style: 'smiley_50'\n      }, {\n        id: 51, cn: '[阴险]', hk: '[陰險]', us: '[Sly]', code: '/:X-)', web_code: '/阴险', style: 'smiley_51'\n      }, {\n        id: 52, cn: '[亲亲]', hk: '[親親]', us: '[Kiss]', code: '/::*', web_code: '/亲亲', style: 'smiley_52'\n      }, {\n        id: 53, cn: '[吓]', hk: '[嚇]', us: '[Wrath]', code: '/:@x', web_code: '/吓', style: 'smiley_53'\n      }, {\n        id: 54, cn: '[可怜]', hk: '[可憐]', us: '[Whimper]', code: '/:8*', web_code: '/可怜', style: 'smiley_54'\n      }, {\n        id: 55, cn: '[菜刀]', hk: '[菜刀]', us: '[Cleaver]', code: '/:pd', web_code: '/菜刀', style: 'smiley_55'\n      }, {\n        id: 56, cn: '[西瓜]', hk: '[西瓜]', us: '[Watermelon]', code: '/:<W>', web_code: '/西瓜', style: 'smiley_56'\n      }, {\n        id: 57, cn: '[啤酒]', hk: '[啤酒]', us: '[Beer]', code: '/:beer', web_code: '/啤酒', style: 'smiley_57'\n      }, {\n        id: 58, cn: '[篮球]', hk: '[籃球]', us: '[Basketball]', code: '/:basketb', web_code: '/篮球', style: 'smiley_58'\n      }, {\n        id: 59, cn: '[乒乓]', hk: '[乒乓]', us: '[PingPong]', code: '/:oo', web_code: '/乒乓', style: 'smiley_59'\n      }, {\n        id: 60, cn: '[咖啡]', hk: '[咖啡]', us: '[Coffee]', code: '/:coffee', web_code: '/咖啡', style: 'smiley_60'\n      }, {\n        id: 61, cn: '[饭]', hk: '[飯]', us: '[Rice]', code: '/:eat', web_code: '/饭', style: 'smiley_61'\n      }, {\n        id: 62, cn: '[猪头]', hk: '[豬頭]', us: '[Pig]', code: '/:pig', web_code: '/猪头', style: 'smiley_62'\n      }, {\n        id: 63, cn: '[玫瑰]', hk: '[玫瑰]', us: '[Rose]', code: '/:rose', web_code: '/玫瑰', style: 'smiley_63'\n      }, {\n        id: 64, cn: '[凋谢]', hk: '[枯萎]', us: '[Wilt]', code: '/:fade', web_code: '/凋谢', style: 'smiley_64'\n      }, {\n        id: 65, cn: '[嘴唇]', hk: '[嘴唇]', us: '[Lips]', code: '/:showlove', web_code: '/示爱', style: 'smiley_65'\n      }, {\n        id: 66, cn: '[爱心]', hk: '[愛心]', us: '[Heart]', code: '/:heart', web_code: '/爱心', style: 'smiley_66'\n      }, {\n        id: 67, cn: '[心碎]', hk: '[心碎]', us: '[BrokenHeart]', code: '/:break', web_code: '/心碎', style: 'smiley_67'\n      }, {\n        id: 68, cn: '[蛋糕]', hk: '[蛋糕]', us: '[Cake]', code: '/:cake', web_code: '/蛋糕', style: 'smiley_68'\n      }, {\n        id: 69, cn: '[闪电]', hk: '[閃電]', us: '[Lightning]', code: '/:li', web_code: '/闪电', style: 'smiley_69'\n      }, {\n        id: 70, cn: '[炸弹]', hk: '[炸彈]', us: '[Bomb]', code: '/:bome', web_code: '/炸弹', style: 'smiley_70'\n      }, {\n        id: 71, cn: '[刀]', hk: '[刀]', us: '[Dagger]', code: '/:kn', web_code: '/刀', style: 'smiley_71'\n      }, {\n        id: 72, cn: '[足球]', hk: '[足球]', us: '[Soccer]', code: '/:footb', web_code: '/足球', style: 'smiley_72'\n      }, {\n        id: 73, cn: '[瓢虫]', hk: '[甲蟲]', us: '[Ladybug]', code: '/:ladybug', web_code: '/瓢虫', style: 'smiley_73'\n      }, {\n        id: 74, cn: '[便便]', hk: '[便便]', us: '[Poop]', code: '/:shit', web_code: '/便便', style: 'smiley_74'\n      }, {\n        id: 75, cn: '[月亮]', hk: '[月亮]', us: '[Moon]', code: '/:moon', web_code: '/月亮', style: 'smiley_75'\n      }, {\n        id: 76, cn: '[太阳]', hk: '[太陽]', us: '[Sun]', code: '/:sun', web_code: '/太阳', style: 'smiley_76'\n      }, {\n        id: 77, cn: '[礼物]', hk: '[禮物]', us: '[Gift]', code: '/:gift', web_code: '/礼物', style: 'smiley_77'\n      }, {\n        id: 78, cn: '[拥抱]', hk: '[擁抱]', us: '[Hug]', code: '/:hug', web_code: '/拥抱', style: 'smiley_78'\n      }, {\n        id: 79, cn: '[强]', hk: '[強]', us: '[ThumbsUp]', code: '/:strong', web_code: '/强', style: 'smiley_79'\n      }, {\n        id: 80, cn: '[弱]', hk: '[弱]', us: '[ThumbsDown]', code: '/:weak', web_code: '/弱', style: 'smiley_80'\n      }, {\n        id: 81, cn: '[握手]', hk: '[握手]', us: '[Shake]', code: '/:share', web_code: '/握手', style: 'smiley_81'\n      }, {\n        id: 82, cn: '[胜利]', hk: '[勝利]', us: '[Peace]', code: '/:v', web_code: '/胜利', style: 'smiley_82'\n      }, {\n        id: 83, cn: '[抱拳]', hk: '[抱拳]', us: '[Fight]', code: '/:@)', web_code: '/抱拳', style: 'smiley_83'\n      }, {\n        id: 84, cn: '[勾引]', hk: '[勾引]', us: '[Beckon]', code: '/:jj', web_code: '/勾引', style: 'smiley_84'\n      }, {\n        id: 85, cn: '[拳头]', hk: '[拳頭]', us: '[Fist]', code: '/:@@', web_code: '/拳头', style: 'smiley_85'\n      }, {\n        id: 86, cn: '[差劲]', hk: '[差勁]', us: '[Pinky]', code: '/:bad', web_code: '/差劲', style: 'smiley_86'\n      }, {\n        id: 87, cn: '[爱你]', hk: '[愛你]', us: '[RockOn]', code: '/:lvu', web_code: '/爱你', style: 'smiley_87'\n      }, {\n        id: 88, cn: '[NO]', hk: '[NO]', us: '[Nuh-uh]', code: '/:no', web_code: '/NO', style: 'smiley_88'\n      }, {\n        id: 89, cn: '[OK]', hk: '[OK]', us: '[OK]', code: '/:ok', web_code: '/OK', style: 'smiley_89'\n      }, {\n        id: 90, cn: '[爱情]', hk: '[愛情]', us: '[InLove]', code: '/:love', web_code: '/爱情', style: 'smiley_90'\n      }, {\n        id: 91, cn: '[飞吻]', hk: '[飛吻]', us: '[Blowkiss]', code: '/:<L>', web_code: '/飞吻', style: 'smiley_91'\n      }, {\n        id: 92, cn: '[跳跳]', hk: '[跳跳]', us: '[Waddle]', code: '/:jump', web_code: '/跳跳', style: 'smiley_92'\n      }, {\n        id: 93, cn: '[发抖]', hk: '[發抖]', us: '[Tremble]', code: '/:shake', web_code: '/发抖', style: 'smiley_93'\n      }, {\n        id: 94, cn: '[怄火]', hk: '[噴火]', us: '[Aaagh!]', code: '/:<O>', web_code: '/怄火', style: 'smiley_94'\n      }, {\n        id: 95, cn: '[转圈]', hk: '[轉圈]', us: '[Twirl]', code: '/:circle', web_code: '/转圈', style: 'smiley_95'\n      }, {\n        id: 96, cn: '[磕头]', hk: '[磕頭]', us: '[Kotow]', code: '/:kotow', web_code: '/磕头', style: 'smiley_96'\n      }, {\n        id: 97, cn: '[回头]', hk: '[回頭]', us: '[Dramatic]', code: '/:turn', web_code: '/回头', style: 'smiley_97'\n      }, {\n        id: 98, cn: '[跳绳]', hk: '[跳繩]', us: '[JumpRope]', code: '/:skip', web_code: '/跳绳', style: 'smiley_98'\n      }, {\n        id: 99, cn: '[投降]', hk: '[投降]', us: '[Surrender]', code: '/:oY', web_code: '/挥手', style: 'smiley_99'\n      }, {\n        id: 100, cn: '[激动]', hk: '[激動]', us: '[Hooray]', code: '/:#-0', web_code: '/激动', style: 'smiley_100'\n      }, {\n        id: 101, cn: '[乱舞]', hk: '[亂舞]', us: '[Meditate]', code: '/:hiphot', web_code: '/街舞', style: 'smiley_101'\n      }, {\n        id: 102, cn: '[献吻]', hk: '[獻吻]', us: '[Smooch]', code: '/:kiss', web_code: '/献吻', style: 'smiley_102'\n      }, {\n        id: 103, cn: '[左太极]', hk: '[左太極]', us: '[TaiChi L]', code: '/:<&', web_code: '/左太极', style: 'smiley_103'\n      }, {\n        id: 104, cn: '[右太极]', hk: '[右太極]', us: '[TaiChi R]', code: '/:&>', web_code: '/右太极', style: 'smiley_104'\n      }, {\n        id: 204, cn: '[嘿哈]', hk: '[吼嘿]', us: '[Hey]', code: '', web_code: '', style: 'e2_04'\n      }, {\n        id: 205, cn: '[捂脸]', hk: '[掩面]', us: '[Facepalm]', code: '', web_code: '', style: 'e2_05'\n      }, {\n        id: 202, cn: '[奸笑]', hk: '[奸笑]', us: '[Smirk]', code: '', web_code: '', style: 'e2_02'\n      }, {\n        id: 206, cn: '[机智]', hk: '[機智]', us: '[Smart]', code: '', web_code: '', style: 'e2_06'\n      }, {\n        id: 212, cn: '[皱眉]', hk: '[皺眉]', us: '[Moue]', code: '', web_code: '', style: 'e2_12'\n      }, {\n        id: 211, cn: '[耶]', hk: '[歐耶]', us: '[Yeah!]', code: '', web_code: '', style: 'e2_11'\n      }, {\n        id: 207, cn: '[茶]', hk: '[茶]', us: '[Tea]', code: '', web_code: '', style: 'e2_07'\n      }, {\n        id: 209, cn: '[红包]', hk: '[Packet]', us: '[Packet]', code: '', web_code: '', style: 'e2_09'\n      }, {\n        id: 210, cn: '[蜡烛]', hk: '[蠟燭]', us: '[Candle]', code: '', web_code: '', style: 'e2_10'\n      }, {\n        id: 215, cn: '[福]', hk: '[福]', us: '[Blessing]', code: '', web_code: '', style: 'e2_15'\n      }, {\n        id: 214, cn: '[鸡]', hk: '[小雞]', us: '[Chick]', code: '', web_code: '', style: 'e2_14'\n      }, {\n        id: 300, cn: '[笑脸]', emoji: '😄', hk: '', us: '', code: '\\\\ue415', web_code: '', style: 'u1F604'\n      }, {\n        id: 301, cn: '[生病]', emoji: '😷', hk: '', us: '', code: '\\\\ue40c', web_code: '', style: 'u1F637'\n      }, {\n        id: 302, cn: '[破涕为笑]', emoji: '😂', hk: '', us: '', code: '\\\\ue412', web_code: '', style: 'u1F602'\n      }, {\n        id: 303, cn: '[吐舌]', emoji: '😝', hk: '', us: '', code: '\\\\ue409', web_code: '', style: 'u1F61D'\n      }, {\n        id: 304, cn: '[脸红]', emoji: '😳', hk: '', us: '', code: '\\\\ue40d', web_code: '', style: 'u1F633'\n      }, {\n        id: 305, cn: '[恐惧]', emoji: '😱', hk: '', us: '', code: '\\\\ue107', web_code: '', style: 'u1F631'\n      }, {\n        id: 306, cn: '[失望]', emoji: '😔', hk: '', us: '', code: '\\\\ue403', web_code: '', style: 'u1F614'\n      }, {\n        id: 307, cn: '[无语]', emoji: '😒', hk: '', us: '', code: '\\\\ue40e', web_code: '', style: 'u1F612'\n      }, {\n        id: 308, cn: '[鬼魂]', emoji: '👻', hk: '', us: '', code: '\\\\ue11b', web_code: '', style: 'u1F47B'\n      }, {\n        id: 309, cn: '[合十]', emoji: '🙏', hk: '', us: '', code: '\\\\ue41d', web_code: '', style: 'u1F64F'\n      }, {\n        id: 310, cn: '[强壮]', emoji: '💪', hk: '', us: '', code: '\\\\ue14c', web_code: '', style: 'u1F4AA'\n      }, {\n        id: 311, cn: '[庆祝]', emoji: '🎉', hk: '', us: '', code: '\\\\ue312', web_code: '', style: 'u1F389'\n      }, {\n        id: 312, cn: '[礼物]', hk: '', us: '', code: '\\\\ue112', web_code: '', style: 'u1F381'\n      }, {\n        id: 313, cn: '[吃瓜]', hk: '[]', us: '[]', code: '', web_code: '', style: 'smiley_313'\n      }, {\n        id: 314, cn: '[加油]', hk: '[]', us: '[]', code: '', web_code: '', style: 'smiley_314'\n      }, {\n        id: 315, cn: '[汗]', hk: '[]', us: '[]', code: '', web_code: '', style: 'smiley_315'\n      }, {\n        id: 316, cn: '[天啊]', hk: '[]', us: '[]', code: '', web_code: '', style: 'smiley_316'\n      }, {\n        id: 317, cn: '[Emm]', hk: '[]', us: '[]', code: '', web_code: '', style: 'smiley_317'\n      }, {\n        id: 318, cn: '[社会社会]', hk: '[]', us: '[]', code: '', web_code: '', style: 'smiley_318'\n      }, {\n        id: 319, cn: '[旺柴]', hk: '[]', us: '[]', code: '', web_code: '', style: 'smiley_319'\n      }, {\n        id: 320, cn: '[好的]', hk: '[]', us: '[]', code: '', web_code: '', style: 'smiley_320'\n      }, {\n        id: 321, cn: '[打脸]', hk: '[]', us: '[]', code: '', web_code: '', style: 'smiley_321'\n      }, {\n        id: 322, cn: '[哇]', hk: '[]', us: '[]', code: '', web_code: '', style: 'smiley_322'\n      }]\n      /***/ }),\n    /* 1 */,\n    /* 2 */\n    /***/ (function (module, exports, __webpack_require__) {\n      Object.defineProperty(exports, '__esModule', { value: true })\n      const emoji_data_1 = __webpack_require__(0)\n      const emoji_panel_data_1 = __webpack_require__(3)\n      const parser_1 = __webpack_require__(4)\n      const EMOTION_SIZE = 40\n      const emotionMap = {}\n      const emotionNames = []\n      emoji_data_1.default.forEach(function (item) {\n        emotionMap[item.id] = item\n        emotionNames.push(item.cn)\n      })\n      const emotions = []\n      emoji_panel_data_1.default.forEach(function (id) {\n        return emotions.push(emotionMap[id])\n      })\n      Component({\n        options: {\n          pureDataPattern: /^_/\n        },\n        properties: {\n          padding: {\n            type: Number,\n            value: 15\n          },\n          backgroundColor: {\n            type: String,\n            value: '#EDEDED'\n          },\n          showSend: {\n            type: Boolean,\n            value: true\n          },\n          showDel: {\n            type: Boolean,\n            value: true\n          },\n          showHistory: {\n            type: Boolean,\n            value: true\n          },\n          height: {\n            type: Number,\n            value: 300\n          },\n          source: {\n            type: String,\n            value: ''\n          },\n          // 适配 darkmode\n          theme: {\n            type: String,\n            value: 'light' // light dark\n          }\n        },\n        data: {\n          history: [],\n          emotions,\n          extraPadding: 0,\n          perLine: 0\n        },\n        lifetimes: {\n          attached: function attached() {\n            const padding = this.data.padding\n            const systemInfo = wx.getSystemInfoSync()\n            const areaWidth = systemInfo.windowWidth\n            const perLine = Math.floor((areaWidth - padding * 2) / 45)\n            const extraPadding = Math.floor((areaWidth - padding * 2 - perLine * EMOTION_SIZE) / (perLine - 1))\n            this.setData({\n              perLine,\n              extraPadding,\n              hasSafeBottom: systemInfo.model.indexOf('iPhone X') >= 0\n            })\n          }\n        },\n        methods: {\n          getEmojiNames() {\n            return emotionNames\n          },\n\n          parseEmoji: parser_1.parseEmoji,\n          insertEmoji(evt) {\n            const data = this.data\n            const idx = evt.currentTarget.dataset.idx\n            const emotionName = data.emotions[idx].cn\n            this.LRUCache(data.history, data.perLine, idx)\n            this.setData({ history: data.history })\n            this.triggerEvent('insertemoji', { emotionName })\n          },\n          deleteEmoji() {\n            this.triggerEvent('delemoji')\n          },\n          send() {\n            this.triggerEvent('send')\n          },\n          LRUCache(arr, limit, data) {\n            const idx = arr.indexOf(data)\n            if (idx >= 0) {\n              arr.splice(idx, 1)\n              arr.unshift(data)\n            } else if (arr.length < limit) {\n              arr.push(data)\n            } else if (arr.length === limit) {\n              arr[limit - 1] = data\n            }\n          }\n        }\n      })\n      /***/ }),\n    /* 3 */\n    /***/ (function (module, exports, __webpack_require__) {\n      Object.defineProperty(exports, '__esModule', { value: true })\n      exports.default = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 60, 62, 63, 64, 65, 66, 67, 68, 70, 74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 85, 89, 92, 93, 94, 95, 300, 301, 302, 303, 304, 305, 306, 307, 204, 205, 202, 206, 212, 211, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 308, 309, 310, 311, 312, 209]\n      /***/ }),\n    /* 4 */\n    /***/ (function (module, exports, __webpack_require__) {\n      Object.defineProperty(exports, '__esModule', { value: true })\n      const emoji_data_1 = __webpack_require__(0)\n      const emotionMap = {}\n      emoji_data_1.default.forEach(function (item, index) {\n        if (item.cn) {\n          emotionMap[item.cn] = item\n        }\n        if (item.code) emotionMap[item.code] = item\n        if (item.us) emotionMap[item.us] = item\n      })\n      const parseEmoji = function parseEmoji(content) {\n        let emojiIndexList = []\n        for (const k in emotionMap) {\n          let idx = content.indexOf(k)\n          while (idx >= 0) {\n            emojiIndexList.push({ idx, code: k, type: 2 })\n            idx = content.indexOf(k, idx + k.length)\n          }\n        }\n        emojiIndexList = emojiIndexList.sort(function (a, b) {\n          return a.idx - b.idx\n        })\n        const newContentList = []\n        let lastTextIndex = 0\n        emojiIndexList.forEach(function (item) {\n          if (lastTextIndex !== item.idx) {\n            newContentList.push({\n              type: 1,\n              content: content.substring(lastTextIndex, item.idx)\n            })\n          }\n          if (item.type === 2) {\n            newContentList.push({\n              type: item.type,\n              content: content.substr(item.idx, item.code.length),\n              imageClass: emotionMap[item.code].style\n            })\n          } else {\n            newContentList.push({\n              type: item.type,\n              content: item.code,\n              imageClass: item.value\n            })\n          }\n          lastTextIndex = item.idx + item.code.length\n        })\n        const lastText = content.substring(lastTextIndex)\n        if (lastText) {\n          newContentList.push({\n            type: 1,\n            content: lastText\n          })\n        }\n        return newContentList\n      }\n      exports.parseEmoji = parseEmoji\n      /***/ })\n    /** *** */ ]))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/emoji/emoji.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/emoji/emoji.wxml",
    "content": "<!--components/emoji/emoji.wxml-->\n<view class=\"weui-emoji_area\" style=\"height: {{height}}px; background-color: {{backgroundColor}}\">\n  <view \n    class=\"weui-emotion_list\"\n    style=\"padding-left: {{padding}}px; padding-right: {{padding}}px;\"\n  >\n    <view hidden=\"{{!showHistory || history.length === 0}}\">\n      <view class=\"weui-emotion_head\">最近使用</view>\n      <block wx:for=\"{{history}}\" wx:key=\"*this\">\n        <view class=\"weui-emotion_item\" data-idx=\"{{item}}\" bindtap=\"insertEmoji\" style=\"margin-right: {{(index + 1) % perLine ? extraPadding : 0}}px\">\n          <view class=\"weui-icon_emotion {{emotions[item].style}}\" style=\"background-image: url({{source}});\"></view>\n        </view>\n      </block>\n    </view>\n    <!-- 图片32px，每个宽度40px -->\n    <view class=\"weui-emotion_head\" style=\"margin-top: 8px;\">所有表情{{emotions.length}}</view>\n    <block wx:for=\"{{emotions}}\" wx:key=\"*this\">\n      <view class=\"weui-emotion_item\" data-idx=\"{{index}}\" bindtap=\"insertEmoji\" style=\"padding-right: {{(index + 1) % perLine ? extraPadding : 0}}px\">\n        <view class=\"weui-icon_emotion {{item.style}}\" style=\"background-image: url({{source}});\"></view>\n      </view>\n    </block>\n  </view>\n  <!--操作-->\n  <view class=\"weui-emoji__operation\">\n    <view class=\"weui-emoji__operation__delete\" bindtap=\"deleteEmoji\" wx:if=\"{{showDel}}\">\n      <image src=\"./icon_emotion_del.png\" class=\"weui-emotion_del_btn\"></image>\n    </view>\n    <view class=\"weui-emoji__operation__send\" bindtap=\"send\" wx:if=\"{{showSend}}\">发送</view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/emoji/emoji.wxss",
    "content": "/*!-----The css code below is created by----*/\n.e2_02,\n.e2_04,\n.e2_05,\n.e2_06,\n.e2_09,\n.e2_11,\n.e2_12,\n.e2_14,\n.smiley_0,\n.smiley_1,\n.smiley_10,\n.smiley_11,\n.smiley_12,\n.smiley_13,\n.smiley_14,\n.smiley_15,\n.smiley_17,\n.smiley_18,\n.smiley_19,\n.smiley_2,\n.smiley_20,\n.smiley_21,\n.smiley_22,\n.smiley_23,\n.smiley_25,\n.smiley_26,\n.smiley_27,\n.smiley_28,\n.smiley_29,\n.smiley_3,\n.smiley_30,\n.smiley_31,\n.smiley_313,\n.smiley_314,\n.smiley_315,\n.smiley_316,\n.smiley_317,\n.smiley_318,\n.smiley_319,\n.smiley_32,\n.smiley_320,\n.smiley_321,\n.smiley_322,\n.smiley_33,\n.smiley_34,\n.smiley_36,\n.smiley_37,\n.smiley_38,\n.smiley_39,\n.smiley_4,\n.smiley_40,\n.smiley_41,\n.smiley_42,\n.smiley_44,\n.smiley_45,\n.smiley_46,\n.smiley_47,\n.smiley_48,\n.smiley_49,\n.smiley_5,\n.smiley_50,\n.smiley_51,\n.smiley_52,\n.smiley_54,\n.smiley_55,\n.smiley_56,\n.smiley_57,\n.smiley_6,\n.smiley_60,\n.smiley_61,\n.smiley_62,\n.smiley_63,\n.smiley_64,\n.smiley_65,\n.smiley_66,\n.smiley_67,\n.smiley_68,\n.smiley_7,\n.smiley_70,\n.smiley_74,\n.smiley_75,\n.smiley_76,\n.smiley_78,\n.smiley_79,\n.smiley_8,\n.smiley_80,\n.smiley_81,\n.smiley_82,\n.smiley_83,\n.smiley_84,\n.smiley_85,\n.smiley_89,\n.smiley_9,\n.smiley_92,\n.smiley_93,\n.smiley_94,\n.smiley_95,\n.u1F381,\n.u1F389,\n.u1F47B,\n.u1F4AA,\n.u1F602,\n.u1F604,\n.u1F612,\n.u1F614,\n.u1F61D,\n.u1F631,\n.u1F633,\n.u1F637,\n.u1F64F {\n  display: inline-block;\n  background-repeat: no-repeat\n}\n\n.e2_02 {\n  width: 64px;\n  height: 64px;\n  background-position: -66px 0\n}\n\n.e2_04 {\n  width: 64px;\n  height: 64px;\n  background-position: -462px -396px\n}\n\n.e2_05 {\n  width: 64px;\n  height: 64px;\n  background-position: 0 -66px\n}\n\n.e2_06 {\n  width: 64px;\n  height: 64px;\n  background-position: -66px -66px\n}\n\n.e2_09 {\n  width: 64px;\n  height: 64px;\n  background-position: -132px 0\n}\n\n.e2_11 {\n  width: 64px;\n  height: 64px;\n  background-position: -132px -66px\n}\n\n.e2_12 {\n  width: 64px;\n  height: 64px;\n  background-position: 0 -132px\n}\n\n.e2_14 {\n  width: 64px;\n  height: 64px;\n  background-position: -66px -132px\n}\n\n.smiley_0 {\n  width: 64px;\n  height: 64px;\n  background-position: -132px -132px\n}\n\n.smiley_1 {\n  width: 63px;\n  height: 64px;\n  background-position: -660px -594px\n}\n\n.smiley_10 {\n  width: 64px;\n  height: 64px;\n  background-position: -198px -66px\n}\n\n.smiley_11 {\n  width: 64px;\n  height: 64px;\n  background-position: -198px -132px\n}\n\n.smiley_12 {\n  width: 64px;\n  height: 64px;\n  background-position: 0 -198px\n}\n\n.smiley_13 {\n  width: 64px;\n  height: 64px;\n  background-position: -66px -198px\n}\n\n.smiley_14 {\n  width: 64px;\n  height: 64px;\n  background-position: -132px -198px\n}\n\n.smiley_15 {\n  width: 64px;\n  height: 64px;\n  background-position: -198px -198px\n}\n\n.smiley_17 {\n  width: 64px;\n  height: 64px;\n  background-position: -264px 0\n}\n\n.smiley_18 {\n  width: 64px;\n  height: 64px;\n  background-position: -264px -66px\n}\n\n.smiley_19 {\n  width: 64px;\n  height: 64px;\n  background-position: -264px -132px\n}\n\n.smiley_2 {\n  width: 64px;\n  height: 64px;\n  background-position: -264px -198px\n}\n\n.smiley_20 {\n  width: 64px;\n  height: 64px;\n  background-position: 0 -264px\n}\n\n.smiley_21 {\n  width: 64px;\n  height: 64px;\n  background-position: -66px -264px\n}\n\n.smiley_22 {\n  width: 64px;\n  height: 64px;\n  background-position: -132px -264px\n}\n\n.smiley_23 {\n  width: 64px;\n  height: 64px;\n  background-position: -198px -264px\n}\n\n.smiley_25 {\n  width: 64px;\n  height: 64px;\n  background-position: -264px -264px\n}\n\n.smiley_26 {\n  width: 64px;\n  height: 64px;\n  background-position: -330px 0\n}\n\n.smiley_27 {\n  width: 64px;\n  height: 64px;\n  background-position: -330px -66px\n}\n\n.smiley_28 {\n  width: 64px;\n  height: 64px;\n  background-position: -330px -132px\n}\n\n.smiley_29 {\n  width: 64px;\n  height: 64px;\n  background-position: -330px -198px\n}\n\n.smiley_3 {\n  width: 64px;\n  height: 64px;\n  background-position: -330px -264px\n}\n\n.smiley_30 {\n  width: 64px;\n  height: 64px;\n  background-position: 0 -330px\n}\n\n.smiley_31 {\n  width: 64px;\n  height: 64px;\n  background-position: -66px -330px\n}\n\n.smiley_313 {\n  width: 64px;\n  height: 64px;\n  background-position: -132px -330px\n}\n\n.smiley_314 {\n  width: 64px;\n  height: 64px;\n  background-position: -198px -330px\n}\n\n.smiley_315 {\n  width: 64px;\n  height: 64px;\n  background-position: -264px -330px\n}\n\n.smiley_316 {\n  width: 64px;\n  height: 64px;\n  background-position: -330px -330px\n}\n\n.smiley_317 {\n  width: 64px;\n  height: 64px;\n  background-position: -396px 0\n}\n\n.smiley_318 {\n  width: 64px;\n  height: 64px;\n  background-position: -396px -66px\n}\n\n.smiley_319 {\n  width: 64px;\n  height: 64px;\n  background-position: -396px -132px\n}\n\n.smiley_32 {\n  width: 64px;\n  height: 64px;\n  background-position: -396px -198px\n}\n\n.smiley_320 {\n  width: 64px;\n  height: 64px;\n  background-position: -396px -264px\n}\n\n.smiley_321 {\n  width: 64px;\n  height: 64px;\n  background-position: -396px -330px\n}\n\n.smiley_322 {\n  width: 64px;\n  height: 64px;\n  background-position: 0 -396px\n}\n\n.smiley_33 {\n  width: 64px;\n  height: 64px;\n  background-position: -66px -396px\n}\n\n.smiley_34 {\n  width: 64px;\n  height: 64px;\n  background-position: -132px -396px\n}\n\n.smiley_36 {\n  width: 64px;\n  height: 64px;\n  background-position: -198px -396px\n}\n\n.smiley_37 {\n  width: 64px;\n  height: 64px;\n  background-position: -264px -396px\n}\n\n.smiley_38 {\n  width: 64px;\n  height: 64px;\n  background-position: -330px -396px\n}\n\n.smiley_39 {\n  width: 64px;\n  height: 64px;\n  background-position: -396px -396px\n}\n\n.smiley_4 {\n  width: 64px;\n  height: 64px;\n  background-position: -462px 0\n}\n\n.smiley_40 {\n  width: 64px;\n  height: 64px;\n  background-position: -462px -66px\n}\n\n.smiley_41 {\n  width: 64px;\n  height: 64px;\n  background-position: -462px -132px\n}\n\n.smiley_42 {\n  width: 64px;\n  height: 64px;\n  background-position: -462px -198px\n}\n\n.smiley_44 {\n  width: 64px;\n  height: 64px;\n  background-position: -462px -264px\n}\n\n.smiley_45 {\n  width: 64px;\n  height: 64px;\n  background-position: -462px -330px\n}\n\n.smiley_46 {\n  width: 64px;\n  height: 64px;\n  background-position: 0 0\n}\n\n.smiley_47 {\n  width: 64px;\n  height: 64px;\n  background-position: 0 -462px\n}\n\n.smiley_48 {\n  width: 64px;\n  height: 64px;\n  background-position: -66px -462px\n}\n\n.smiley_49 {\n  width: 64px;\n  height: 64px;\n  background-position: -132px -462px\n}\n\n.smiley_5 {\n  width: 64px;\n  height: 64px;\n  background-position: -198px -462px\n}\n\n.smiley_50 {\n  width: 64px;\n  height: 64px;\n  background-position: -264px -462px\n}\n\n.smiley_51 {\n  width: 64px;\n  height: 64px;\n  background-position: -330px -462px\n}\n\n.smiley_52 {\n  width: 64px;\n  height: 64px;\n  background-position: -396px -462px\n}\n\n.smiley_54 {\n  width: 64px;\n  height: 64px;\n  background-position: -462px -462px\n}\n\n.smiley_55 {\n  width: 64px;\n  height: 64px;\n  background-position: -528px 0\n}\n\n.smiley_56 {\n  width: 64px;\n  height: 64px;\n  background-position: -528px -66px\n}\n\n.smiley_57 {\n  width: 64px;\n  height: 64px;\n  background-position: -528px -132px\n}\n\n.smiley_6 {\n  width: 64px;\n  height: 64px;\n  background-position: -528px -198px\n}\n\n.smiley_60 {\n  width: 64px;\n  height: 64px;\n  background-position: -528px -264px\n}\n\n.smiley_61 {\n  width: 64px;\n  height: 64px;\n  background-position: -528px -330px\n}\n\n.smiley_62 {\n  width: 64px;\n  height: 64px;\n  background-position: -528px -396px\n}\n\n.smiley_63 {\n  width: 64px;\n  height: 64px;\n  background-position: -528px -462px\n}\n\n.smiley_64 {\n  width: 64px;\n  height: 64px;\n  background-position: 0 -528px\n}\n\n.smiley_65 {\n  width: 64px;\n  height: 64px;\n  background-position: -66px -528px\n}\n\n.smiley_66 {\n  width: 64px;\n  height: 64px;\n  background-position: -132px -528px\n}\n\n.smiley_67 {\n  width: 64px;\n  height: 64px;\n  background-position: -198px -528px\n}\n\n.smiley_68 {\n  width: 64px;\n  height: 64px;\n  background-position: -264px -528px\n}\n\n.smiley_7 {\n  width: 64px;\n  height: 64px;\n  background-position: -330px -528px\n}\n\n.smiley_70 {\n  width: 64px;\n  height: 64px;\n  background-position: -396px -528px\n}\n\n.smiley_74 {\n  width: 64px;\n  height: 64px;\n  background-position: -462px -528px\n}\n\n.smiley_75 {\n  width: 64px;\n  height: 64px;\n  background-position: -528px -528px\n}\n\n.smiley_76 {\n  width: 64px;\n  height: 64px;\n  background-position: -594px 0\n}\n\n.smiley_78 {\n  width: 64px;\n  height: 64px;\n  background-position: -594px -66px\n}\n\n.smiley_79 {\n  width: 64px;\n  height: 64px;\n  background-position: -594px -132px\n}\n\n.smiley_8 {\n  width: 64px;\n  height: 64px;\n  background-position: -594px -198px\n}\n\n.smiley_80 {\n  width: 64px;\n  height: 64px;\n  background-position: -594px -264px\n}\n\n.smiley_81 {\n  width: 64px;\n  height: 64px;\n  background-position: -594px -330px\n}\n\n.smiley_82 {\n  width: 64px;\n  height: 64px;\n  background-position: -594px -396px\n}\n\n.smiley_83 {\n  width: 64px;\n  height: 64px;\n  background-position: -594px -462px\n}\n\n.smiley_84 {\n  width: 64px;\n  height: 64px;\n  background-position: -594px -528px\n}\n\n.smiley_85 {\n  width: 64px;\n  height: 64px;\n  background-position: 0 -594px\n}\n\n.smiley_89 {\n  width: 64px;\n  height: 64px;\n  background-position: -66px -594px\n}\n\n.smiley_9 {\n  width: 64px;\n  height: 64px;\n  background-position: -132px -594px\n}\n\n.smiley_92 {\n  width: 64px;\n  height: 64px;\n  background-position: -198px -594px\n}\n\n.smiley_93 {\n  width: 64px;\n  height: 64px;\n  background-position: -264px -594px\n}\n\n.smiley_94 {\n  width: 64px;\n  height: 64px;\n  background-position: -330px -594px\n}\n\n.smiley_95 {\n  width: 64px;\n  height: 64px;\n  background-position: -396px -594px\n}\n\n.u1F381 {\n  width: 64px;\n  height: 64px;\n  background-position: -462px -594px\n}\n\n.u1F389 {\n  width: 64px;\n  height: 64px;\n  background-position: -528px -594px\n}\n\n.u1F47B {\n  width: 64px;\n  height: 64px;\n  background-position: -594px -594px\n}\n\n.u1F4AA {\n  width: 64px;\n  height: 64px;\n  background-position: -660px 0\n}\n\n.u1F602 {\n  width: 64px;\n  height: 64px;\n  background-position: -660px -66px\n}\n\n.u1F604 {\n  width: 64px;\n  height: 64px;\n  background-position: -660px -132px\n}\n\n.u1F612 {\n  width: 64px;\n  height: 64px;\n  background-position: -660px -198px\n}\n\n.u1F614 {\n  width: 64px;\n  height: 64px;\n  background-position: -660px -264px\n}\n\n.u1F61D {\n  width: 64px;\n  height: 64px;\n  background-position: -660px -330px\n}\n\n.u1F631 {\n  width: 64px;\n  height: 64px;\n  background-position: -660px -396px\n}\n\n.u1F633 {\n  width: 64px;\n  height: 64px;\n  background-position: -660px -462px\n}\n\n.u1F637 {\n  width: 64px;\n  height: 64px;\n  background-position: -198px 0\n}\n\n.u1F64F {\n  width: 64px;\n  height: 64px;\n  background-position: -660px -528px\n}\n\n.weui-emotion_list {\n  padding: 0 10px;\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n  width: 100%;\n  height: 100%;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  white-space: normal;\n  font-size: 0;\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom);\n}\n\n.weui-emotion_item {\n  display: inline-block;\n  position: relative;\n  width: 40px;\n  height: 40px;\n  padding-bottom: 5px;\n  line-height: 40px\n}\n\n.weui-icon_emotion {\n  position: absolute;\n  top: 4px;\n  left: 4px;\n  display: inline-block;\n  transform-origin: 0 0;\n  transform: scale(.5)\n}\n\n.weui-emotion_head {\n  margin: 14px 5px 8px;\n  color: var(--weui-FG-0);\n  font-size: 14px;\n  text-align: left\n}\n\n\n.weui-emoji_area {\n  position: relative;\n  width: 100%;\n  background: var(--weui-BG-0)\n\n}\n\n.weui-emoji_area__has-safe-bottom {\n  padding-bottom: 34px\n}\n\n.weui-emotion_del_btn {\n  display: inline-block;\n  width: 24px;\n  height: 24px;\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -50%)\n}\n\n.weui-emoji__operation {\n  position: absolute;\n  bottom: 34px;\n  right: 12px;\n  width: 120px;\n  height: 44px;\n  display: flex;\n  align-items: center;\n  justify-content: flex-end\n}\n\n.weui-emoji__operation__delete,\n.weui-emoji__operation__send {\n  display: inline-block;\n  width: 56px;\n  height: 44px;\n  line-height: 44px;\n  text-align: center;\n  border-radius: 4px;\n  font-size: 16px\n}\n\n.weui-emoji__operation__delete {\n  position: relative;\n  font-size: 0;\n  background-color: var(--weui-BG-3)\n}\n\n\n.weui-emoji__operation__send {\n  margin-left: 8px;\n  background-color: #04C160;\n  color: rgba(255, 255, 255, 0.9)\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/form/form.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 4)\n    /** *** */ }([\n    /* 0 */\n    /***/ (function (module, exports, __webpack_require__) {\n      Object.defineProperty(exports, '__esModule', { value: true })\n      exports.diff = function (old, newVal) {\n        if (!old && newVal || old && !newVal) return true\n        for (const k in newVal) {\n          if (old[k] !== newVal[k]) return true\n        }\n        for (const _k in old) {\n          if (old[_k] !== newVal[_k]) return true\n        }\n        return false\n      }\n      exports.diffObject = function (old, newVal) {\n        if (!old && newVal) return newVal\n        if (!newVal && old) return old\n        const diffObj = {}\n        let isDiff = false\n        for (const k in newVal) {\n          if (old[k] !== newVal[k]) {\n            isDiff = true\n            diffObj[k] = newVal[k]\n          }\n        }\n        for (const _k2 in old) {\n          if (old[_k2] !== newVal[_k2]) {\n            isDiff = true\n            diffObj[_k2] = newVal[_k2]\n          }\n        }\n        return isDiff ? diffObj : null\n      }\n      /***/ }),\n    /* 1 */,\n    /* 2 */,\n    /* 3 */,\n    /* 4 */\n    /***/ (function (module, exports, __webpack_require__) {\n      Object.defineProperty(exports, '__esModule', { value: true })\n      const form_validator_1 = __webpack_require__(5)\n      const object_1 = __webpack_require__(0)\n      function linked(target) {\n        if (target.data.prop) {\n          this.data.formItems[target.data.prop] = target\n        }\n        if (target.setInForm) {\n          target.setInForm()\n        }\n        if (!this.data.firstItem) {\n          this.data.firstItem = target\n        }\n        if (target !== this.data.firstItem) {}\n      }\n      function unlinked(target) {\n        if (target.data.prop) {\n          delete this.data.formItems[target.data.prop]\n        }\n      }\n      Component({\n        properties: {\n          models: {\n            type: Object,\n            value: {},\n            observer: '_modelChange'\n          },\n          rules: {\n            type: Array,\n            value: [],\n            observer: '_rulesChange'\n          },\n          extClass: {\n            type: String,\n            value: ''\n          }\n        },\n        data: {\n          errors: {},\n          formItems: {},\n          firstItem: null\n        },\n        relations: {\n          '../cell/cell': {\n            type: 'descendant',\n            linked,\n            unlinked\n          },\n          '../checkbox-group/checkbox-group': {\n            type: 'descendant',\n            linked,\n            unlinked\n          }\n        },\n        attached: function attached() {\n          this.initRules()\n          this.formValidator = new form_validator_1.default(this.data.models, this.data.newRules)\n        },\n\n        methods: {\n          initRules: function initRules(rules) {\n            const newRules = {};\n            (rules || this.data.rules).forEach(function (rule) {\n              if (rule.name && rule.rules) {\n                newRules[rule.name] = rule.rules || []\n              }\n            })\n            this.setData({ newRules })\n            return newRules\n          },\n          _modelChange: function _modelChange(newVal, oldVal, path) {\n            const _this = this\n\n            if (!this.isInit) {\n              this.isInit = true\n              return newVal\n            }\n            this.formValidator.setModel(newVal)\n            this.isInit = true\n            const diffObj = object_1.diffObject(oldVal, newVal)\n            if (diffObj) {\n              (function () {\n                let isValid = true\n                const errors = []\n                const errorMap = {}\n\n                const _loop = function _loop(k) {\n                  _this.formValidator.validateField(k, diffObj[k], function (isValided, error) {\n                    if (error && error[k]) {\n                      errors.push(error[k])\n                      errorMap[k] = error[k]\n                    }\n                    isValid = isValided\n                  })\n                }\n\n                for (const k in diffObj) {\n                  _loop(k)\n                }\n                _this._showErrors(diffObj, errorMap)\n                _this.triggerEvent(isValid ? 'success' : 'fail', isValid ? { trigger: 'change' } : { errors, trigger: 'change' })\n              }())\n            }\n            return newVal\n          },\n          _rulesChange: function _rulesChange(newVal) {\n            const newRules = this.initRules(newVal)\n            if (this.formValidator) {\n              this.formValidator.setRules(newRules)\n            }\n            return newVal\n          },\n          _showAllErrors: function _showAllErrors(errors) {\n            for (const k in this.data.newRules) {\n              this._showError(k, errors && errors[k])\n            }\n          },\n          _showErrors: function _showErrors(objs, errors) {\n            for (const k in objs) {\n              this._showError(k, errors && errors[k])\n            }\n          },\n          _showError: function _showError(prop, error) {\n            const formItem = this.data.formItems[prop]\n            if (formItem && formItem.data.showError) {\n              formItem.setError(error)\n            }\n          },\n          validate: function validate(cb) {\n            const _this2 = this\n\n            return this.formValidator.validate(function (isValid, errors) {\n              _this2._showAllErrors(errors)\n              const handleError = _this2.handleErrors(errors)\n              _this2.triggerEvent(isValid ? 'success' : 'fail', isValid ? { trigger: 'validate' } : { errors: handleError, trigger: 'validate' })\n              cb && cb(isValid, handleError)\n            })\n          },\n          validateField: function validateField(name, value) {\n            const _this3 = this\n\n            const cb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (v) {\n              const error = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null\n            }\n\n            return this.formValidator.validateField(name, value, function (isValid, errors) {\n              _this3._showError(name, errors)\n              const handleError = _this3.handleErrors(errors)\n              _this3.triggerEvent(isValid ? 'success' : 'fail', isValid ? { trigger: 'validate' } : { errors: handleError, trigger: 'validate' })\n              cb && cb(isValid, handleError)\n            })\n          },\n          handleErrors: function handleErrors(errors) {\n            if (errors) {\n              const newErrors = []\n              this.data.rules.forEach(function (rule) {\n                if (errors[rule.name]) {\n                  errors[rule.name].name = rule.name\n                  newErrors.push(errors[rule.name])\n                }\n              })\n              return newErrors\n            }\n            return errors\n          },\n          addMethod: function addMethod(ruleName, method) {\n            return this.formValidator.addMethod(ruleName, method)\n          }\n        }\n      })\n      exports.default = form_validator_1.default\n      /***/ }),\n    /* 5 */\n    /***/ (function (module, exports, __webpack_require__) {\n      function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function') } }\n\n      Object.defineProperty(exports, '__esModule', { value: true })\n      const validator_1 = __webpack_require__(6)\n      const object_1 = __webpack_require__(0)\n      const toString = Object.prototype.toString\n      const validateSingleRule = function validateSingleRule(rule, value) {\n        const param = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null\n        const models = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null\n\n        let message = ''\n        for (const ruleKey in rule) {\n          if (ruleKey === 'name' || ruleKey === 'message') continue\n          const validateMethod = typeof rule.validator !== 'undefined' ? rule.validator : validator_1.default[ruleKey]\n          if (typeof validateMethod === 'function') {\n            message = validateMethod(rule, value, param, models)\n            if (message) {\n              return message\n            }\n          }\n        }\n        return message\n      }\n\n      const FormValidator = (function () {\n        function FormValidator(models, rules) {\n          _classCallCheck(this, FormValidator)\n\n          this.models = models\n          this.rules = rules\n          this.errors = {}\n        }\n\n        FormValidator.prototype.validate = function validate(cb) {\n          const _this = this\n\n          return new Promise(function (resolve) {\n            let fieldCount = 0\n            let failCount = 0\n            const errors = _this.errors\n            const models = _this.models\n            let errorChanged = false\n\n            const _loop = function _loop(k) {\n              (function (fieldName) {\n                const oldError = errors[fieldName]\n                _this._innerValidateField(k, models[fieldName], function (valid, newError) {\n                  fieldCount++\n                  if (!valid) failCount++\n                  if (object_1.diff(oldError, newError)) {\n                    errors[fieldName] = newError\n                    errorChanged = true\n                  }\n                })\n              }(k))\n            }\n\n            for (const k in _this.rules) {\n              _loop(k)\n            }\n            if (errorChanged) {}\n            const keys = Object.keys(errors)\n            keys.forEach(function (key) {\n              if (!errors[key]) delete errors[key]\n            })\n            resolve({ isValid: !failCount, errors: failCount ? errors : undefined })\n            cb && cb(!failCount, failCount ? errors : undefined)\n          })\n        }\n\n        FormValidator.prototype.validateField = function validateField(name, value) {\n          const _this2 = this\n\n          const cb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (v) {\n            const error = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null\n          }\n\n          return new Promise(function (resolve) {\n            _this2._innerValidateField(name, value, function (valid, error) {\n              const errObj = {}\n              errObj[name] = error\n              resolve({ valid, error: valid ? undefined : error })\n              cb(valid, valid ? undefined : errObj)\n              const oldError = _this2.errors[name]\n              const errorChanged = object_1.diff(oldError, error)\n              if (errorChanged) {\n                if (!error) delete _this2.errors[name]\n                _this2.errors[name] = error\n              }\n            })\n          })\n        }\n\n        FormValidator.prototype._innerValidateField = function _innerValidateField(name, value) {\n          let cb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (v) {\n            const errors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null\n          }\n\n          const rules = this.rules[name]\n          if (!rules) {\n            console.warn('[form-validtor] rule name ' + name + ' not exists.')\n            cb(true)\n            return\n          }\n          if (typeof value === 'function') {\n            cb = value\n            value = undefined\n          }\n          let isFail = false\n          const models = this.models\n          if (toString.call(rules) === '[object Array]') {\n            rules.forEach(function (rule) {\n              rule.name = name\n              const resMessage = validateSingleRule(rule, value || models[name], rule.param, models)\n              if (resMessage && !isFail) {\n                isFail = true\n                const error = resMessage ? { message: resMessage, rule } : undefined\n                cb(false, error)\n              }\n            })\n            if (!isFail) {\n              cb(!isFail)\n            }\n          } else {\n            const rule = rules\n            rule.name = name\n            const resMessage = validateSingleRule(rule, value || models[name], rule.param, models)\n            const error = resMessage ? { message: resMessage, rule } : undefined\n            if (resMessage) {\n              isFail = true\n            }\n            cb(!isFail, error)\n          }\n        }\n\n        FormValidator.prototype.addMethod = function addMethod(ruleName, method) {\n          validator_1.default[ruleName] = method\n        }\n\n        FormValidator.prototype.setModel = function setModel(newModel) {\n          this.models = newModel\n        }\n\n        FormValidator.prototype.setRules = function setRules(newRules) {\n          this.rules = newRules\n        }\n\n        return FormValidator\n      }())\n\n      exports.default = FormValidator\n      /***/ }),\n    /* 6 */\n    /***/ (function (module, exports, __webpack_require__) {\n      Object.defineProperty(exports, '__esModule', { value: true })\n      const string_1 = __webpack_require__(7)\n      const defaultMessage = {\n        required: '%s必填',\n        minlength: '长度最少为%s',\n        maxlength: '长度最大为%s',\n        rangelength: '长度在%s和%s之间',\n        bytelength: '最多只能输入%s个字',\n        min: '值最小为%s',\n        max: '值最大为%s',\n        range: '值的范围为%s和%s之间',\n        mobile: '请输入正确的手机号',\n        email: '请输入正确的电子邮件',\n        url: '请输入正确的URL地址',\n        equalTo: '值和字段%s不相等'\n      }\n      exports.default = {\n        required: function required(r, val, param, models) {\n          if (r.required === false) return\n          if (!val) return string_1.sprintf(r.message || defaultMessage.required, r.name)\n        },\n        minlength: function minlength(r, val) {\n          const minlen = r.minlength\n          val = val || ''\n          if (val.length < minlen) return string_1.sprintf(r.message || defaultMessage.minlength, minlen)\n        },\n        maxlength: function maxlength(r, val) {\n          const maxlen = r.maxlength\n          val = val || ''\n          if (val.length > maxlen) return string_1.sprintf(r.message || defaultMessage.maxlength, maxlen)\n        },\n        rangelength: function rangelength(r, val) {\n          const range = r.range\n          val = val || ''\n          if (val.length > range[1] || val.length < range[0]) return string_1.sprintf(r.message || defaultMessage.rangelength, range[0], range[1])\n        },\n        min: function min(r, val) {\n          const min = r.min\n          if (val < min) return string_1.sprintf(r.message || defaultMessage.min, min)\n        },\n        max: function max(r, val) {\n          const max = r.max\n          if (val > max) return string_1.sprintf(r.message || defaultMessage.max, max)\n        },\n        range: function range(r, val) {\n          const range = r.range\n          if (val < range[0] || val > range[1]) return string_1.sprintf(r.message || defaultMessage.range, range[0], range[1])\n        },\n        mobile: function mobile(r, val) {\n          if (r.mobile === false) return\n          val = val || ''\n          if (val.length !== 11) return string_1.sprintf(r.message || defaultMessage.mobile)\n        },\n        email: function email(r, value) {\n          if (r.email === false) return\n          if (!/^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i.test(value)) {\n            return string_1.sprintf(r.message || defaultMessage.email)\n          }\n        },\n        url: function url(r, value) {\n          if (r.url === false) return\n          if (!/^(https?|s?ftp|weixin):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i.test(value)) {\n            return r.message || defaultMessage.url\n          }\n        },\n        equalTo: function equalTo(r, value, param, models) {\n          const equalTo = r.equalTo\n          if (value !== models[equalTo]) return string_1.sprintf(r.message || defaultMessage.equalTo, r.name)\n        },\n        bytelength: function bytelength(r, value, param, models) {\n          param = r.param\n          const len = value.replace(/[^\\x00-\\xff]/g, '**').length\n          if (len > param) return string_1.sprintf(r.message || defaultMessage.bytelength, param)\n        }\n      }\n      /***/ }),\n    /* 7 */\n    /***/ (function (module, exports, __webpack_require__) {\n      Object.defineProperty(exports, '__esModule', { value: true })\n      exports.sprintf = function () {\n        for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n          args[_key] = arguments[_key]\n        }\n\n        let i = void 0\n        let result = args[0] || ''\n        let para = void 0\n        let reg = void 0\n        const length = args.length - 1\n        if (length < 1) {\n          return result\n        }\n        i = 1\n        while (i < length + 1) {\n          result = result.replace(/%s/, '{#' + i + '#}')\n          i++\n        }\n        result.replace('%s', '')\n        i = 1\n        while (true) {\n          para = args[i]\n          if (para === undefined) {\n            break\n          }\n          reg = new RegExp('{#' + i + '#}', 'g')\n          result = result.replace(reg, para)\n          i++\n        }\n        return result\n      }\n      /***/ })\n    /** *** */ ]))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/form/form.json",
    "content": "{\n    \"component\": true,\n    \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/form/form.wxml",
    "content": "<view class=\"{{extClass}}\">\n    <slot></slot>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/form-page/form-page.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 2)\n    /** *** */ }({\n\n    /***/ 2:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n          multipleSlots: true\n        },\n        properties: {\n          title: {\n            type: String,\n            value: ''\n          },\n          subtitle: {\n            type: String,\n            value: ''\n          }\n        },\n        relations: {\n          '../cells/cells': {\n            type: 'descendant',\n            linked(target) {\n              if (!this.data.firstItem) {\n                this.data.firstItem = target\n              }\n              target.setOuterClass('weui-cells__group weui-cells__group_form weui-cells_form')\n              if (target !== this.data.firstItem) {\n                target.setOuterClass('weui-cells__group_wxss weui-cells__group weui-cells__group_form weui-cells_form')\n              }\n            }\n          }\n        },\n        data: {\n          firstItem: null\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/form-page/form-page.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/form-page/form-page.wxml",
    "content": "<view class=\"weui-form\">\n    <block wx:if=\"{{title || subtitle}}\">\n      <view class=\"weui-form__text-area\">\n          <view class=\"weui-form__title\">{{title}}</view>\n          <view class=\"weui-form__desc\">{{subtitle}}</view>\n      </view>\n    </block>\n    <block wx:else>\n      <view class=\"weui-form__text-area\">\n        <slot name=\"title\"></slot>\n      </view>\n    </block>\n  <view class=\"weui-form__control-area\">\n    <slot></slot>\n  </view>\n  <view class=\"weui-form__tips-area\">\n    <slot name=\"tips\"></slot>\n  </view>\n  <view class=\"weui-form__opr-area\">\n    <slot name=\"button\"></slot>\n  </view>\n  <view class=\"weui-form__tips-area\">\n    <slot name=\"suffixtips\"></slot>\n  </view>\n  <view class=\"weui-form__extra-area\">\n    <view class=\"weui-footer\">\n      <slot name=\"footer\"></slot>\n    </view>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/packageExtend/components/form-page/form-page.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageExtend/components/gallery/gallery.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 21)\n    /** *** */ }({\n\n    /***/ 21:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n        },\n        properties: {\n          imgUrls: {\n            type: Array,\n            value: [],\n            observer: function observer(newVal, oldVal, changedPath) {\n              this.setData({ currentImgs: newVal })\n            }\n          },\n          showDelete: {\n            type: Boolean,\n            value: true\n          },\n          show: {\n            type: Boolean,\n            value: true\n          },\n          current: {\n            type: Number,\n            value: 0\n          },\n          hideOnClick: {\n            type: Boolean,\n            value: true\n          },\n          extClass: {\n            type: Boolean,\n            value: ''\n          }\n        },\n        data: {\n          currentImgs: []\n        },\n        ready() {\n          const data = this.data\n          this.setData({\n            currentImgs: data.imgUrls\n          })\n        },\n\n        methods: {\n          change(e) {\n            this.setData({\n              current: e.detail.current\n            })\n            this.triggerEvent('change', {\n              current: e.detail.current\n            }, {})\n          },\n          deleteImg() {\n            const data = this.data\n            const imgs = data.currentImgs\n            const url = imgs.splice(data.current, 1)\n            this.triggerEvent('delete', {\n              url: url[0],\n              index: data.current\n            }, {})\n\n            if (imgs.length === 0) {\n              // @ts-ignore\n              this.hideGallery()\n              return\n            }\n\n            this.setData({\n              current: 0,\n              currentImgs: imgs\n            })\n          },\n          hideGallery() {\n            const data = this.data\n\n            if (data.hideOnClick) {\n              this.setData({\n                show: false\n              })\n              this.triggerEvent('hide', {}, {})\n            }\n          }\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/gallery/gallery.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/gallery/gallery.wxml",
    "content": "<view class=\"weui-gallery {{show ? 'weui-gallery_show' : ''}} {{extClass}}\">\n  <view class=\"weui-gallery__info\">{{current+1}}/{{currentImgs.length}}</view>\n  <swiper class=\"weui-gallery__img__wrp\" bindtap=\"hideGallery\" indicator-dots=\"{{false}}\" bindchange=\"change\" current=\"{{current}}\" autoplay=\"{{false}}\" duration=\"{{500}}\">\n    <block wx:for=\"{{currentImgs}}\" wx:key=\"index\">\n      <swiper-item>\n        <image mode=\"aspectFit\" class=\"weui-gallery__img\" src=\"{{item}}\"></image>\n      </swiper-item>\n    </block>\n  </swiper>\n  <view class=\"weui-gallery__opr\" wx:if=\"{{showDelete}}\">\n    <navigator bindtap=\"deleteImg\" class=\"weui-gallery__del\">删除</navigator>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/components/gallery/gallery.wxss",
    "content": ".weui-gallery{display:none}.weui-gallery_show.weui-gallery{display:flex}"
  },
  {
    "path": "miniprogram/packageExtend/components/grids/grids.js",
    "content": "/** *** */ (function (modules) { // webpackBootstrap\n/** *** */ // The module cache\n/** *** */ const installedModules = {}\n  /** *** */\n  /** *** */ // The require function\n  /** *** */ function __webpack_require__(moduleId) {\n    /** *** */\n    /** *** */ // Check if module is in cache\n    /** *** */ if (installedModules[moduleId]) {\n      /** *** */ return installedModules[moduleId].exports\n      /** *** */ }\n    /** *** */ // Create a new module (and put it into the cache)\n    /** *** */ const module = installedModules[moduleId] = {\n      /** *** */ i: moduleId,\n      /** *** */ l: false,\n      /** *** */ exports: {}\n      /** *** */ }\n    /** *** */\n    /** *** */ // Execute the module function\n    /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n    /** *** */\n    /** *** */ // Flag the module as loaded\n    /** *** */ module.l = true\n    /** *** */\n    /** *** */ // Return the exports of the module\n    /** *** */ return module.exports\n    /** *** */ }\n  /** *** */\n  /** *** */\n  /** *** */ // expose the modules object (__webpack_modules__)\n  /** *** */ __webpack_require__.m = modules\n  /** *** */\n  /** *** */ // expose the module cache\n  /** *** */ __webpack_require__.c = installedModules\n  /** *** */\n  /** *** */ // define getter function for harmony exports\n  /** *** */ __webpack_require__.d = function (exports, name, getter) {\n    /** *** */ if (!__webpack_require__.o(exports, name)) {\n      /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n      /** *** */ }\n    /** *** */ }\n  /** *** */\n  /** *** */ // define __esModule on exports\n  /** *** */ __webpack_require__.r = function (exports) {\n    /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n      /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n      /** *** */ }\n    /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n    /** *** */ }\n  /** *** */\n  /** *** */ // create a fake namespace object\n  /** *** */ // mode & 1: value is a module id, require it\n  /** *** */ // mode & 2: merge all properties of value into the ns\n  /** *** */ // mode & 4: return value when already ns object\n  /** *** */ // mode & 8|1: behave like require\n  /** *** */ __webpack_require__.t = function (value, mode) {\n    /** *** */ if (mode & 1) value = __webpack_require__(value)\n    /** *** */ if (mode & 8) return value\n    /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n    /** *** */ const ns = Object.create(null)\n    /** *** */ __webpack_require__.r(ns)\n    /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n    /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n    /** *** */ return ns\n    /** *** */ }\n  /** *** */\n  /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n  /** *** */ __webpack_require__.n = function (module) {\n    /** *** */ const getter = module && module.__esModule\n    /** *** */ ? function getDefault() { return module.default }\n    /** *** */ : function getModuleExports() { return module }\n    /** *** */ __webpack_require__.d(getter, 'a', getter)\n    /** *** */ return getter\n    /** *** */ }\n  /** *** */\n  /** *** */ // Object.prototype.hasOwnProperty.call\n  /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n  /** *** */\n  /** *** */ // __webpack_public_path__\n  /** *** */ __webpack_require__.p = ''\n  /** *** */\n  /** *** */\n  /** *** */ // Load entry module and return exports\n  /** *** */ return __webpack_require__(__webpack_require__.s = 23)\n/** *** */ }({\n\n  /***/ 23:\n  /***/ (function (module, exports, __webpack_require__) {\n    Component({\n      options: {\n        pureDataPattern: /^_/\n      },\n      properties: {\n        extClass: {\n          type: String,\n          value: ''\n        },\n        grids: {\n          type: Array,\n          value: [],\n        }\n      },\n      data: {\n        innerGrids: [],\n        _defaultGridProps: {\n          target: 'self',\n          url: '',\n          openType: 'navigate',\n          delta: 1,\n          appId: '',\n          path: '',\n          extraData: '',\n          version: 'release',\n          hoverClass: 'navigator-hover',\n          hoverStopPropagation: false,\n          hoverStartTime: 50,\n          hoverStayTime: 600,\n\n          bindsuccess() {},\n\n          bindfail() {},\n\n          bindcomplete() {}\n\n        }\n      },\n\n      ready() {},\n\n      lifetimes: {\n        attached() {\n          if (this.data.grids) {\n            this.setData({\n              innerGrids: this.data.grids.map(grid => ({ ...this.data._defaultGridProps, ...grid }))\n            })\n          }\n        }\n\n      }\n    })\n    /***/ })\n\n/** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/grids/grids.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/grids/grids.wxml",
    "content": "<view class=\"weui-grids {{extClass}}\">\n  <block wx:for=\"{{innerGrids}}\" wx:key=\"index\">\n    <navigator\n      class=\"weui-grid\"\n      target=\"{{item.target}}\"\n      url=\"{{item.url}}\"\n      open-type=\"{{item.openType}}\"\n      app-id=\"{{item.appId}}\"\n      path=\"{{item.path}}\"\n      extra-data=\"{{item.extraData}}\"\n      version=\"{{item.version}}\"\n      hover-class=\"{{item.hoverClass}}\"\n      hover-stop-propagation=\"{{item.hoverStopPropagation}}\"\n      hover-start-time=\"{{item.hoverStartTime}}\"\n      hover-stay-time=\"{{item.hoverStayTime}}\"\n      bindsuccess=\"{{item.bindsuccess}}\"\n      bindfail=\"{{item.bindfail}}\"\n      bindcomplete=\"{{item.bindcomplete}}\"\n    >\n      <view class=\"weui-grid__icon\">\n        <image class=\"weui-grid__icon_img\" src=\"{{item.imgUrl}}\" alt></image>\n      </view>\n      <view class=\"weui-grid__label\">{{item.text}}</view>\n    </navigator>\n  </block>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/grids/grids.wxss",
    "content": ".weui-grid .weui-grid__icon_img{width:100%;height:100%}"
  },
  {
    "path": "miniprogram/packageExtend/components/icon/icon.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 10)\n    /** *** */ }({\n\n    /***/ 10:\n    /***/ (function (module, exports, __webpack_require__) {\n      const _base = _interopRequireDefault(__webpack_require__(11))\n\n      const _icondata = _interopRequireDefault(__webpack_require__(12))\n\n      function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj } }\n\n      const getFixedIconType = function (type) {\n        // 兼容旧版本 typo\n        return type === 'field' ? 'filled' : type\n      }\n\n      Component({\n        options: {\n        },\n        properties: {\n          extClass: {\n            type: String,\n            value: ''\n          },\n          type: {\n            type: String,\n            value: 'outline',\n            observer: '_genSrcByType'\n          },\n          icon: {\n            type: String,\n            value: '',\n            observer: '_genSrcByIcon'\n          },\n          size: {\n            type: Number,\n            value: 20\n          },\n          color: {\n            type: String,\n            value: '#000000'\n          }\n        },\n        data: {\n          src: '',\n          height: 20,\n          width: 20\n        },\n        methods: {\n          _genSrcByIcon(v) {\n            this._genSrc(_icondata.default[v][getFixedIconType(this.data.type)])\n          },\n\n          _genSrcByType(v) {\n            this._genSrc(_icondata.default[this.data.icon][getFixedIconType(v)])\n          },\n          _genSrc(rawData) {\n            if (!rawData) return // type 不存在\n\n            const base64 = _base.default.encode(rawData)\n\n            this.setData({\n              src: 'data:image/svg+xml;base64,' + base64\n            })\n          }\n        }\n      })\n      /***/ }),\n\n    /***/ 11:\n    /***/ (function (module, exports, __webpack_require__) {\n      Object.defineProperty(exports, '__esModule', { value: true })\n      const b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n      const cb_encode = function cb_encode(ccc) {\n        const padlen = [0, 2, 1][ccc.length % 3]\n        const ord = ccc.charCodeAt(0) << 16 | (ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8 | (ccc.length > 2 ? ccc.charCodeAt(2) : 0)\n        const chars = [b64chars.charAt(ord >>> 18), b64chars.charAt(ord >>> 12 & 63), padlen >= 2 ? '=' : b64chars.charAt(ord >>> 6 & 63), padlen >= 1 ? '=' : b64chars.charAt(ord & 63)]\n        return chars.join('')\n      }\n      const btoa = global.btoa ? function (b) {\n        return global.btoa(b)\n      } : function (b) {\n        return b.replace(/[\\s\\S]{1,3}/g, cb_encode)\n      }\n      const fromCharCode = String.fromCharCode\n      const cb_utob = function cb_utob(c) {\n        let cc\n        if (c.length < 2) {\n          cc = c.charCodeAt(0)\n          return cc < 0x80 ? c : cc < 0x800 ? fromCharCode(0xc0 | cc >>> 6) + fromCharCode(0x80 | cc & 0x3f) : fromCharCode(0xe0 | cc >>> 12 & 0x0f) + fromCharCode(0x80 | cc >>> 6 & 0x3f) + fromCharCode(0x80 | cc & 0x3f)\n        } else {\n          cc = 0x10000 + (c.charCodeAt(0) - 0xD800) * 0x400 + (c.charCodeAt(1) - 0xDC00)\n          return fromCharCode(0xf0 | cc >>> 18 & 0x07) + fromCharCode(0x80 | cc >>> 12 & 0x3f) + fromCharCode(0x80 | cc >>> 6 & 0x3f) + fromCharCode(0x80 | cc & 0x3f)\n        }\n      }\n      const re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g\n      const utob = function utob(u) {\n        return u.replace(re_utob, cb_utob)\n      }\n      const _encode = function _encode(u) {\n        const isUint8Array = Object.prototype.toString.call(u) === '[object Uint8Array]'\n        return isUint8Array ? u.toString('base64') : btoa(utob(String(u)))\n      }\n      const encode = function encode(u) {\n        const urisafe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false\n\n        return !urisafe ? _encode(u) : _encode(String(u)).replace(/[+\\/]/g, function (m0) {\n          return m0 == '+' ? '-' : '_'\n        }).replace(/[=]/g, '')\n      }\n      exports.default = {\n        encode\n      }\n      /***/ }),\n\n    /***/ 12:\n    /***/ (function (module, exports, __webpack_require__) {\n      Object.defineProperty(exports, '__esModule', { value: true })\n      exports.default = {\n        'add-friends': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><title>3.Icons/Outlined/add-friends</title><desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/add-friends\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon13\" transform=\"translate(1.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M6.83191269,9.35013798 C6.09631763,8.47828515 5.5,6.84949648 5.5,5.70929053 L5.5,3.99958038 C5.5,1.79067313 7.29535615,0 9.5,0 C11.709139,0 13.5,1.79298022 13.5,4.00020747 L13.5,5.71018568 C13.5,6.84929595 12.9009324,8.48286035 12.1680872,9.35157303 L11.8065546,9.78013273 C11.2170324,10.4789507 11.4011877,11.3683976 12.225549,11.7705104 L17.8859024,14.5315576 C18.5012015,14.8316925 19,15.6251701 19,16.3154633 L19,17.0015619 C19,17.552984 18.5490746,18 17.9985704,18 L1.00142961,18 C0.448355308,18 0,17.5557555 0,17.0015619 L0,16.3154633 C0,15.6303744 0.498150907,14.8319079 1.11409761,14.5313327 L6.77445076,11.769143 C7.59537712,11.36854 7.78625906,10.4812624 7.19344522,9.7786389 L6.83191269,9.35013798 Z M1.2,16.8 L17.8,16.8 L17.8,16.3154633 C17.8,16.0860594 17.564679,15.7100199 17.3598095,15.6100873 L11.6994561,12.8490401 C10.1728743,12.1043932 9.79557277,10.302913 10.8893366,9.00636847 L11.2508692,8.57780877 C11.802195,7.92426863 12.3,6.56439093 12.3,5.71018568 L12.3,4.00020747 C12.3,2.4549142 11.0455898,1.2 9.5,1.2 C7.95630885,1.2 6.7,2.4552027 6.7,3.99958038 L6.7,5.70929053 C6.7,6.56566389 7.19574673,7.92048381 7.74907842,8.57631176 L8.11061095,9.00481267 C9.20663642,10.3038601 8.82521432,12.1036503 7.30071945,12.8475869 L1.6403663,15.6097766 C1.43701709,15.7090088 1.2,16.0886771 1.2,16.3154633 L1.2,16.8 Z M17.8999939,7.8999939 L17.8999939,5 L19.0999939,5 L19.0999939,7.8999939 L22,7.8999939 L22,9.09999394 L19.0999939,9.09999394 L19.0999939,12 L17.8999939,12 L17.8999939,9.09999394 L15,9.09999394 L15,7.8999939 L17.8999939,7.8999939 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/add-friends</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/add-friends\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon13\" fill=\"#000000\">            <path d=\"M18.7499939,10.75 L18.7499939,8 L20.2499939,8 L20.2499939,10.75 L23,10.75 L23,12.25 L20.2499939,12.25 L20.2499939,15 L18.7499939,15 L18.7499939,12.25 L16,12.25 L16,11.5 L16,10.75 L18.7499939,10.75 Z M7.83191269,12.350138 C7.09631763,11.4782852 6.5,9.84949648 6.5,8.70929053 L6.5,6.99958038 C6.5,4.79067313 8.29535615,3 10.5,3 C12.709139,3 14.5,4.79298022 14.5,7.00020747 L14.5,8.71018568 C14.5,9.84929595 13.9009324,11.4828603 13.1680872,12.351573 L12.8065546,12.7801327 C12.2170324,13.4789507 12.4011877,14.3683976 13.225549,14.7705104 L18.8859024,17.5315576 C19.5012015,17.8316925 20,18.6251701 20,19.3154633 L20,20.0015619 C20,20.552984 19.5490746,21 18.9985704,21 L2.00142961,21 C1.44835531,21 1,20.5557555 1,20.0015619 L1,19.3154633 C1,18.6303744 1.49815091,17.8319079 2.11409761,17.5313327 L7.77445076,14.769143 C8.59537712,14.36854 8.78625906,13.4812624 8.19344522,12.7786389 L7.83191269,12.350138 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        add: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/add</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/add\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M8.25,8.25 L8.25,0.5 L9.75,0.5 L9.75,8.25 L17.5,8.25 L17.5,9.75 L9.75,9.75 L9.75,17.5 L8.25,17.5 L8.25,9.75 L0.5,9.75 L0.5,8.25 L8.25,8.25 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/add</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/add\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_add\" transform=\"translate(4.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M7,7 L7,0 L9,0 L9,7 L16,7 L16,9 L9,9 L9,16 L7,16 L7,9 L0,9 L0,7 L7,7 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        add2: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/add2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/add2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M9.3999939,9.3999939 L9.3999939,5 L10.5999939,5 L10.5999939,9.3999939 L15,9.3999939 L15,10.5999939 L10.5999939,10.5999939 L10.5999939,15 L9.3999939,15 L9.3999939,10.5999939 L5,10.5999939 L5,9.3999939 L9.3999939,9.3999939 Z M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/add2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/add2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon21\" fill=\"#000000\">            <path d=\"M11.25,11.25 L7,11.25 L7,12.75 L11.25,12.75 L11.25,17 L12.75,17 L12.75,12.75 L17,12.75 L17,11.25 L12.75,11.25 L12.75,7 L11.25,7 L11.25,11.25 Z M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        album: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/album</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/album\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_album\" transform=\"translate(2.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M18.8,10.4088466 L18.8,1.2 L1.2,1.2 L1.2,10.0922199 L6.19924553,6.04925865 C6.66179904,5.67518501 7.40462562,5.69332718 7.85049542,6.08508368 L12.3269229,10.0182264 L14.6091025,8.07749766 C15.0713175,7.68443756 15.8067229,7.69242258 16.2554314,8.0950837 L18.8,10.4088466 Z M18.7999996,11.9936093 L15.4261838,8.95789191 L13.2379757,10.8187086 L14.5824388,12 L12.8111672,12 L7.00605625,6.94008323 L1.2,11.6355239 L1.2,14.8 L18.8,14.8 L18.8,11.9936092 Z M0.99180311,0 L19.0081969,0 C19.5446944,0 20,0.481137002 20,1.07464957 L20,14.9253504 C20,15.5211518 19.5559546,16 19.0081969,16 L0.99180311,16 C0.455305576,16 0,15.518863 0,14.9253504 L0,1.07464957 C0,0.478848219 0.444045377,0 0.99180311,0 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/album</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/album\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_album\" fill=\"#000000\">            <path d=\"M20.5,14.1360582 L20.5,5.5 L3.5,5.5 L3.5,13.8496056 L8.19924553,10.0492586 C8.66179904,9.67518501 9.40462562,9.69332718 9.85049542,10.0850837 L14.3269229,14.0182264 L16.6091025,12.0774977 C17.0713175,11.6844376 17.8067229,11.6924226 18.2554314,12.0950837 L20.5,14.1360582 Z M2.99180311,4 L21.0081969,4 C21.5446944,4 22,4.481137 22,5.07464957 L22,18.9253504 C22,19.5211518 21.5559546,20 21.0081969,20 L2.99180311,20 C2.45530558,20 2,19.518863 2,18.9253504 L2,5.07464957 C2,4.47884822 2.44404538,4 2.99180311,4 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        arrow: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"12px\" height=\"24px\" viewBox=\"0 0 12 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/arrow</title>    <desc>Created with Sketch.</desc>    <defs>        <path d=\"M7.58750873,12.4298916 L6.52684856,13.4905518 L0.747951526,7.71165473 C0.357826227,7.32152943 0.354365786,6.69247179 0.747951526,6.29888605 L6.52684856,0.519989014 L7.58750873,1.58064919 L2.16288753,7.00527039 L7.58750873,12.4298916 Z\" id=\"path-1\"></path>    </defs>    <g id=\"3.Icons/Outlined/arrow\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">        <g id=\"Group\" transform=\"translate(2.000000, 5.000000)\">            <mask id=\"mask-2\" fill=\"white\">                <use xlink:href=\"#path-1\"></use>            </mask>            <use id=\"\\u56FE\\u6807\\u989C\\u8272\" fill-opacity=\"0.9\" fill=\"#000000\" transform=\"translate(4.020784, 7.005270) rotate(-180.000000) translate(-4.020784, -7.005270) \" xlink:href=\"#path-1\"></use>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"12px\" height=\"24px\" viewBox=\"0 0 12 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/arrow</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/arrow\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(-2.000000, 5.000000)\" fill=\"#000000\">            <path d=\"M3,2.5039609 L11,2.5039609 L11,4.5039609 L4,4.5039609 L4,11.5039609 L2,11.5039609 L2,3.5039609 C2,2.95167615 2.44771525,2.5039609 3,2.5039609 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\" transform=\"translate(6.500000, 7.003961) rotate(135.000000) translate(-6.500000, -7.003961) \"></path>        </g>    </g></svg>' },\n        at: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/at</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/at\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M9.26953125,6.1875 C7.5703125,6.1875 6.46875,7.62890625 6.46875,9.84375 C6.46875,12.046875 7.55859375,13.4765625 9.2578125,13.4765625 C10.9921875,13.4765625 12.1054688,12.0234375 12.1054688,9.78515625 C12.1054688,7.58203125 11.015625,6.1875 9.26953125,6.1875 Z M9.64453125,-3.67705866e-13 C14.779824,-3.67705866e-13 19.0195312,3.52734375 19.0195312,8.71875 C19.0195312,12.4453125 17.4726562,14.8359375 14.8945312,14.8359375 C13.5,14.8359375 12.3984375,13.9921875 12.2226562,12.6796875 L12.140625,12.6796875 C11.6132812,14.015625 10.5234375,14.7539062 9.0703125,14.7539062 C6.65625,14.7539062 5.015625,12.7617187 5.015625,9.80859375 C5.015625,6.92578125 6.6796875,4.93359375 9.0703125,4.93359375 C10.4296875,4.93359375 11.6132812,5.671875 12.046875,6.8203125 L12.1289062,6.8203125 L12.1289062,5.16796875 L13.4882812,5.16796875 L13.4882812,11.8710937 C13.4882812,12.9375 14.0507812,13.640625 15.1171875,13.640625 C16.6757812,13.640625 17.7421875,11.8476562 17.7421875,8.6953125 C17.7421875,4.21875 14.2381961,1.17570471 9.64453125,1.17570471 C5.05086641,1.17570471 1.2890625,4.52563768 1.2890625,9.7734375 C1.2890625,14.6481839 5.3031848,18.3632812 9.7734375,18.3632812 C11.3554688,18.3632812 12.8671875,18.1640625 13.6640625,17.8476562 L13.6640625,19.0078125 C12.7148438,19.3359375 11.3320312,19.5234375 9.76171875,19.5234375 C4.19794948,19.5234375 0,15.3256061 0,9.7265625 C0,4.12751891 4.50923846,-3.67705866e-13 9.64453125,-3.67705866e-13 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/at</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/at\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(1.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10.4648438,7.14453125 C9.22265625,7.14453125 8.484375,8.1640625 8.484375,9.875 C8.484375,11.5742188 9.22265625,12.6054688 10.453125,12.6054688 C11.71875,12.6054688 12.5039062,11.5625 12.5039062,9.875 C12.5039062,8.1875 11.71875,7.14453125 10.4648438,7.14453125 Z M10.8515625,0.01953125 C16.40625,0.01953125 20.3085938,3.51171875 20.3085938,8.7265625 C20.3085938,12.4179688 18.5625,14.796875 15.703125,14.796875 C14.25,14.796875 13.1367188,14.09375 12.8789062,12.9570312 L12.7148437,12.9570312 C12.234375,14.1289062 11.25,14.7617188 9.890625,14.7617188 C7.453125,14.7617188 5.82421875,12.78125 5.82421875,9.8046875 C5.82421875,6.95703125 7.4296875,5.01171875 9.7734375,5.01171875 C11.0390625,5.01171875 12.09375,5.64453125 12.5507812,6.67578125 L12.7148437,6.67578125 L12.7148437,5.26953125 L15.09375,5.26953125 L15.09375,11.5390625 C15.09375,12.3476562 15.46875,12.8632812 16.2070312,12.8632812 C17.3554688,12.8632812 18.1523438,11.3984375 18.1523438,8.90234375 C18.1523438,4.63671875 15.2109375,1.8828125 10.7695312,1.8828125 C6.2578125,1.8828125 3.09375,5.140625 3.09375,9.8515625 C3.09375,14.7851562 6.38671875,17.6679688 11.2148438,17.6679688 C12.46875,17.6679688 13.7460938,17.5039062 14.4140625,17.2578125 L14.4140625,19.1328125 C13.5,19.4023438 12.3046875,19.5664062 11.0390625,19.5664062 C5.109375,19.5664062 0.9375,15.8515625 0.9375,9.79296875 C0.9375,3.98046875 5.00390625,0.01953125 10.8515625,0.01953125 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        back: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"12px\" height=\"24px\" viewBox=\"0 0 12 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/back</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/back\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(1.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M9,16.4375 L7.95453228,17.5 L0.289492864,9.71008525 C-0.0963897671,9.317916 -0.0915538699,8.67716932 0.289492864,8.28991475 L7.95453228,0.5 L9,1.5625 L1.68172599,9 L9,16.4375 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"12px\" height=\"24px\" viewBox=\"0 0 12 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/back</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/back\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"\\u56FE\\u6807\\u989C\\u8272\" transform=\"translate(0.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M3.34314575,9 L10.4142136,16.0710678 L9,17.4852814 L1.22182541,9.70710678 C0.831301115,9.31658249 0.831301115,8.68341751 1.22182541,8.29289322 L9,0.514718626 L10.4142136,1.92893219 L3.34314575,9 Z\"></path>        </g>    </g></svg>' },\n        back2: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/back2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/back2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M11.998534,13.4375 L10.9530663,14.5 L7.29043516,10.7230029 C6.90322246,10.3236994 6.9031541,9.6763711 7.29043516,9.27699715 L10.9530663,5.5 L11.998534,6.5625 L8.68025999,10 L11.998534,13.4375 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/back2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/back2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M11.998534,13.4375 L8.68025999,10 L11.998534,6.5625 L10.9530663,5.5 L7.29043516,9.27699715 C6.9031541,9.6763711 6.90322246,10.3236994 7.29043516,10.7230029 L10.9530663,14.5 L11.998534,13.4375 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'bellring-off': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/bellring_off</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/bellring_off\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_mute\" fill=\"#000000\">            <path d=\"M18.8048808,17.107824 L22.4249789,20.7279221 L21.5764507,21.5764502 L4.84852868,4.84852817 L5.69705685,4 L7.60857571,5.91151886 C8.26739702,5.20419447 9.09506285,4.6562304 10.0273967,4.33180314 C10.0093774,4.22388264 10,4.11303643 10,4 C10,2.8954305 10.8954305,2 12,2 C13.1045695,2 14,2.8954305 14,4 C14,4.11303643 13.9906226,4.22388264 13.9726033,4.33180314 C16.317288,5.14769073 18,7.37733614 18,10 L18,14 C18,15.0359413 18.2682936,16.0718826 18.8048808,17.107824 Z M8.45731125,6.7602544 L16.9005511,15.2034943 C16.8336616,14.8040214 16.8,14.4027783 16.8,14 L16.8,10 C16.8,7.94086096 15.4913875,6.13087529 13.5782297,5.46514753 L12.6222987,5.13250909 L12.7889885,4.13417698 C12.7962818,4.09049657 12.8,4.04574037 12.8,4 C12.8,3.5581722 12.4418278,3.2 12,3.2 C11.5581722,3.2 11.2,3.5581722 11.2,4 C11.2,4.04574037 11.2037182,4.09049657 11.2110115,4.13417698 L11.3777013,5.13250909 L10.4217703,5.46514753 C9.65461156,5.73209825 8.9846599,6.18303836 8.45731125,6.7602544 Z M18.3029714,20.0000282 L12,20.0000282 L5.18670673,20.0000282 C4.97372563,20.0000282 4.76630774,19.9319983 4.59466757,19.8059007 C4.14960038,19.4789265 4.05386708,18.8530633 4.38084128,18.4079961 C5.46027096,16.9386502 6,15.4693251 6,14 L6,10 C6,9.30936012 6.11668844,8.64597429 6.33142549,8.02848234 L7.30447337,9.00153022 C7.23589042,9.32480971 7.2,9.65898818 7.2,10 L7.2,14 C7.2,15.6303277 6.64849214,17.2355113 5.57422114,18.8000266 L12.000005,18.8000266 L17.1029698,18.8000266 L18.3029714,20.0000282 Z M11,20 L13,20 L13,20.2 C13,20.7522848 12.5522847,21.2 12,21.2 C11.4477153,21.2 11,20.7522848 11,20.2 L11,20 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/bell-ring_off</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/bell-ring_off\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(4.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M14.4530995,14.3317792 L18.0918831,17.9705627 L17.0312229,19.0312229 L0.0606601718,2.06066017 L1.12132034,1 L3.81845045,3.69713011 C4.4398094,3.09318282 5.19153957,2.62265908 6.02739671,2.33180314 C6.0093774,2.22388264 6,2.11303643 6,2 C6,0.8954305 6.8954305,0 8,0 C9.1045695,0 10,0.8954305 10,2 C10,2.11303643 9.9906226,2.22388264 9.97260329,2.33180314 C12.317288,3.14769073 14,5.37733614 14,8 L14,12 C14,12.7772597 14.1510332,13.5545194 14.4530995,14.3317792 Z M13.8787079,18.0000282 L8,18.0000282 L1.18670673,18.0000282 C0.973725629,18.0000282 0.766307737,17.9319983 0.594667574,17.8059007 C0.149600376,17.4789265 0.0538670836,16.8530633 0.380841281,16.4079961 C1.46027096,14.9386502 2,13.4693251 2,12 L2,8 C2,7.42805163 2.08002731,6.87479463 2.22949529,6.35081564 L13.8787079,18.0000282 Z M7,18 L9,18 L9,18.2 C9,18.7522848 8.55228475,19.2 8,19.2 C7.44771525,19.2 7,18.7522848 7,18.2 L7,18 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'bellring-on': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/bellring_on</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/bellring_on\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(4.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M6,2 C6,0.8954305 6.8954305,0 8,0 C9.1045695,0 10,0.8954305 10,2 C10,2.11303643 9.9906226,2.22388264 9.97260329,2.33180314 C12.317288,3.14769073 14,5.37733614 14,8 L14,12 C14,13.4693091 14.5397173,14.9386183 15.619152,16.4079274 C15.7452557,16.5795777 15.8132606,16.7870072 15.8132606,17 C15.8132606,17.5523003 15.3655327,18.0000282 14.8132324,18.0000282 L8,18.0000282 L1.18670673,18.0000282 C0.973725629,18.0000282 0.766307737,17.9319983 0.594667574,17.8059007 C0.149600376,17.4789265 0.0538670836,16.8530633 0.380841281,16.4079961 C1.46027096,14.9386502 2,13.4693251 2,12 L2,8 C2,5.37733614 3.68271203,3.14769073 6.02739671,2.33180314 C6.0093774,2.22388264 6,2.11303643 6,2 Z M8.00000497,16.8000266 L14.4258309,16.8000266 C13.3515289,15.2355634 12.8,13.6303581 12.8,12 L12.8,8 C12.8,5.94086096 11.4913875,4.13087529 9.57822974,3.46514753 L8.6222987,3.13250909 L8.78898853,2.13417698 C8.79628178,2.09049657 8.8,2.04574037 8.8,2 C8.8,1.5581722 8.4418278,1.2 8,1.2 C7.5581722,1.2 7.2,1.5581722 7.2,2 C7.2,2.04574037 7.20371822,2.09049657 7.21101147,2.13417698 L7.3777013,3.13250909 L6.42177026,3.46514753 C4.50861248,4.13087529 3.2,5.94086096 3.2,8 L3.2,12 C3.2,13.6303277 2.64849214,15.2355113 1.57422114,16.8000266 L8.00000497,16.8000266 Z M7,18 L9,18 L9,18.2 C9,18.7522848 8.55228475,19.2 8,19.2 C7.44771525,19.2 7,18.7522848 7,18.2 L7,18 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/bell-ring_on</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/bell-ring_on\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" fill=\"#000000\">            <path d=\"M11,20 L5.18670673,20 C4.97372563,20 4.76630774,19.9319983 4.59466757,19.8059007 C4.14960038,19.4789265 4.05386708,18.8530633 4.38084128,18.4079961 L4.38081287,18.4079752 C5.46027096,16.9386502 6,15.4693251 6,14 L6,10 C6,7.37733614 7.68271203,5.14769073 10.0273967,4.33180314 C10.0093774,4.22388264 10,4.11303643 10,4 C10,2.8954305 10.8954305,2 12,2 C13.1045695,2 14,2.8954305 14,4 C14,4.11303643 13.9906226,4.22388264 13.9726033,4.33180314 C16.317288,5.14769073 18,7.37733614 18,10 L18,14 C18,15.4693091 18.5397173,16.9386183 19.619152,18.4079274 C19.7452557,18.5795777 19.8132606,18.7870072 19.8132606,19 C19.8132606,19.5523003 19.3655327,20.0000282 18.8132324,20.0000282 L13,20 L13,20.2 C13,20.7522848 12.5522847,21.2 12,21.2 C11.4477153,21.2 11,20.7522848 11,20.2 L11,20 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        camera: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/camera</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/camera\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon20\" transform=\"translate(2.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M12.3577795,1.2 L7.64222051,1.2 L5.64222051,4.2 L1.2,4.2 L1.2,14.8 L18.8,14.8 L18.8,4.2 L14.3577795,4.2 L12.3577795,1.2 Z M12.7324081,0 C12.8995847,0 13.0557004,0.0835505677 13.1484333,0.222649902 L15,3 L19,3 C19.5522847,3 20,3.44771525 20,4 L20,15 C20,15.5522847 19.5522847,16 19,16 L1,16 C0.44771525,16 0,15.5522847 0,15 L0,4 C0,3.44771525 0.44771525,3 1,3 L5,3 L6.85156673,0.222649902 C6.94429962,0.0835505677 7.10041529,0 7.26759188,0 L12.7324081,0 Z M10,11.8 C11.5463973,11.8 12.8,10.5463973 12.8,9 C12.8,7.4536027 11.5463973,6.2 10,6.2 C8.4536027,6.2 7.2,7.4536027 7.2,9 C7.2,10.5463973 8.4536027,11.8 10,11.8 Z M10,13 C7.790861,13 6,11.209139 6,9 C6,6.790861 7.790861,5 10,5 C12.209139,5 14,6.790861 14,9 C14,11.209139 12.209139,13 10,13 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/camera</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/camera\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon20\" transform=\"translate(2.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M12.7324081,0 C12.8995847,5.6322073e-16 13.0557004,0.0835505677 13.1484333,0.222649902 L15,3 L19,3 C19.5522847,3 20,3.44771525 20,4 L20,15 C20,15.5522847 19.5522847,16 19,16 L1,16 C0.44771525,16 6.76353751e-17,15.5522847 0,15 L0,4 C-6.76353751e-17,3.44771525 0.44771525,3 1,3 L5,3 L6.85156673,0.222649902 C6.94429962,0.0835505677 7.10041529,3.07098421e-17 7.26759188,0 L12.7324081,0 Z M10,12.5 C11.9329966,12.5 13.5,10.9329966 13.5,9 C13.5,7.06700338 11.9329966,5.5 10,5.5 C8.06700338,5.5 6.5,7.06700338 6.5,9 C6.5,10.9329966 8.06700338,12.5 10,12.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        cellphone: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/cellphone</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/cellphone\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(5.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M0,1 C0,0.44771525 0.44771525,0 1,0 L13,0 C13.5522847,0 14,0.44771525 14,1 L14,19 C14,19.5522847 13.5522847,20 13,20 L1,20 C0.44771525,20 0,19.5522847 0,19 L0,1 Z M1.2,1.2 L1.2,18.8 L12.8,18.8 L12.8,1.2 L1.2,1.2 Z M7,18 C6.44771525,18 6,17.5522847 6,17 C6,16.4477153 6.44771525,16 7,16 C7.55228475,16 8,16.4477153 8,17 C8,17.5522847 7.55228475,18 7,18 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/cellphone</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/cellphone\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" fill=\"#000000\">            <path d=\"M5,3 C5,2.44771525 5.44771525,2 6,2 L18,2 C18.5522847,2 19,2.44771525 19,3 L19,21 C19,21.5522847 18.5522847,22 18,22 L6,22 C5.44771525,22 5,21.5522847 5,21 L5,3 Z M12,20 C12.5522847,20 13,19.5522847 13,19 C13,18.4477153 12.5522847,18 12,18 C11.4477153,18 11,18.4477153 11,19 C11,19.5522847 11.4477153,20 12,20 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        clip: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/clip</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/clip\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M4.20000005,4.20000005 L4.20000005,13.8 L13.8,13.8 L13.8,4.20000005 L4.20000005,4.20000005 Z M3,4.20000005 L0,4.20000005 L0,3 L3,3 L3,0 L4.20000005,0 L4.20000005,3 L13.8,3 L14,3 C14.5522847,3 15,3.44771525 15,4 L15,13.8 L18,13.8 L18,15 L15,15 L15,18 L13.8,18 L13.8,15 L4,15 C3.44771525,15 3,14.5522847 3,14 L3,4.20000005 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/clip</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/clip\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M13,15 L4,15 C3.44771525,15 3,14.5522847 3,14 L3,5 L0,5 L0,3 L3,3 L3,0 L5,0 L5,3 L14,3 C14.5522847,3 15,3.44771525 15,4 L15,13 L18,13 L18,15 L15,15 L15,18 L13,18 L13,15 Z M13,13 L13,5 L5,5 L5,13 L13,13 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        close: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/close</title>    <desc>Created with Sketch.</desc>    <defs>        <polygon id=\"path-1\" points=\"8 6.94318182 1.80681818 0.75 0.75 1.80681818 6.94318182 8 0.75 14.1931818 1.80681818 15.25 8 9.05681818 14.1931818 15.25 15.25 14.1931818 9.05681818 8 15.25 1.80681818 14.1931818 0.75\"></polygon>    </defs>    <g id=\"3.Icons/Outlined/close\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(4.000000, 4.000000)\">            <mask id=\"mask-2\" fill=\"white\">                <use xlink:href=\"#path-1\"></use>            </mask>            <use id=\"\\u56FE\\u6807\\u989C\\u8272\" fill-opacity=\"0.9\" fill=\"#000000\" xlink:href=\"#path-1\"></use>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/close</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/close\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(4.000000, 4.000000)\" fill=\"#000000\">            <polygon id=\"\\u56FE\\u6807\\u989C\\u8272\" points=\"8 6.58578644 13.6568542 0.928932188 15.0710678 2.34314575 9.41421356 8 15.0710678 13.6568542 13.6568542 15.0710678 8 9.41421356 2.34314575 15.0710678 0.928932188 13.6568542 6.58578644 8 0.928932188 2.34314575 2.34314575 0.928932188\"></polygon>        </g>    </g></svg>' },\n        close2: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/close2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/close2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M10.8485282,9.99999949 L13.9597982,13.1112696 L13.1112701,13.9597977 L10,10.8485277 L6.88872993,13.9597977 L6.04020176,13.1112696 L9.15147183,9.99999949 L6.04020176,6.88872993 L6.88873043,6.04020176 L10,9.15147132 L13.1112696,6.04020176 L13.9597982,6.88872993 L10.8485282,9.99999949 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/close2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/close2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_miniprogram\" fill=\"#000000\">            <path d=\"M13.0606602,12 L16.065864,8.99479618 L15.0052038,7.93413601 L12,10.9393398 L8.99479618,7.93413601 L7.93413601,8.99479618 L10.9393398,12 L7.93413601,15.0052038 L8.99479618,16.065864 L12,13.0606602 L15.0052038,16.065864 L16.065864,15.0052038 L13.0606602,12 Z M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        comment: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/comment</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/comment\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group-22\" transform=\"translate(2.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M8.50294373,13.8 L18.5,13.8 C18.6656854,13.8 18.8,13.6656854 18.8,13.5 L18.8,1.5 C18.8,1.33431458 18.6656854,1.2 18.5,1.2 L1.5,1.2 C1.33431458,1.2 1.2,1.33431458 1.2,1.5 L1.2,13.5 C1.2,13.6656854 1.33431458,13.8 1.5,13.8 L6.2,13.8 L6.2,16.1029437 L8.50294373,13.8 Z M9,15 L6.70710678,17.2928932 C6.31658249,17.6834175 5.68341751,17.6834175 5.29289322,17.2928932 C5.10535684,17.1053568 5,16.8510029 5,16.5857864 L5,15 L1.5,15 C0.671572875,15 0,14.3284271 0,13.5 L0,1.5 C0,0.671572875 0.671572875,0 1.5,0 L18.5,0 C19.3284271,0 20,0.671572875 20,1.5 L20,13.5 C20,14.3284271 19.3284271,15 18.5,15 L9,15 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/comment</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/comment\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group-22\" fill=\"#000000\">            <path d=\"M11,19 L8.70710678,21.2928932 C8.31658249,21.6834175 7.68341751,21.6834175 7.29289322,21.2928932 C7.10535684,21.1053568 7,20.8510029 7,20.5857864 L7,19 L3.5,19 C2.67157288,19 2,18.3284271 2,17.5 L2,5.5 C2,4.67157288 2.67157288,4 3.5,4 L20.5,4 C21.3284271,4 22,4.67157288 22,5.5 L22,17.5 C22,18.3284271 21.3284271,19 20.5,19 L11,19 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        contacts: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/contacts</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/contacts\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon12\" transform=\"translate(1.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M17.8,16.8 L17.8,16.3154633 C17.8,16.0860594 17.564679,15.7100199 17.3598095,15.6100873 L11.6994561,12.8490401 C10.1728743,12.1043932 9.79557277,10.302913 10.8893366,9.00636847 L11.2508692,8.57780877 C11.802195,7.92426863 12.3,6.56439093 12.3,5.71018568 L12.3,4.00020747 C12.3,2.4549142 11.0455898,1.2 9.5,1.2 C7.95630885,1.2 6.7,2.4552027 6.7,3.99958038 L6.7,5.70929053 C6.7,6.56566389 7.19574673,7.92048381 7.74907842,8.57631176 L8.11061095,9.00481267 C9.20663642,10.3038601 8.82521432,12.1036503 7.30071945,12.8475869 L1.6403663,15.6097766 C1.43701709,15.7090088 1.2,16.0886771 1.2,16.3154633 L1.2,16.8 L17.8,16.8 Z M0,17 L0,16.3154633 C0,15.6303744 0.498150907,14.8319079 1.11409761,14.5313327 L6.77445076,11.769143 C7.59537712,11.36854 7.78625906,10.4812624 7.19344522,9.7786389 L6.83191269,9.35013798 C6.09631763,8.47828515 5.5,6.84949648 5.5,5.70929053 L5.5,3.99958038 C5.5,1.79067313 7.29535615,0 9.5,0 C11.709139,0 13.5,1.79298022 13.5,4.00020747 L13.5,5.71018568 C13.5,6.84929595 12.9009324,8.48286035 12.1680872,9.35157303 L11.8065546,9.78013273 C11.2170324,10.4789507 11.4011877,11.3683976 12.225549,11.7705104 L17.8859024,14.5315576 C18.5012015,14.8316925 19,15.6251701 19,16.3154633 L19,17 C19,17.5522847 18.5522847,18 18,18 L1,18 C0.44771525,18 0,17.5522847 0,17 Z M19,11.5 L22,11.5 L22,12.7 L19,12.7 L19,11.5 Z M17,8.5 L22,8.5 L22,9.70000005 L17,9.70000005 L17,8.5 Z M15,5.5 L22,5.5 L22,6.70000005 L15,6.70000005 L15,5.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/contacts</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/contacts\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon12\" fill=\"#000000\">            <path d=\"M1,20 L1,19.3154633 C1,18.6303744 1.49815091,17.8319079 2.11409761,17.5313327 L7.77445076,14.769143 C8.59537712,14.36854 8.78625906,13.4812624 8.19344522,12.7786389 L7.83191269,12.350138 C7.09631763,11.4782852 6.5,9.84949648 6.5,8.70929053 L6.5,6.99958038 C6.5,4.79067313 8.29535615,3 10.5,3 C12.709139,3 14.5,4.79298022 14.5,7.00020747 L14.5,8.71018568 C14.5,9.84929595 13.9009324,11.4828603 13.1680872,12.351573 L12.8065546,12.7801327 C12.2170324,13.4789507 12.4011877,14.3683976 13.225549,14.7705104 L18.8859024,17.5315576 C19.5012015,17.8316925 20,18.6251701 20,19.3154633 L20,20 C20,20.5522847 19.5522847,21 19,21 L2,21 C1.44771525,21 1,20.5522847 1,20 Z M20,14.5 L23,14.5 L23,16 L20,16 L20,14.5 Z M18,11.5 L23,11.5 L23,13 L18,13 L18,11.5 Z M16,8.5 L23,8.5 L23,10 L16,10 L16,8.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        copy: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/copy</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/copy\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(5.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M7.4,1.2 L1.2,1.2 L1.2,18.8 L13.8,18.8 L13.8,7.6 L9,7.6 C8.1163444,7.6 7.4,6.8836556 7.4,6 L7.4,1.2 Z M8.6,1.2989947 L8.6,6 C8.6,6.2209139 8.7790861,6.4 9,6.4 L13.702787,6.4 L8.6,1.2989947 Z M0.995808514,0 L8.99790426,0 L15,6 L15,19.0013542 C15,19.5542301 14.5541613,20 14.0041915,20 L0.995808514,20 C0.448920205,20 0,19.552891 0,19.0013542 L0,0.998645811 C0,0.445769913 0.445838658,0 0.995808514,0 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/copy</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/copy\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(5.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M8.6,1.2989947 L8.6,6 C8.6,6.2209139 8.7790861,6.4 9,6.4 L13.702787,6.4 L8.6,1.2989947 Z M0.995808514,0 L8.99790426,0 L15,6 L15,19.0013542 C15,19.5542301 14.5541613,20 14.0041915,20 L0.995808514,20 C0.448920205,20 0,19.552891 0,19.0013542 L0,0.998645811 C0,0.445769913 0.445838658,0 0.995808514,0 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'delete-on': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/delete_on</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/delete_on\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon39\" fill=\"#000000\">            <path d=\"M6.77355253,6.399997 L7.58590583,20.0475349 C7.61106164,20.4701525 7.96112672,20.8 8.38449235,20.8 L15.6155076,20.8 C16.0388733,20.8 16.3889384,20.4701525 16.4140942,20.0475349 L17.2264475,6.399997 L18.4285714,6.399997 L17.611974,20.1188373 C17.5490844,21.1753813 16.6739217,22 15.6155076,22 L8.38449235,22 C7.32607828,22 6.45091556,21.1753813 6.38802605,20.1188373 L5.57142856,6.399997 L6.77355253,6.399997 Z M9.5,9 L10.7000122,9 L11.2000122,18 L10,18 L9.5,9 Z M13.2999878,9 L14.5,9 L14,18 L12.7999878,18 L13.2999878,9 Z M4.4590499,2.35303271 L20.2159739,5.13140356 C20.4879211,5.17935518 20.6695054,5.43868437 20.6215537,5.71063152 L20.5,6.399997 L3.7582682,3.44797798 L3.87982193,2.7586125 C3.92777355,2.48666535 4.18710275,2.30508109 4.4590499,2.35303271 Z M10.7499171,1.2283746 L14.6891481,1.92296731 C14.9610953,1.97091893 15.1426796,2.23024812 15.0947279,2.50219528 L14.9731747,3.1915577 L10.049136,2.32331681 L10.1706892,1.63395439 C10.2186408,1.36200724 10.47797,1.18042298 10.7499171,1.2283746 Z\" id=\"Path-2\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/delete_on</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/delete_on\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon39\" fill=\"#000000\">            <path d=\"M9.77436653,5 L3.7582682,3.93919955 L3.93191675,2.95438967 C3.97986837,2.68244252 4.23919756,2.50085826 4.51114472,2.54880988 L18.4125347,5 L18.5,5 L18.4125347,5 L20.2680688,5.32718073 C20.5400159,5.37513235 20.7216002,5.63446154 20.6736486,5.90640869 L20.5,6.89121857 L18.4104253,6.52277017 L17.6107386,20.117444 C17.5485547,21.1745693 16.6731425,22 15.6141898,22 L8.38581016,22 C7.32685754,22 6.45144525,21.1745693 6.38926141,20.117444 L5.58823542,6.50000215 L18.2813015,6.50000215 L9.77436653,5 L5.5,5 L9.77436653,5 Z M9,8.99998133 L9.5,17.9999943 L11,17.9999943 L10.6000004,8.99998133 L9,8.99998133 Z M13.5,8.99998133 L13,17.9999943 L14.5,17.9999943 L15,8.99998133 L13.5,8.99998133 Z M10.8541058,1.12871315 L14.7933368,1.82330587 C15.0652839,1.87125749 15.2468682,2.13058668 15.1989166,2.40253383 L15.0252743,3.387308 L10.1012355,2.51906711 L10.2748778,1.53429294 C10.3228294,1.26234579 10.5821586,1.08076153 10.8541058,1.12871315 L10.8541058,1.12871315 Z\" id=\"Shape\"></path>        </g>    </g></svg>' },\n        delete: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/delete</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/delete\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon39\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M3.77355253,3.39999695 L4.58590583,17.0475349 C4.61106164,17.4701525 4.96112672,17.8 5.38449235,17.8 L12.6155076,17.8 C13.0388733,17.8 13.3889384,17.4701525 13.4140942,17.0475349 L14.2264475,3.39999695 L3.77355253,3.39999695 Z M15.4285714,3.399997 L14.611974,17.1188373 C14.5490844,18.1753813 13.6739217,19 12.6155076,19 L5.38449235,19 C4.32607828,19 3.45091556,18.1753813 3.38802605,17.1188373 L2.57142856,3.399997 L0.5,3.399997 L0.5,2.69999695 C0.5,2.42385457 0.723857625,2.19999695 1,2.19999695 L17,2.19999695 C17.2761424,2.19999695 17.5,2.42385457 17.5,2.69999695 L17.5,3.399997 L15.4285714,3.399997 Z M11,2.72855691e-05 C11.2761424,2.72855691e-05 11.5,0.223884911 11.5,0.500027286 L11.5,1.20002423 L6.5,1.20002423 L6.5,0.500027286 C6.5,0.223884911 6.72385763,2.72855691e-05 7,2.72855691e-05 L11,2.72855691e-05 Z M6.5,6 L7.70001221,6 L8.20001221,15 L7,15 L6.5,6 Z M10.2999878,6 L11.5,6 L11,15 L9.79998779,15 L10.2999878,6 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/delete</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/delete\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon39\" fill=\"#000000\">            <g id=\"Group-3\" transform=\"translate(3.000000, 2.000000)\">                <path d=\"M15.4117647,4.5 L14.6107386,18.117444 C14.5485547,19.1745693 13.6731425,20 12.6141898,20 L5.38581016,20 C4.32685754,20 3.45144525,19.1745693 3.38926141,18.117444 L2.58823529,4.5 L0.5,4.5 L0.5,3.5 C0.5,3.22385763 0.723857625,3 1,3 L17,3 C17.2761424,3 17.5,3.22385763 17.5,3.5 L17.5,4.5 L15.4117647,4.5 Z M7,0.500034106 L11,0.500034106 C11.2761424,0.500034106 11.5,0.723891731 11.5,1.00003411 L11.5,2 L6.5,2 L6.5,1.00003411 C6.5,0.723891731 6.72385763,0.500034106 7,0.500034106 Z M6,6.99998133 L6.5,15.9999943 L8,15.9999943 L7.60000038,6.99998133 L6,6.99998133 Z M10.5,6.99998133 L10,15.9999943 L11.5,15.9999943 L12,6.99998133 L10.5,6.99998133 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>            </g>        </g>    </g></svg>' },\n        discover: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/discover</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/discover\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M9.12335563,9.12335563 L7.26736162,12.7326384 L10.8766444,10.8766444 L12.7326384,7.26736162 L9.12335563,9.12335563 Z M8.23223305,8.23223305 L14.1243501,5.20234187 C14.2678549,5.12854767 14.4381526,5.12854767 14.5816575,5.20234187 C14.8272333,5.32862381 14.9239401,5.63007409 14.7976581,5.87564991 L11.767767,11.767767 L5.87564991,14.7976581 C5.73214506,14.8714523 5.56184738,14.8714523 5.41834253,14.7976581 C5.17276672,14.6713762 5.07605992,14.3699259 5.20234187,14.1243501 L8.23223305,8.23223305 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/discover</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/discover\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon22\" fill=\"#000000\">            <path d=\"M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z M10.6035341,10.6035341 L7.64699622,16.3530038 L13.3964659,13.3964659 L16.3530038,7.64699622 L10.6035341,10.6035341 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        display: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/display</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/display\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_tv&amp;display\" transform=\"translate(2.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M1.2,1.2 L1.2,13.8 L18.8,13.8 L18.8,1.2 L1.2,1.2 Z M0,1 C0,0.44771525 0.44771525,0 1,0 L19,0 C19.5522847,0 20,0.44771525 20,1 L20,14 C20,14.5522847 19.5522847,15 19,15 L1,15 C0.44771525,15 0,14.5522847 0,14 L0,1 Z M6,16.8999993 C6,16.5686284 6.26617432,16.2999992 6.60130024,16.2999992 L13.3986998,16.2999992 C13.7307887,16.2999992 14,16.5783196 14,16.8999993 L14,17.4999993 L6,17.4999993 L6,16.8999993 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/display</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/display\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_tv&amp;display\" fill=\"#000000\">            <g id=\"Pic\" transform=\"translate(2.000000, 3.500000)\">                <path d=\"M0,1.5 C0,0.94771525 0.44771525,0.5 1,0.5 L19,0.5 C19.5522847,0.5 20,0.94771525 20,1.5 L20,14.5 C20,15.0522847 19.5522847,15.5 19,15.5 L1,15.5 C0.44771525,15.5 0,15.0522847 0,14.5 L0,1.5 Z M6,17.5499992 C6,17.1357857 6.34375,16.7999992 6.75262058,16.7999992 L13.2473794,16.7999992 C13.6630403,16.7999992 14,17.1328979 14,17.5499992 L14,18.2999992 L6,18.2999992 L6,17.5499992 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>            </g>        </g>    </g></svg>' },\n        done: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/done</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/done\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 5.000000)\" fill=\"#000000\">            <path d=\"M6.86396103,11.6170094 L1.56066017,6.3137085 L0.5,7.37436867 L6.15685425,13.0312229 C6.54737854,13.4217472 7.18054352,13.4217472 7.57106781,13.0312229 L19.2383297,1.36396103 L18.1776695,0.303300859 L6.86396103,11.6170094 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/done</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/done\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_done\" fill=\"#000000\">            <path d=\"M8.65685425,18.4350288 L3,12.7781746 L4.41421356,11.363961 L9.36396103,16.3137085 L20.6776695,5 L22.0918831,6.41421356 L10.0710678,18.4350288 C9.68054352,18.8255531 9.04737854,18.8255531 8.65685425,18.4350288 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        done2: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/done2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/done2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M8.82842729,12.5583261 L14.6367534,6.75 L15.4852815,7.59852817 L9.53553407,13.5482756 C9.14500978,13.9387999 8.5118448,13.9387999 8.12132051,13.5482756 L5,10.4269551 L5.84852817,9.57842696 L8.82842729,12.5583261 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/done2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/done2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_miniprogram\" fill=\"#000000\">            <path d=\"M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z M10.8234373,14.1393166 L8.05753759,11.3734169 L7,12.4309545 L10.1188091,15.5520194 C10.1187366,15.5521643 10.1187728,15.5522005 10.118809,15.5522368 C10.5092522,15.9428422 11.1424171,15.9429738 11.5329139,15.5524219 L17.4852815,9.60252752 L16.422754,8.53999996 L10.8234373,14.1393166 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        download: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/download</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/download\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon38\" transform=\"translate(4.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M14.8,6.2 L12,6.2 L12,5 L15.0010434,5 C15.5508697,5 16,5.44583866 16,5.99580851 L16,19.0041915 C16,19.5510798 15.5541613,20 15.0041915,20 L0.995808514,20 C0.448920205,20 0,19.5541613 0,19.0041915 L0,5.99580851 C0,5.44892021 0.447248087,5 0.998956561,5 L4,5 L4,6.2 L1.2,6.2 L1.2,18.8 L14.8,18.8 L14.8,6.2 Z M8.59999394,10.6171633 L10.6870057,8.53015149 L11.5355339,9.37867966 L8.70710678,12.2071068 C8.31658249,12.5976311 7.68341751,12.5976311 7.29289322,12.2071068 L4.46446609,9.37867966 L5.31299427,8.53015149 L7.3999939,10.6171511 L7.3999939,0 L8.59999394,0 L8.59999394,10.6171633 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/download</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/download\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon38\" fill=\"#000000\">            <path d=\"M11.25,12.0397591 L9.53050029,10.3199997 L8.47000027,11.3806599 L11.2978402,14.2091404 C11.688335,14.5996941 12.3215,14.5997419 12.7120537,14.2090336 L15.5400004,11.3806599 L14.4795004,10.3199997 L12.75,12.0497613 L12.75,7 L11.25,7 L11.25,12.0397591 Z M11.25,7 L11.25,2 L12.75,2 L12.75,7 L19.0010434,7 C19.5508697,7 20,7.44583866 20,7.99580851 L20,21.0041915 C20,21.5510798 19.5541613,22 19.0041915,22 L4.99580851,22 C4.44892021,22 4,21.5541613 4,21.0041915 L4,7.99580851 C4,7.44892021 4.44724809,7 4.99895656,7 L11.25,7 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        email: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/email</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/email\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_email\" transform=\"translate(2.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M2.2,1.2 L9.76,6.87 C9.90222222,6.97666667 10.0977778,6.97666667 10.24,6.87 L17.8,1.2 L2.2,1.2 Z M18.8,1.95 L10.96,7.83 C10.3911111,8.25666667 9.60888889,8.25666667 9.04,7.83 L1.2,1.95 L1.2,14.8 L18.8,14.8 L18.8,1.95 Z M1,0 L19,0 C19.5522847,0 20,0.44771525 20,1 L20,15 C20,15.5522847 19.5522847,16 19,16 L1,16 C0.44771525,16 0,15.5522847 0,15 L0,1 C0,0.44771525 0.44771525,0 1,0 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/email</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/email\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_email\" fill=\"#000000\">            <path d=\"M3,4 L21,4 C21.5522847,4 22,4.44771525 22,5 L22,19 C22,19.5522847 21.5522847,20 21,20 L3,20 C2.44771525,20 2,19.5522847 2,19 L2,5 C2,4.44771525 2.44771525,4 3,4 Z M19.0314787,5.91434839 L12.1561738,11.4145924 C12.0648691,11.4876361 11.9351309,11.4876361 11.8438262,11.4145924 L4.96852129,5.91434839 L4.03147871,7.08565161 L10.9067837,12.5858956 C11.5459163,13.0972017 12.4540837,13.0972017 13.0932163,12.5858956 L19.9685213,7.08565161 L19.0314787,5.91434839 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        error: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/error</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/error\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M9.34082031,4.43115234 L10.6591797,4.43115234 L10.5712891,11.4916992 L9.42871094,11.4916992 L9.34082031,4.43115234 Z M10,15.0732422 C9.53125,15.0732422 9.16503906,14.7070312 9.16503906,14.2382812 C9.16503906,13.762207 9.53125,13.4033203 10,13.4033203 C10.4760742,13.4033203 10.8349609,13.762207 10.8349609,14.2382812 C10.8349609,14.7070312 10.4760742,15.0732422 10,15.0732422 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/error</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/error\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_info\" fill=\"#000000\">            <path d=\"M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z M11.2367191,6.13574219 L11.3460941,13.7324219 L12.6517582,13.7324219 L12.7611332,6.13574219 L11.2367191,6.13574219 Z M11.9955082,17.1025391 C12.5082035,17.1025391 12.8978519,16.7197266 12.8978519,16.2207031 C12.8978519,15.7216797 12.5082035,15.3388672 11.9955082,15.3388672 C11.4964848,15.3388672 11.1000004,15.7216797 11.1000004,16.2207031 C11.1000004,16.7197266 11.4964848,17.1025391 11.9955082,17.1025391 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'eyes-off': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/eyes_off</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/eyes_off\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon21\" transform=\"translate(1.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M17.6701381,13.9730813 L20.4249789,16.7279221 L19.5764507,17.5764502 L2.84852868,0.848528171 L3.69705685,0 L6.55246809,2.85541124 C7.93196844,2.3029864 9.43174921,2 11,2 C15.8077906,2 19.9720635,4.84762755 22,9 C21.0088953,11.0293711 19.5075207,12.7471002 17.6701381,13.9730813 Z M7.48629025,3.7892334 L9.14977359,5.45271674 C9.70307173,5.1635303 10.3324386,5 11,5 C13.209139,5 15,6.790861 15,9 C15,9.66756141 14.8364697,10.2969283 14.5472833,10.8502264 L16.8030731,13.1060162 C18.3773063,12.1062525 19.7070071,10.7026267 20.6478722,9 C18.6862248,5.45012523 15.0343177,3.2 11,3.2 C9.78190146,3.2 8.59866509,3.40513103 7.48629025,3.7892334 Z M13.6379795,9.94092264 C13.7428778,9.64685352 13.7999997,9.33009741 13.7999997,8.99999976 C13.7999997,7.45360249 12.546397,6.19999981 10.9999998,6.19999981 C10.6699021,6.19999981 10.353146,6.25712171 10.0590769,6.36202004 L13.6379795,9.94092264 Z M15.4475319,15.1445888 C14.0680316,15.6970136 12.5682508,16 11,16 C6.1922094,16 2.0279365,13.1523724 -2.72848411e-12,9 C0.991104672,6.9706289 2.49247928,5.25289977 4.32986187,4.02691872 L5.19692691,4.89398376 C3.62269375,5.89374754 2.29299288,7.29737333 1.35212783,9 C3.31377519,12.5498748 6.96568232,14.8 11,14.8 C12.2180985,14.8 13.4013349,14.594869 14.5137097,14.2107666 L15.4475319,15.1445888 Z M7.45271674,7.14977359 L8.36202004,8.05907689 C8.25712171,8.353146 8.19999981,8.66990212 8.19999981,8.99999976 C8.19999981,10.546397 9.45360249,11.7999997 10.9999998,11.7999997 C11.3300974,11.7999997 11.6468535,11.7428778 11.9409226,11.6379795 L12.8502264,12.5472833 C12.2969283,12.8364697 11.6675614,13 11,13 C8.790861,13 7,11.209139 7,9 C7,8.33243859 7.1635303,7.70307173 7.45271674,7.14977359 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/eyes_off</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/eyes_off\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon21\" fill=\"#000000\">            <path d=\"M18.9218787,16.8005584 L22.0918831,19.9705627 L21.0312229,21.0312229 L4.06066017,4.06066017 L5.12132034,3 L7.8588755,5.73755516 C9.15302069,5.26004417 10.5471275,5 12,5 C16.8077906,5 20.9720635,7.84762755 23,12 C22.0545468,13.9358958 20.6447484,15.5881976 18.9218787,16.8005584 Z M10.8238458,8.70252549 L15.2974745,13.1761542 C15.4285976,12.8085676 15.5,12.4126223 15.5,12 C15.5,10.0670034 13.9329966,8.5 12,8.5 C11.5873777,8.5 11.1914324,8.57140244 10.8238458,8.70252549 Z M16.1411245,18.2624448 C14.8469793,18.7399558 13.4528725,19 12,19 C7.1922094,19 3.0279365,16.1523724 1,12 C1.94545318,10.0641042 3.35525158,8.41180238 5.07812128,7.19944162 L8.70252549,10.8238458 C8.57140244,11.1914324 8.5,11.5873777 8.5,12 C8.5,13.9329966 10.0670034,15.5 12,15.5 C12.4126223,15.5 12.8085676,15.4285976 13.1761542,15.2974745 L16.1411245,18.2624448 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'eyes-on': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/eyes_on</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/eyes_on\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon21\" transform=\"translate(1.000000, 5.000000)\" fill=\"#000000\">            <path d=\"M11,12.8 C15.0343177,12.8 18.6862248,10.5498748 20.6478722,7 C18.6862248,3.45012523 15.0343177,1.2 11,1.2 C6.96568232,1.2 3.31377519,3.45012523 1.35212783,7 C3.31377519,10.5498748 6.96568232,12.8 11,12.8 Z M11,0 C15.8077906,0 19.9720635,2.84762755 22,7 C19.9720635,11.1523724 15.8077906,14 11,14 C6.1922094,14 2.0279365,11.1523724 -1.09139364e-11,7 C2.0279365,2.84762755 6.1922094,0 11,0 Z M11,9.8 C12.5463973,9.8 13.8,8.5463973 13.8,7 C13.8,5.4536027 12.5463973,4.2 11,4.2 C9.4536027,4.2 8.2,5.4536027 8.2,7 C8.2,8.5463973 9.4536027,9.8 11,9.8 Z M11,11 C8.790861,11 7,9.209139 7,7 C7,4.790861 8.790861,3 11,3 C13.209139,3 15,4.790861 15,7 C15,9.209139 13.209139,11 11,11 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/eyes_on</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/eyes_on\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon21\" fill=\"#000000\">            <path d=\"M1,12 C3.0279365,7.84762755 7.1922094,5 12,5 C16.8077906,5 20.9720635,7.84762755 23,12 C20.9720635,16.1523724 16.8077906,19 12,19 C7.1922094,19 3.0279365,16.1523724 1,12 Z M12,15.5 C13.9329966,15.5 15.5,13.9329966 15.5,12 C15.5,10.0670034 13.9329966,8.5 12,8.5 C10.0670034,8.5 8.5,10.0670034 8.5,12 C8.5,13.9329966 10.0670034,15.5 12,15.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        folder: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/folder</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/folder\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Picture\" transform=\"translate(2.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M18.8,5 L18.8,2.7 L8.20406273,2.7 L6.32906273,1.2 L1.2,1.2 L1.2,5 L18.8,5 Z M18.8,6.20000005 L1.2,6.20000005 L1.2,14.8 L18.8,14.8 L18.8,6.20000005 Z M1,0 L6.75,0 L8.625,1.5 L19,1.5 C19.5522847,1.5 20,1.94771525 20,2.5 L20,15 C20,15.5522847 19.5522847,16 19,16 L1,16 C0.44771525,16 0,15.5522847 0,15 L0,1 C0,0.44771525 0.44771525,0 1,0 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/folder</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/folder\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Picture\" transform=\"translate(2.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M1,0 L6.75,0 L8.625,1.5 L19,1.5 C19.5522847,1.5 20,1.94771525 20,2.5 L20,15 C20,15.5522847 19.5522847,16 19,16 L1,16 C0.44771525,16 6.76353751e-17,15.5522847 0,15 L0,1 C-6.76353751e-17,0.44771525 0.44771525,1.01453063e-16 1,0 Z M1.5,5 L1.5,6.5 L18.5,6.5 L18.5,5 L1.5,5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'group-detail': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/group-detail</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/group-detail\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon14\" transform=\"translate(1.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M1.2,16.8 L17.8,16.8 L17.8,16.3154633 C17.8,16.0860594 17.564679,15.7100199 17.3598095,15.6100873 L11.6994561,12.8490401 C10.1728743,12.1043932 9.79557277,10.302913 10.8893366,9.00636847 L11.2508692,8.57780877 C11.802195,7.92426863 12.3,6.56439093 12.3,5.71018568 L12.3,4.00020747 C12.3,2.4549142 11.0455898,1.2 9.5,1.2 C7.95630885,1.2 6.7,2.4552027 6.7,3.99958038 L6.7,5.70929053 C6.7,6.56566389 7.19574673,7.92048381 7.74907842,8.57631176 L8.11061095,9.00481267 C9.20663642,10.3038601 8.82521432,12.1036503 7.30071945,12.8475869 L1.6403663,15.6097766 C1.43701709,15.7090088 1.2,16.0886771 1.2,16.3154633 L1.2,16.8 Z M12.4960944,1.35064233 C12.9490802,1.12626413 13.4599583,1 14,1 C15.8603276,1 17.3684211,2.49415019 17.3684211,4.33350622 L17.3684211,5.75848807 C17.3684211,6.70774662 16.8639431,8.06905029 16.2468102,8.79297753 L15.9423618,9.15011061 C15.445922,9.73245889 15.6010002,10.4736647 16.2951991,10.8087587 L21.0618125,13.1096313 C21.5799592,13.3597438 22,14.0209751 22,14.5962194 L22,15.1679682 C22,15.6274867 21.6202734,16 21.1566909,16 L18.9676453,16 C18.9887855,16.1061337 19,16.2119585 19,16.3154633 L19,17.0015619 C19,17.552984 18.5490746,18 17.9985704,18 L1.00142961,18 C0.448355308,18 0,17.5557555 0,17.0015619 L0,16.3154633 C0,15.6303744 0.498150907,14.8319079 1.11409761,14.5313327 L6.77445076,11.769143 C7.59537712,11.36854 7.78625906,10.4812624 7.19344522,9.7786389 L6.83191269,9.35013798 C6.09631763,8.47828515 5.5,6.84949648 5.5,5.70929053 L5.5,3.99958038 C5.5,1.79067313 7.29535615,0 9.5,0 C10.6925681,0 11.7632414,0.522511424 12.4960868,1.35063371 Z M13.1531568,2.36930666 C13.3760552,2.86753487 13.5,3.41953623 13.5,4.00020747 L13.5,5.71018568 C13.5,6.84929595 12.9009324,8.48286035 12.1680872,9.35157303 L11.8065546,9.78013273 C11.2170324,10.4789507 11.4011877,11.3683976 12.225549,11.7705104 L17.8859024,14.5315576 C18.0233929,14.5986237 18.1550664,14.690323 18.2766575,14.8 L20.8,14.8 L20.8,14.5962194 C20.8,14.4845959 20.6463054,14.2415527 20.5401598,14.1903156 L15.7735464,11.8894429 C14.3727962,11.2132924 14.0215331,9.55360651 15.0291527,8.37161899 L15.3336012,8.01448591 C15.76679,7.50633402 16.1684211,6.42060801 16.1684211,5.75848807 L16.1684211,4.33350622 C16.1684211,3.15902864 15.1996866,2.2 14,2.2 C13.6994787,2.2 13.4132922,2.26035387 13.1531562,2.36930543 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/group-detail</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/group-detail\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon14\" fill=\"#000000\">            <path d=\"M15.1110698,4.00178 C16.9199852,4.05984018 18.3684211,5.53089815 18.3684211,7.33350622 L18.3684211,8.75848807 C18.3684211,9.70774662 17.8639431,11.0690503 17.2468102,11.7929775 L16.9423618,12.1501106 C16.445922,12.7324589 16.6010002,13.4736647 17.2951991,13.8087587 L22.0618125,16.1096313 C22.5799592,16.3597438 23,17.0209751 23,17.5962194 L23,18.1679682 C23,18.6274867 22.6202734,19 22.1566909,19 L21.4832067,19 C21.3608065,17.8393567 20.5814047,16.689663 19.5435184,16.1833954 L14.1269298,13.5412535 L14.3146097,13.3187784 C15.276491,12.1785669 16,10.2021228 16,8.71018568 L16,7.00020747 C16,5.89435381 15.6732669,4.86441043 15.1110698,4.00178 L15.1110698,4.00178 Z M7.83191269,12.350138 C7.09631763,11.4782852 6.5,9.84949648 6.5,8.70929053 L6.5,6.99958038 C6.5,4.79067313 8.29535615,3 10.5,3 C12.709139,3 14.5,4.79298022 14.5,7.00020747 L14.5,8.71018568 C14.5,9.84929595 13.9009324,11.4828603 13.1680872,12.351573 L12.8065546,12.7801327 C12.2170324,13.4789507 12.4011877,14.3683976 13.225549,14.7705104 L18.8859024,17.5315576 C19.5012015,17.8316925 20,18.6251701 20,19.3154633 L20,20.0015619 C20,20.552984 19.5490746,21 18.9985704,21 L2.00142961,21 C1.44835531,21 1,20.5557555 1,20.0015619 L1,19.3154633 C1,18.6303744 1.49815091,17.8319079 2.11409761,17.5313327 L7.77445076,14.769143 C8.59537712,14.36854 8.78625906,13.4812624 8.19344522,12.7786389 L7.83191269,12.350138 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        help: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/help</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/help\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M7,7.70697674 C7.07674419,6.2 8.08139535,5 10.0418605,5 C11.8,5 13,6.08837209 13,7.5255814 C13,8.62093023 12.4348837,9.39534884 11.5418605,9.93255814 C10.655814,10.455814 10.4046512,10.8465116 10.4046512,11.5790698 L10.4046512,12.0325581 L9.18372093,12.0325581 L9.18372093,11.3906977 C9.17674419,10.4697674 9.62325581,9.84186047 10.5790698,9.26976744 C11.3883721,8.7744186 11.7023256,8.33488372 11.7023256,7.58837209 C11.7023256,6.72325581 11.0325581,6.08837209 9.99302326,6.08837209 C8.93953488,6.08837209 8.26976744,6.70930233 8.19302326,7.70697674 L7,7.70697674 Z M9.79767442,15.2139535 C9.35116279,15.2139535 9.00232558,14.8651163 9.00232558,14.4186047 C9.00232558,13.9651163 9.35116279,13.6232558 9.79767442,13.6232558 C10.2511628,13.6232558 10.5930233,13.9651163 10.5930233,14.4186047 C10.5930233,14.8651163 10.2511628,15.2139535 9.79767442,15.2139535 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/help</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/help\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon10\" fill=\"#000000\">            <path d=\"M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z M9,9.78222656 L10.6064453,9.78222656 C10.6611328,8.93457031 11.2285156,8.39453125 12.1103516,8.39453125 C12.9716797,8.39453125 13.5458984,8.92089844 13.5458984,9.64550781 C13.5458984,10.3222656 13.2587891,10.6914062 12.4111328,11.2041016 C11.4677734,11.7578125 11.0712891,12.3730469 11.1328125,13.3847656 L11.1396484,13.8701172 L12.7255859,13.8701172 L12.7255859,13.4736328 C12.7255859,12.7900391 12.9785156,12.4345703 13.8740234,11.9150391 C14.8037109,11.3613281 15.3232422,10.6298828 15.3232422,9.58398438 C15.3232422,8.08007812 14.0722656,7 12.1992188,7 C10.1689453,7 9.0546875,8.17578125 9,9.78222656 Z M11.953125,17.0830078 C12.5068359,17.0830078 12.9443359,16.6523438 12.9443359,16.1123047 C12.9443359,15.5722656 12.5068359,15.1484375 11.953125,15.1484375 C11.3994141,15.1484375 10.9550781,15.5722656 10.9550781,16.1123047 C10.9550781,16.6523438 11.3994141,17.0830078 11.953125,17.0830078 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        home: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/home</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/home\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon31\" transform=\"translate(2.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M11,16.8 L14.8,16.8 L14.8,9.8 L18.1029437,9.8 L10,1.69705627 L1.89705627,9.8 L5.2,9.8 L5.2,16.8 L9,16.8 L9,14 L11,14 L11,16.8 Z M16,17 C16,17.5522847 15.5522847,18 15,18 L5,18 C4.44771525,18 4,17.5522847 4,17 L4,11 L1.41421356,11 C1.14899707,11 0.89464316,10.8946432 0.707106781,10.7071068 C0.316582489,10.3165825 0.316582489,9.68341751 0.707106781,9.29289322 L9.29289322,0.707106781 C9.68341751,0.316582489 10.3165825,0.316582489 10.7071068,0.707106781 L19.2928932,9.29289322 C19.4804296,9.4804296 19.5857864,9.73478351 19.5857864,10 C19.5857864,10.5522847 19.1380712,11 18.5857864,11 L16,11 L16,17 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/home</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/home\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon31\" fill=\"#000000\">            <path d=\"M13.5,21 L13.5,17 L10.5,17 L10.5,21 L7,21 C6.44771525,21 6,20.5522847 6,20 L6,14.0000062 L3.41421259,14.0000062 C3.1489962,14.0000062 2.89464237,13.8946495 2.70710601,13.7071132 C2.31658161,13.316589 2.31658143,12.6834241 2.70710561,12.2928997 L11.2928934,3.70710618 C11.6834178,3.316582 12.3165828,3.31658218 12.7071066,3.70710698 L21.2928944,12.2928997 C21.4804306,12.480436 21.5857874,12.7347899 21.5857874,13.0000062 C21.5857874,13.552291 21.1380722,14.0000062 20.5857874,14.0000062 L18,14.0000062 L18,20 C18,20.5522847 17.5522847,21 17,21 L13.5,21 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        imac: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/imac</title>    <desc>Created with Sketch.</desc>    <defs>        <path d=\"M18.8,11 L18.8,1.2 L1.2,1.2 L1.2,11 L18.8,11 Z M18.8,12.2 L1.2,12.2 L1.2,13.8 L18.8,13.8 L18.8,12.2 Z M13.1554082,15 L13.7770168,16.8399675 C13.7944347,16.8915248 13.803319,16.9455799 13.803319,17 C13.803319,17.2761424 13.5794614,17.5 13.303319,17.5 L6.69668101,17.5 C6.64226093,17.5 6.58820584,17.4911158 6.5366485,17.4736978 C6.27503244,17.3853143 6.13459971,17.1015836 6.22298322,16.8399675 L6.84459181,15 L1,15 C0.44771525,15 0,14.5522847 0,14 L0,1 C0,0.44771525 0.44771525,0 1,0 L19,0 C19.5522847,0 20,0.44771525 20,1 L20,14 C20,14.5522847 19.5522847,15 19,15 L13.1554082,15 Z M8.11122629,14.9999878 L7.67203442,16.3 L12.3279656,16.3 L11.8887737,14.9999878 L8.11122629,14.9999878 Z\" id=\"path-1\"></path>    </defs>    <g id=\"3.Icons/Outlined/imac\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">        <g id=\"icon31\" transform=\"translate(2.000000, 4.000000)\">            <mask id=\"mask-2\" fill=\"white\">                <use xlink:href=\"#path-1\"></use>            </mask>            <use id=\"\\u56FE\\u6807\\u989C\\u8272\" fill-opacity=\"0.9\" fill=\"#000000\" xlink:href=\"#path-1\"></use>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/imac</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/imac\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon31\" fill=\"#000000\">            <g id=\"Group-2\" transform=\"translate(2.000000, 4.000000)\">                <path d=\"M13.1554082,15 L13.7770168,16.8399675 C13.7944347,16.8915248 13.803319,16.9455799 13.803319,17 C13.803319,17.2761424 13.5794614,17.5 13.303319,17.5 L6.69668101,17.5 C6.64226093,17.5 6.58820584,17.4911158 6.5366485,17.4736978 C6.27503244,17.3853143 6.13459971,17.1015836 6.22298322,16.8399675 L6.84459181,15 L1,15 C0.44771525,15 0,14.5522847 0,14 L0,1 C0,0.44771525 0.44771525,0 1,0 L19,0 C19.5522847,0 20,0.44771525 20,1 L20,14 C20,14.5522847 19.5522847,15 19,15 L13.1554082,15 L13.1554082,15 Z M18.5,12 L1.5,12 L1.5,13.5 L18.5,13.5 L18.5,12 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>            </g>        </g>    </g></svg>' },\n        info: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/info</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/info\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M9.39999962,8 L10.5999997,8 L10.5999997,15 L9.39999962,15 L9.39999962,8 Z M10,7 C9.44771525,7 9,6.55228475 9,6 C9,5.44771525 9.44771525,5 10,5 C10.5522847,5 11,5.44771525 11,6 C11,6.55228475 10.5522847,7 10,7 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/info</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/info\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_info\" fill=\"#000000\">            <g id=\"Group-19\" transform=\"translate(2.000000, 2.000000)\">                <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M9.25,8 L9.25,15 L10.75,15 L10.75,8 L9.25,8 Z M10,7 C10.5522847,7 11,6.55228475 11,6 C11,5.44771525 10.5522847,5 10,5 C9.44771525,5 9,5.44771525 9,6 C9,6.55228475 9.44771525,7 10,7 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>            </g>        </g>    </g></svg>' },\n        keyboard: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/keyboard</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/keyboard\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_info\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M4.5,6 L6.5,6 L6.5,8 L4.5,8 L4.5,6 Z M7.5,6 L9.5,6 L9.5,8 L7.5,8 L7.5,6 Z M10.5,6 L12.5,6 L12.5,8 L10.5,8 L10.5,6 Z M13.5,6 L15.5,6 L15.5,8 L13.5,8 L13.5,6 Z M4.5,9 L6.5,9 L6.5,11 L4.5,11 L4.5,9 Z M7.5,9 L9.5,9 L9.5,11 L7.5,11 L7.5,9 Z M7,13 L13,13 L13,15 L7,15 L7,13 Z M10.5,9 L12.5,9 L12.5,11 L10.5,11 L10.5,9 Z M13.5,9 L15.5,9 L15.5,11 L13.5,11 L13.5,9 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/keyboard</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/keyboard\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_info\" fill=\"#000000\">            <path d=\"M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z M6.5,8 L6.5,10 L8.5,10 L8.5,8 L6.5,8 Z M9.5,8 L9.5,10 L11.5,10 L11.5,8 L9.5,8 Z M12.5,8 L12.5,10 L14.5,10 L14.5,8 L12.5,8 Z M15.5,8 L15.5,10 L17.5,10 L17.5,8 L15.5,8 Z M6.5,11 L6.5,13 L8.5,13 L8.5,11 L6.5,11 Z M9.5,11 L9.5,13 L11.5,13 L11.5,11 L9.5,11 Z M9,15 L9,17 L15,17 L15,15 L9,15 Z M12.5,11 L12.5,13 L14.5,13 L14.5,11 L12.5,11 Z M15.5,11 L15.5,13 L17.5,13 L17.5,11 L15.5,11 Z\" id=\"Mask\"></path>        </g>    </g></svg>' },\n        like: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/like</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/like\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_like\" transform=\"translate(3.000000, 5.000000)\" fill=\"#000000\">            <path d=\"M16.2846386,7.64509528 C17.7287556,6.15675186 17.7118979,3.7815372 16.243355,2.31299423 C14.7593626,0.829001923 12.3533357,0.829001923 10.8693434,2.31299423 C10.6770786,2.50525906 10.4332063,2.74049974 10.1366138,3.0199452 L9.3137085,3.79527533 L8.49080324,3.0199452 C8.1942107,2.74049974 7.95033841,2.50525906 7.75807358,2.31299423 C6.27408127,0.829001923 3.86805435,0.829001923 2.38406204,2.31299423 C0.915537104,3.78151917 0.898583145,6.15687038 2.32967362,7.63261735 L9.313666,14.6166823 L16.2846386,7.64509528 Z M1.53553391,1.46446609 C3.48815536,-0.488155365 6.65398026,-0.488155365 8.60660172,1.46446609 C8.78940843,1.6472728 9.02511069,1.87463262 9.3137085,2.14654555 C9.60230631,1.87463262 9.83800857,1.6472728 10.0208153,1.46446609 C11.9734367,-0.488155365 15.1392616,-0.488155365 17.0918831,1.46446609 C19.0263413,3.39892429 19.0443356,6.5241205 17.145866,8.48073116 L10.0208153,15.6066017 C9.63031143,15.9971464 8.99714645,15.9971796 8.60660172,15.6066757 L1.48114108,8.48114108 C-0.416918598,6.5241205 -0.398924294,3.39892429 1.53553391,1.46446609 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/like</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/like\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_like\" fill=\"#000000\">            <path d=\"M4.53553391,5.77817459 C6.48815536,3.82555313 9.65398026,3.82555313 11.6066017,5.77817459 C11.7894084,5.9609813 12.0251107,6.18834112 12.3137085,6.46025405 C12.6023063,6.18834112 12.8380086,5.9609813 13.0208153,5.77817459 C14.9734367,3.82555313 18.1392616,3.82555313 20.0918831,5.77817459 C22.0263413,7.71263279 22.0443356,10.837829 20.145866,12.7944397 L13.0207783,19.9202732 C12.6303114,20.3108549 11.9971464,20.3108881 11.6066017,19.9203842 C11.6065894,19.9203719 11.606577,19.9203596 11.6066017,19.9203102 L4.48114108,12.7948496 C2.5830814,10.837829 2.60107571,7.71263279 4.53553391,5.77817459 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        link: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/link</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/link\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M14.6568542,9 L13.8083261,8.15147186 L15.9296465,6.03015152 C17.0231145,4.9366835 17.0231145,3.16382156 15.9296465,2.07035354 C14.8361784,0.976885527 13.0633165,0.976885527 11.9698485,2.07035354 L8.08076118,5.95944084 C6.98729317,7.05290886 6.98729317,8.8257708 8.08076118,9.91923882 L7.23223305,10.767767 C5.67013588,9.20566979 5.67013588,6.67300987 7.23223305,5.1109127 L11.1213203,1.22182541 C12.6834175,-0.34027176 15.2160774,-0.34027176 16.7781746,1.22182541 C18.3402718,2.78392257 18.3402718,5.31658249 16.7781746,6.87867966 L14.6568542,9 Z M3.34314575,9 L4.19167389,9.84852814 L2.07035354,11.9698485 C0.976885527,13.0633165 0.976885527,14.8361784 2.07035354,15.9296465 C3.16382156,17.0231145 4.9366835,17.0231145 6.03015152,15.9296465 L9.91923882,12.0405592 C11.0127068,10.9470911 11.0127068,9.1742292 9.91923882,8.08076118 L10.767767,7.23223305 C12.3298641,8.79433021 12.3298641,11.3269901 10.767767,12.8890873 L6.87867966,16.7781746 C5.31658249,18.3402718 2.78392257,18.3402718 1.22182541,16.7781746 C-0.34027176,15.2160774 -0.34027176,12.6834175 1.22182541,11.1213203 L3.34314575,9 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/link</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/link\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M14.6568542,9 L13.2426407,7.58578644 L15.363961,5.46446609 C16.1450096,4.68341751 16.1450096,3.41708755 15.363961,2.63603897 C14.5829124,1.85499039 13.3165825,1.85499039 12.5355339,2.63603897 L8.29289322,6.87867966 C7.51184464,7.65972824 7.51184464,8.9260582 8.29289322,9.70710678 L6.87867966,11.1213203 C5.31658249,9.55922318 5.31658249,7.02656326 6.87867966,5.46446609 L11.1213203,1.22182541 C12.6834175,-0.34027176 15.2160774,-0.34027176 16.7781746,1.22182541 C18.3402718,2.78392257 18.3402718,5.31658249 16.7781746,6.87867966 L14.6568542,9 Z M3.34314575,9 L4.75735931,10.4142136 L2.63603897,12.5355339 C1.85499039,13.3165825 1.85499039,14.5829124 2.63603897,15.363961 C3.41708755,16.1450096 4.68341751,16.1450096 5.46446609,15.363961 L9.70710678,11.1213203 C10.4881554,10.3402718 10.4881554,9.0739418 9.70710678,8.29289322 L11.1213203,6.87867966 C12.6834175,8.44077682 12.6834175,10.9734367 11.1213203,12.5355339 L6.87867966,16.7781746 C5.31658249,18.3402718 2.78392257,18.3402718 1.22182541,16.7781746 C-0.34027176,15.2160774 -0.34027176,12.6834175 1.22182541,11.1213203 L3.34314575,9 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        location: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/location</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/location\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon22\" transform=\"translate(4.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M8.06519014,19.2431663 C8.06300986,19.2412009 8.06085569,19.2393247 8.05872818,19.2375353 L8.06519014,19.2431663 Z M8.24683684,18.9686065 C8.48293324,18.7557774 8.74732343,18.5078114 9.03284437,18.2278923 C9.85063366,17.4261479 10.6688921,16.5335242 11.4301661,15.5768797 C13.4693431,13.0143765 14.7113924,10.487102 14.7954866,8.23968166 C14.7984932,8.15933104 14.8,8.07943664 14.8,8 C14.8,4.2444637 11.7555363,1.2 8,1.2 C4.2444637,1.2 1.2,4.2444637 1.2,8 C1.2,8.07943664 1.20150681,8.15933104 1.20451338,8.23968166 C1.28860758,10.487102 2.5306569,13.0143765 4.56983386,15.5768797 C5.33110795,16.5335242 6.14936634,17.4261479 6.96715563,18.2278923 C7.25267657,18.5078114 7.51706676,18.7557774 7.75316316,18.9686065 C7.86349262,19.068063 7.94697177,19.1413912 8,19.1870148 C8.05302823,19.1413912 8.13650738,19.068063 8.24683684,18.9686065 Z M7.26171875,20.1344765 C7.26171875,20.1344765 0,14.018278 0,8 C0,3.581722 3.581722,0 8,0 C12.418278,0 16,3.581722 16,8 C16,14.018278 8.73828125,20.1344765 8.73828125,20.1344765 C8.33356488,20.5060199 7.66946023,20.502035 7.26171875,20.1344765 Z M8,10.8 C9.5463973,10.8 10.8,9.5463973 10.8,8 C10.8,6.4536027 9.5463973,5.2 8,5.2 C6.4536027,5.2 5.2,6.4536027 5.2,8 C5.2,9.5463973 6.4536027,10.8 8,10.8 Z M8,12 C5.790861,12 4,10.209139 4,8 C4,5.790861 5.790861,4 8,4 C10.209139,4 12,5.790861 12,8 C12,10.209139 10.209139,12 8,12 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/location</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/location\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon22\" fill=\"#000000\">            <path d=\"M11.2617188,22.1344765 C11.2617188,22.1344765 4,16.018278 4,10 C4,5.581722 7.581722,2 12,2 C16.418278,2 20,5.581722 20,10 C20,16.018278 12.7382812,22.1344765 12.7382812,22.1344765 C12.3335649,22.5060199 11.6694602,22.502035 11.2617188,22.1344765 Z M12,13.5 C13.9329966,13.5 15.5,11.9329966 15.5,10 C15.5,8.06700338 13.9329966,6.5 12,6.5 C10.0670034,6.5 8.5,8.06700338 8.5,10 C8.5,11.9329966 10.0670034,13.5 12,13.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        lock: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/lock</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/lock\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon37\" transform=\"translate(4.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M4,7 L4,4 C4,1.790861 5.790861,0 8,0 C10.209139,0 12,1.790861 12,4 L12,7 L14.9991283,7 C15.5518945,7 16,7.44748943 16,7.99850233 L16,19.0014977 C16,19.5529553 15.5553691,20 14.9991283,20 L1.00087166,20 C0.448105505,20 0,19.5525106 0,19.0014977 L0,7.99850233 C0,7.44704472 0.444630861,7 1.00087166,7 L4,7 Z M5.20000005,7 L10.7999992,7 L10.7999992,4 C10.7999969,2.45359963 9.54639417,1.19999695 8,1.19999695 C6.45359963,1.19999695 5.19999695,2.45359963 5.19999695,4 L5.20000005,7 Z M1.2,8.2 L1.2,18.8 L14.8,18.8 L14.8,8.2 L1.2,8.2 Z M7.39999962,13.8751867 C6.87022839,13.6437197 6.5,13.1150956 6.5,12.5 C6.5,11.6715729 7.17157288,11 8,11 C8.82842712,11 9.5,11.6715729 9.5,12.5 C9.5,13.1150958 9.12977128,13.6437201 8.59999967,13.875187 L8.59999967,16 L7.39999962,16 L7.39999962,13.8751867 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/lock</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/lock\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon37\" fill=\"#000000\">            <path d=\"M7.5,9 L7.5,6.5 C7.5,4.01471863 9.51471863,2 12,2 C14.4852814,2 16.5,4.01471863 16.5,6.5 L16.5,9 L18.9991283,9 C19.5518945,9 20,9.44748943 20,9.99850233 L20,21.0014977 C20,21.5529553 19.5553691,22 18.9991283,22 L5.00087166,22 C4.4481055,22 4,21.5525106 4,21.0014977 L4,9.99850233 C4,9.44704472 4.44463086,9 5.00087166,9 L7.5,9 Z M9,9 L15,9 L15,6.5 C15,4.84314575 13.6568542,3.5 12,3.5 C10.3431458,3.5 9,4.84314575 9,6.5 L9,9 Z M11.3999996,15.8751867 L11.3999996,18 L12.5999997,18 L12.5999997,15.875187 C13.1297713,15.6437201 13.5,15.1150958 13.5,14.5 C13.5,13.6715729 12.8284271,13 12,13 C11.1715729,13 10.5,13.6715729 10.5,14.5 C10.5,15.1150956 10.8702284,15.6437197 11.3999996,15.8751867 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'max-window': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/max-window</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/max-window\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Max-icon\" transform=\"translate(3.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M18,14 L18,18 C18,18.5522847 17.5522847,19 17,19 L13,19 L13,17.8 L16.8,17.8 L16.8,14 L18,14 Z M5,1 L5,2.2 L1.2,2.2 L1.2,6 L0,6 L0,2 C0,1.44771525 0.44771525,1 1,1 L5,1 Z M16.7968544,3.04562642 L11.3249201,8.51756067 L10.4763919,7.6690325 L15.9483176,2.19710685 L12.9968544,2.19710685 L12.9968544,0.997106803 L16.9968544,0.997106803 C17.5491392,0.997106803 17.9968544,1.44482205 17.9968544,1.9971068 L17.9968544,5.9971068 L16.7968544,5.9971068 L16.7968544,3.04562642 Z M1.20314565,16.9543736 L6.67507989,11.4824393 L7.52360806,12.3309675 L2.05168241,17.8028931 L5.0031456,17.8028931 L5.0031456,19.0028932 L1.0031456,19.0028932 C0.450860848,19.0028932 0.00314559792,18.5551779 0.00314559792,18.0028932 L0.00314559792,14.0028932 L1.20314565,14.0028932 L1.20314565,16.9543736 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/max-window</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/max-window\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Max-icon\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M18,12 L18,17 C18,17.5522847 17.5522847,18 17,18 L12,18 L12,16 L16,16 L16,12 L18,12 Z M6,0 L6,2 L2,2 L2,6 L0,6 L0,1 C0,0.44771525 0.44771525,0 1,0 L6,0 Z M14.5839613,2 L12,2 L12,0 L17,0 C17.5522847,0 18,0.44771525 18,1 L18,6 L16,6 L16,3.41364079 L11.6342138,7.77817459 L10.2200003,6.36396103 L14.5839613,2 Z M3.4160387,15.9981749 L6,15.9981749 L6,17.9981749 L1,17.9981749 C0.44771525,17.9981749 0,17.5504596 0,16.9981749 L0,11.9981749 L2,11.9981749 L2,14.5845341 L6.36578617,10.2200003 L7.77999973,11.6342138 L3.4160387,15.9981749 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        me: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/me</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/me\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon11\" transform=\"translate(2.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M18.3,16.8 L18.3,16.3154633 C18.3,16.0860594 18.064679,15.7100199 17.8598095,15.6100873 L12.1994561,12.8490401 C10.6728743,12.1043932 10.2955728,10.302913 11.3893366,9.00636847 L11.7508692,8.57780877 C12.302195,7.92426863 12.8,6.56439093 12.8,5.71018568 L12.8,4.00020747 C12.8,2.4549142 11.5455898,1.2 10,1.2 C8.45630885,1.2 7.2,2.4552027 7.2,3.99958038 L7.2,5.70929053 C7.2,6.56566389 7.69574673,7.92048381 8.24907842,8.57631176 L8.61061095,9.00481267 C9.70663642,10.3038601 9.32521432,12.1036503 7.80071945,12.8475869 L2.1403663,15.6097766 C1.93701709,15.7090088 1.7,16.0886771 1.7,16.3154633 L1.7,16.8 L18.3,16.8 Z M0.5,17 L0.5,16.3154633 C0.5,15.6303744 0.998150907,14.8319079 1.61409761,14.5313327 L7.27445076,11.769143 C8.09537712,11.36854 8.28625906,10.4812624 7.69344522,9.7786389 L7.33191269,9.35013798 C6.59631763,8.47828515 6,6.84949648 6,5.70929053 L6,3.99958038 C6,1.79067313 7.79535615,0 10,0 C12.209139,0 14,1.79298022 14,4.00020747 L14,5.71018568 C14,6.84929595 13.4009324,8.48286035 12.6680872,9.35157303 L12.3065546,9.78013273 C11.7170324,10.4789507 11.9011877,11.3683976 12.725549,11.7705104 L18.3859024,14.5315576 C19.0012015,14.8316925 19.5,15.6251701 19.5,16.3154633 L19.5,17 C19.5,17.5522847 19.0522847,18 18.5,18 L1.5,18 C0.94771525,18 0.5,17.5522847 0.5,17 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/me</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/me\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon11\" fill=\"#000000\">            <path d=\"M2.5,20 L2.5,19.3154633 C2.5,18.6303744 2.99815091,17.8319079 3.61409761,17.5313327 L9.27445076,14.769143 C10.0953771,14.36854 10.2862591,13.4812624 9.69344522,12.7786389 L9.33191269,12.350138 C8.59631763,11.4782852 8,9.84949648 8,8.70929053 L8,6.99958038 C8,4.79067313 9.79535615,3 12,3 C14.209139,3 16,4.79298022 16,7.00020747 L16,8.71018568 C16,9.84929595 15.4009324,11.4828603 14.6680872,12.351573 L14.3065546,12.7801327 C13.7170324,13.4789507 13.9011877,14.3683976 14.725549,14.7705104 L20.3859024,17.5315576 C21.0012015,17.8316925 21.5,18.6251701 21.5,19.3154633 L21.5,20 C21.5,20.5522847 21.0522847,21 20.5,21 L3.5,21 C2.94771525,21 2.5,20.5522847 2.5,20 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        mike: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/mike</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/mike\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(4.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M4.7,4.5 L4.7,10.5 C4.7,12.3225397 6.17746033,13.8 8,13.8 C9.82253967,13.8 11.3,12.3225397 11.3,10.5 L11.3,4.5 C11.3,2.67746033 9.82253967,1.2 8,1.2 C6.17746033,1.2 4.7,2.67746033 4.7,4.5 Z M8.59999967,17.9763496 L8.59999967,21 L7.39999962,21 L7.39999962,17.9763495 C3.53839884,17.670687 0.5,14.4401715 0.5,10.5 L0.5,9 L1.7,9 L1.7,10.5 C1.7,13.9793939 4.52060608,16.8 8,16.8 C11.4793939,16.8 14.3,13.9793939 14.3,10.5 L14.3,9 L15.5,9 L15.5,10.5 C15.5,14.4401718 12.4616008,17.6706874 8.59999967,17.9763496 Z M3.5,4.5 C3.5,2.01471863 5.51471863,0 8,0 C10.4852814,0 12.5,2.01471863 12.5,4.5 L12.5,10.5 C12.5,12.9852814 10.4852814,15 8,15 C5.51471863,15 3.5,12.9852814 3.5,10.5 L3.5,4.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/mike</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/mike\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" fill=\"#000000\">            <path d=\"M12.75,18.9602923 L12.75,22 L11.25,22 L11.25,18.9602923 C7.736675,18.5860629 5,15.6126238 5,12 L5,10 L6.5,10 L6.5,12 C6.5,15.0375661 8.96243388,17.5 12,17.5 C15.0375661,17.5 17.5,15.0375661 17.5,12 L17.5,10 L19,10 L19,12 C19,15.6126238 16.263325,18.5860629 12.75,18.9602923 Z M8,6 C8,3.790861 9.790861,2 12,2 C14.209139,2 16,3.790861 16,6 L16,12 C16,14.209139 14.209139,16 12,16 C9.790861,16 8,14.209139 8,12 L8,6 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        mike2: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/mike2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/mike2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,5.7 C9.28202983,5.7 8.7,6.28202983 8.7,7 L8.7,10.5 C8.7,11.2179702 9.28202983,11.8 10,11.8 C10.7179702,11.8 11.3,11.2179702 11.3,10.5 L11.3,7 C11.3,6.28202983 10.7179702,5.7 10,5.7 Z M10.6000245,14.9603384 L10.6000245,16.5 L9.40002441,16.5 L9.40002441,14.9603399 C7.19839688,14.6669239 5.5,12.7811214 5.5,10.4975018 L5.5,9 L6.7,9 L6.7,10.4975018 C6.7,12.3219031 8.17739974,13.8 10,13.8 C11.8227257,13.8 13.3,12.3217816 13.3,10.4975018 L13.3,9 L14.5,9 L14.5,10.4975018 C14.5,12.7806453 12.8020307,14.6668791 10.6000245,14.9603384 L10.6000245,14.9603384 Z M10,4.5 C11.3807119,4.5 12.5,5.61928813 12.5,7 L12.5,10.5 C12.5,11.8807119 11.3807119,13 10,13 C8.61928813,13 7.5,11.8807119 7.5,10.5 L7.5,7 C7.5,5.61928813 8.61928813,4.5 10,4.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/mike2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/mike2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon24\" fill=\"#000000\">            <path d=\"M12.6000245,16.4603384 C14.8020307,16.1668791 16.5,14.2806453 16.5,11.9975018 L16.5,10.5 L15.3,10.5 L15.3,11.9975018 C15.3,13.8217816 13.8227257,15.3 12,15.3 C10.1773997,15.3 8.7,13.8219031 8.7,11.9975018 L8.7,10.5 L7.5,10.5 L7.5,11.9975018 C7.5,14.2811214 9.19839688,16.1669239 11.4000244,16.4603399 L11.4000244,18 L12.6000245,18 L12.6000245,16.4603384 Z M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z M12,6.5 C10.8954305,6.5 10,7.3954305 10,8.5 L10,12 C10,13.1045695 10.8954305,14 12,14 C13.1045695,14 14,13.1045695 14,12 L14,8.5 C14,7.3954305 13.1045695,6.5 12,6.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'mobile-contacts': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/mobile-contacts</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/mobile-contacts\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(4.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M0,1 C0,0.44771525 0.44771525,0 1,0 L15,0 C15.5522847,0 16,0.44771525 16,1 L16,19 C16,19.5522847 15.5522847,20 15,20 L1,20 C0.44771525,20 0,19.5522847 0,19 L0,1 Z M1.2,1.2 L1.2,18.8 L14.8,18.8 L14.8,1.2 L1.2,1.2 Z M10.9093627,11.3061065 L12.6521261,11.9605864 C12.852621,12.0452838 12.9837138,12.2377779 12.9991365,12.4687708 C13.0068479,12.561168 12.9605798,12.6689647 12.9528685,12.692064 C12.6752601,13.4466408 11.9581053,13.9856243 11.1098576,13.9856243 C10.870806,13.9856243 10.6471771,13.931726 10.5931977,13.9163264 C8.97381581,13.5467378 7.5317948,12.722863 6.39822747,11.5909978 C5.26466015,10.4591325 4.43954651,9.01927668 4.06940208,7.40232629 C4.06169074,7.34842795 4,7.1251348 4,6.88644212 C4,6.03946811 4.53979396,5.32339008 5.29550551,5.04619858 C5.31863954,5.03849882 5.42659833,5 5.51913444,5 C5.75047471,5.00769976 5.94325827,5.13859575 6.02808304,5.33878961 L6.68354714,7.07893621 C6.71439251,7.16363362 6.69896982,7.2098322 6.65270177,7.2945296 C6.49847492,7.56402133 6.12833049,8.24160054 5.92012424,8.64968802 C5.86614485,8.74978495 5.83529948,8.86528141 5.83529948,8.98077786 C5.83529948,9.10397408 5.87385619,9.2271703 5.93554693,9.32726723 C6.26713465,9.88934999 6.65270177,10.4206337 7.10767097,10.8749197 C7.56264017,11.3369056 8.09472279,11.7218938 8.65765078,12.0529836 C8.75789823,12.1145817 8.87356836,12.1530805 9.00466118,12.1530805 C9.12804266,12.1530805 9.23600145,12.1222815 9.33624891,12.0683831 C9.73723871,11.8604895 10.4158368,11.4909008 10.6934452,11.3369056 C10.7782699,11.290707 10.8168266,11.2753075 10.9093627,11.3061065 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/mobile-contacts</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/mobile-contacts\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" fill=\"#000000\">            <path d=\"M4,3 C4,2.44771525 4.44771525,2 5,2 L19,2 C19.5522847,2 20,2.44771525 20,3 L20,21 C20,21.5522847 19.5522847,22 19,22 L5,22 C4.44771525,22 4,21.5522847 4,21 L4,3 Z M14.9093627,13.8061065 C14.8168266,13.7753075 14.7782699,13.790707 14.6934452,13.8369056 C14.4158368,13.9909008 13.7372387,14.3604895 13.3362489,14.5683831 C13.2360015,14.6222815 13.1280427,14.6530805 13.0046612,14.6530805 C12.8735684,14.6530805 12.7578982,14.6145817 12.6576508,14.5529836 C12.0947228,14.2218938 11.5626402,13.8369056 11.107671,13.3749197 C10.6527018,12.9206337 10.2671347,12.38935 9.93554693,11.8272672 C9.87385619,11.7271703 9.83529948,11.6039741 9.83529948,11.4807779 C9.83529948,11.3652814 9.86614485,11.2497849 9.92012424,11.149688 C10.1283305,10.7416005 10.4984749,10.0640213 10.6527018,9.7945296 C10.6989698,9.7098322 10.7143925,9.66363362 10.6835471,9.57893621 L10.028083,7.83878961 C9.94325827,7.63859575 9.75047471,7.50769976 9.51913444,7.5 C9.42659833,7.5 9.31863954,7.53849882 9.29550551,7.54619858 C8.53979396,7.82339008 8,8.53946811 8,9.38644212 C8,9.6251348 8.06169074,9.84842795 8.06940208,9.90232629 C8.43954651,11.5192767 9.26466015,12.9591325 10.3982275,14.0909978 C11.5317948,15.222863 12.9738158,16.0467378 14.5931977,16.4163264 C14.6471771,16.431726 14.870806,16.4856243 15.1098576,16.4856243 C15.9581053,16.4856243 16.6752601,15.9466408 16.9528685,15.192064 C16.9605798,15.1689647 17.0068479,15.061168 16.9991365,14.9687708 C16.9837138,14.7377779 16.852621,14.5452838 16.6521261,14.4605864 L14.9093627,13.8061065 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        more: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/more</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/more\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(3.000000, 10.000000)\" fill=\"#000000\">            <path d=\"M3.75,2 C3.75,2.96635 2.96635,3.75 2,3.75 C1.03365,3.75 0.25,2.96635 0.25,2 C0.25,1.0333 1.03365,0.25 2,0.25 C2.96635,0.25 3.75,1.0333 3.75,2 Z M9,0.25 C9.96635,0.25 10.75,1.0333 10.75,2 C10.75,2.96635 9.96635,3.75 9,3.75 C8.03365,3.75 7.25,2.96635 7.25,2 C7.25,1.0333 8.03365,0.25 9,0.25 Z M16,0.25 C16.96635,0.25 17.75,1.0333 17.75,2 C17.75,2.96635 16.96635,3.75 16,3.75 C15.03365,3.75 14.25,2.96635 14.25,2 C14.25,1.0333 15.03365,0.25 16,0.25 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/more</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/more\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_more\" fill=\"#000000\">            <path d=\"M7,12 C7,13.1044 6.1044,14 5,14 C3.8956,14 3,13.1044 3,12 C3,10.8952 3.8956,10 5,10 C6.1044,10 7,10.8952 7,12 Z M12,10 C13.1044,10 14,10.8952 14,12 C14,13.1044 13.1044,14 12,14 C10.8956,14 10,13.1044 10,12 C10,10.8952 10.8956,10 12,10 Z M19,10 C20.1044,10 21,10.8952 21,12 C21,13.1044 20.1044,14 19,14 C17.8956,14 17,13.1044 17,12 C17,10.8952 17.8956,10 19,10 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        more2: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/more2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/more2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M10,11 C9.44771525,11 9,10.5522847 9,10 C9,9.44771525 9.44771525,9 10,9 C10.5522847,9 11,9.44771525 11,10 C11,10.5522847 10.5522847,11 10,11 Z M14,11 C13.4477153,11 13,10.5522847 13,10 C13,9.44771525 13.4477153,9 14,9 C14.5522847,9 15,9.44771525 15,10 C15,10.5522847 14.5522847,11 14,11 Z M6,11 C5.44771525,11 5,10.5522847 5,10 C5,9.44771525 5.44771525,9 6,9 C6.55228475,9 7,9.44771525 7,10 C7,10.5522847 6.55228475,11 6,11 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/more2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/more2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_miniprogram\" fill=\"#000000\">            <path d=\"M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z M12,13.5 C12.8284271,13.5 13.5,12.8284271 13.5,12 C13.5,11.1715729 12.8284271,10.5 12,10.5 C11.1715729,10.5 10.5,11.1715729 10.5,12 C10.5,12.8284271 11.1715729,13.5 12,13.5 Z M16.5,13.5 C17.3284271,13.5 18,12.8284271 18,12 C18,11.1715729 17.3284271,10.5 16.5,10.5 C15.6715729,10.5 15,11.1715729 15,12 C15,12.8284271 15.6715729,13.5 16.5,13.5 Z M7.5,13.5 C8.32842712,13.5 9,12.8284271 9,12 C9,11.1715729 8.32842712,10.5 7.5,10.5 C6.67157288,10.5 6,11.1715729 6,12 C6,12.8284271 6.67157288,13.5 7.5,13.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        mosaic: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/mosaic</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/mosaic\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"\\u56FE\\u6807\\u989C\\u8272\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M8,12 L10,12 L10,14 L8,14 L8,12 Z M4,12 L6,12 L6,14 L4,14 L4,12 Z M12,12 L14,12 L14,14 L12,14 L12,12 Z M12,4 L14,4 L14,6 L12,6 L12,4 Z M4,8 L6,8 L6,10 L4,10 L4,8 Z M4,4 L6,4 L6,6 L4,6 L4,4 Z M6,10 L8,10 L8,12 L6,12 L6,10 Z M6,6 L8,6 L8,8 L6,8 L6,6 Z M10,10 L12,10 L12,12 L10,12 L10,10 Z M10,6 L12,6 L12,8 L10,8 L10,6 Z M8,4 L10,4 L10,6 L8,6 L8,4 Z M8,8 L10,8 L10,10 L8,10 L8,8 Z M12,8 L14,8 L14,10 L12,10 L12,8 Z M1.2,1.2 L1.2,16.8 L16.8,16.8 L16.8,1.2 L1.2,1.2 Z M1,0 L17,0 C17.5522847,0 18,0.44771525 18,1 L18,17 C18,17.5522847 17.5522847,18 17,18 L1,18 C0.44771525,18 0,17.5522847 0,17 L0,1 C0,0.44771525 0.44771525,0 1,0 Z\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/mask</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/mask\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M1,0 L17,0 C17.5522847,-1.01453063e-16 18,0.44771525 18,1 L18,17 C18,17.5522847 17.5522847,18 17,18 L1,18 C0.44771525,18 6.76353751e-17,17.5522847 0,17 L0,1 C-6.76353751e-17,0.44771525 0.44771525,1.01453063e-16 1,0 Z M7.80000019,12.6000004 L7.80000019,15.0000005 L10.2000003,15.0000005 L10.2000003,12.6000004 L7.80000019,12.6000004 Z M3,12.6000004 L3,15.0000005 L5.4000001,15.0000005 L5.4000001,12.6000004 L3,12.6000004 Z M12.6000004,12.6000004 L12.6000004,15.0000005 L15.0000005,15.0000005 L15.0000005,12.6000004 L12.6000004,12.6000004 Z M12.6000004,3 L12.6000004,5.4000001 L15.0000005,5.4000001 L15.0000005,3 L12.6000004,3 Z M3,7.80000019 L3,10.2000003 L5.4000001,10.2000003 L5.4000001,7.80000019 L3,7.80000019 Z M3,3 L3,5.4000001 L5.4000001,5.4000001 L5.4000001,3 L3,3 Z M5.4000001,10.2000003 L5.4000001,12.6000004 L7.80000019,12.6000004 L7.80000019,10.2000003 L5.4000001,10.2000003 Z M5.4000001,5.4000001 L5.4000001,7.80000019 L7.80000019,7.80000019 L7.80000019,5.4000001 L5.4000001,5.4000001 Z M10.2000003,10.2000003 L10.2000003,12.6000004 L12.6000004,12.6000004 L12.6000004,10.2000003 L10.2000003,10.2000003 Z M10.2000003,5.4000001 L10.2000003,7.80000019 L12.6000004,7.80000019 L12.6000004,5.4000001 L10.2000003,5.4000001 Z M7.80000019,3 L7.80000019,5.4000001 L10.2000003,5.4000001 L10.2000003,3 L7.80000019,3 Z M7.80000019,7.80000019 L7.80000019,10.2000003 L10.2000003,10.2000003 L10.2000003,7.80000019 L7.80000019,7.80000019 Z M12.6000004,7.80000019 L12.6000004,10.2000003 L15.0000005,10.2000003 L15.0000005,7.80000019 L12.6000004,7.80000019 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'music-off': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/music_off</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/music_off\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_music\" fill=\"#000000\">            <path d=\"M7.53207892,4.83502207 L18.8772863,2.34318067 C19.2025252,2.27476488 19.5226771,2.47930633 19.5972863,2.80318067 C19.605581,2.84598886 19.6089363,2.88960748 19.6072863,2.93318067 L19.6072863,16.5831807 C19.6038814,16.6843639 19.594782,16.7844909 19.580239,16.8831821 L22.4249789,19.7279221 L21.5764507,20.5764502 L4.84852868,3.84852817 L5.69705685,3 L7.53207892,4.83502207 Z M17.3893408,14.692284 L17.6672863,14.6331807 C18.0911755,14.5476455 18.396326,14.1756127 18.3972863,13.7431807 L18.3972863,3.83318067 L8.66738839,5.97033154 L17.3893408,14.692284 L17.3893408,14.692284 Z M6.40728625,7.1043431 L7.60728625,8.3043431 L7.60728625,19.2031807 C7.58608355,20.213505 6.9983734,21.1260023 6.08728625,21.5631807 C5.90728625,21.6431807 4.85728625,21.8831807 4.78728625,21.8831807 C4.66102239,21.8974666 4.53355012,21.8974666 4.40728625,21.8831807 C3.32225343,21.8373813 2.45308559,20.9682135 2.40728625,19.8831807 C2.3216979,18.8458811 2.99829854,17.8986402 4.00728625,17.6431807 L5.67728625,17.2931807 C6.10332728,17.2112417 6.41027368,16.8370194 6.40728625,16.4031807 L6.40728625,7.1043431 L6.40728625,7.1043431 Z M14.9201196,15.6171765 L15.7639875,16.4610444 C15.6205529,16.6523256 15.5467342,16.8934569 15.5672863,17.1431807 C15.5788722,17.5942966 15.9193125,17.9687809 16.3672863,18.0231807 L16.5172863,18.0231807 C16.6128978,18.0052535 16.9120521,17.9409043 17.1800217,17.8770786 L18.1670541,18.8641109 C18.134238,18.8811052 18.1009781,18.8974682 18.0672863,18.9131807 C17.636529,19.0454344 17.1992916,19.1555782 16.7572863,19.2431807 C16.6277067,19.2579667 16.4968658,19.2579667 16.3672863,19.2431807 C15.2843027,19.1927286 14.4177383,18.3261642 14.3672863,17.2431807 C14.3136552,16.6295529 14.5272058,16.0455188 14.9201196,15.6171765 L14.9201196,15.6171765 Z M6.40728625,18.3031807 C6.25171355,18.382502 6.08721189,18.4429312 5.91728625,18.4831807 L4.19728625,18.8231807 C3.80742967,18.9965193 3.57048788,19.3981156 3.60728625,19.8231807 C3.60649702,20.0665755 3.70770255,20.2991715 3.88633215,20.4644989 C4.06496176,20.6298263 4.30467933,20.7127655 4.54728625,20.6931807 C4.69728625,20.6531807 5.42728625,20.4931807 5.61728625,20.4331807 C6.077472,20.1894078 6.37699373,19.7230638 6.40728625,19.2031807 L6.40728625,18.3031807 Z\" id=\"Shape\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/music-off</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/music-off\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_music\" fill=\"#000000\">            <path d=\"M9.33073588,6.20941554 L17.6563348,14.5350145 C17.8692631,14.3487944 18,14.0758571 18,13.7782081 L18,4.30884616 L9.33073588,6.20941554 Z M19.5,16.3786797 L22.0918831,18.9705627 L21.0312229,20.0312229 L4.06066017,3.06066017 L5.12132034,2 L7.95778239,4.83646204 L18.8930356,2.44165489 C19.1627851,2.38258008 19.4293498,2.55336564 19.4884246,2.82311512 C19.4961191,2.8582498 19.5,2.89411216 19.5,2.93007952 L19.5,16.3786797 Z M8,9.12132034 L8,19.2012686 C8,20.1376561 7.37291357,21.0506958 6.5294712,21.4440654 C6.37267856,21.5171912 5.382193,21.7385747 5.25286076,21.7645934 C4.01016532,22.0145956 3.05534487,20.9501591 3.00276162,19.8737811 C2.95017837,18.7974031 3.65606327,17.8998615 4.47506962,17.7350959 L5.73958069,17.4178208 C6.18656759,17.3056685 6.5,16.9038781 6.5,16.443036 L6.5,7.62132034 L8,9.12132034 Z M17.7441316,18.8654519 C17.3884565,18.959172 16.824758,19.0835157 16.7290072,19.1026128 C15.4755213,19.352615 14.5124101,18.2881785 14.4593703,17.2118005 C14.4354581,16.7265322 14.5670444,16.2776127 14.7944808,15.9158011 L17.7441316,18.8654519 Z\" id=\"Mask\"></path>        </g>    </g></svg>' },\n        music: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/music</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/music\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_music\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M17.5972863,0.803180666 C17.5226771,0.479306335 17.2025252,0.27476488 16.8772863,0.343180666 L5.26728625,2.89318067 C4.75103261,3.00829488 4.38979938,3.47453776 4.40728625,4.00318067 L4.40728625,14.4031807 C4.41027368,14.8370194 4.10332728,15.2112417 3.67728625,15.2931807 L2.00728625,15.6431807 C0.998298543,15.8986402 0.321697899,16.8458811 0.407286253,17.8831807 C0.453085593,18.9682135 1.32225343,19.8373813 2.40728625,19.8831807 C2.53355012,19.8974666 2.66102239,19.8974666 2.78728625,19.8831807 C2.85728625,19.8831807 3.90728625,19.6431807 4.08728625,19.5631807 C4.9983734,19.1260023 5.58608355,18.213505 5.60728625,17.2031807 L5.60728625,4.20318067 L16.3972863,1.83318067 L16.3972863,11.7431807 C16.396326,12.1756127 16.0911755,12.5476455 15.6672863,12.6331807 L13.9272863,13.0031807 C12.9343035,13.274758 12.277654,14.2176393 12.3672863,15.2431807 C12.4177383,16.3261642 13.2843027,17.1927286 14.3672863,17.2431807 C14.4968658,17.2579667 14.6277067,17.2579667 14.7572863,17.2431807 C15.1992916,17.1555782 15.636529,17.0454344 16.0672863,16.9131807 C16.978293,16.488326 17.5734799,15.5878159 17.6072863,14.5831807 L17.6072863,0.933180666 C17.6089363,0.889607483 17.605581,0.84598886 17.5972863,0.803180666 Z M16.4072863,13.6431807 L16.4072863,14.5431807 C16.3734998,15.0621621 16.0697874,15.5253236 15.6072863,15.7631807 C15.4072863,15.8331807 14.6772863,15.9931807 14.5172863,16.0231807 L14.3672863,16.0231807 C13.9193125,15.9687809 13.5788722,15.5942966 13.5672863,15.1431807 C13.5321017,14.7156597 13.7735044,14.3133218 14.1672863,14.1431807 L15.9072863,13.7931807 C16.0792293,13.7628381 16.2470352,13.7124964 16.4072863,13.6431807 Z M4.40728625,16.3031807 L4.40728625,17.2031807 C4.37699373,17.7230638 4.077472,18.1894078 3.61728625,18.4331807 C3.42728625,18.4931807 2.69728625,18.6531807 2.54728625,18.6931807 C2.30467933,18.7127655 2.06496176,18.6298263 1.88633215,18.4644989 C1.70770255,18.2991715 1.60649702,18.0665755 1.60728625,17.8231807 C1.57048788,17.3981156 1.80742967,16.9965193 2.19728625,16.8231807 L3.91728625,16.4831807 C4.08721189,16.4429312 4.25171355,16.382502 4.40728625,16.3031807 L4.40728625,16.3031807 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/music</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/music\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_music\" fill=\"#000000\">            <path d=\"M18,4.30884616 L8,6.50115378 L8,18.1957627 L8,19.2012686 C8,20.1376561 7.37291357,21.0506958 6.5294712,21.4440654 C6.37267856,21.5171912 5.382193,21.7385747 5.25286076,21.7645934 C4.01016532,22.0145956 3.05534487,20.9501591 3.00276162,19.8737811 C2.95017837,18.7974031 3.65606327,17.8998615 4.47506962,17.7350959 L5.73958069,17.4178208 C6.18656759,17.3056685 6.5,16.9038781 6.5,16.443036 L6.5,6.82999992 L6.5,5.96041523 C6.5,5.49056505 6.8270984,5.08408046 7.2860712,4.98356598 L18.8930356,2.44165489 C19.1627851,2.38258008 19.4293498,2.55336564 19.4884246,2.82311512 C19.4961191,2.8582498 19.5,2.89411216 19.5,2.93007952 L19.5,3.73369813 L19.5,15.5337821 L19.5,16.5392879 C19.5,17.4756754 18.8674685,18.3887152 18.0167025,18.7820848 C17.8585484,18.8552106 16.8594624,19.0765941 16.7290072,19.1026128 C15.4755213,19.352615 14.5124101,18.2881785 14.4593703,17.2118005 C14.4063304,16.1354225 15.1183446,15.2378809 15.9444624,15.0731153 L17.23615,14.7538472 C17.6848085,14.6429517 18,14.2403684 18,13.7782081 L18,4.30884616 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        note: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/note</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/note\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(4.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M4.20000005,1.2 L4.20000005,15.8092926 L14,15.8092926 C14.4418278,15.8092926 14.8,15.4511204 14.8,15.0092926 L14.8,13.2000122 L14.8,2 C14.8,1.5581722 14.4418278,1.2 14,1.2 L4.20000005,1.2 Z M3,1.2 L1.2,1.2 L1.2,15.8092926 L3,15.8092926 L3,1.2 Z M14.8,16.8428752 C14.5550151,16.9499136 14.2844419,17.0092926 14,17.0092926 L1.2,17.0092926 L1.2,18.8 L14,18.8 C14.4418278,18.8 14.8,18.4418278 14.8,18 L14.8,16.8428752 Z M0,0 L14,0 C15.1045695,0 16,0.8954305 16,2 L16,18 C16,19.1045695 15.1045695,20 14,20 L0,20 L0,0 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/note</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/note\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(4.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M14.5,16.9462839 C14.34019,16.9874161 14.1726498,17.0092926 14,17.0092926 L1.5,17.0092926 L1.5,18.5 L14,18.5 C14.2761424,18.5 14.5,18.2761424 14.5,18 L14.5,16.9462839 L14.5,16.9462839 Z M0,0 L14,0 C15.1045695,0 16,0.8954305 16,2 L16,18 C16,19.1045695 15.1045695,20 14,20 L0,20 L0,0 Z M3,1.5 L3,15.5 L4.5,15.5 L4.5,1.5 L3,1.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        pad: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/pad</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/pad\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" fill=\"#000000\">            <path d=\"M5.2,3.2 L5.2,20.8 L18.8,20.8 L18.8,3.2 L5.2,3.2 Z M4,3 C4,2.44771525 4.44771525,2 5,2 L19,2 C19.5522847,2 20,2.44771525 20,3 L20,21 C20,21.5522847 19.5522847,22 19,22 L5,22 C4.44771525,22 4,21.5522847 4,21 L4,3 Z M12,20 C11.4477153,20 11,19.5522847 11,19 C11,18.4477153 11.4477153,18 12,18 C12.5522847,18 13,18.4477153 13,19 C13,19.5522847 12.5522847,20 12,20 Z\" id=\"Combined-Shape\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/pad</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/pad\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" fill=\"#000000\">            <path d=\"M4,3 C4,2.44771525 4.44771525,2 5,2 L19,2 C19.5522847,2 20,2.44771525 20,3 L20,21 C20,21.5522847 19.5522847,22 19,22 L5,22 C4.44771525,22 4,21.5522847 4,21 L4,3 Z M12,20 C12.5522847,20 13,19.5522847 13,19 C13,18.4477153 12.5522847,18 12,18 C11.4477153,18 11,18.4477153 11,19 C11,19.5522847 11.4477153,20 12,20 Z\" id=\"\\u5F62\\u72B6\\u7ED3\\u5408\"></path>        </g>    </g></svg>' },\n        pause: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/pause</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/pause\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" fill=\"#000000\">            <path d=\"M7,5 L9,5 C9.55228475,5 10,5.41786757 10,5.93333333 L10,18.0666667 C10,18.5821324 9.55228475,19 9,19 L7,19 C6.44771525,19 6,18.5821324 6,18.0666667 L6,5.93333333 C6,5.41786757 6.44771525,5 7,5 Z M7.2,17.8 L8.8,17.8 L8.8,6.2 L7.2,6.2 L7.2,17.8 Z M15,5 L17,5 C17.5522847,5 18,5.41786757 18,5.93333333 L18,18.0666667 C18,18.5821324 17.5522847,19 17,19 L15,19 C14.4477153,19 14,18.5821324 14,18.0666667 L14,5.93333333 C14,5.41786757 14.4477153,5 15,5 Z M15.2,17.8 L16.8,17.8 L16.8,6.2 L15.2,6.2 L15.2,17.8 Z\" id=\"\\u5F62\\u72B6\\u7ED3\\u5408\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/pause</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/pause\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" fill=\"#000000\">            <path d=\"M7,5 L9,5 C9.55228475,5 10,5.41786757 10,5.93333333 L10,18.0666667 C10,18.5821324 9.55228475,19 9,19 L7,19 C6.44771525,19 6,18.5821324 6,18.0666667 L6,5.93333333 C6,5.41786757 6.44771525,5 7,5 Z M15,5 L17,5 C17.5522847,5 18,5.41786757 18,5.93333333 L18,18.0666667 C18,18.5821324 17.5522847,19 17,19 L15,19 C14.4477153,19 14,18.5821324 14,18.0666667 L14,5.93333333 C14,5.41786757 14.4477153,5 15,5 Z\" id=\"\\u5F62\\u72B6\\u7ED3\\u5408\"></path>        </g>    </g></svg>' },\n        pencil: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/pencil</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/pencil\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(3.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M11,1 L11,2.2 L1.2,2.2 L1.2,17.8 L16.8,17.8 L16.8,8 L18,8 L18,18 C18,18.5522847 17.5522847,19 17,19 L1,19 C0.44771525,19 0,18.5522847 0,18 L0,2 C0,1.44771525 0.44771525,1 1,1 L11,1 Z M16.8608816,0.74608004 C17.0556551,0.551306526 17.3714454,0.551306526 17.5662189,0.74608004 L18.2715562,1.45141733 C18.4663297,1.64619084 18.4663297,1.9619811 18.2715562,2.15675462 L8.76190575,11.6664051 L6.445312,12.9618781 C6.30106541,13.0425463 6.11873594,12.9910058 6.03806772,12.8467592 C5.98683746,12.755152 5.98734579,12.6434011 6.03940732,12.5522637 L7.35135595,10.2556057 L16.8608816,0.74608004 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/pencil</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/pencil\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" fill=\"#000000\">            <path d=\"M14,3 L14,5 L5,5 L5,19 L19,19 L19,10 L21,10 L21,20 C21,20.5522847 20.5522847,21 20,21 L4,21 C3.44771525,21 3,20.5522847 3,20 L3,4 C3,3.44771525 3.44771525,3 4,3 L14,3 Z M19.9403667,3.35355339 L20.6474735,4.06066017 C20.8427356,4.25592232 20.8427356,4.57250481 20.6474735,4.76776695 L11.3142761,14.1009644 L9.32169414,15.0809343 C9.17301667,15.1540552 8.99321354,15.0928045 8.92009261,14.9441271 C8.87903177,14.8606377 8.87903177,14.7628221 8.92009261,14.6793327 L9.90006249,12.6867508 L19.2332599,3.35355339 C19.4285221,3.15829124 19.7451046,3.15829124 19.9403667,3.35355339 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'photo-wall': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/photo-wall</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/photo-wall\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon34\" transform=\"translate(2.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M4,4 L4,1 C4,0.44771525 4.44771525,0 5,0 L19,0 C19.5522847,0 20,0.44771525 20,1 L20,11 C20,11.5522847 19.5522847,12 19,12 L16,12 L16,10.8 L18.8,10.8 L18.8,1.2 L5.2,1.2 L5.2,4 L4,4 Z M1,4 L15,4 C15.5522847,4 16,4.44771525 16,5 L16,15 C16,15.5522847 15.5522847,16 15,16 L1,16 C0.44771525,16 0,15.5522847 0,15 L0,5 C0,4.44771525 0.44771525,4 1,4 Z M1.2,5.2 L1.2,14.8 L14.8,14.8 L14.8,5.2 L1.2,5.2 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/photo-wall</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/photo-wall\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon34\" fill=\"#000000\">            <path d=\"M6,6.5 L6,5 C6,4.44771525 6.44771525,4 7,4 L21,4 C21.5522847,4 22,4.44771525 22,5 L22,15 C22,15.5522847 21.5522847,16 21,16 L19.5,16 L19.5,8 C19.5,7.17157288 18.8284271,6.5 18,6.5 L6,6.5 Z M3,8 L17,8 C17.5522847,8 18,8.44771525 18,9 L18,19 C18,19.5522847 17.5522847,20 17,20 L3,20 C2.44771525,20 2,19.5522847 2,19 L2,9 C2,8.44771525 2.44771525,8 3,8 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        play: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/play</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/play\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" fill=\"#000000\">            <path d=\"M9.52409743,4.93790611 L19.6160552,11.1483417 C20.0864131,11.4377927 20.2330671,12.0537395 19.9436161,12.5240974 C19.8615728,12.6574179 19.7493757,12.769615 19.6160552,12.8516583 L9.52409743,19.0620939 C9.05373953,19.3515449 8.4377927,19.2048909 8.14834168,18.734533 C8.05135233,18.5769253 8,18.3954954 8,18.2104356 L8,5.78956442 C8,5.23727967 8.44771525,4.78956442 9,4.78956442 C9.18505978,4.78956442 9.36648973,4.84091676 9.52409743,4.93790611 Z M9.2,6.14747731 L9.2,17.8525227 L18.7103494,12 L9.2,6.14747731 Z\" id=\"\\u77E9\\u5F62\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/play</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/play\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">        <g id=\"Group\"></g>        <path d=\"M9.52409743,4.93790611 L19.6160552,11.1483417 C20.0864131,11.4377927 20.2330671,12.0537395 19.9436161,12.5240974 C19.8615728,12.6574179 19.7493757,12.769615 19.6160552,12.8516583 L9.52409743,19.0620939 C9.05373953,19.3515449 8.4377927,19.2048909 8.14834168,18.734533 C8.05135233,18.5769253 8,18.3954954 8,18.2104356 L8,5.78956442 C8,5.23727967 8.44771525,4.78956442 9,4.78956442 C9.18505978,4.78956442 9.36648973,4.84091676 9.52409743,4.93790611 Z\" id=\"\\u77E9\\u5F62\" fill-opacity=\"0.9\" fill=\"#000000\"></path>    </g></svg>' },\n        play2: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/play2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/play2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M8.7,12.8349028 L13.2358445,10 L8.7,7.16509717 L8.7,12.8349028 Z M8.26499947,5.47812467 L14.8216014,9.57600085 C15.0557696,9.72235601 15.1269562,10.0308312 14.980601,10.2649995 C14.9403607,10.329384 14.8859859,10.3837588 14.8216014,10.4239992 L8.26499947,14.5218753 C8.0308312,14.6682305 7.72235601,14.5970439 7.57600085,14.3628756 C7.52633472,14.2834098 7.5,14.191586 7.5,14.0978762 L7.5,5.90212382 C7.5,5.62598145 7.72385763,5.40212382 8,5.40212382 C8.09370986,5.40212382 8.18553367,5.42845854 8.26499947,5.47812467 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/play2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/play2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon21\" fill=\"#000000\">            <path d=\"M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z M10.7649995,8.38024849 C10.6855337,8.33058236 10.5937099,8.30424764 10.5,8.30424764 C10.2238576,8.30424764 10,8.52810527 10,8.80424764 L10,15.1957524 C10,15.2894622 10.0263347,15.381286 10.0760008,15.4607518 C10.222356,15.6949201 10.5308312,15.7661067 10.7649995,15.6197515 L15.8782032,12.4239992 C15.9425878,12.3837588 15.9969626,12.329384 16.0372029,12.2649995 C16.1835581,12.0308312 16.1123715,11.722356 15.8782032,11.5760008 L10.7649995,8.38024849 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        previous: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/previous</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/previous\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(4.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M6.44089928,5.5 L8.87132034,7.93042107 L7.81066017,8.99108124 L4.62867966,5.80910072 L3.92157288,5.10199394 C3.72631073,4.9067318 3.72631073,4.59014931 3.92157288,4.39488716 L7.81066017,0.505799865 L8.87132034,1.56646004 L6.43778038,4 L11,4 C14.3137085,4 17,6.6862915 17,10 C17,13.3137085 14.3137085,16 11,16 L0,16 L0,14.5 L11,14.5 C13.4852814,14.5 15.5,12.4852814 15.5,10 C15.5,7.51471863 13.4852814,5.5 11,5.5 L6.44089928,5.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/previous</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/previous\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon4\" transform=\"translate(4.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M6.58578644,6 L8.41421356,7.82842712 L7,9.24264069 L3.46446609,5.70710678 C3.0739418,5.31658249 3.0739418,4.68341751 3.46446609,4.29289322 L7,0.757359313 L8.41421356,2.17157288 L6.58578644,4 L11,4 C14.3137085,4 17,6.6862915 17,10 C17,13.3137085 14.3137085,16 11,16 L0,16 L0,14 L11,14 C13.209139,14 15,12.209139 15,10 C15,7.790861 13.209139,6 11,6 L6.58578644,6 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        previous2: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/previous2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/previous2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M7.26862907,9.20000005 L8.6769553,10.6083263 L7.82842712,11.4568544 L5.84852817,9.47695549 L5.35355339,8.98198071 C5.15829124,8.78671856 5.15829124,8.47013607 5.35355339,8.27487392 L7.82842712,5.80000019 L8.6769553,6.64852836 L7.32548366,8 L12,8 C13.6568542,8 15,9.34314575 15,11 C15,12.6568542 13.6568542,14 12,14 L10,14.0000002 L10,12.8000002 L12,12.8000002 C12.9941125,12.8 13.8,11.9941125 13.8,11 C13.8,10.0058875 12.9941125,9.2 12,9.2 L7.26862907,9.20000005 Z M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/previous2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/previous2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_miniprogram\" fill=\"#000000\">            <path d=\"M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z M9.26862907,11.2 L14,11.2 C14.9941125,11.2 15.8,12.0058875 15.8,13 C15.8,13.9941125 14.9941125,14.8000002 14,14.8000002 L12,14.8000002 L12,16.0000002 L14,16.0000002 C15.6568542,16.0000002 17,14.6568542 17,13 C17,11.3431458 15.6568542,10 14,10 L9.32548366,10 L10.6769553,8.64852836 L9.82842712,7.80000019 L7.35355339,10.2748739 C7.15829124,10.4701361 7.15829124,10.7867186 7.35355339,10.9819807 L9.82842712,13.4568544 L10.6769553,12.6083263 L9.26862907,11.2 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'qr-code': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/qr-code</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/qr-code\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"\\u56FE\\u6807\\u989C\\u8272\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M8,16 L10,16 L10,18 L8,18 L8,16 Z M16,8 L18,8 L18,10 L16,10 L16,8 Z M8,12 L10,12 L10,14 L8,14 L8,12 Z M12,8 L14,8 L14,10 L12,10 L12,8 Z M1,0 L9,0 C9.55228475,0 10,0.44771525 10,1 L10,9 C10,9.55228475 9.55228475,10 9,10 L1,10 C0.44771525,10 0,9.55228475 0,9 L0,1 C0,0.44771525 0.44771525,0 1,0 Z M1.2,1.2 L1.2,8.8 L8.8,8.8 L8.8,1.2 L1.2,1.2 Z M4,4 L6,4 L6,6 L4,6 L4,4 Z M13,0 L17,0 C17.5522847,0 18,0.44771525 18,1 L18,5 C18,5.55228475 17.5522847,6 17,6 L13,6 C12.4477153,6 12,5.55228475 12,5 L12,1 C12,0.44771525 12.4477153,0 13,0 Z M13.2,4.8 L16.8,4.8 L16.8,1.2 L13.2,1.2 L13.2,4.8 Z M13,12 L17,12 C17.5522847,12 18,12.4477153 18,13 L18,17 C18,17.5522847 17.5522847,18 17,18 L13,18 C12.4477153,18 12,17.5522847 12,17 L12,13 C12,12.4477153 12.4477153,12 13,12 Z M13.2,16.8 L16.8,16.8 L16.8,13.2 L13.2,13.2 L13.2,16.8 Z M1,12 L5,12 C5.55228475,12 6,12.4477153 6,13 L6,17 C6,17.5522847 5.55228475,18 5,18 L1,18 C0.44771525,18 0,17.5522847 0,17 L0,13 C0,12.4477153 0.44771525,12 1,12 Z M1.2,16.8 L4.8,16.8 L4.8,13.2 L1.2,13.2 L1.2,16.8 Z\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/qr-code</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/qr-code\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M14,2 L14,4 L16,4 L16,2 L14,2 Z M8,16 L10,16 L10,18 L8,18 L8,16 Z M16,8 L18,8 L18,10 L16,10 L16,8 Z M8,12 L10,12 L10,14 L8,14 L8,12 Z M12,8 L14,8 L14,10 L12,10 L12,8 Z M1,0 L9,0 C9.55228475,0 10,0.44771525 10,1 L10,9 C10,9.55228475 9.55228475,10 9,10 L1,10 C0.44771525,10 0,9.55228475 0,9 L0,1 C0,0.44771525 0.44771525,0 1,0 Z M2,2 L2,8 L8,8 L8,2 L2,2 Z M4,4 L6,4 L6,6 L4,6 L4,4 Z M13,0 L17,0 C17.5522847,0 18,0.44771525 18,1 L18,5 C18,5.55228475 17.5522847,6 17,6 L13,6 C12.4477153,6 12,5.55228475 12,5 L12,1 C12,0.44771525 12.4477153,0 13,0 Z M13,12 L17,12 C17.5522847,12 18,12.4477153 18,13 L18,17 C18,17.5522847 17.5522847,18 17,18 L13,18 C12.4477153,18 12,17.5522847 12,17 L12,13 C12,12.4477153 12.4477153,12 13,12 Z M14,14 L14,16 L16,16 L16,14 L14,14 Z M1,12 L5,12 C5.55228475,12 6,12.4477153 6,13 L6,17 C6,17.5522847 5.55228475,18 5,18 L1,18 C0.44771525,18 0,17.5522847 0,17 L0,13 C0,12.4477153 0.44771525,12 1,12 Z M2,14 L2,16 L4,16 L4,14 L2,14 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        refresh: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/refresh</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/refresh\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(3.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M8.57694763,3.2112774 C4.46584819,3.43100725 1.2,6.83411377 1.2,11 C1.2,15.307821 4.69217895,18.8 9,18.8 C13.307821,18.8 16.8,15.307821 16.8,11 C16.8,8.90208215 15.9695547,6.93868889 14.5154329,5.48456711 L15.363961,4.63603897 C16.9926407,6.26471863 18,8.51471863 18,11 C18,15.9705627 13.9705627,20 9,20 C4.02943725,20 0,15.9705627 0,11 C0,6.30954147 3.58809453,2.45712733 8.16920597,2.03783519 L6.97989895,0.848528171 L7.82842712,3.1485925e-13 L10.3033009,2.47487373 C10.498563,2.67013588 10.498563,2.98671837 10.3033009,3.18198052 L9.80832608,3.6769553 L7.82842712,5.65685425 L6.97989895,4.80832608 L8.57694763,3.2112774 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/refresh</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/refresh\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_miniprogram\" fill=\"#000000\">            <path d=\"M10.5460197,5.13180618 L8.82842712,3.41421356 L10.2426407,2 L14.131728,5.8890873 C14.3269901,6.08434944 14.3269901,6.40093193 14.131728,6.59619408 L10.2426407,10.4852814 L8.82842712,9.07106781 L10.7741707,7.12532426 C8.04836137,7.69118678 6,10.1063832 6,13 C6,16.3137085 8.6862915,19 12,19 C15.3137085,19 18,16.3137085 18,13 C18,11.3852639 17.3618946,9.87661321 16.2426407,8.75735931 L17.6568542,7.34314575 C19.1045695,8.790861 20,10.790861 20,13 C20,17.418278 16.418278,21 12,21 C7.581722,21 4,17.418278 4,13 C4,9.07824577 6.821932,5.81558908 10.5460197,5.13180618 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'report-problem': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/report_problem</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/report_problem\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(1.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M10.9983807,1.40008709 L2.07828678,16.8542285 L19.9214654,16.8527331 L10.9983807,1.40008709 Z M1.73198946,18.0542575 C1.17970471,18.0542575 0.73190565,17.6066261 0.73190565,17.0543413 C0.73190565,16.8788151 0.778077283,16.7063769 0.865823011,16.5543567 L10.1322606,0.50017172 C10.4083483,0.0218474871 11.0199199,-0.142097683 11.4982441,0.133989935 C11.6502857,0.221747967 11.7765459,0.347984576 11.8643324,0.500009721 L21.133877,16.5526412 C21.4100541,17.0309138 21.2462233,17.6425161 20.7679507,17.9186932 C20.6159412,18.0064706 20.4435045,18.0526893 20.2679717,18.052704 L1.73198946,18.0542575 Z M10.3725586,6.95410156 L11.6274414,6.95410156 L11.5297852,11.6757812 L10.4702148,11.6757812 L10.3725586,6.95410156 Z M10.9975586,14.0976562 C10.6020508,14.0976562 10.2895508,13.7900391 10.2895508,13.4042969 C10.2895508,13.0185547 10.6020508,12.7158203 10.9975586,12.7158203 C11.3979492,12.7158203 11.7104492,13.0185547 11.7104492,13.4042969 C11.7104492,13.7900391 11.3979492,14.0976562 10.9975586,14.0976562 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/report-problem</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/report-problem\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(1.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M20.2679717,18.052704 L1.73198946,18.0542575 C1.17970471,18.0543038 0.731951939,17.6066261 0.731905653,17.0543413 C0.731890943,16.8788151 0.778077283,16.7063769 0.865823011,16.5543567 L10.1322606,0.50017172 C10.4083483,0.0218474871 11.0199199,-0.142097683 11.4982441,0.133989935 C11.6502857,0.221747967 11.7765459,0.347984576 11.8643324,0.500009721 L21.133877,16.5526412 C21.4100541,17.0309138 21.2462233,17.6425161 20.7679507,17.9186932 C20.6159412,18.0064706 20.4435045,18.0526893 20.2679717,18.052704 Z M10.2470703,6.54492188 L10.3642578,12.2109375 L11.6357422,12.2109375 L11.7529297,6.54492188 L10.2470703,6.54492188 Z M10.9970703,15.1171875 C11.4775391,15.1171875 11.8525391,14.7480469 11.8525391,14.2851563 C11.8525391,13.8222656 11.4775391,13.4589844 10.9970703,13.4589844 C10.5224609,13.4589844 10.1474609,13.8222656 10.1474609,14.2851563 C10.1474609,14.7480469 10.5224609,15.1171875 10.9970703,15.1171875 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        search: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/search</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/search\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(4.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M12.3099312,11.561403 L16.4242641,15.6757359 L15.5757359,16.5242641 L11.4528509,12.4013791 C10.2428099,13.4000674 8.69146727,14 7,14 C3.134,14 0,10.866 0,7 C0,3.134 3.134,0 7,0 C10.866,0 14,3.134 14,7 C14,8.74248408 13.3633321,10.3362634 12.3099312,11.561403 Z M12.7999973,7.0000124 C12.7999973,3.79675515 10.2032544,1.20001221 6.99999714,1.20001221 C3.79673989,1.20001221 1.19999695,3.79675515 1.19999695,7.0000124 C1.19999695,10.2032696 3.79673989,12.8000126 6.99999714,12.8000126 C10.2032544,12.8000126 12.7999973,10.2032696 12.7999973,7.0000124 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/search</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/search\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_search\" fill=\"#000000\">            <path d=\"M16.6216248,15.171751 L20.8662058,19.4163321 L19.4519923,20.8305456 L15.21253,16.5910833 C14.0404668,17.4755514 12.5814804,18 11,18 C7.134,18 4,14.866 4,11 C4,7.134 7.134,4 11,4 C14.866,4 18,7.134 18,11 C18,12.5631909 17.4876115,14.0067046 16.6216248,15.171751 Z M16,11 C16,8.23857143 13.7614286,6 11,6 C8.23857143,6 6,8.23857143 6,11 C6,13.7614286 8.23857143,16 11,16 C13.7614286,16 16,13.7614286 16,11 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        sending: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/sending</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/sending\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(5.000000, 7.000000)\" fill=\"#000000\">            <path d=\"M2.87132034,4.25 L8,4.25 L8,5.75 L2.87132034,5.75 L5.30330086,8.18198052 L4.24264069,9.24264069 L1.06066017,6.06066017 L0.353553391,5.35355339 C0.158291245,5.15829124 0.158291245,4.84170876 0.353553391,4.64644661 L4.24264069,0.757359313 L5.30330086,1.81801948 L2.87132034,4.25 Z M9.5,4.25 L11,4.25 L11,5.75 L9.5,5.75 L9.5,4.25 Z M12.5,4.25 L14,4.25 L14,5.75 L12.5,5.75 L12.5,4.25 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/sending</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/sending\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group-11\" transform=\"translate(5.000000, 7.000000)\" fill=\"#000000\">            <path d=\"M3.82842712,4 L8,4 L8,6 L3.82842712,6 L5.65685425,7.82842712 L4.24264069,9.24264069 L1.41421356,6.41421356 L0.353553391,5.35355339 C0.158291245,5.15829124 0.158291245,4.84170876 0.353553391,4.64644661 L4.24264069,0.757359313 L5.65685425,2.17157288 L3.82842712,4 Z M9,4 L11,4 L11,6 L9,6 L9,4 Z M12,4 L14,4 L14,6 L12,6 L12,4 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        setting: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/setting</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/setting\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10.5630683,1.2 L9.43693169,1.2 L8.79240518,3.77810602 L8.14519264,3.97714227 C7.76740015,4.0933242 7.40218123,4.24492893 7.05375494,4.42967378 L6.45518089,4.74705359 L4.17560975,3.3793109 L3.3793109,4.17560975 L4.74705359,6.45518089 L4.42967378,7.05375494 C4.24492893,7.40218123 4.0933242,7.76740015 3.97714227,8.14519264 L3.77810602,8.79240518 L1.2,9.43693169 L1.2,10.5630683 L3.77810602,11.2075948 L3.97714227,11.8548074 C4.0933242,12.2325999 4.24492893,12.5978188 4.42967378,12.9462451 L4.74705359,13.5448191 L3.3793109,15.8243903 L4.17560975,16.6206891 L6.45518089,15.2529464 L7.05375494,15.5703262 C7.40218123,15.7550711 7.76740015,15.9066758 8.14519264,16.0228577 L8.79240518,16.221894 L9.43693169,18.8 L10.5630683,18.8 L11.2075948,16.221894 L11.8548074,16.0228577 C12.2325999,15.9066758 12.5978188,15.7550711 12.9462451,15.5703262 L13.5448191,15.2529464 L15.8243903,16.6206891 L16.6206891,15.8243903 L15.2529464,13.5448191 L15.5703262,12.9462451 C15.7550711,12.5978188 15.9066758,12.2325999 16.0228577,11.8548074 L16.221894,11.2075948 L18.8,10.5630683 L18.8,9.43693169 L16.221894,8.79240518 L16.0228577,8.14519264 C15.9066758,7.76740015 15.7550711,7.40218123 15.5703262,7.05375494 L15.2529464,6.45518089 L16.6206891,4.17560975 L15.8243903,3.3793109 L13.5448191,4.74705359 L12.9462451,4.42967378 C12.5978188,4.24492893 12.2325999,4.0933242 11.8548074,3.97714227 L11.2075948,3.77810602 L10.5630683,1.2 Z M13.5083849,3.36948567 L15.3408974,2.26997816 C15.7343732,2.03389271 16.2380315,2.09589589 16.5624999,2.42036431 L17.5796357,3.43750007 C17.9041041,3.76196849 17.9661073,4.26562685 17.7300218,4.6591026 L16.6305143,6.49161512 C16.8491215,6.90390529 17.0303999,7.33902209 17.1698454,7.79246134 L19.2425356,8.31063391 C19.6877026,8.42192566 20,8.82190876 20,9.28077641 L20,10.7192236 C20,11.1780912 19.6877026,11.5780743 19.2425356,11.6893661 L17.1698454,12.2075387 C17.0303999,12.6609779 16.8491215,13.0960947 16.6305143,13.5083849 L17.7300218,15.3408974 C17.9661073,15.7343732 17.9041041,16.2380315 17.5796357,16.5624999 L16.5624999,17.5796357 C16.2380315,17.9041041 15.7343732,17.9661073 15.3408974,17.7300218 L13.5083849,16.6305143 C13.0960947,16.8491215 12.6609779,17.0303999 12.2075387,17.1698454 L11.6893661,19.2425356 C11.5780743,19.6877026 11.1780912,20 10.7192236,20 L9.28077641,20 C8.82190876,20 8.42192566,19.6877026 8.31063391,19.2425356 L7.79246134,17.1698454 C7.33902209,17.0303999 6.90390529,16.8491215 6.49161512,16.6305143 L4.6591026,17.7300218 C4.26562685,17.9661073 3.76196849,17.9041041 3.43750007,17.5796357 L2.42036431,16.5624999 C2.09589589,16.2380315 2.03389271,15.7343732 2.26997816,15.3408974 L3.36948567,13.5083849 C3.1508785,13.0960947 2.9696001,12.6609779 2.83015464,12.2075387 L0.757464375,11.6893661 C0.312297374,11.5780743 0,11.1780912 0,10.7192236 L0,9.28077641 C0,8.82190876 0.312297374,8.42192566 0.757464375,8.31063391 L2.83015464,7.79246134 C2.9696001,7.33902209 3.1508785,6.90390529 3.36948567,6.49161512 L2.26997816,4.6591026 C2.03389271,4.26562685 2.09589589,3.76196849 2.42036431,3.43750007 L3.43750007,2.42036431 C3.76196849,2.09589589 4.26562685,2.03389271 4.6591026,2.26997816 L6.49161512,3.36948567 C6.90390529,3.1508785 7.33902209,2.9696001 7.79246134,2.83015464 L8.31063391,0.757464375 C8.42192566,0.312297374 8.82190876,0 9.28077641,0 L10.7192236,0 C11.1780912,0 11.5780743,0.312297374 11.6893661,0.757464375 L12.2075387,2.83015464 C12.6609779,2.9696001 13.0960947,3.1508785 13.5083849,3.36948567 Z M10,12.8 C11.5463973,12.8 12.8,11.5463973 12.8,10 C12.8,8.4536027 11.5463973,7.2 10,7.2 C8.4536027,7.2 7.2,8.4536027 7.2,10 C7.2,11.5463973 8.4536027,12.8 10,12.8 Z M10,14 C7.790861,14 6,12.209139 6,10 C6,7.790861 7.790861,6 10,6 C12.209139,6 14,7.790861 14,10 C14,12.209139 12.209139,14 10,14 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/setting</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/setting\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon26\" fill=\"#000000\">            <path d=\"M14.2075387,4.83015464 C14.6609779,4.9696001 15.0960947,5.1508785 15.5083849,5.36948567 L17.3408974,4.26997816 C17.7343732,4.03389271 18.2380315,4.09589589 18.5624999,4.42036431 L19.5796357,5.43750007 C19.9041041,5.76196849 19.9661073,6.26562685 19.7300218,6.6591026 L18.6305143,8.49161512 C18.8491215,8.90390529 19.0303999,9.33902209 19.1698454,9.79246134 L21.2425356,10.3106339 C21.6877026,10.4219257 22,10.8219088 22,11.2807764 L22,12.7192236 C22,13.1780912 21.6877026,13.5780743 21.2425356,13.6893661 L19.1698454,14.2075387 C19.0303999,14.6609779 18.8491215,15.0960947 18.6305143,15.5083849 L19.7300218,17.3408974 C19.9661073,17.7343732 19.9041041,18.2380315 19.5796357,18.5624999 L18.5624999,19.5796357 C18.2380315,19.9041041 17.7343732,19.9661073 17.3408974,19.7300218 L15.5083849,18.6305143 C15.0960947,18.8491215 14.6609779,19.0303999 14.2075387,19.1698454 L13.6893661,21.2425356 C13.5780743,21.6877026 13.1780912,22 12.7192236,22 L11.2807764,22 C10.8219088,22 10.4219257,21.6877026 10.3106339,21.2425356 L9.79246134,19.1698454 C9.33902209,19.0303999 8.90390529,18.8491215 8.49161512,18.6305143 L6.6591026,19.7300218 C6.26562685,19.9661073 5.76196849,19.9041041 5.43750007,19.5796357 L4.42036431,18.5624999 C4.09589589,18.2380315 4.03389271,17.7343732 4.26997816,17.3408974 L5.36948567,15.5083849 C5.1508785,15.0960947 4.9696001,14.6609779 4.83015464,14.2075387 L2.75746437,13.6893661 C2.31229737,13.5780743 2,13.1780912 2,12.7192236 L2,11.2807764 C2,10.8219088 2.31229737,10.4219257 2.75746437,10.3106339 L4.83015464,9.79246134 C4.9696001,9.33902209 5.1508785,8.90390529 5.36948567,8.49161512 L4.26997816,6.6591026 C4.03389271,6.26562685 4.09589589,5.76196849 4.42036431,5.43750007 L5.43750007,4.42036431 C5.76196849,4.09589589 6.26562685,4.03389271 6.6591026,4.26997816 L8.49161512,5.36948567 C8.90390529,5.1508785 9.33902209,4.9696001 9.79246134,4.83015464 L10.3106339,2.75746437 C10.4219257,2.31229737 10.8219088,2 11.2807764,2 L12.7192236,2 C13.1780912,2 13.5780743,2.31229737 13.6893661,2.75746437 L14.2075387,4.83015464 Z M12,16 C14.209139,16 16,14.209139 16,12 C16,9.790861 14.209139,8 12,8 C9.790861,8 8,9.790861 8,12 C8,14.209139 9.790861,16 12,16 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        share: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/share</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/share\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon38\" transform=\"translate(4.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M14.8,6.2 L12,6.2 L12,5 L15.0010434,5 C15.5508697,5 16,5.44583866 16,5.99580851 L16,19.0041915 C16,19.5510798 15.5541613,20 15.0041915,20 L0.995808514,20 C0.448920205,20 0,19.5541613 0,19.0041915 L0,5.99580851 C0,5.44892021 0.447248087,5 0.998956561,5 L4,5 L4,6.2 L1.2,6.2 L1.2,18.8 L14.8,18.8 L14.8,6.2 Z M8.59999394,2.26151638 L8.59999394,11.5 L7.3999939,11.5 L7.3999939,2.26152854 L5.31299427,4.34852817 L4.46446609,3.5 L7.29289322,0.671572875 C7.68341751,0.281048584 8.31658249,0.281048584 8.70710678,0.671572875 L11.5355339,3.5 L10.6870057,4.34852817 L8.59999394,2.26151638 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/share</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/share\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon38\" fill=\"#000000\">            <path d=\"M12.75,4.36643249 L12.75,7 L19.0010434,7 C19.5508697,7 20,7.44583866 20,7.99580851 L20,21.0041915 C20,21.5510798 19.5541613,22 19.0041915,22 L4.99580851,22 C4.44892021,22 4,21.5541613 4,21.0041915 L4,7.99580851 C4,7.44892021 4.44724809,7 4.99895656,7 L11.25,7 L11.25,4.37643471 L9.53050029,6.09619408 L8.47000027,5.03553391 L11.297947,2.20716017 C11.688335,1.81649963 12.3215,1.81645183 12.7120537,2.20694664 C12.7120893,2.20698223 12.7121249,2.20701782 12.7120537,2.20716017 L15.5400004,5.03553391 L14.4795004,6.09619408 L12.75,4.36643249 Z M11.25,7 L11.25,13.5 L12.75,13.5 L12.75,7 L11.25,7 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        shop: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/shop</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/shop\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon37\" transform=\"translate(4.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M4,5 L4,4 C4,1.790861 5.790861,0 8,0 C10.209139,0 12,1.790861 12,4 L12,5 L14.9991283,5 C15.5518945,5 16,5.44892021 16,6.00748397 L16,18.0081158 C16,19.1082031 15.1054862,20 14.0059397,20 L1.99406028,20 C0.892771196,20 0,19.1066027 0,18.0081158 L0,6.00748397 C0,5.45106594 0.444630861,5 1.00087166,5 L4,5 Z M5.19999757,5 L10.7999992,5 L10.7999992,4 C10.7999969,2.45359963 9.54639417,1.19999695 8,1.19999695 C6.45359963,1.19999695 5.19999695,2.45359963 5.19999695,4 L5.19999757,5 Z M4,6.2 L1.2,6.2 L1.2,18.0081158 C1.2,18.4442694 1.5559217,18.8 1.99406028,18.8 L14.0059397,18.8 C14.4438014,18.8 14.8,18.4444047 14.8,18.0081158 L14.8,6.2 L12,6.2 L12,9 L10.7999992,9 L10.7999992,6.2 L5.19999831,6.2 L5.20000005,9 L4,9 L4,6.2 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/shop</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/shop\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon37\" fill=\"#000000\">            <path d=\"M7.5,7 L7.5,6.5 C7.5,4.01471863 9.51471863,2 12,2 C14.4852814,2 16.5,4.01471863 16.5,6.5 L16.5,7 L18.9991283,7 C19.5518945,7 20,7.44892021 20,8.00748397 L20,20.0081158 C20,21.1082031 19.1054862,22 18.0059397,22 L5.99406028,22 C4.8927712,22 4,21.1066027 4,20.0081158 L4,8.00748397 C4,7.45106594 4.44463086,7 5.00087166,7 L7.5,7 Z M9,7 L15,7 L15,6.5 C15,4.84314575 13.6568542,3.5 12,3.5 C10.3431458,3.5 9,4.84314575 9,6.5 L9,7 Z M7.5,7 L7.5,11 L9,11 L9,7 L7.5,7 Z M15,7 L15,11 L16.5,11 L16.5,7 L15,7 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        star: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/star</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/star\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group-25\" transform=\"translate(2.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M13.9414342,11.2806496 L17.8828683,7.43870082 L12.4359403,6.64721585 L10,1.71146175 L7.56405973,6.64721585 L2.11713169,7.43870082 L6.05856585,11.2806496 L5.12811946,16.7055683 L10,14.1442691 L14.8718805,16.7055683 L13.9414342,11.2806496 Z M10,15.5 L5.32783438,17.9563028 C4.83898979,18.2133036 4.23436264,18.0253571 3.97736183,17.5365125 C3.87502276,17.3418521 3.83970808,17.118884 3.87688493,16.9021263 L4.76918916,11.6995935 L0.989327772,8.01513923 C0.593844194,7.62963801 0.585751887,6.99652475 0.971253099,6.60104117 C1.1247617,6.44355754 1.32590411,6.34107036 1.54354115,6.30944585 L6.76718111,5.55040653 L9.10326392,0.816985751 C9.34768622,0.321732091 9.94731205,0.118393092 10.4425657,0.362815385 C10.6397783,0.460145624 10.7994058,0.619773146 10.8967361,0.816985751 L13.2328189,5.55040653 L18.4564589,6.30944585 C19.0030037,6.38886347 19.3816852,6.89630632 19.3022676,7.44285118 C19.270643,7.66048821 19.1681559,7.86163062 19.0106722,8.01513923 L15.2308108,11.6995935 L16.1231151,16.9021263 C16.2164761,17.4464628 15.8508883,17.9634187 15.3065518,18.0567797 C15.0897942,18.0939566 14.8668261,18.0586419 14.6721656,17.9563028 L10,15.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/star</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/star\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group-25\" fill=\"#000000\">            <path d=\"M12,18.5 L7.32783438,20.9563028 C6.83898979,21.2133036 6.23436264,21.0253571 5.97736183,20.5365125 C5.87502276,20.3418521 5.83970808,20.118884 5.87688493,19.9021263 L6.76918916,14.6995935 L2.98932777,11.0151392 C2.59384419,10.629638 2.58575189,9.99652475 2.9712531,9.60104117 C3.1247617,9.44355754 3.32590411,9.34107036 3.54354115,9.30944585 L8.76718111,8.55040653 L11.1032639,3.81698575 C11.3476862,3.32173209 11.9473121,3.11839309 12.4425657,3.36281539 C12.6397783,3.46014562 12.7994058,3.61977315 12.8967361,3.81698575 L15.2328189,8.55040653 L20.4564589,9.30944585 C21.0030037,9.38886347 21.3816852,9.89630632 21.3022676,10.4428512 C21.270643,10.6604882 21.1681559,10.8616306 21.0106722,11.0151392 L17.2308108,14.6995935 L18.1231151,19.9021263 C18.2164761,20.4464628 17.8508883,20.9634187 17.3065518,21.0567797 C17.0897942,21.0939566 16.8668261,21.0586419 16.6721656,20.9563028 L12,18.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        sticker: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/sticker</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/sticker\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M4,10.5 L16,10.5 C16,13.8137085 13.3137085,16.5 10,16.5 C6.6862915,16.5 4,13.8137085 4,10.5 Z M10,15.3 C12.2366073,15.3 14.1159277,13.7702727 14.648779,11.7 L5.35122098,11.7 C5.88407233,13.7702727 7.76339268,15.3 10,15.3 Z M6.5,8.5 C5.67157288,8.5 5,7.82842712 5,7 C5,6.17157288 5.67157288,5.5 6.5,5.5 C7.32842712,5.5 8,6.17157288 8,7 C8,7.82842712 7.32842712,8.5 6.5,8.5 Z M13.5,8.5 C12.6715729,8.5 12,7.82842712 12,7 C12,6.17157288 12.6715729,5.5 13.5,5.5 C14.3284271,5.5 15,6.17157288 15,7 C15,7.82842712 14.3284271,8.5 13.5,8.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/sticker</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/sticker\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon23\" fill=\"#000000\">            <g id=\"Group-19\" transform=\"translate(2.000000, 2.000000)\">                <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,16 C12.8690213,16 15.2249641,13.80325 15.4775785,11 L4.52242151,11 C4.7750359,13.80325 7.13097872,16 10,16 Z M6.5,8.5 C7.32842712,8.5 8,7.82842712 8,7 C8,6.17157288 7.32842712,5.5 6.5,5.5 C5.67157288,5.5 5,6.17157288 5,7 C5,7.82842712 5.67157288,8.5 6.5,8.5 Z M13.5,8.5 C14.3284271,8.5 15,7.82842712 15,7 C15,6.17157288 14.3284271,5.5 13.5,5.5 C12.6715729,5.5 12,6.17157288 12,7 C12,7.82842712 12.6715729,8.5 13.5,8.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>            </g>        </g>    </g></svg>' },\n        tag: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/tag</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/tag\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon28\" transform=\"translate(2.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M1.20710678,11.2071068 C0.816582489,10.8165825 0.816582489,10.1834175 1.20710678,9.79289322 L10.7071068,0.292893219 C10.8946432,0.10535684 11.1489971,0 11.4142136,0 L18,0 C18.5522847,0 19,0.44771525 19,1 L19,7.58578644 C19,7.85100293 18.8946432,8.10535684 18.7071068,8.29289322 L9.20710678,17.7928932 C8.81658249,18.1834175 8.18341751,18.1834175 7.79289322,17.7928932 L1.20710678,11.2071068 Z M17.8,7.50294373 L17.8,1.2 L11.4970563,1.2 L2.19705627,10.5 L8.5,16.8029437 L17.8,7.50294373 Z M14,6.5 C13.1715729,6.5 12.5,5.82842712 12.5,5 C12.5,4.17157288 13.1715729,3.5 14,3.5 C14.8284271,3.5 15.5,4.17157288 15.5,5 C15.5,5.82842712 14.8284271,6.5 14,6.5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/tag</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/tag\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon28\" fill=\"#000000\">            <path d=\"M3.20710678,14.2071068 C2.81658249,13.8165825 2.81658249,13.1834175 3.20710678,12.7928932 L12.7071068,3.29289322 C12.8946432,3.10535684 13.1489971,3 13.4142136,3 L20,3 C20.5522847,3 21,3.44771525 21,4 L21,10.5857864 C21,10.8510029 20.8946432,11.1053568 20.7071068,11.2928932 L11.2071068,20.7928932 C10.8165825,21.1834175 10.1834175,21.1834175 9.79289322,20.7928932 L3.20710678,14.2071068 Z M16,10 C17.1045695,10 18,9.1045695 18,8 C18,6.8954305 17.1045695,6 16,6 C14.8954305,6 14,6.8954305 14,8 C14,9.1045695 14.8954305,10 16,10 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        text: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/text</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/text\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M1,0 L17,0 C17.5522847,0 18,0.44771525 18,1 L18,17 C18,17.5522847 17.5522847,18 17,18 L1,18 C0.44771525,18 0,17.5522847 0,17 L0,1 C0,0.44771525 0.44771525,0 1,0 Z M1.2,1.2 L1.2,16.8 L16.8,16.8 L16.8,1.2 L1.2,1.2 Z M9.59999394,5.70000005 L9.59999394,14.5 L8.3999939,14.5 L8.3999939,5.70000005 L4.5,5.70000005 L4.5,4.5 L13.5,4.5 L13.5,5.70000005 L9.59999394,5.70000005 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/text</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/text\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" fill=\"#000000\">            <path d=\"M4,3 L20,3 C20.5522847,3 21,3.44771525 21,4 L21,20 C21,20.5522847 20.5522847,21 20,21 L4,21 C3.44771525,21 3,20.5522847 3,20 L3,4 C3,3.44771525 3.44771525,3 4,3 Z M13,9 L16.5,9 L16.5,7 L7.5,7 L7.5,9 L11,9 L11,17 L13,17 L13,9 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        time: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/time</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/time\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10.5999997,9.50294371 L14.4911685,13.3941125 L13.6426403,14.2426407 L9.39999962,10 L9.39999962,4 L10.5999997,4 L10.5999997,9.50294371 Z M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/time</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/time\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon21\" fill=\"#000000\">            <path d=\"M12.75,11.3793394 L12.75,6 L11.25,6 L11.25,12 L15.4926407,16.2433004 L16.5533009,15.1826403 L12.75,11.3793394 Z M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'transfer-text': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/transfer-text</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/transfer-text\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"\\u56FE\\u6807\\u989C\\u8272\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M1,0 L17,0 C17.5522847,0 18,0.44771525 18,1 L18,17 C18,17.5522847 17.5522847,18 17,18 L1,18 C0.44771525,18 0,17.5522847 0,17 L0,1 C0,0.44771525 0.44771525,0 1,0 Z M1.2,1.2 L1.2,16.8 L16.8,16.8 L16.8,1.2 L1.2,1.2 Z M4.57,5.86 L8.53,5.86 C8.28,5.4 7.97,4.97 7.61,4.56 L8.66,4.18 C9.02,4.65 9.35,5.21 9.65,5.86 L13.43,5.86 L13.43,6.9 L11.92,6.9 C11.44,8.4 10.74,9.65 9.82,10.66 C10.85,11.48 12.13,12.16 13.65,12.72 L13.07,13.61 C11.47,13.01 10.14,12.27 9.08,11.39 C7.96,12.38 6.58,13.11 4.95,13.57 L4.39,12.65 C5.98,12.24 7.3,11.6 8.34,10.72 C7.26,9.62 6.51,8.35 6.09,6.9 L4.57,6.9 L4.57,5.86 Z M7.09,6.9 C7.5,8.08 8.16,9.11 9.08,10.01 C9.86,9.15 10.45,8.11 10.84,6.9 L7.09,6.9 Z\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/transfer-text</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/transfer-text\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"\\u56FE\\u6807\\u989C\\u8272\" transform=\"translate(3.000000, 3.000000)\" fill=\"#000000\">            <path d=\"M1,0 L17,0 C17.5522847,0 18,0.44771525 18,1 L18,17 C18,17.5522847 17.5522847,18 17,18 L1,18 C0.44771525,18 0,17.5522847 0,17 L0,1 C0,0.44771525 0.44771525,0 1,0 Z M4.198,5.848 L4.198,6.992 L5.87,6.992 C6.332,8.587 7.157,9.984 8.345,11.194 C7.201,12.162 5.749,12.866 4,13.317 L4.616,14.329 C6.409,13.823 7.927,13.02 9.159,11.931 C10.325,12.899 11.788,13.713 13.548,14.373 L14.186,13.394 C12.514,12.778 11.106,12.03 9.973,11.128 C10.985,10.017 11.755,8.642 12.283,6.992 L13.944,6.992 L13.944,5.848 L9.786,5.848 C9.456,5.133 9.093,4.517 8.697,4 L7.542,4.418 C7.938,4.869 8.279,5.342 8.554,5.848 L4.198,5.848 Z M6.97,6.992 L11.095,6.992 C10.666,8.323 10.017,9.467 9.159,10.413 C8.147,9.423 7.421,8.29 6.97,6.992 Z\"></path>        </g>    </g></svg>' },\n        transfer2: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/transfer2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/transfer2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M7.78990146,7.92367324 L15,7.92367324 L15,9.12367328 L7,9.12367328 L5.54588248,9.12367328 C5.2697401,9.12367328 5.04588248,8.89981542 5.04588248,8.62367305 C5.04588248,8.47568977 5.11143476,8.33530829 5.22489809,8.24030765 L8.3863121,5.59331722 C8.55569359,5.4514974 8.8079721,5.47384054 8.94979192,5.64322203 C9.06317978,5.778646 9.07432456,5.97240774 8.97721173,6.11993928 L7.78990146,7.92367324 Z M12.255981,12.0800002 L5.04588248,12.0800002 L5.04588248,10.8800001 L13.0458825,10.8800001 L14.5,10.8800001 C14.7761424,10.8800001 15,11.103858 15,11.3800001 C15,11.5279836 14.9344477,11.6683651 14.8209844,11.7633657 L11.6595704,14.4103562 C11.4901889,14.552176 11.2379104,14.5298329 11.0960906,14.3604514 C10.9827027,14.2250274 10.9715579,14.0312657 11.0686708,13.8837341 L12.255981,12.0800002 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/transfer2</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/transfer2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_miniprogram\" fill=\"#000000\">            <path d=\"M13.0150338,14.5536734 L11.9008658,16.9301632 C11.8391719,17.0617546 11.853708,17.2164553 11.938835,17.334251 C12.0682302,17.5133036 12.3182766,17.5535588 12.4973291,17.4241636 L17.2974838,13.9552544 C17.4275709,13.8612449 17.5046203,13.7105008 17.5046203,13.5500002 C17.5046203,13.2738578 17.2807627,13.0500002 17.0046203,13.0500002 L13.7199998,13.0500002 L13.7182777,13.0536734 L7,13.0536734 L7,14.5536734 L13.0150338,14.5536734 Z M11.2095863,9.44631611 L12.3237543,7.0698263 C12.3854483,6.93823484 12.3709122,6.7835342 12.2857852,6.66573842 C12.1563899,6.48668585 11.9063436,6.44643061 11.727291,6.57582585 L6.9271363,10.0447351 C6.79704919,10.1387446 6.71999979,10.2894886 6.71999979,10.4499893 C6.71999979,10.7261316 6.94385742,10.9499893 7.21999979,10.9499893 L10.5046203,10.9499893 L10.5063424,10.9463161 L17.2199998,10.9463161 L17.2199998,9.44631611 L11.2095863,9.44631611 L11.2095863,9.44631611 Z M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        translate: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/translate</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/translate\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group-9\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M1.2,9.2 L1.2,18.8 L10.8,18.8 L10.8,9.2 L1.2,9.2 Z M8,8 L8,1.00247329 C8,0.455760956 8.44882258,0 9.00247329,0 L18.9975267,0 C19.544239,0 20,0.448822582 20,1.00247329 L20,10.9975267 C20,11.544239 19.5511774,12 18.9975267,12 L12,12 L12,18.9975267 C12,19.544239 11.5511774,20 10.9975267,20 L1.00247329,20 C0.455760956,20 0,19.5511774 0,18.9975267 L0,9.00247329 C0,8.45576096 0.448822582,8 1.00247329,8 L8,8 Z M9.2,8 L10.9975267,8 C11.544239,8 12,8.44882258 12,9.00247329 L12,10.8 L18.8,10.8 L18.8,1.2 L9.2,1.2 L9.2,8 Z M6.94499638,12.6968862 L4.78057032,12.6968862 C5.06288676,13.3628635 5.44654757,13.9564519 5.93155274,14.4704126 C6.35864685,13.9781686 6.69887435,13.391819 6.94499638,12.6968862 Z M9.22524457,12.6968862 L8.13217322,12.6968862 C7.79194571,13.6813744 7.32865719,14.4993681 6.73506877,15.1725843 C7.45895708,15.6937839 8.33486194,16.0774447 9.3845,16.3090889 C9.14561686,16.5407332 8.83434488,17.0040217 8.67508945,17.293577 C7.56030145,17.0040217 6.65544105,16.555211 5.90983609,15.9543837 C5.12079783,16.5769276 4.16526525,17.0329772 3.02152172,17.3514881 C2.90569959,17.0981272 2.58718873,16.6058831 2.3845,16.3597611 C3.49204912,16.1136391 4.39690951,15.7372172 5.12803671,15.2015398 C4.52720941,14.506607 4.06392089,13.6741355 3.68749897,12.6968862 L2.54375543,12.6968862 L2.54375543,11.6689648 L5.52617528,11.6689648 C5.45378645,11.3794095 5.32348656,11.0102265 5.18594778,10.7206711 L6.31521355,10.3876825 C6.49618563,10.72791 6.69887435,11.1839597 6.77126319,11.4879928 L6.18491365,11.6689648 L9.22524457,11.6689648 L9.22524457,12.6968862 Z M15.5507812,8.63671875 L15.1210938,7.26953125 L13.140625,7.26953125 L12.7109375,8.63671875 L11.5,8.63671875 L13.4570312,3 L14.84375,3 L16.8046875,8.63671875 L15.5507812,8.63671875 Z M14.1171875,4.078125 L13.3945312,6.38671875 L14.8671875,6.38671875 L14.1445312,4.078125 L14.1171875,4.078125 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/translate</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/translate\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group-9\" fill=\"#000000\">            <path d=\"M15.4745785,9.26953125 L17.1210938,9.26953125 L17.5507812,10.6367188 L18.8046875,10.6367188 L16.84375,5 L15.4570312,5 L14.2418545,8.5 L10,8.5 L10,3.00247329 C10,2.45576096 10.4488226,2 11.0024733,2 L20.9975267,2 C21.544239,2 22,2.44882258 22,3.00247329 L22,12.9975267 C22,13.544239 21.5511774,14 20.9975267,14 L15.5,14 L15.5,9.49268723 C15.5,9.41595736 15.4912019,9.34126077 15.4745785,9.26953125 L15.4745785,9.26953125 Z M16.1171875,6.078125 L16.1445312,6.078125 L16.8671875,8.38671875 L15.3945312,8.38671875 L16.1171875,6.078125 Z M3.00247329,10 L12.9975267,10 C13.544239,10 14,10.4488226 14,11.0024733 L14,20.9975267 C14,21.544239 13.5511774,22 12.9975267,22 L3.00247329,22 C2.45576096,22 2,21.5511774 2,20.9975267 L2,11.0024733 C2,10.455761 2.44882258,10 3.00247329,10 Z M11.2252446,14.6968862 L11.2252446,13.6689648 L8.18491365,13.6689648 L8.77126319,13.4879928 C8.69887435,13.1839597 8.49618563,12.72791 8.31521355,12.3876825 L7.18594778,12.7206711 C7.32348656,13.0102265 7.45378645,13.3794095 7.52617528,13.6689648 L4.54375543,13.6689648 L4.54375543,14.6968862 L5.68749897,14.6968862 C6.06392089,15.6741355 6.52720941,16.506607 7.12803671,17.2015398 C6.39690951,17.7372172 5.49204912,18.1136391 4.3845,18.3597611 C4.58718873,18.6058831 4.90569959,19.0981272 5.02152172,19.3514881 C6.16526525,19.0329772 7.12079783,18.5769276 7.90983609,17.9543837 C8.65544105,18.555211 9.56030145,19.0040217 10.6750895,19.293577 C10.8343449,19.0040217 11.1456169,18.5407332 11.3845,18.3090889 C10.3348619,18.0774447 9.45895708,17.6937839 8.73506877,17.1725843 C9.32865719,16.4993681 9.79194571,15.6813744 10.1321732,14.6968862 L11.2252446,14.6968862 Z M8.94499638,14.6968862 C8.69887435,15.391819 8.35864685,15.9781686 7.93155274,16.4704126 C7.44654757,15.9564519 7.06288676,15.3628635 6.78057032,14.6968862 L8.94499638,14.6968862 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        tv: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/tv</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/tv\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_tv&amp;display\" transform=\"translate(2.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M1.2,1.2 L1.2,13.8 L18.8,13.8 L18.8,1.2 L1.2,1.2 Z M0,1 C0,0.44771525 0.44771525,0 1,0 L19,0 C19.5522847,0 20,0.44771525 20,1 L20,14 C20,14.5522847 19.5522847,15 19,15 L1,15 C0.44771525,15 0,14.5522847 0,14 L0,1 Z M6,16.8999993 C6,16.5686284 6.26617432,16.2999992 6.60130024,16.2999992 L13.3986998,16.2999992 C13.7307887,16.2999992 14,16.5783196 14,16.8999993 L14,17.4999993 L6,17.4999993 L6,16.8999993 Z M9.66543361,4.89648438 L7.80957031,4.89648438 L7.80957031,11 L6.71582031,11 L6.71582031,4.89648438 L4.55761719,4.89648438 L4.55761719,3.95410156 L9.32910156,3.95410156 L10.515625,3.95410156 L12.4345703,9.76953125 L12.4638672,9.76953125 L14.3876953,3.95410156 L15.5546875,3.95410156 L13.0400391,11 L11.84375,11 L9.66543361,4.89648438 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/tv</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/tv\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"common_icons_tv&amp;display\" fill=\"#000000\">            <path d=\"M11.2179689,7.95410156 L6.30000019,7.95410156 L6.30000019,9.16992188 L8.336133,9.16992188 L8.336133,15 L9.81074238,15 L9.81074238,9.16992188 L11.6266126,9.16992188 L13.586133,15 L15.3634768,15 L17.7316408,7.95410156 L16.1251955,7.95410156 L14.5138674,13.4814453 L14.4796877,13.4814453 L12.8683596,7.95410156 L11.2179689,7.95410156 Z M2,5 C2,4.44771525 2.44771525,4 3,4 L21,4 C21.5522847,4 22,4.44771525 22,5 L22,18 C22,18.5522847 21.5522847,19 21,19 L3,19 C2.44771525,19 2,18.5522847 2,18 L2,5 Z M8,21.0499992 C8,20.6357857 8.34375,20.2999992 8.75262058,20.2999992 L15.2473794,20.2999992 C15.6630403,20.2999992 16,20.6328979 16,21.0499992 L16,21.7999992 L8,21.7999992 L8,21.0499992 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'video-call': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/video-call</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/video-call\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"\\u56FE\\u6807\\u989C\\u8272\" transform=\"translate(2.000000, 5.000000)\" fill=\"#000000\">            <path d=\"M1.2,1.7 L1.2,12.3 L13.8,12.3 L13.8,1.7 L1.2,1.7 Z M1,0.5 L14,0.5 C14.5522847,0.5 15,0.94771525 15,1.5 L15,12.5 C15,13.0522847 14.5522847,13.5 14,13.5 L1,13.5 C0.44771525,13.5 0,13.0522847 0,12.5 L0,1.5 C0,0.94771525 0.44771525,0.5 1,0.5 Z M17.2,8.42325018 L19.8,10.5032502 L19.8,3.49674982 L17.2,5.57674982 L17.2,8.42325018 Z M16,5 L19.375305,2.29975604 C19.8065669,1.95474649 20.4358593,2.02466786 20.7808688,2.4559298 C20.9227192,2.63324285 21,2.85355335 21,3.08062485 L21,10.9193752 C21,11.4716599 20.5522847,11.9193752 20,11.9193752 C19.7729285,11.9193752 19.552618,11.8420944 19.375305,11.700244 L16,9 L16,5 Z\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/video-call</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/video-call\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Group\" transform=\"translate(2.000000, 5.000000)\" fill=\"#000000\">            <path d=\"M1,0.5 L14,0.5 C14.5522847,0.5 15,0.94771525 15,1.5 L15,12.5 C15,13.0522847 14.5522847,13.5 14,13.5 L1,13.5 C0.44771525,13.5 6.76353751e-17,13.0522847 0,12.5 L0,1.5 C-6.76353751e-17,0.94771525 0.44771525,0.5 1,0.5 Z M16,5 L19.375305,2.29975604 C19.8065669,1.95474649 20.4358593,2.02466786 20.7808688,2.4559298 C20.9227192,2.63324285 21,2.85355335 21,3.08062485 L21,10.9193752 C21,11.4716599 20.5522847,11.9193752 20,11.9193752 C19.7729285,11.9193752 19.552618,11.8420944 19.375305,11.700244 L16,9 L16,5 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        voice: { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/voice</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/voice\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"Icons/Tint-Color/Black\" transform=\"translate(2.000000, 2.000000)\" fill=\"#000000\">            <path d=\"M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,18.8 C14.8601058,18.8 18.8,14.8601058 18.8,10 C18.8,5.1398942 14.8601058,1.2 10,1.2 C5.1398942,1.2 1.2,5.1398942 1.2,10 C1.2,14.8601058 5.1398942,18.8 10,18.8 Z M10.3083261,14.8083261 C11.5761218,13.5405304 12.3,11.8290902 12.3,10 C12.3,8.17090981 11.5761218,6.45946962 10.3083261,5.19167389 L11.1568542,4.34314575 C12.6045695,5.790861 13.5,7.790861 13.5,10 C13.5,12.209139 12.6045695,14.209139 11.1568542,15.6568542 L10.3083261,14.8083261 Z M8.32842712,12.8284271 C9.07450989,12.0823444 9.5,11.0763727 9.5,10 C9.5,8.92362725 9.07450989,7.91765564 8.32842712,7.17157288 L9.17695526,6.32304474 C10.1179702,7.26405965 10.7,8.56405965 10.7,10 C10.7,11.4359403 10.1179702,12.7359403 9.17695526,13.6769553 L8.32842712,12.8284271 Z M7.19705627,11.6970563 L5.5,10 L7.19705627,8.30294373 C7.63137085,8.7372583 7.9,9.3372583 7.9,10 C7.9,10.6627417 7.63137085,11.2627417 7.19705627,11.6970563 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/voice</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/voice\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"icon24\" fill=\"#000000\">            <path d=\"M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z M12.3083261,16.8083261 L13.1568542,17.6568542 C14.6045695,16.209139 15.5,14.209139 15.5,12 C15.5,9.790861 14.6045695,7.790861 13.1568542,6.34314575 L12.3083261,7.19167389 C13.5761218,8.45946962 14.3,10.1709098 14.3,12 C14.3,13.8290902 13.5761218,15.5405304 12.3083261,16.8083261 Z M10.3284271,14.8284271 L11.1769553,15.6769553 C12.1179702,14.7359403 12.7,13.4359403 12.7,12 C12.7,10.5640597 12.1179702,9.26405965 11.1769553,8.32304474 L10.3284271,9.17157288 C11.0745099,9.91765564 11.5,10.9236273 11.5,12 C11.5,13.0763727 11.0745099,14.0823444 10.3284271,14.8284271 Z M9.19705627,13.6970563 C9.63137085,13.2627417 9.9,12.6627417 9.9,12 C9.9,11.3372583 9.63137085,10.7372583 9.19705627,10.3029437 L7.5,12 L9.19705627,13.6970563 Z\" id=\"\\u56FE\\u6807\\u989C\\u8272\"></path>        </g>    </g></svg>' },\n        'volume-down': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/volume_down</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/volume_down\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <path d=\"M12,5.41421356 L7.91421356,9.5 L3,9.5 L3,14.5 L7.91421356,14.5 L12,18.5857864 L12,5.41421356 Z M7.5,8.5 L11.2928932,4.70710678 C11.6834175,4.31658249 12.3165825,4.31658249 12.7071068,4.70710678 C12.8946432,4.89464316 13,5.14899707 13,5.41421356 L13,18.5857864 C13,19.1380712 12.5522847,19.5857864 12,19.5857864 C11.7347835,19.5857864 11.4804296,19.4804296 11.2928932,19.2928932 L7.5,15.5 L3,15.5 C2.44771525,15.5 2,15.0522847 2,14.5 L2,9.5 C2,8.94771525 2.44771525,8.5 3,8.5 L7.5,8.5 Z M15.3284271,14.8284271 C16.0745099,14.0823444 16.5,13.0763727 16.5,12 C16.5,10.9236273 16.0745099,9.91765564 15.3284271,9.17157288 L16.1769553,8.32304474 C17.1179702,9.26405965 17.7,10.5640597 17.7,12 C17.7,13.4359403 17.1179702,14.7359403 16.1769553,15.6769553 L15.3284271,14.8284271 Z\" id=\"Combined-Shape\" fill=\"#000000\"></path>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/volume-down</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/volume-down\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"\\u97F3\\u91CF\" transform=\"translate(2.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M9.3,0.7 C9.7,0.3 10.3,0.3 10.7,0.7 C10.9,0.9 11,1.1 11,1.4 L11,14.6 C11,15.2 10.6,15.6 10,15.6 C9.7,15.6 9.5,15.5 9.3,15.3 L5.5,11.5 L1,11.5 C0.4,11.5 0,11.1 0,10.5 L0,5.5 C0,4.9 0.4,4.5 1,4.5 L5.5,4.5 L9.3,0.7 Z M14.2,11.9 L13.1,10.8 L13.2,10.7 C13.9,10 14.3,9 14.3,8 C14.3,7 13.9,6 13.2,5.3 L13.1,5.2 L14.2,4.1 L14.3,4.2 C15.3,5.2 15.9,6.6 15.9,8 C15.9,9.4 15.3,10.8 14.3,11.8 L14.2,11.9 Z\" id=\"Combined-Shape\"></path>        </g>    </g></svg>' },\n        'volume-off': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/volume_off</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/volume_off\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <path d=\"M8.84852842,7.15147158 L11.2928932,4.70710678 C11.6834175,4.31658249 12.3165825,4.31658249 12.7071068,4.70710678 C12.8946432,4.89464316 13,5.14899707 13,5.41421356 L13,11.3029432 L15.8635112,14.1664544 C16.2743314,13.5304353 16.5,12.7838871 16.5,12 C16.5,10.9236273 16.0745099,9.91765564 15.3284271,9.17157288 L16.1769553,8.32304474 C17.1179702,9.26405965 17.7,10.5640597 17.7,12 C17.7,13.1304063 17.3393038,14.1765674 16.7267259,15.029669 L17.8698713,16.1728144 C18.7875614,14.994606 19.3,13.5389457 19.3,12 C19.3,10.1709098 18.5761218,8.45946962 17.3083261,7.19167389 L18.1568542,6.34314575 C19.6045695,7.790861 20.5,9.790861 20.5,12 C20.5,13.9042389 19.8346829,15.6530847 18.7238215,17.0267646 L21.4249789,19.7279221 L20.5764507,20.5764502 L3.84852868,3.84852817 L4.69705685,3 L8.84852842,7.15147158 Z M12,10.3029432 L12,5.41421356 L9.55563521,7.85857836 L12,10.3029432 Z M7.80294315,9.5 L3,9.5 L3,14.5 L7.91421356,14.5 L12,18.5857864 L12,13.6970568 L13,14.6970568 L13,18.5857864 C13,19.1380712 12.5522847,19.5857864 12,19.5857864 C11.7347835,19.5857864 11.4804296,19.4804296 11.2928932,19.2928932 L7.5,15.5 L3,15.5 C2.44771525,15.5 2,15.0522847 2,14.5 L2,9.5 C2,8.94771525 2.44771525,8.5 3,8.5 L6.80294315,8.5 L7.80294315,9.5 Z\" id=\"Combined-Shape\" fill=\"#000000\"></path>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/volume-off</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/volume-off\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <path d=\"M9.06066017,6.93933983 L11.3,4.7 C11.7,4.3 12.3,4.3 12.7,4.7 C12.9,4.9 13,5.1 13,5.4 L13,10.8786797 L15.8785479,13.7572276 C16.1520151,13.2164906 16.3,12.6082453 16.3,12 C16.3,11 15.9,10 15.2,9.3 L15.1,9.2 L16.2,8.1 L16.3,8.2 C17.3,9.2 17.9,10.6 17.9,12 C17.9,13.0188672 17.5822172,14.0377344 17.0237418,14.9024214 L17.9423347,15.8210143 C18.7302379,14.7028496 19.1,13.4130518 19.1,12 C19.1,10.2 18.4,8.6 17.2,7.3 L17.1,7.2 L18.2,6.1 L18.3,6.2 C19.8,7.7 20.7,9.8 20.7,12 C20.7,13.820007 20.1524917,15.5031369 19.057475,16.9361546 L22.0918831,19.9705627 L21.0312229,21.0312229 L4.06066017,4.06066017 L5.12132034,3 L9.06066017,6.93933983 Z M13,15.1213203 L13,18.6 C13,19.2 12.6,19.6 12,19.6 C11.7,19.6 11.5,19.5 11.3,19.3 L7.5,15.5 L3,15.5 C2.4,15.5 2,15.1 2,14.5 L2,9.5 C2,8.9 2.4,8.5 3,8.5 L6.37867966,8.5 L13,15.1213203 Z\" id=\"Combined-Shape\" fill=\"#000000\"></path>    </g></svg>' },\n        'volume-up': { outline: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Outlined/volume_up</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Outlined/volume_up\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <path d=\"M12,5.41421356 L7.91421356,9.5 L3,9.5 L3,14.5 L7.91421356,14.5 L12,18.5857864 L12,5.41421356 Z M7.5,8.5 L11.2928932,4.70710678 C11.6834175,4.31658249 12.3165825,4.31658249 12.7071068,4.70710678 C12.8946432,4.89464316 13,5.14899707 13,5.41421356 L13,18.5857864 C13,19.1380712 12.5522847,19.5857864 12,19.5857864 C11.7347835,19.5857864 11.4804296,19.4804296 11.2928932,19.2928932 L7.5,15.5 L3,15.5 C2.44771525,15.5 2,15.0522847 2,14.5 L2,9.5 C2,8.94771525 2.44771525,8.5 3,8.5 L7.5,8.5 Z M17.3083261,16.8083261 C18.5761218,15.5405304 19.3,13.8290902 19.3,12 C19.3,10.1709098 18.5761218,8.45946962 17.3083261,7.19167389 L18.1568542,6.34314575 C19.6045695,7.790861 20.5,9.790861 20.5,12 C20.5,14.209139 19.6045695,16.209139 18.1568542,17.6568542 L17.3083261,16.8083261 Z M15.3284271,14.8284271 C16.0745099,14.0823444 16.5,13.0763727 16.5,12 C16.5,10.9236273 16.0745099,9.91765564 15.3284271,9.17157288 L16.1769553,8.32304474 C17.1179702,9.26405965 17.7,10.5640597 17.7,12 C17.7,13.4359403 17.1179702,14.7359403 16.1769553,15.6769553 L15.3284271,14.8284271 Z\" id=\"Combined-Shape\" fill=\"#000000\"></path>    </g></svg>', field: '<?xml version=\"1.0\" encoding=\"UTF-8\"?><svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">        <title>3.Icons/Filled/volume-up</title>    <desc>Created with Sketch.</desc>    <g id=\"3.Icons/Filled/volume-up\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" fill-opacity=\"0.9\">        <g id=\"\\u97F3\\u91CF\" transform=\"translate(2.000000, 4.000000)\" fill=\"#000000\">            <path d=\"M9.3,0.7 C9.7,0.3 10.3,0.3 10.7,0.7 C10.9,0.9 11,1.1 11,1.4 L11,14.6 C11,15.2 10.6,15.6 10,15.6 C9.7,15.6 9.5,15.5 9.3,15.3 L5.5,11.5 L1,11.5 C0.4,11.5 0,11.1 0,10.5 L0,5.5 C0,4.9 0.4,4.5 1,4.5 L5.5,4.5 L9.3,0.7 Z M16.2,13.9 L15.1,12.8 L15.2,12.7 C16.5,11.4 17.1,9.8 17.1,8 C17.1,6.2 16.4,4.6 15.2,3.3 L15.1,3.2 L16.2,2.1 L16.3,2.2 C17.8,3.7 18.7,5.8 18.7,8 C18.7,10.2 17.9,12.2 16.3,13.8 L16.2,13.9 Z M14.2,11.9 L13.1,10.8 L13.2,10.7 C13.9,10 14.3,9 14.3,8 C14.3,7 13.9,6 13.2,5.3 L13.1,5.2 L14.2,4.1 L14.3,4.2 C15.3,5.2 15.9,6.6 15.9,8 C15.9,9.4 15.3,10.8 14.3,11.8 L14.2,11.9 Z\" id=\"Combined-Shape\"></path>        </g>    </g></svg>' }\n      }\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/icon/icon.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/icon/icon.wxml",
    "content": "<wxs module=\"utils\">\n    var double = function(a) {\n        return 2*a\n    };\n    var ifSpecialIcon = function(v) {\n      return v === 'arrow' || v === 'back'\n    }\n    module.exports = {\n      double: double,\n      ifSpecialIcon: ifSpecialIcon\n    }\n</wxs>\n\n<view class=\"{{extClass}} weui-icon\" style=\"background:{{color}};width:{{size}}px;height:{{ utils.ifSpecialIcon(icon) ? utils.double(size) : size}}px;mask-image:url({{src}});-webkit-mask-image:url({{src}});-moz-mask-image:url({{src}})\"></view>\n"
  },
  {
    "path": "miniprogram/packageExtend/components/icon/icon.wxss",
    "content": ".weui-icon{vertical-align:middle;display:inline-block;background:black;mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;-moz-mask-repeat:no-repeat;mask-size:cover;-webkit-mask-size:cover;-moz-mask-size:cover}"
  },
  {
    "path": "miniprogram/packageExtend/components/index-list/index-list.js",
    "content": "const throttle = function throttle(func, wait, options) {\n  let context = void 0\n  let args = void 0\n  let result = void 0\n  let timeout = null\n  let previous = 0\n  if (!options) options = {}\n  const later = function later() {\n    previous = options.leading === false ? 0 : Date.now()\n    timeout = null\n    result = func.apply(context, args)\n    if (!timeout) context = args = null\n  }\n  return function () {\n    const now = Date.now()\n    if (!previous && options.leading === false) previous = now\n    const remaining = wait - (now - previous)\n    context = this\n    args = arguments\n    if (remaining <= 0 || remaining > wait) {\n      clearTimeout(timeout)\n      timeout = null\n      previous = now\n      result = func.apply(context, args)\n      if (!timeout) context = args = null\n    } else if (!timeout && options.trailing !== false) {\n      timeout = setTimeout(later, remaining)\n    }\n    return result\n  }\n}\n\nComponent({\n  behaviors: [],\n  options: {\n    pureDataPattern: /^_/\n  },\n  properties: {\n    list: {\n      type: Array,\n      value: [],\n      observer: function observer(newVal) {\n        const _this = this\n\n        if (newVal.length === 0) return\n        const data = this.data\n        const alphabet = data.list.map(function (item) {\n          return item.alpha\n        })\n        this.setData({\n          alphabet,\n          current: alphabet[0]\n        }, function () {\n          _this.computedSize()\n        })\n      }\n    },\n    vibrated: {\n      type: Boolean,\n      value: true\n    }\n  },\n\n  data: {\n    windowHeight: 612,\n    current: 'A',\n    intoView: '',\n    touching: false,\n    alphabet: [],\n    _tops: [],\n    _anchorItemH: 0,\n    _anchorItemW: 0,\n    _anchorTop: 0,\n    _listUpperBound: 0\n  },\n\n  lifetimes: {\n    created() {\n\n    },\n    attached() {\n      this.__scrollTo = throttle(this._scrollTo, 100, {})\n      this.__onScroll = throttle(this._onScroll, 100, {})\n\n      const _wx$getSystemInfoSync = wx.getSystemInfoSync(); const\n        windowHeight = _wx$getSystemInfoSync.windowHeight\n\n      this.setData({ windowHeight })\n    },\n  },\n  methods: {\n    choose(e) {\n      const item = e.target.dataset.item\n      this.triggerEvent('choose', { item })\n    },\n    scrollTo(e) {\n      this.__scrollTo(e)\n    },\n    _scrollTo(e) {\n      const data = this.data\n      const clientY = e.changedTouches[0].clientY\n      const index = Math.floor((clientY - data._anchorTop) / data._anchorItemH)\n      const current = data.alphabet[index]\n      this.setData({ current, intoView: current, touching: true })\n      if (data.vibrated) wx.vibrateShort()\n    },\n    computedSize() {\n      const data = this.data\n      const query = this.createSelectorQuery()\n      query.selectAll('.city_list_item').boundingClientRect(function (rects) {\n        const result = rects\n        data._tops = result.map(function (item) {\n          return item.top\n        })\n      }).exec()\n      query.select('.anchor-list').boundingClientRect(function (rect) {\n        data._anchorItemH = rect.height / data.alphabet.length\n        data._anchorItemW = rect.width\n        data._anchorTop = rect.top\n      }).exec()\n      query.select('.page-select-city').boundingClientRect(function (rect) {\n        data._listUpperBound = rect.top\n      })\n    },\n    removeTouching: function removeTouching() {\n      const _this2 = this\n\n      setTimeout(function () {\n        _this2.setData({ touching: false })\n      }, 150)\n    },\n    onScroll: function onScroll(e) {\n      this.__onScroll(e)\n    },\n    _onScroll: function _onScroll(e) {\n      const data = this.data\n      const _tops = data._tops; const\n        alphabet = data.alphabet\n\n      const scrollTop = e.detail.scrollTop\n      let current = ''\n      if (scrollTop < _tops[0]) {\n        current = alphabet[0]\n      } else {\n        for (let i = 0, len = _tops.length; i < len - 1; i++) {\n          if (scrollTop >= _tops[i] && scrollTop < _tops[i + 1]) {\n            current = alphabet[i]\n          }\n        }\n      }\n      if (!current) current = alphabet[alphabet.length - 1]\n      this.setData({ current })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/components/index-list/index-list.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/index-list/index-list.wxml",
    "content": "<scroll-view class=\"page page-select-city\" style=\"height: {{windowHeight}}px;\" enable-back-to-top scroll-into-view=\"{{intoView}}\" scroll-y bindscroll=\"onScroll\">\n  <view>\n    <slot></slot>\n  </view>\n  <view class=\"city_list_item\" wx:for=\"{{list}}\" wx:key=\"alpha\" id=\"{{item.alpha}}\">\n    <view class=\"city-group__title font-size-26 tips-color\">{{item.alpha}}</view>\n    <view class=\"city-group__content\">\n      <view class=\"city-group__list\">\n        <block wx:for=\"{{item.subItems}}\" wx:for-item=\"subItem\" wx:key=\"name\">\n          <view \n            class=\"city-group__item thin-border-bottom\" \n            hover-class=\"bg-highlight\" \n            data-item=\"{{subItem}}\"\n            bindtap=\"choose\">\n              {{subItem.name}}\n          </view>\n        </block>\n      </view>\n    </view>\n  </view>\n</scroll-view>\n<view class=\"anchor-bar__wrp wx-flex\" catchtouchstart='scrollTo' catchtouchmove='scrollTo' catchtouchend='removeTouching'>\n  <view class=\"anchor-bar wx-flex__item\">\n    <view class=\"anchor-list\">\n      <block wx:for=\"{{alphabet}}\" wx:key=\"*this\" wx:for-item=\"alpha\">\n        <view class=\"anchor-item {{current == alpha ? ( touching ? 'selected tapped' : 'selected' ): ''}}\" data-alpha=\"{{alpha}}\">\n          <view class=\"anchor-item__inner\">{{alpha}}</view>\n          <view class=\"anchor-item__pop\">{{alpha}}</view>\n        </view>\n      </block>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/index-list/index-list.wxss",
    "content": ".wx-flex {\n  display: flex;\n  align-items: center\n}\n\n.wx-flex__item {\n  flex: 1\n}\n\n.thin-border-bottom {\n  position: relative\n}\n\n.thin-border-bottom:after {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid #EAEAEA;\n  color: #e5e5e5;\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  z-index: 2\n}\n\n.thin-border-top {\n  position: relative\n}\n\n.thin-border-top:after {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid #EAEAEA;\n  color: #e5e5e5;\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  z-index: 2\n}\n\n.square-tag {\n  color: #9a9a9a;\n  text-align: center;\n  height: 30px;\n  line-height: 30px;\n  box-sizing: border-box;\n  border-radius: 2px;\n  background-color: #f7f7f7;\n  font-size: 12px;\n  position: relative\n}\n\n.square-tag:after {\n  content: \"\";\n  width: 200%;\n  height: 200%;\n  border: 1px solid #f7f7f7;\n  transform: scale(.5);\n  transform-origin: 0 0;\n  position: absolute;\n  left: 0;\n  top: 0;\n  box-sizing: border-box;\n  border-radius: 4px\n}\n\n.square-tag.selected {\n  background: rgba(26, 173, 25, 0.1);\n  color: #1AAD19\n}\n\n.square-tag.selected:after {\n  border: 1px solid #1AAD19\n}\n\n.select-city__hd {\n  padding: 0 15px;\n  position: fixed;\n  height: 50px;\n  background-color: #fff;\n  left: 0;\n  right: 0;\n  z-index: 990\n}\n\n.select-city__hd.thin-border-bottom:after {\n  left: 12px;\n  right: 12px\n}\n\n.current-city__name {\n  display: inline-block;\n  margin-right: 10px;\n  margin-left: 11px\n}\n\n.city-group_part .city-group__content {\n  padding: 0 15px\n}\n\n.city-group_part .city-group__title {\n  padding-bottom: 12px\n}\n\n.city-group__title {\n  padding: 12px 12px 11px\n}\n\n.city-group__content {\n  font-size: 0\n}\n\n.square-tag {\n  width: 100px;\n  display: inline-block;\n  margin-right: 12px;\n  margin-bottom: 12px;\n  height: 40px;\n  line-height: 40px;\n  font-size: 15px;\n  color: #000;\n  background-color: rgba(0, 0, 0, 0.02);\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis\n}\n\n.city-group__item {\n  padding: 15px 12px;\n  font-size: 15px\n}\n\n.city-group__item.thin-border-bottom:after {\n  left: 12px\n}\n\n.city-group_all {\n  padding-bottom: 50px\n}\n\n.fixed__top {\n  position: fixed;\n  top: 0\n}\n\n.anchor-bar__wrp {\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  width: 30px;\n  z-index: 999\n}\n\n.anchor-item {\n  font-size: 0;\n  text-align: center;\n  position: relative\n}\n\n.anchor-item__inner {\n  line-height: 14px;\n  height: 14px;\n  width: 14px;\n  border-radius: 50%;\n  display: inline-block;\n  font-size: 10px;\n  margin: 1px 0;\n  font-weight: 500\n}\n\n.tapped .anchor-item__pop {\n  display: block\n}\n\n.anchor-item__pop {\n  position: absolute;\n  font-size: 62px;\n  width: 50px;\n  height: 50px;\n  line-height: 50px;\n  color: #fff;\n  background-color: #C9C9C9;\n  border-radius: 50%;\n  right: 40px;\n  top: 50%;\n  transform: translateY(-50%);\n  display: none\n}\n\n.anchor-item__pop:after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  width: 0;\n  height: 0;\n  left: 40px;\n  border: 20px solid;\n  border-color: transparent transparent transparent #C9C9C9;\n  top: 50%;\n  transform: translateY(-50%)\n}\n\n.anchor-item.selected .anchor-item__inner {\n  color: #fff;\n  background-color: #1aad19\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/index.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 27)\n    /** *** */ }({\n\n    /***/ 27:\n    /***/ (function (module, exports, __webpack_require__) {\n      exports.__esModule = true\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/loading/loading.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 14)\n    /** *** */ }({\n\n    /***/ 14:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n        },\n        properties: {\n          extClass: {\n            type: String,\n            value: ''\n          },\n          show: {\n            type: Boolean,\n            value: true,\n            observer(newValue) {\n              this._computedStyle(newValue, this.data.animated)\n            }\n          },\n          animated: {\n            type: Boolean,\n            value: false,\n            observer(newValue) {\n              this._computedStyle(this.data.show, newValue)\n            }\n          },\n          duration: {\n            // 过渡动画时间\n            type: Number,\n            value: 350\n          },\n          type: {\n            type: String,\n            value: 'dot-gray' // 取值dot-white、dot-gray、circle\n          },\n          tips: {\n            // type是circle的时候才有效\n            type: String,\n            value: '加载中'\n          }\n        },\n        data: {\n          animationData: {},\n          animationInstance: {},\n          displayStyle: 'none'\n        },\n        methods: {\n          _computedStyle(show, animated) {\n            if (!show) {\n              if (!animated) {\n                this.setData({\n                  displayStyle: 'none'\n                })\n              } else {\n                this._startAnimation()\n              }\n            } else {\n              this.setData({\n                displayStyle: ''\n              })\n            }\n          },\n\n          _startAnimation() {\n            setTimeout(() => {\n              const data = this.data\n              const animation = data.animationInstance\n              animation.height(0).step()\n              this.setData({\n                animationData: animation.export()\n              })\n            }, 0)\n          }\n\n        },\n        lifetimes: {\n          attached() {\n            const data = this.data\n            const animationInstance = wx.createAnimation({\n              duration: data.duration,\n              timingFunction: 'ease'\n            })\n            this.setData({\n              animationInstance\n            })\n\n            this._computedStyle(this.data.show, this.data.animated)\n          }\n\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/loading/loading.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/loading/loading.wxml",
    "content": "<view style=\"display:{{displayStyle}};\" class=\"wx_loading_view {{extClass}}\" animation=\"{{animationData}}\" id=\"wx_loading_view\">\n    <view wx:if=\"{{type==='dot-white'}}\" class=\"loading wx_dot_loading wx_dot_loading_white\">\n    </view>\n    <view wx:elif=\"{{type==='dot-gray'}}\" class=\"loading wx_dot_loading\"></view>\n    <view wx:elif=\"{{type==='circle'}}\" class=\"weui-loadmore\">\n        <view class=\"weui-loading\"></view>\n        <view class=\"weui-loadmore__tips\">{{tips}}</view>\n    </view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/loading/loading.wxss",
    "content": ".wx_loading_view{display:flex;justify-content:center;align-items:center;overflow:hidden}.loading{color:rgba(255,255,255,0.9);font-size:17px;text-align:center}.loading_view_translation{transition:height .2s .3s ease}"
  },
  {
    "path": "miniprogram/packageExtend/components/msg/msg.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 19)\n    /** *** */ }({\n\n    /***/ 19:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n          multipleSlots: true\n        },\n        properties: {\n          title: {\n            type: String,\n            value: ''\n          },\n          type: {\n            type: String,\n            value: ''\n          },\n          icon: {\n            // 可以自行设置 icon, 设置icon 之后，type 失效\n            type: String,\n            value: ''\n          },\n          desc: {\n            type: String,\n            value: ''\n          },\n          extClass: {\n            type: String,\n            value: ''\n          },\n          size: {\n            // 可以自行设置 icon, 设置icon 之后，type 失效\n            type: Number,\n            value: 64\n          }\n        },\n        data: {}\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/msg/msg.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/msg/msg.wxml",
    "content": "<view class=\"weui-msg {{extClass}}\">\n  <view class=\"weui-msg__icon-area\">\n    <icon type=\"{{type}}\" size=\"{{size}}\" wx:if=\"{{type}}\"></icon>\n    <image class=\"weui-msg__icon-img\" src=\"{{icon}}\" mode=\"aspectFit\" wx:elif=\"{{icon}}\" />  </view>\n  <view class=\"weui-msg__text-area\">\n    <view class=\"weui-msg__title\">{{title}}</view>\n    <view class=\"weui-msg__desc\">\n      {{desc}}\n      <slot name=\"desc\" wx:if=\"{{!desc}}\"></slot>\n    </view>\n    <slot name=\"extend\"></slot>\n  </view>\n  <view class=\"weui-msg__opr-area\">\n    <view class=\"weui-btn-area\">\n      <slot name=\"handle\"></slot>\n    </view>\n  </view>\n  <view class=\"weui-msg__tips-area\">\n    <view class=\"weui-msg__tips\">\n      <slot name=\"tips\"></slot>\n    </view>\n  </view>\n  <view class=\"weui-msg__extra-area\">\n    <view class=\"weui-footer\">\n      <slot name=\"footer\"></slot>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/components/msg/msg.wxss",
    "content": ".weui-msg__icon-img{width:95px;height:95px}"
  },
  {
    "path": "miniprogram/packageExtend/components/navigation-bar/navigation-bar.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 3)\n    /** *** */ }({\n\n    /***/ 3:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n          multipleSlots: true,\n        },\n        properties: {\n          extClass: {\n            type: String,\n            value: ''\n          },\n          title: {\n            type: String,\n            value: ''\n          },\n          background: {\n            type: String,\n            value: ''\n          },\n          color: {\n            type: String,\n            value: ''\n          },\n          back: {\n            type: Boolean,\n            value: true\n          },\n          loading: {\n            type: Boolean,\n            value: false\n          },\n          // 显示隐藏的时候opacity动画效果\n          animated: {\n            type: Boolean,\n            value: true\n          },\n          // 显示隐藏导航，隐藏的时候navigation-bar的高度占位还在\n          show: {\n            type: Boolean,\n            value: true,\n            observer: '_showChange'\n          },\n          delta: {\n            type: Number,\n            value: 1\n          }\n        },\n        data: {\n          displayStyle: ''\n        },\n        attached() {\n          const isSupport = !!wx.getMenuButtonBoundingClientRect\n          const rect = wx.getMenuButtonBoundingClientRect ? wx.getMenuButtonBoundingClientRect() : null\n          wx.getSystemInfo({\n            success: res => {\n              const ios = !!(res.system.toLowerCase().search('ios') + 1)\n              this.setData({\n                ios,\n                statusBarHeight: res.statusBarHeight,\n                innerWidth: isSupport ? `width:${rect.left}px` : '',\n                innerPaddingRight: isSupport ? `padding-right:${res.windowWidth - rect.left}px` : '',\n                leftWidth: isSupport ? `width:${res.windowWidth - rect.left}px` : ''\n              })\n            }\n          })\n        },\n\n        methods: {\n          _showChange(show) {\n            const animated = this.data.animated\n            let displayStyle = ''\n\n            if (animated) {\n              displayStyle = `opacity: ${show ? '1' : '0'};-webkit-transition:opacity 0.5s;transition:opacity 0.5s;`\n            } else {\n              displayStyle = `display: ${show ? '' : 'none'}`\n            }\n\n            this.setData({\n              displayStyle\n            })\n          },\n          back() {\n            const data = this.data\n\n            if (data.delta) {\n              wx.navigateBack({\n                delta: data.delta\n              })\n            }\n\n            this.triggerEvent('back', {\n              delta: data.delta\n            }, {})\n          }\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/navigation-bar/navigation-bar.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/navigation-bar/navigation-bar.wxml",
    "content": "<view class=\"weui-navigation-bar {{extClass}}\">\n  <view class=\"weui-navigation-bar__placeholder {{ios ? 'ios' : 'android'}}\" style=\"padding-top: {{statusBarHeight}}px;visibility: hidden;\"></view>\n  <view class=\"weui-navigation-bar__inner {{ios ? 'ios' : 'android'}}\" style=\"padding-top: {{statusBarHeight}}px; color: {{color}};background: {{background}};{{displayStyle}};{{innerPaddingRight}};{{innerWidth}};\">\n\n    <view class='weui-navigation-bar__left' style=\"{{leftWidth}}\">\n      <block wx:if=\"{{back}}\">\n        <view class=\"weui-navigation-bar__buttons\">\n          <view bindtap=\"back\" class=\"weui-navigation-bar__button weui-navigation-bar__btn_goback\"></view>\n        </view>\n      </block>\n      <block wx:else>\n        <slot name=\"left\"></slot>\n      </block>\n    </view>\n\n    <view class='weui-navigation-bar__center'>\n      <view wx:if=\"{{loading}}\" class=\"weui-navigation-bar__loading\">\n        <view class=\"weui-loading\" style=\"width:{{size.width}}rpx;height:{{size.height}}rpx;\"></view>\n      </view>\n      <block wx:if=\"{{title}}\">\n        <text>{{title}}</text>\n      </block>\n      <block wx:else>\n        <slot name=\"center\"></slot>\n      </block>\n    </view>\n\n    <view class='weui-navigation-bar__right'>\n      <slot name=\"right\"></slot>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/components/navigation-bar/navigation-bar.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageExtend/components/package.json",
    "content": "{\n    \"name\": \"weui-miniprogram\",\n    \"version\": \"1.0.0\",\n    \"description\": \"小程序 WeUI 组件库\",\n    \"author\": \"xushengni,tomylin,cunjinli,rockhou\",\n    \"license\": \"MIT\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/row/index.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 13)\n    /** *** */ }({\n\n    /***/ 13:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        properties: {},\n        relations: {\n          '../col/index': {\n            type: 'child'\n          }\n        },\n        data: {\n          classStyle: ''\n        },\n        attached: function attached() {},\n\n        methods: {}\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/row/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/row/index.wxml",
    "content": "<span class=\"weui-row-before\"></span>\n<slot></slot>\n<span class=\"weui-row-after\"></span>"
  },
  {
    "path": "miniprogram/packageExtend/components/row/index.wxss",
    "content": ":host{position:relative;box-sizing:border-box;width:100%}.weui-row-before{display:table}.weui-row-after{display:table;clear:both;content:\"\"}"
  },
  {
    "path": "miniprogram/packageExtend/components/searchbar/searchbar.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 25)\n    /** *** */ }({\n\n    /***/ 25:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n        },\n        properties: {\n          extClass: {\n            type: String,\n            value: ''\n          },\n          focus: {\n            type: Boolean,\n            value: false\n          },\n          placeholder: {\n            type: String,\n            value: '搜索'\n          },\n          value: {\n            type: String,\n            value: ''\n          },\n          search: {\n            type: Function,\n            value: null\n          },\n          throttle: {\n            type: Number,\n            value: 500\n          },\n          cancelText: {\n            type: String,\n            value: '取消'\n          },\n          cancel: {\n            type: Boolean,\n            value: true\n          }\n        },\n        data: {\n          result: []\n        },\n        lastSearch: Date.now(),\n        lifetimes: {\n          attached: function attached() {\n            if (this.data.focus) {\n              this.setData({\n                searchState: true\n              })\n            }\n          }\n        },\n        methods: {\n          clearInput() {\n            // @ts-ignore\n            this.setData({\n              value: '',\n              focus: true,\n              result: []\n            }) // @ts-ignore\n\n            this.triggerEvent('clear')\n          },\n          inputFocus(e) {\n            // this.setData({\n            //     searchState: true\n            // })\n            // @ts-ignore\n            this.triggerEvent('focus', e.detail)\n          },\n          inputBlur(e) {\n            this.setData({\n              focus: false\n            })\n            this.triggerEvent('blur', e.detail)\n          },\n          showInput() {\n            this.setData({\n              focus: true,\n              searchState: true\n            })\n          },\n\n          hideInput() {\n            this.setData({\n              searchState: false\n            })\n          },\n\n          // @ts-ignore\n          inputChange(e) {\n            this.setData({\n              value: e.detail.value\n            })\n            this.triggerEvent('input', e.detail)\n\n            if (Date.now() - this.lastSearch < this.data.throttle) {\n              return\n            }\n\n            if (typeof this.data.search !== 'function') {\n              return\n            }\n\n            this.lastSearch = Date.now()\n            this.timerId = setTimeout(() => {\n              this.data.search(e.detail.value).then(json => {\n                this.setData({\n                  result: json\n                })\n              }).catch(err => {\n                console.error('search error', err)\n              })\n            }, this.data.throttle)\n          },\n          selectResult(e) {\n            const {\n              index\n            } = e.currentTarget.dataset\n            const item = this.data.result[index]\n            this.triggerEvent('selectresult', {\n              index,\n              item\n            })\n          }\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/searchbar/searchbar.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"mp-cells\": \"../cells/cells\",\n    \"mp-cell\": \"../cell/cell\"\n  },\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/searchbar/searchbar.wxml",
    "content": "<view class=\"weui-search-bar {{searchState ? 'weui-search-bar_focusing' : ''}} {{extClass}}\">   \n    <view class=\"weui-search-bar__form\">\n        <view class=\"weui-search-bar__box\">\n            <icon class=\"weui-icon-search\" type=\"search\" size=\"12\"></icon>\n            <input type=\"text\" class=\"weui-search-bar__input\" placeholder=\"{{placeholder}}\" value=\"{{value}}\" focus=\"{{focus}}\" bindblur=\"inputBlur\" bindfocus=\"inputFocus\" bindinput=\"inputChange\" />\n            <text class=\"weui-icon-clear\" wx:if=\"{{value.length > 0}}\" bindtap=\"clearInput\"></text>\n        </view>\n        <label class=\"weui-search-bar__label\" bindtap=\"showInput\">\n            <icon class=\"weui-icon-search\" type=\"search\" size=\"12\"></icon>\n            <text class=\"weui-search-bar__text\">搜索</text>\n        </label>\n    </view>\n    <view wx:if=\"{{cancel && searchState}}\" class=\"weui-search-bar__cancel-btn\" bindtap=\"hideInput\">{{cancelText}}</view>\n</view>\n<mp-cells ext-class=\" {{'searchbar-result ' + extClass}}\" wx:if=\"{{searchState && result.length > 0}}\">\n    <mp-cell bindtap=\"selectResult\" body-class=\"weui-cell_primary\" data-index=\"{{index}}\" wx:for=\"{{result}}\" wx:key=\"index\" hover>\n     <view>{{item.text}}</view>\n    </mp-cell>\n</mp-cells>"
  },
  {
    "path": "miniprogram/packageExtend/components/searchbar/searchbar.wxss",
    "content": ".weui-search-bar__label text{display:inline-block;font-size:14px;vertical-align:middle}"
  },
  {
    "path": "miniprogram/packageExtend/components/select-text/select-text.js",
    "content": "Component({\n  /**\n   * 组件的属性列表\n   */\n  properties: {\n    space: {\n      type: String,\n      value: ''\n    },\n    decode: {\n      type: Boolean,\n      value: false\n    },\n    placement: {\n      type: String,\n      value: 'top'\n    },\n    showCopyBtn: {\n      type: Boolean,\n      value: false\n    },\n    value: {\n      type: String,\n      value: ''\n    }\n  },\n  observers: {\n    onDocumentTap() {\n      this.setData({\n        showToolTip: false\n      })\n    }\n  },\n\n  /**\n   * 组件的初始数据\n   */\n  data: {\n    showToolTip: false\n  },\n\n  /**\n   * 组件的方法列表\n   */\n  methods: {\n    handleLongPress() {\n      if (!this.data.showCopyBtn) return\n      this.setData({\n        showToolTip: true,\n      })\n    },\n    handleCopy() {\n      this.setData({\n        showToolTip: false\n      })\n      wx.setClipboardData({\n        data: this.data.value,\n      })\n      this.triggerEvent('copy', {})\n    },\n    stopPropagation: function stopPropagation(e) {}\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/components/select-text/select-text.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/select-text/select-text.wxml",
    "content": "<wxs src=\"./select-text.wxs\" module=\"computed\" />\n\n<view \n  class=\"weui-select-text\" \n  style=\"{{computed.containerStyle({showToolTip, showCopyBtn, activeBgColor})}}\"\n  catch:tap=\"stopPropagation\"\n>\n  <text \n    selectable=\"{{!showCopyBtn}}\" \n    space=\"{{space}}\" \n    decode=\"{{decode}}\" \n    catch:longpress=\"handleLongPress\"\n  >{{value}}</text>\n  <view \n    wx:if=\"{{showToolTip}}\"\n    class=\"weui-tooltip weui-tooltip__{{placement}}\"\n    style=\"z-index: {{zIndex}};\"\n    catch:tap=\"handleCopy\"\n  >\n    复制\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/select-text/select-text.wxs",
    "content": "function containerStyle(data) {\n  if (data.showToolTip && data.showCopyBtn) {\n    return 'background-color: ' + data.activeBgColor\n  }\n  return ''\n}\n\nmodule.exports = {\n  containerStyle: containerStyle,\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/select-text/select-text.wxss",
    "content": ".weui-select-text {\n  display: inline;\n  position: relative\n}\n\n.weui-tooltip {\n  box-sizing: border-box;\n  width: 60px;\n  background-color: #000000;\n  color: #ffffff;\n  text-align: center;\n  padding: 5px 0;\n  border-radius: 6px;\n  position: absolute;\n  font-size: 14px\n}\n\n.weui-tooltip__top {\n  left: 50%;\n  top: 0;\n  transform: translate(-50%, -100%);\n  margin-top: -10px\n}\n\n.weui-tooltip__top::after {\n  content: \" \";\n  position: absolute;\n  top: 100%;\n  left: 50%;\n  transform: translate(-50%, 0);\n  border-width: 5px;\n  border-style: solid;\n  border-color: black transparent transparent transparent\n}\n\n.weui-tooltip__bottom {\n  left: 50%;\n  top: 100%;\n  transform: translate(-50%, 0);\n  margin-top: 10px\n}\n\n.weui-tooltip__bottom::after {\n  content: \" \";\n  position: absolute;\n  top: 0;\n  left: 50%;\n  transform: translate(-50%, -100%);\n  border-width: 5px;\n  border-style: solid;\n  border-color: transparent transparent black transparent\n}\n\n.weui-tooltip__left {\n  left: 0;\n  top: 50%;\n  transform: translate(-100%, -50%);\n  margin-left: -10px\n}\n\n.weui-tooltip__left::after {\n  content: \" \";\n  position: absolute;\n  top: 50%;\n  left: 100%;\n  transform: translate(0, -50%);\n  border-width: 5px;\n  border-style: solid;\n  border-color: transparent transparent transparent black\n}\n\n.weui-tooltip__right {\n  left: 100%;\n  top: 50%;\n  transform: translate(0, -50%);\n  margin-left: 10px\n}\n\n.weui-tooltip__right::after {\n  content: \" \";\n  position: absolute;\n  top: 50%;\n  left: 0;\n  transform: translate(-100%, -50%);\n  border-width: 5px;\n  border-style: solid;\n  border-color: transparent black transparent transparent\n}\ntextarea {\n  height: 16px;\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/slideview/slideview.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 18)\n    /** *** */ }({\n\n    /***/ 18:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n          multipleSlots: true\n        },\n        properties: {\n          extClass: {\n            type: String,\n            value: ''\n          },\n          buttons: {\n            type: Array,\n            value: [],\n            // type, data, text, src, extClass\n            observer() {\n              this.addClassNameForButton()\n            }\n\n          },\n          disable: {\n            type: Boolean,\n            value: false\n          },\n          icon: {\n            type: Boolean,\n            value: false\n          },\n          show: {\n            type: Boolean,\n            value: false\n          },\n          duration: {\n            type: Number,\n            value: 350\n          },\n          throttle: {\n            type: Number,\n            value: 40\n          },\n          rebounce: {\n            type: Number,\n            value: 0\n          }\n        },\n        data: {\n          size: null\n        },\n        ready() {\n          // @ts-ignore\n          this.updateRight()\n          this.addClassNameForButton()\n        },\n\n        methods: {\n          updateRight() {\n            // 获取右侧滑动显示区域的宽度\n            const data = this.data\n            const query = this.createSelectorQuery()\n            query.select('.left').boundingClientRect(res => {\n              const btnQuery = this.createSelectorQuery()\n              btnQuery.selectAll('.btn').boundingClientRect(rects => {\n                this.setData({\n                  size: {\n                    buttons: rects,\n                    button: res,\n                    show: data.show,\n                    disable: data.disable,\n                    throttle: data.throttle,\n                    rebounce: data.rebounce\n                  }\n                })\n              }).exec()\n            }).exec()\n          },\n          addClassNameForButton() {\n            // @ts-ignore\n            const {\n              buttons,\n              icon\n            } = this.data\n            buttons.forEach(btn => {\n              if (icon) {\n                btn.className = ''\n              } else if (btn.type === 'warn') {\n                btn.className = 'weui-slideview__btn-group_warn'\n              } else {\n                btn.className = 'weui-slideview__btn-group_default'\n              }\n            })\n            this.setData({\n              buttons\n            })\n          },\n          buttonTapByWxs(data) {\n            this.triggerEvent('buttontap', data, {})\n          },\n          hide() {\n            this.triggerEvent('hide', {}, {})\n          },\n          show() {\n            this.triggerEvent('show', {}, {})\n          },\n\n          transitionEnd() {}\n\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/slideview/slideview.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/slideview/slideview.wxml",
    "content": "<!-- slide-view/slide-view.wxml -->\n<wxs module=\"handler\" src=\"./slideview.wxs\"></wxs>\n<view class=\"weui-slideview weui-movable-view {{icon ? 'weui-slideview_icon' : ''}} {{extClass}}\" style=\"width: 100%;height: 100%;\">\n    <view bindtransitionend=\"{{handler.transitionEnd}}\"\n      show=\"{{show}}\" change:show=\"{{handler.showChange}}\" \n      rebounce=\"{{rebounce}}\" change:rebounce=\"{{handler.rebounceChange}}\" \n      duration=\"{{duration}}\" change:duration=\"{{handler.durationChange}}\" \n      change:disable=\"{{handler.disableChange}}\" disable=\"{{disable}}\" \n      change:prop=\"{{handler.sizeReady}}\" prop=\"{{size}}\" \n      bindtouchstart=\"{{handler.touchstart}}\" bindtouchmove=\"{{handler.touchmove}}\" bindtouchend=\"{{handler.touchend}}\" class=\"weui-slideview__left left\" style=\"width:100%;\">\n      <slot></slot>\n    </view>\n    <view class=\"weui-slideview__right right\">\n      <view class=\"weui-slideview__buttons\" style=\"height:100%;width:100%;\" wx:if=\"{{buttons && buttons.length}}\">\n        <view wx:for=\"{{buttons}}\" wx:key=\"index\" class='btn weui-slideview__btn__wrp {{item.className}} {{item.extClass}}'>\n          <view bindtap=\"{{handler.hideButton}}\" data-data=\"{{item.data}}\" data-index=\"{{index}}\" class='weui-slideview__btn'>\n            <text wx:if=\"{{!icon}}\">{{item.text}}</text>\n            <image class=\"weui-slideview__btn__icon\" wx:else src=\"{{item.src}}\"/>\n          </view>\n        </view>\n      </view>\n    </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/components/slideview/slideview.wxs",
    "content": "/* eslint-disable */\nvar touchstart = function(event, ownerInstance) {\n    var ins = event.instance\n    var st = ins.getState()\n    if (st.disable) return // disable的逻辑\n    // console.log('touchstart st', JSON.stringify(st))\n    if (!st.size) return\n    // console.log('touchstart', JSON.stringify(event))\n    st.isMoving = true\n    st.startX = event.touches[0].pageX\n    st.startY = event.touches[0].pageY\n    st.firstAngle = 0\n}\nvar touchmove = function(event, ownerInstance) {\n    var ins = event.instance\n    var st = ins.getState()\n    if (!st.size || !st.isMoving) return\n    // console.log('touchmove', JSON.stringify(event))\n    var pagex = event.touches[0].pageX - st.startX\n    var pagey = event.touches[0].pageY - st.startY\n    // 左侧45度角为界限，大于45度则允许水平滑动\n    if (st.firstAngle === 0) {\n        st.firstAngle = Math.abs(pagex) - Math.abs(pagey)\n    }\n    if (st.firstAngle < 0) {\n        return\n    }\n    var movex = pagex > 0 ? Math.min(st.max, pagex) : Math.max(-st.max, pagex)\n    // 往回滑动的情况\n    if (st.out) {\n        // 已经是划出来了，还要往左滑动，忽略\n        if (movex < 0) return\n        ins.setStyle({\n            'transform': 'translateX(' + (st.transformx + movex) + 'px)',\n            'transition': ''\n        })\n        var btns = ownerInstance.selectAllComponents('.btn')\n        var transformTotal = 0\n        var len = btns.length\n        var i = len - 1;\n        for (;i >= 0; i--) {\n            var transform = st.size.buttons[i].width / st.max * movex\n            var transformx = st.size.buttons[i].max - Math.min(st.size.buttons[i].max, transform + transformTotal)\n            btns[i].setStyle({\n                'transform': 'translateX(' + (-transformx) + 'px)',\n                'transition': ''\n            })\n            transformTotal += transform\n        }\n        return false\n    }\n    if (movex > 0) movex = 0\n    ins.setStyle({\n        'transform': 'translateX(' + movex + 'px)',\n        'transition': ''\n    })\n    st.transformx = movex\n    var btns = ownerInstance.selectAllComponents('.btn')\n    var transformTotal = 0\n    var len = btns.length\n    var i = len - 1;\n    for (;i >= 0; i--) {\n        var transform = st.size.buttons[i].width / st.max * movex\n        var transformx = Math.max(-st.size.buttons[i].max, transform + transformTotal)\n        btns[i].setStyle({\n            'transform': 'translateX(' + transformx + 'px)',\n            'transition': ''\n        })\n        st.size.buttons[i].transformx = transformx\n        transformTotal += transform\n    }\n    return false // 禁止垂直方向的滑动\n}\nvar touchend = function(event, ownerInstance) {\n    var ins = event.instance\n    var st = ins.getState()\n    if (!st.size || !st.isMoving) return\n    // 左侧45度角为界限，大于45度则允许水平滑动\n    if (st.firstAngle < 0) {\n        return\n    }\n    var duration = st.duration / 1000\n    st.isMoving = false\n    // console.log('touchend', JSON.stringify(event))\n    var btns = ownerInstance.selectAllComponents('.btn')\n    var len = btns.length\n    var i = len - 1\n    // console.log('len size', len)\n    if (Math.abs(event.changedTouches[0].pageX - st.startX) < st.throttle || event.changedTouches[0].pageX - st.startX > 0) { // 方向也要控制\n        st.out = false\n        ins.setStyle({\n            'transform': 'translate3d(0px, 0, 0)',\n            'transition': 'transform ' + (duration) + 's'\n        })\n        for (;i >= 0; i--) {\n            btns[i].setStyle({\n                'transform': 'translate3d(0px, 0, 0)',\n                'transition': 'transform ' + (duration) + 's'\n            })\n        }\n        ownerInstance.callMethod('hide')\n        return\n    }\n    showButtons(ins, ownerInstance, duration)\n    ownerInstance.callMethod('show')\n}\nvar REBOUNCE_TIME = 0.2\nvar showButtons = function(ins, ownerInstance, withDuration) {\n    var st = ins.getState()\n    if (!st.size) return\n    var rebounceTime = st.rebounce ? REBOUNCE_TIME : 0\n    var movex = st.max\n    st.out = true\n    var btns = ownerInstance.selectAllComponents('.btn')\n    var rebounce = st.rebounce || 0\n    var len = btns.length\n    var i = len - 1\n    ins.setStyle({\n        'transform': 'translate3d(' + (-movex - rebounce) + 'px, 0, 0)',\n        'transition': 'transform ' + (withDuration) + 's'\n    })\n    st.transformx = -movex\n    var transformTotal = 0\n    for (;i >= 0; i--) {\n        var transform = st.size.buttons[i].width / st.max * movex\n        var transformx = (-(transform + transformTotal))\n        btns[i].setStyle({\n            'transform': 'translate3d(' + transformx + 'px, 0, 0)',\n            'transition': 'transform ' + (withDuration ? withDuration + rebounceTime : withDuration) + 's'\n        })\n        st.size.buttons[i].transformx = transformx\n        transformTotal += transform\n    }\n}\nvar innerHideButton = function(ownerInstance) {\n    var ins = ownerInstance.selectComponent('.left')\n    var st = ins.getState()\n    if (!st.size) return\n    var duration = st.duration ? st.duration / 1000 : 0\n    var btns = ownerInstance.selectAllComponents('.btn')\n    var len = btns.length\n    var i = len - 1\n    ins.setStyle({\n        'transform': 'translate3d(0px, 0, 0)',\n        'transition': 'transform ' + (duration) + 's'\n    })\n    st.transformx = 0\n    for (;i >= 0; i--) {\n        btns[i].setStyle({\n            'transform': 'translate3d(0px, 0, 0)',\n            'transition': 'transform ' + (duration) + 's'\n        })\n        st.size.buttons[i].transformx = 0\n    }\n}\nvar hideButton = function(event, ownerInstance) {\n    innerHideButton(ownerInstance)\n    ownerInstance.callMethod('buttonTapByWxs', {index: event.currentTarget.dataset.index, data: event.currentTarget.dataset.data})\n    return false\n}\nvar sizeReady = function(newVal, oldVal, ownerInstance, ins) {\n    var st = ins.getState()\n    // st.disable = newVal && newVal.disable\n    if (newVal && newVal.button && newVal.buttons) {\n        st.size = newVal\n        st.transformx = 0\n        // var min = newVal.button.width\n        var max = 0\n        var len = newVal.buttons.length\n        var i = newVal.buttons.length - 1;\n        var total = 0\n        for (; i >= 0; i--) {\n            max += newVal.buttons[i].width\n            // if (min > newVal.buttons[i]) {\n            //     min = newVal.buttons[i].width\n            // }\n            total += newVal.buttons[i].width\n            newVal.buttons[i].max = total\n            newVal.buttons[i].transformx = 0\n        }\n        st.throttle = st.size.throttle || 40 // 固定值\n        st.rebounce = st.size.rebounce\n        st.max = max\n        ownerInstance.selectComponent('.right').setStyle({\n            'line-height': newVal.button.height + 'px',\n            left: (newVal.button.width) + 'px',\n            width: max + 'px'\n        })\n        // console.log('st size', JSON.stringify(newVal))\n        if (!st.size.disable && st.size.show) {\n            showButtons(ins, ownerInstance)\n        }\n    }\n}\nvar disableChange = function(newVal, oldVal, ownerInstance, ins) {\n    var st = ins.getState()\n    st.disable = newVal\n}\nvar durationChange = function(newVal, oldVal, ownerInstance, ins) {\n    var st = ins.getState()\n    st.duration = newVal || 400\n}\nvar showChange = function(newVal, oldVal, ownerInstance, ins) {\n    var st = ins.getState()\n    st.show = newVal\n    if (st.disable) return\n    // console.log('show change')\n    if (st.show) {\n        showButtons(ins, ownerInstance, st.duration)\n    } else {\n        innerHideButton(ownerInstance)\n    }\n}\nvar rebounceChange = function(newVal, oldVal, ownerInstance, ins) {\n    var st = ins.getState()\n    // console.log('rebounce', st.rebounce)\n    st.rebounce = newVal\n}\nvar transitionEnd = function(event, ownerInstance) {\n    // console.log('transition')\n    var ins = event.instance\n    var st = ins.getState()\n    // 回弹效果\n    if (st.out && st.rebounce) {\n        console.log('transition rebounce', st.rebounce)\n        ins.setStyle({\n            'transform': 'translate3d(' + (-st.max) + 'px, 0, 0)',\n            'transition': 'transform ' + REBOUNCE_TIME +'s'\n        })\n    }\n}\nmodule.exports = {\n    touchstart: touchstart,\n    touchmove: touchmove,\n    touchend: touchend,\n    hideButton: hideButton,\n    sizeReady: sizeReady,\n    disableChange: disableChange,\n    durationChange: durationChange,\n    showChange: showChange,\n    rebounceChange: rebounceChange,\n    transitionEnd: transitionEnd\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/slideview/slideview.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageExtend/components/sticky/sticky.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 8)\n    /** *** */ }({\n\n    /***/ 8:\n    /***/ (function (module, exports, __webpack_require__) {\n      const selectQuery = __webpack_require__(9)\n      const target = '.weui-sticky'\n\n      Component({\n        options: {\n          pureDataPattern: /^_/,\n          multipleSlots: true\n        },\n        behaviors: [selectQuery],\n        properties: {\n          offsetTop: {\n            type: Number,\n            value: 0\n          },\n          zIndex: {\n            type: Number,\n            value: 99\n          },\n          disabled: {\n            type: Boolean,\n            value: false\n          },\n          container: {\n            type: null\n          }\n        },\n        data: {\n          fixed: false,\n          height: 0,\n          _attached: false,\n          _containerHeight: 0\n        },\n        observers: {\n          disabled(newVal) {\n            if (!this._attached) return\n            newVal ? this.disconnectObserver() : this.initObserver()\n          },\n          container(newVal) {\n            if (typeof newVal !== 'function' || !this.data.height) return\n            this.observerContainer()\n          }\n        },\n        lifetimes: {\n          attached() {\n            this.data._attached = true\n            if (!this.data.disabled) this.initObserver()\n          },\n          detached() {\n            this.data._attached = false\n            this.disconnectObserver()\n          }\n        },\n        methods: {\n          getContainerRect() {\n            const nodesRef = this.data.container()\n            return new Promise(function (resolve) {\n              return nodesRef.boundingClientRect(resolve).exec()\n            })\n          },\n          initObserver() {\n            const _this = this\n\n            this.disconnectObserver()\n            this.getRect(target).then(function (rect) {\n              _this.setData({\n                height: rect.height\n              })\n              _this.observerContent()\n              _this.observerContainer()\n            })\n          },\n          disconnectObserver(observerName) {\n            if (observerName) {\n              const observer = this[observerName]\n              observer && observer.disconnect()\n            } else {\n              this.contentObserver && this.contentObserver.disconnect()\n              this.containerObserver && this.containerObserver.disconnect()\n            }\n          },\n          observerContent() {\n            const _this2 = this\n\n            const offsetTop = this.data.offsetTop\n\n            this.disconnectObserver('contentObserver')\n            const contentObserver = this.createIntersectionObserver({\n              thresholds: [1],\n              initialRatio: 1\n            })\n            contentObserver.relativeToViewport({\n              top: -offsetTop\n            })\n            contentObserver.observe(target, function (res) {\n              if (_this2.data.disabled) return\n              _this2.setFixed(res.boundingClientRect.top)\n            })\n            this.contentObserver = contentObserver\n          },\n          observerContainer() {\n            const _this3 = this\n\n            const _data = this.data\n            const container = _data.container\n            const height = _data.height\n            const offsetTop = _data.offsetTop\n\n            if (typeof container !== 'function') return\n            this.disconnectObserver('containerObserver')\n            this.getContainerRect().then(function (rect) {\n              _this3.getRect(target).then(function (contentRect) {\n                const _contentTop = contentRect.top\n                const _containerTop = rect.top\n                const _containerHeight = rect.height\n                const _relativeTop = _contentTop - _containerTop\n                const containerObserver = _this3.createIntersectionObserver({\n                  thresholds: [1],\n                  initialRatio: 1\n                })\n                containerObserver.relativeToViewport({\n                  top: _containerHeight - height - offsetTop - _relativeTop\n                })\n                containerObserver.observe(target, function (res) {\n                  if (_this3.data.disabled) return\n                  _this3.setFixed(res.boundingClientRect.top)\n                })\n                _this3.data._relativeTop = _relativeTop\n                _this3.data._containerHeight = _containerHeight\n                _this3.containerObserver = containerObserver\n              })\n            })\n          },\n          setFixed(top) {\n            const _data2 = this.data\n            const height = _data2.height\n            const _containerHeight = _data2._containerHeight\n            const _relativeTop = _data2._relativeTop\n            const offsetTop = _data2.offsetTop\n\n            const fixed = _containerHeight && height ? top >= height + offsetTop + _relativeTop - _containerHeight && top < offsetTop : top < offsetTop\n            this.triggerEvent('scroll', {\n              scrollTop: top,\n              isFixed: fixed\n            })\n            this.setData({ fixed })\n          }\n        }\n      })\n      /***/ }),\n\n    /***/ 9:\n    /***/ (function (module, exports, __webpack_require__) {\n      module.exports = Behavior({\n        methods: {\n          getRect(selector) {\n            const _this = this\n\n            return new Promise(function (resolve, reject) {\n              _this.createSelectorQuery().select(selector).boundingClientRect(function (rect) {\n                if (rect) {\n                  resolve(rect)\n                } else {\n                  reject(new Error('can not find selector: ' + selector))\n                }\n              }).exec()\n            })\n          },\n          getAllRects(selector) {\n            const _this2 = this\n\n            return new Promise(function (resolve, reject) {\n              _this2.createSelectorQuery().selectAll(selector).boundingClientRect(function (rects) {\n                if (rects && rects.lenght > 0) {\n                  resolve(rects)\n                } else {\n                  reject(new Error('can not find selector: ' + selector))\n                }\n              }).exec()\n            })\n          }\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/sticky/sticky.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/sticky/sticky.wxml",
    "content": "<wxs src=\"./sticky.wxs\" module=\"computed\" />\n\n<view class=\"weui-sticky\" style=\"{{computed.containerStyle({fixed, height, zIndex})}}\">\n  <view class=\"{{fixed ? 'weui-sticky__fixed' : ''}}\" style=\"{{computed.wrapStyle({fixed, offsetTop})}}\">\n    <slot ></slot>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/sticky/sticky.wxs",
    "content": "\n/* eslint-disable */\nfunction wrapStyle(data) {\n  if (data.fixed) {\n    return 'top: ' + data.offsetTop + 'px;'\n  }\n  return ''\n}\n\nfunction containerStyle(data) {\n  if (data.fixed) {\n    return 'height: ' + data.height + 'px; z-index: ' + data.zIndex + ';'\n  }\n  return ''\n}\n\nmodule.exports = {\n  wrapStyle: wrapStyle,\n  containerStyle: containerStyle\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/sticky/sticky.wxss",
    "content": ".weui-sticky {\n  position: relative\n}\n\n.weui-sticky__fixed {\n  position: fixed;\n  left: 0;\n  top: 0\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/tabbar/tabbar.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 16)\n    /** *** */ }({\n\n    /***/ 16:\n    /***/ (function (module, exports, __webpack_require__) {\n      Component({\n        options: {\n        },\n        properties: {\n          extClass: {\n            type: String,\n            value: ''\n          },\n          list: {\n            type: Array,\n            value: []\n          },\n          current: {\n            type: Number,\n            value: 0\n          }\n        },\n        methods: {\n          tabChange(e) {\n            const {\n              index\n            } = e.currentTarget.dataset\n\n            if (index === this.data.current) {\n              return\n            }\n            this.setData({\n              current: index\n            })\n            this.triggerEvent('change', {\n              index,\n              item: this.data.list[index]\n            })\n          }\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/tabbar/tabbar.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"mp-badge\": \"../badge/badge\"\n  },\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/tabbar/tabbar.wxml",
    "content": "<view class=\"weui-tabbar {{extClass}}\">\n  <!-- 选中的时候往 weui-tabbar__item 加 class:weui-bar__item_on -->\n  <view data-index='{{index}}' bindtap=\"tabChange\" wx:for=\"{{list}}\" wx:key=\"index\" class=\"weui-tabbar__item {{index === current ? 'weui-bar__item_on' : ''}}\">\n    <view style=\"position: relative;display:inline-block;\">\n      <image src=\"{{current === index ? item.selectedIconPath : item.iconPath}}\" class=\"weui-tabbar__icon\"></image>\n      <mp-badge wx:if=\"{{item.badge || item.dot}}\" content=\"{{item.badge}}\" style=\"position: absolute;top:-2px;left:calc(100% - 3px)\"></mp-badge>\n    </view>\n    <view class=\"weui-tabbar__label\">{{item.text}}</view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/tabbar/tabbar.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageExtend/components/tabs/tabs.js",
    "content": "Component({\n  options: {\n    pureDataPattern: /^_/,\n    multipleSlots: true\n  },\n  properties: {\n    tabs: { type: Array, value: [] },\n    tabClass: { type: String, value: '' },\n    swiperClass: { type: String, value: '' },\n    activeClass: { type: String, value: '' },\n    tabUnderlineColor: { type: String, value: '#07c160' },\n    tabActiveTextColor: { type: String, value: '#000000' },\n    tabInactiveTextColor: { type: String, value: '#000000' },\n    tabBackgroundColor: { type: String, value: '#ffffff' },\n    activeTab: { type: Number, value: 0 },\n    swipeable: { type: Boolean, value: true },\n    animation: { type: Boolean, value: true },\n    duration: { type: Number, value: 500 },\n    theme: { type: String, value: 'light' } // light dark\n  },\n  data: {\n    currentView: 0\n  },\n  observers: {\n    activeTab: function activeTab(_activeTab) {\n      const len = this.data.tabs.length\n      if (len === 0) return\n      let currentView = _activeTab - 1\n      if (currentView < 0) currentView = 0\n      if (currentView > len - 1) currentView = len - 1\n      this.setData({ currentView })\n    }\n  },\n  lifetimes: {\n    created: function created() {}\n  },\n  methods: {\n    handleTabClick: function handleTabClick(e) {\n      const index = e.currentTarget.dataset.index\n      this.setData({ activeTab: index })\n      this.triggerEvent('tabclick', { index })\n    },\n    handleSwiperChange: function handleSwiperChange(e) {\n      const index = e.detail.current\n      this.setData({ activeTab: index })\n      this.triggerEvent('change', { index })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/components/tabs/tabs.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/tabs/tabs.wxml",
    "content": "<view class=\"weui-tabs\">\n  <view class=\"weui-tabs-bar__wrp\">\n    <scroll-view scroll-x scroll-into-view=\"item_{{currentView}}\" scroll-with-animation=\"{{animation}}\">\n      <view class=\"weui-tabs-bar__content\">\n        <block wx:for=\"{{tabs}}\" wx:key=\"title\">\n          <view id=\"item_{{index}}\" class=\"weui-tabs-bar__item\" style=\"background-color: {{tabBackgroundColor}}; color: {{activeTab === index ? tabActiveTextColor : tabInactiveTextColor}};\" bindtap=\"handleTabClick\" data-index=\"{{index}}\">\n            <view class=\"weui-tabs-bar__title {{tabClass}} {{activeTab === index ? activeClass : ''}}\" style=\"border-bottom-color: {{activeTab === index ? tabUnderlineColor : 'transparent'}}\">\n              <text class=\"\">{{item.title}}</text>\n            </view>\n          </view>\n        </block>\n      </view>\n    </scroll-view>\n  </view>\n  <swiper class=\"{{swiperClass}}\" current=\"{{activeTab}}\" duration=\"{{duration}}\" bindchange=\"handleSwiperChange\">\n    <swiper-item wx:for=\"{{tabs}}\" wx:key=\"title\">\n      <slot name=\"tab-content-{{index}}\"></slot>\n    </swiper-item>\n  </swiper>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/tabs/tabs.wxss",
    "content": "@import '../../../common/lib/weui.wxss';\n\n.weui-tabs {\n  width: 100%;\n  height: 100%;\n}\n\n.weui-tabs-bar__wrp {\n  width: 100%;\n  background: var(--weui-BG-2);\n  margin-top: 0;\n  padding-top: 10px;\n}\n\n.weui-tabs-bar__content {\n  width: 100%;\n  white-space: nowrap\n}\n\n.weui-tabs-bar__item {\n  display: inline-block;\n}\n\n.weui-tabs-bar__title {\n  display: inline-block;\n  border-bottom-width: 2px;\n  border-bottom-style: solid;\n  border-bottom-color: transparent;\n}\n\n"
  },
  {
    "path": "miniprogram/packageExtend/components/toptips/toptips.js",
    "content": "Component({\n  options: {\n  },\n  properties: {\n    type: {\n      type: String,\n      value: 'error',\n      observer: '_typeChange'\n    },\n    show: {\n      type: Boolean,\n      value: false,\n      observer: '_showChange'\n    },\n    msg: {\n      type: String,\n      value: ''\n    },\n    delay: {\n      type: Number,\n      value: 2000\n    },\n    extClass: {\n      type: String,\n      value: ''\n    }\n  },\n  data: {\n    typeClassMap: {\n      warn: 'weui-toptips_warn',\n      info: 'weui-toptips_info',\n      success: 'weui-toptips_success',\n      error: 'weui-toptips_error'\n    }\n  },\n  lifetimes: {\n    attached() {\n      const data = this.data\n      this.setData({\n        className: data.typeClassMap[data.type] || ''\n      })\n    },\n  },\n\n  methods: {\n    _typeChange(newVal) {\n      this.setData({\n        className: this.data.typeClassMap[newVal] || ''\n      })\n      return newVal\n    },\n    _showChange(newVal) {\n      this._showToptips(newVal)\n    },\n    _showToptips(newVal) {\n      if (newVal && this.data.delay) {\n        setTimeout(() => {\n          this.setData({\n            show: false\n          }, () => {\n            // tooltips 隐藏了，触发 hide 事件\n            this.triggerEvent('hide', {}, {})\n          })\n        }, this.data.delay)\n      }\n      this.setData({\n        show: newVal\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/components/toptips/toptips.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/toptips/toptips.wxml",
    "content": "<view class=\"weui-toptips {{className}} {{extClass}} {{show ? 'weui-toptips_show' :  ''}}\">\n    <block wx:if=\"{{msg}}\">{{msg}}</block>\n    <block wx:else>\n        <slot></slot>\n    </block>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/components/toptips/toptips.wxss",
    "content": ".weui-toptips {\n  position: fixed;\n  -webkit-transform: translateZ(0) translateY(calc(-100% - 8px));\n  transform: translateZ(0) translateY(calc(-100% - 8px));\n  text-align: center;\n  top: 8px;\n  left: 16px;\n  right: 16px;\n  border-radius: 4px;\n  padding: 8px;\n  -webkit-border-radius: 4px;\n  color: rgba(255, 255, 255, 0.9);\n  font-size: 17px;\n  line-height: 1.4;\n  background: rgba(250, 81, 81, 0.9);\n  z-index: 5000;\n  word-wrap: break-word;\n  word-break: break-all;\n  -webkit-transition: all .4s ease-in-out;\n  transition: all .4s ease-in-out\n}\n\n.weui-toptips_show {\n  -webkit-transform: translateZ(0) translateY(0);\n  transform: translateZ(0) translateY(0);\n  opacity: 1;\n  display: block\n}\n\n.weui-toptips_warn {\n  background-color: #FA5151\n}\n\n.weui-toptips_success {\n  background-color: #09BB07\n}\n\n.weui-toptips_error {\n  background-color: #FA5151\n}\n\n.weui-toptips_info {\n  background-color: #10AEFF\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/uploader/uploader.js",
    "content": "module.exports =\n/** *** */ (function (modules) { // webpackBootstrap\n    /** *** */ // The module cache\n    /** *** */ const installedModules = {}\n    /** *** */\n    /** *** */ // The require function\n    /** *** */ function __webpack_require__(moduleId) {\n      /** *** */\n      /** *** */ // Check if module is in cache\n      /** *** */ if (installedModules[moduleId]) {\n        /** *** */ return installedModules[moduleId].exports\n        /** *** */ }\n      /** *** */ // Create a new module (and put it into the cache)\n      /** *** */ const module = installedModules[moduleId] = {\n        /** *** */ i: moduleId,\n        /** *** */ l: false,\n        /** *** */ exports: {}\n        /** *** */ }\n      /** *** */\n      /** *** */ // Execute the module function\n      /** *** */ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__)\n      /** *** */\n      /** *** */ // Flag the module as loaded\n      /** *** */ module.l = true\n      /** *** */\n      /** *** */ // Return the exports of the module\n      /** *** */ return module.exports\n      /** *** */ }\n    /** *** */\n    /** *** */\n    /** *** */ // expose the modules object (__webpack_modules__)\n    /** *** */ __webpack_require__.m = modules\n    /** *** */\n    /** *** */ // expose the module cache\n    /** *** */ __webpack_require__.c = installedModules\n    /** *** */\n    /** *** */ // define getter function for harmony exports\n    /** *** */ __webpack_require__.d = function (exports, name, getter) {\n      /** *** */ if (!__webpack_require__.o(exports, name)) {\n        /** *** */ Object.defineProperty(exports, name, { enumerable: true, get: getter })\n        /** *** */ }\n      /** *** */ }\n    /** *** */\n    /** *** */ // define __esModule on exports\n    /** *** */ __webpack_require__.r = function (exports) {\n      /** *** */ if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n        /** *** */ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })\n        /** *** */ }\n      /** *** */ Object.defineProperty(exports, '__esModule', { value: true })\n      /** *** */ }\n    /** *** */\n    /** *** */ // create a fake namespace object\n    /** *** */ // mode & 1: value is a module id, require it\n    /** *** */ // mode & 2: merge all properties of value into the ns\n    /** *** */ // mode & 4: return value when already ns object\n    /** *** */ // mode & 8|1: behave like require\n    /** *** */ __webpack_require__.t = function (value, mode) {\n      /** *** */ if (mode & 1) value = __webpack_require__(value)\n      /** *** */ if (mode & 8) return value\n      /** *** */ if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value\n      /** *** */ const ns = Object.create(null)\n      /** *** */ __webpack_require__.r(ns)\n      /** *** */ Object.defineProperty(ns, 'default', { enumerable: true, value })\n      /** *** */ if (mode & 2 && typeof value !== 'string') for (const key in value) __webpack_require__.d(ns, key, function (key) { return value[key] }.bind(null, key))\n      /** *** */ return ns\n      /** *** */ }\n    /** *** */\n    /** *** */ // getDefaultExport function for compatibility with non-harmony modules\n    /** *** */ __webpack_require__.n = function (module) {\n      /** *** */ const getter = module && module.__esModule\n      /** *** */ ? function getDefault() { return module.default }\n      /** *** */ : function getModuleExports() { return module }\n      /** *** */ __webpack_require__.d(getter, 'a', getter)\n      /** *** */ return getter\n      /** *** */ }\n    /** *** */\n    /** *** */ // Object.prototype.hasOwnProperty.call\n    /** *** */ __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property) }\n    /** *** */\n    /** *** */ // __webpack_public_path__\n    /** *** */ __webpack_require__.p = ''\n    /** *** */\n    /** *** */\n    /** *** */ // Load entry module and return exports\n    /** *** */ return __webpack_require__(__webpack_require__.s = 22)\n    /** *** */ }({\n\n    /***/ 22:\n    /***/ (function (module, exports, __webpack_require__) {\n      console.log(module, exports)\n      Component({\n        options: {\n        },\n        properties: {\n          title: {\n            type: String,\n            value: '图片上传'\n          },\n          sizeType: {\n            type: Array,\n            value: ['original', 'compressed']\n          },\n          sourceType: {\n            type: Array,\n            value: ['album', 'camera']\n          },\n          maxSize: {\n            type: Number,\n            value: 5 * 1024 * 1024\n          },\n          maxCount: {\n            type: Number,\n            value: 1\n          },\n          files: {\n            type: Array,\n            value: [],\n            observer: function observer(newVal) {\n              this.setData({\n                currentFiles: newVal\n              })\n            }\n          },\n          select: {\n            type: Function,\n            value: function value() {}\n          },\n          upload: {\n            type: Function,\n            value: null\n          },\n          tips: {\n            type: String,\n            value: ''\n          },\n          extClass: {\n            type: String,\n            value: ''\n          },\n          showDelete: {\n            type: Boolean,\n            value: true\n          }\n        },\n        data: {\n          currentFiles: [],\n          showPreview: false,\n          previewImageUrls: []\n        },\n        ready: function ready() {},\n\n        methods: {\n          previewImage: function previewImage(e) {\n            const index = e.currentTarget.dataset.index\n\n            const previewImageUrls = []\n            this.data.files.map(function (item) {\n              previewImageUrls.push(item.url)\n            })\n            this.setData({\n              previewImageUrls,\n              previewCurrent: index,\n              showPreview: true\n            })\n          },\n          chooseImage: function chooseImage() {\n            const _this = this\n\n            if (this.uploading) return\n            wx.chooseImage({\n              count: this.data.maxCount - this.data.files.length,\n              success: function success(res) {\n                let invalidIndex = -1\n                res.tempFiles.forEach(function (item, index) {\n                  if (item.size > _this.data.maxSize) {\n                    invalidIndex = index\n                  }\n                })\n                if (typeof _this.data.select === 'function') {\n                  const ret = _this.data.select(res)\n                  if (ret === false) {\n                    return\n                  }\n                }\n                if (invalidIndex >= 0) {\n                  _this.triggerEvent('fail', {\n                    type: 1, errMsg: 'chooseImage:fail size exceed ' + _this.data.maxSize, total: res.tempFilePaths.length, index: invalidIndex\n                  }, {})\n                  return\n                }\n                const mgr = wx.getFileSystemManager()\n                const contents = res.tempFilePaths.map(function (item) {\n                  const fileContent = mgr.readFileSync(item)\n                  return fileContent\n                })\n                const obj = { tempFilePaths: res.tempFilePaths, tempFiles: res.tempFiles, contents }\n                _this.triggerEvent('select', obj, {})\n                const files = res.tempFilePaths.map(function (item, i) {\n                  return { loading: true, url: 'data:image/jpg;base64,' + wx.arrayBufferToBase64(contents[i]) }\n                })\n                if (!files || !files.length) return\n                if (typeof _this.data.upload === 'function') {\n                  const len = _this.data.files.length\n                  const newFiles = _this.data.files.concat(files)\n                  _this.setData({ files: newFiles, currentFiles: newFiles })\n                  _this.loading = true\n                  _this.data.upload(obj).then(function (json) {\n                    _this.loading = false\n                    if (json.urls) {\n                      const oldFiles = _this.data.files\n                      json.urls.forEach(function (url, index) {\n                        oldFiles[len + index].url = url\n                        oldFiles[len + index].loading = false\n                      })\n                      _this.setData({ files: oldFiles, currentFiles: newFiles })\n                      _this.triggerEvent('success', json, {})\n                    } else {\n                      _this.triggerEvent('fail', { type: 3, errMsg: 'upload file fail, urls not found' }, {})\n                    }\n                  }).catch(function (err) {\n                    _this.loading = false\n                    const oldFiles = _this.data.files\n                    res.tempFilePaths.map(function (item, index) {\n                      oldFiles[len + index].error = true\n                      oldFiles[len + index].loading = false\n                    })\n                    _this.setData({ files: oldFiles, currentFiles: newFiles })\n                    _this.triggerEvent('fail', { type: 3, errMsg: 'upload file fail', error: err }, {})\n                  })\n                }\n              },\n              fail: function fail(_fail) {\n                if (_fail.errMsg.indexOf('chooseImage:fail cancel') >= 0) {\n                  _this.triggerEvent('cancel', {}, {})\n                  return\n                }\n                _fail.type = 2\n                _this.triggerEvent('fail', _fail, {})\n              }\n            })\n          },\n          deletePic: function deletePic(e) {\n            const index = e.detail.index\n            const files = this.data.files\n            const file = files.splice(index, 1)\n            this.setData({\n              files,\n              currentFiles: files\n            })\n            this.triggerEvent('delete', { index, item: file[0] })\n          }\n        }\n      })\n      /***/ })\n\n    /** *** */ }))\n"
  },
  {
    "path": "miniprogram/packageExtend/components/uploader/uploader.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"mp-gallery\": \"../gallery/gallery\"\n  },\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/uploader/uploader.wxml",
    "content": "<view class=\"weui-uploader {{extClass}}\">\n    <view class=\"weui-uploader__hd\">\n      <view class=\"weui-uploader__overview\">\n          <view class=\"weui-uploader__title\">{{title}}</view>\n          <view class=\"weui-uploader__info\" wx:if=\"{{maxCount > 1}}\">{{currentFiles.length}}/{{maxCount}}</view>\n\n      </view>\n        <view wx:if=\"{{tips}}\" class=\"weui-uploader__tips\">{{tips}}</view>\n        <view wx:else><slot name=\"tips\"></slot></view>\n    </view>\n    <view class=\"weui-uploader__bd\">\n        <view class=\"weui-uploader__files\">\n            <block wx:for=\"{{currentFiles}}\" wx:key=\"*this\">\n                <view wx:if=\"{{item.error}}\" data-index=\"{{index}}\" bindtap=\"previewImage\" class=\"weui-uploader__file weui-uploader__file_status\">\n                    <image class=\"weui-uploader__img\" src=\"{{item.url}}\" mode=\"aspectFill\" />\n                    <view class=\"weui-uploader__file-content\">\n                        <icon type=\"warn\" size=\"23\" color=\"#F43530\"></icon>\n                    </view>\n                </view>\n                <view wx:elif=\"{{item.loading}}\" data-index=\"{{index}}\" bindtap=\"previewImage\" class=\"weui-uploader__file weui-uploader__file_status\">\n                    <image class=\"weui-uploader__img\" src=\"{{item.url}}\" mode=\"aspectFill\" />\n                    <view class=\"weui-uploader__file-content\">\n                    <view class=\"weui-loading\"></view>\n                    </view>\n                </view>\n                <view wx:else class=\"weui-uploader__file\" data-index=\"{{index}}\" bindtap=\"previewImage\">\n                    <image class=\"weui-uploader__img\" src=\"{{item.url}}\" mode=\"aspectFill\" />\n                </view>\n            </block>\n        </view>\n        <view wx:if=\"{{currentFiles.length < maxCount}}\" class=\"weui-uploader__input-box\">\n            <view class=\"weui-uploader__input\" bindtap=\"chooseImage\"></view>\n        </view>\n    </view>\n</view>\n<mp-gallery hide-on-click=\"{{true}}\" show-delete=\"{{showDelete}}\" show=\"{{showPreview}}\" binddelete=\"deletePic\" img-urls=\"{{previewImageUrls}}\" current=\"{{previewCurrent}}\"></mp-gallery>\n"
  },
  {
    "path": "miniprogram/packageExtend/components/uploader/uploader.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageExtend/components/video-swiper/video-swiper.js",
    "content": "Component({\n  behaviors: [],\n  options: {\n    pureDataPattern: /^_/\n  },\n  properties: {\n    duration: {\n      type: Number,\n      value: 500\n    },\n    easingFunction: {\n      type: String,\n      value: 'default'\n    },\n    loop: {\n      type: Boolean,\n      value: false,\n    },\n    videoList: {\n      type: Array,\n      value: [],\n      observer: function observer(...args) {\n        const newVal = args.length > 0 && args[0] !== undefined ? args[0] : []\n        console.log(newVal)\n        this._videoListChanged(newVal)\n      }\n    }\n  },\n  data: {\n    nextQueue: [],\n    prevQueue: [],\n    curQueue: [],\n    circular: false,\n    _last: 1,\n    _change: -1,\n    _invalidUp: 0,\n    _invalidDown: 0,\n    _videoContexts: []\n  },\n  lifetimes: {\n    attached() {\n      this.data._videoContexts = [\n        wx.createVideoContext('video_0', this), wx.createVideoContext('video_1', this), wx.createVideoContext('video_2', this)]\n    },\n  },\n  methods: {\n    _videoListChanged(newVal) {\n      const _this = this\n      const data = this.data\n      newVal.forEach(function (item) {\n        data.nextQueue.push(item)\n      })\n      if (data.curQueue.length === 0) {\n        this.setData({\n          curQueue: data.nextQueue.splice(0, 3)\n        }, function () {\n          _this.playCurrent(0)\n        })\n      }\n    },\n\n    animationfinish(e) {\n      const _data = this.data\n      const _last = _data._last\n      const _change = _data._change\n      const curQueue = _data.curQueue\n      const prevQueue = _data.prevQueue\n      const nextQueue = _data.nextQueue\n      const current = e.detail.current\n      const diff = current - _last\n      if (diff === 0) return\n      this.data._last = current\n      this.playCurrent(current)\n      this.triggerEvent('change', { activeId: curQueue[current].id })\n      const direction = diff === 1 || diff === -2 ? 'up' : 'down'\n      if (direction === 'up') {\n        console.log(this.data)\n        if (this.data._invalidDown === 0) {\n          const change = (_change + 1) % 3\n          const add = nextQueue.shift()\n          const remove = curQueue[change]\n          if (add) {\n            prevQueue.push(remove)\n            curQueue[change] = add\n            this.data._change = change\n          } else {\n            this.data._invalidUp += 1\n          }\n        } else {\n          this.data._invalidDown -= 1\n        }\n      }\n      if (direction === 'down') {\n        if (this.data._invalidUp === 0) {\n          const _change2 = _change\n          const _remove = curQueue[_change2]\n          const _add = prevQueue.pop()\n          if (_add) {\n            curQueue[_change2] = _add\n            nextQueue.unshift(_remove)\n            this.data._change = (_change2 - 1 + 3) % 3\n          } else {\n            this.data._invalidDown += 1\n          }\n        } else {\n          this.data._invalidUp -= 1\n        }\n      }\n      let circular = true\n      if (nextQueue.length === 0 && current !== 0) {\n        circular = false\n      }\n      if (prevQueue.length === 0 && current !== 2) {\n        circular = false\n      }\n      this.setData({\n        curQueue,\n        circular\n      })\n    },\n\n    playCurrent(current) {\n      this.data._videoContexts.forEach(function (ctx, index) {\n        if (index !== current) {\n          ctx.pause()\n        } else {\n          ctx.play()\n        }\n      })\n    },\n    onPlay: function onPlay(e) {\n      this.trigger(e, 'play')\n    },\n    onPause: function onPause(e) {\n      this.trigger(e, 'pause')\n    },\n    onEnded: function onEnded(e) {\n      this.trigger(e, 'ended')\n    },\n    onError: function onError(e) {\n      this.trigger(e, 'error')\n    },\n    onTimeUpdate: function onTimeUpdate(e) {\n      this.trigger(e, 'timeupdate')\n    },\n    onWaiting: function onWaiting(e) {\n      this.trigger(e, 'wait')\n    },\n    onProgress: function onProgress(e) {\n      this.trigger(e, 'progress')\n    },\n    onLoadedMetaData: function onLoadedMetaData(e) {\n      this.trigger(e, 'loadedmetadata')\n    },\n    trigger: function trigger(e, type, ...args) {\n      const ext = args.length > 2 && args[2] !== undefined ? args[2] : {}\n\n      const detail = e.detail\n      const activeId = e.target.dataset.id\n      this.triggerEvent(type, { ...detail, activeId, ...ext })\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/components/video-swiper/video-swiper.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/video-swiper/video-swiper.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <swiper \n    class=\"video-swiper\" \n    circular=\"{{circular}}\" \n    easing-function=\"{{easingFunction}}\" \n    vertical \n    current=\"1\"\n    duration=\"{{duration}}\" \n    bindanimationfinish=\"animationfinish\">\n    <!-- curQueue 循环会导致video重新插入，objectFit 不可变更 -->\n    <swiper-item wx:for=\"{{curQueue}}\" wx:key=\"*this\">\n      <video \n        id=\"video_{{index}}\" \n        class=\"video_item\" \n        loop=\"{{loop}}\" \n        enable-play-gesture \n        enable-progress-gesture \n        show-center-play-btn=\"{{false}}\"\n        controls=\"{{false}}\"\n        src=\"{{item.url}}\" \n        data-id=\"{{item.id}}\"\n        object-fit=\"{{item.objectFit || 'cover'}}\"\n        data-index=\"{{index}}\"\n        bindplay=\"onPlay\"\n        bindpause=\"onPause\"\n        bindended=\"onEnded\"\n        binderror=\"onError\"\n        bindtimeupdate=\"onTimeUpdate\"\n        bindwaiting=\"onWaiting\"\n        bindprogress=\"onProgress\"\n        bindloadedmetadata=\"onLoadedMetaData\"\n      >\n      </video>\n    </swiper-item>\n  </swiper>\n</view>\n\n"
  },
  {
    "path": "miniprogram/packageExtend/components/video-swiper/video-swiper.wxss",
    "content": ".container {\n  width: 100%;\n  height: 100%\n}\n\n.video-swiper {\n  width: 100%;\n  height: 100%\n}\n\n.video_item {\n  height: 100%;\n  width: 100%\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/vtabs/vtabs.js",
    "content": "Component({\n  options: {\n    pureDataPattern: /^_/,\n    multipleSlots: true\n  },\n  properties: {\n    vtabs: { type: Array, value: [] },\n    tabBarClass: { type: String, value: '' },\n    activeClass: { type: String, value: '' },\n    tabBarLineColor: { type: String, value: '#07c160' },\n    tabBarInactiveTextColor: { type: String, value: '#000000' },\n    tabBarActiveTextColor: { type: String, value: '#07c160' },\n    tabBarInactiveBgColor: { type: String, value: '#eeeeee' },\n    tabBarActiveBgColor: { type: String, value: '#ffffff' },\n    activeTab: { type: Number, value: 0 },\n    animation: { type: Boolean, value: true }\n  },\n  data: {\n    currentView: 0,\n    contentScrollTop: 0,\n    _heightRecords: [],\n    _contentHeight: {}\n  },\n  observers: {\n    activeTab: function activeTab(_activeTab) {\n      this.scrollTabBar(_activeTab)\n    }\n  },\n  relations: {\n    '../vtabs-content/vtabs-content': {\n      type: 'child',\n      linked: function linked(target) {\n        const _this = this\n\n        target.calcHeight(function (rect) {\n          _this.data._contentHeight[target.data.tabIndex] = rect.height\n          if (_this._calcHeightTimer) {\n            clearTimeout(_this._calcHeightTimer)\n          }\n          _this._calcHeightTimer = setTimeout(function () {\n            _this.calcHeight()\n          }, 100)\n        })\n      },\n      unlinked: function unlinked(target) {\n        delete this.data._contentHeight[target.data.tabIndex]\n      }\n    }\n  },\n  lifetimes: {\n    attached: function attached() {}\n  },\n  methods: {\n    calcHeight: function calcHeight() {\n      const length = this.data.vtabs.length\n      const _contentHeight = this.data._contentHeight\n      const _heightRecords = []\n      let temp = 0\n      for (let i = 0; i < length; i++) {\n        _heightRecords[i] = temp + (_contentHeight[i] || 0)\n        temp = _heightRecords[i]\n      }\n      this.data._heightRecords = _heightRecords\n    },\n    scrollTabBar: function scrollTabBar(index) {\n      const len = this.data.vtabs.length\n      if (len === 0) return\n      let currentView = index < 6 ? 0 : index - 5\n      if (currentView >= len) currentView = len - 1\n      this.setData({ currentView })\n    },\n    handleTabClick: function handleTabClick(e) {\n      const _heightRecords = this.data._heightRecords\n      const index = e.currentTarget.dataset.index\n      const contentScrollTop = _heightRecords[index - 1] || 0\n      this.triggerEvent('tabclick', { index })\n      this.setData({\n        activeTab: index,\n        contentScrollTop\n      })\n    },\n    handleContentScroll: function handleContentScroll(e) {\n      const _heightRecords = this.data._heightRecords\n      if (_heightRecords.length === 0) return\n      const length = this.data.vtabs.length\n      const scrollTop = e.detail.scrollTop\n      let index = 0\n      if (scrollTop >= _heightRecords[0]) {\n        for (let i = 1; i < length; i++) {\n          if (scrollTop >= _heightRecords[i - 1] && scrollTop < _heightRecords[i]) {\n            index = i\n            break\n          }\n        }\n      }\n      if (index !== this.data.activeTab) {\n        this.triggerEvent('change', { index })\n        this.setData({ activeTab: index })\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/components/vtabs/vtabs.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/vtabs/vtabs.wxml",
    "content": "\n\n<view class=\"weui-vtabs\">\n  <view class=\"weui-vtabs-bar__wrp {{tabBarClass}}\">\n    <scroll-view \n      scroll-y\n      class=\"weui-vtabs-bar__scrollview\"\n      scroll-into-view=\"weui-vtabs-item__{{currentView}}\"\n    >\n      <view class=\"weui-vtabs-bar__content\">\n        <block wx:for=\"{{vtabs}}\" wx:key=\"title\">\n          <view \n            id=\"weui-vtabs-item__{{index}}\"\n            class=\"{{activeTab === index ? 'weui-vtabs-bar__activeitem' : ''}} weui-vtabs-bar__item\"\n            data-index=\"{{index}}\"\n\n            bindtap=\"handleTabClick\"\n          >\n            <view class=\"weui-vtabs-bar__title {{activeTab === index ? activeClass : ''}}\">\n              <text class=\"\">{{item.title}}</text>\n            </view>\n          </view>\n        </block>\n      </view>\n    </scroll-view>\n  </view>\n  <view class=\"weui-vtabs-content__wrp\">\n    <scroll-view \n      scroll-y\n      class=\"weui-vtabs-content__scrollview\" \n      scroll-top=\"{{contentScrollTop}}\"\n      scroll-with-animation=\"{{animation}}\"\n      bindscroll=\"handleContentScroll\"\n    >\n      <view class=\"weui-vtabs-content\">\n        <slot ></slot>\n      </view>\n    </scroll-view>\n  </view>\n</view>\n<!-- \n            style=\"background-color: {{activeTab === index ? tabBarActiveBgColor : tabBarInactiveBgColor}}; color: {{activeTab === index ? tabBarActiveTextColor : tabBarInactiveTextColor}}; border-left-color: {{activeTab === index ? tabBarLineColor : tabBarInactiveBgColor}}\" -->"
  },
  {
    "path": "miniprogram/packageExtend/components/vtabs/vtabs.wxss",
    "content": ".weui-vtabs {\n  width: 100%;\n  height: 100%;\n  display: flex\n}\n\n.weui-vtabs-bar__wrp {\n  width: 110px;\n  height: 100%;\n  background: #eeeeee;\n}\n\n.weui-vtabs-bar__scrollview {\n  height: 100%\n}\n\n.weui-vtabs-bar__content {\n  width: 110px;\n  height: 100%\n}\n\n.weui-vtabs-bar__item {\n  display: inline-block;\n  width: 110px;\n  height: 55px;\n  border-left: 4px solid transparent\n}\n\n.weui-vtabs-bar__title {\n  box-sizing: border-box;\n  width: 100%;\n  height: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 14px;\n  white-space: nowrap;\n  overflow: hidden\n}\n\n.weui-vtabs-content__wrp {\n  overflow: hidden;\n  flex: 1;\n  height: 100%\n}\n\n.weui-vtabs-content__scrollview {\n  height: 100%\n}\n\n.weui-vtabs-content {\n  height: 100%\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/vtabs-content/vtabs-content.js",
    "content": "Component({\n  options: {\n    multipleSlots: true\n  },\n  properties: {\n    tabIndex: {\n      type: Number,\n      value: 0\n    }\n  },\n  relations: {\n    '../vtabs/vtabs': {\n      type: 'parent'\n    }\n  },\n  lifetimes: {\n    attached: function attached() {}\n  },\n  methods: {\n    calcHeight: function calcHeight(callback) {\n      const query = this.createSelectorQuery()\n      query.select('.weui-vtabs-content__item').boundingClientRect(function (rect) {\n        callback && callback(rect)\n      }).exec()\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/components/vtabs-content/vtabs-content.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"styleIsolation\": \"apply-shared\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/components/vtabs-content/vtabs-content.wxml",
    "content": "<view class=\"weui-vtabs-content__item\" id=\"weui-vtabs-content__{{tabIndex}}\">\n  <slot ></slot>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/components/vtabs-content/vtabs-content.wxss",
    "content": ".weui-tabs-content__item {\n  width: 100%;\n  height: 100%\n}"
  },
  {
    "path": "miniprogram/packageExtend/components/weui-wxss/dist/style/icon/weui-icon.wxss",
    "content": "/*!\n * WeUI v2.3.0 (https://github.com/weui/weui-wxss)\n * Copyright 2020 Tencent, Inc.\n * Licensed under the MIT license\n */\n[data-weui-theme=light],page{--weui-BG-0:#ededed;--weui-BG-1:#f7f7f7;--weui-BG-2:#fff;--weui-BG-3:#f7f7f7;--weui-BG-4:#4c4c4c;--weui-BG-5:#fff;--weui-FG-0:rgba(0,0,0,.9);--weui-FG-HALF:rgba(0,0,0,.9);--weui-FG-1:rgba(0,0,0,.5);--weui-FG-2:rgba(0,0,0,.3);--weui-FG-3:rgba(0,0,0,.1);--weui-RED:#fa5151;--weui-ORANGE:#fa9d3b;--weui-YELLOW:#ffc300;--weui-GREEN:#91d300;--weui-LIGHTGREEN:#95ec69;--weui-BRAND:#07c160;--weui-BLUE:#10aeff;--weui-INDIGO:#1485ee;--weui-PURPLE:#6467f0;--weui-WHITE:#fff;--weui-LINK:#576b95;--weui-TEXTGREEN:#06ae56;--weui-FG:#000;--weui-BG:#fff;--weui-TAG-TEXT-ORANGE:#fa9d3b;--weui-TAG-BACKGROUND-ORANGE:rgba(250,157,59,.1);--weui-TAG-TEXT-GREEN:#06ae56;--weui-TAG-BACKGROUND-GREEN:rgba(6,174,86,.1);--weui-TAG-TEXT-BLUE:#10aeff;--weui-TAG-BACKGROUND-BLUE:rgba(16,174,255,.1);--weui-TAG-TEXT-BLACK:rgba(0,0,0,.5);--weui-TAG-BACKGROUND-BLACK:rgba(0,0,0,.05)}[data-weui-theme=dark]{--weui-BG-0:#191919;--weui-BG-1:#1f1f1f;--weui-BG-2:#232323;--weui-BG-3:#2f2f2f;--weui-BG-4:#606060;--weui-BG-5:#2c2c2c;--weui-FG-0:hsla(0,0%,100%,.8);--weui-FG-HALF:hsla(0,0%,100%,.6);--weui-FG-1:hsla(0,0%,100%,.5);--weui-FG-2:hsla(0,0%,100%,.3);--weui-FG-3:hsla(0,0%,100%,.05);--weui-RED:#fa5151;--weui-ORANGE:#c87d2f;--weui-YELLOW:#cc9c00;--weui-GREEN:#74a800;--weui-LIGHTGREEN:#28b561;--weui-BRAND:#07c160;--weui-BLUE:#10aeff;--weui-INDIGO:#1196ff;--weui-PURPLE:#8183ff;--weui-WHITE:hsla(0,0%,100%,.8);--weui-LINK:#7d90a9;--weui-TEXTGREEN:#259c5c;--weui-FG:#fff;--weui-BG:#000;--weui-TAG-TEXT-ORANGE:rgba(250,157,59,.6);--weui-TAG-BACKGROUND-ORANGE:rgba(250,157,59,.1);--weui-TAG-TEXT-GREEN:rgba(6,174,86,.6);--weui-TAG-BACKGROUND-GREEN:rgba(6,174,86,.1);--weui-TAG-TEXT-BLUE:rgba(16,174,255,.6);--weui-TAG-BACKGROUND-BLUE:rgba(16,174,255,.1);--weui-TAG-TEXT-BLACK:hsla(0,0%,100%,.5);--weui-TAG-BACKGROUND-BLACK:hsla(0,0%,100%,.05)}[data-weui-theme=light],page{--weui-BG-COLOR-ACTIVE:#ececec}[data-weui-theme=dark]{--weui-BG-COLOR-ACTIVE:#373737}[class*=\" weui-icon-\"],[class^=weui-icon-]{display:inline-block;vertical-align:middle;width:24px;height:24px;-webkit-mask-position:50% 50%;mask-position:50% 50%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100%;mask-size:100%;background-color:currentColor}.weui-icon-circle{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-download{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M11.25%2012.04l-1.72-1.72-1.06%201.06%202.828%202.83a1%201%200%20001.414-.001l2.828-2.828-1.06-1.061-1.73%201.73V7h-1.5v5.04zm0-5.04V2h1.5v5h6.251c.55%200%20.999.446.999.996v13.008a.998.998%200%2001-.996.996H4.996A.998.998%200%20014%2021.004V7.996A1%201%200%20014.999%207h6.251z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M11.25%2012.04l-1.72-1.72-1.06%201.06%202.828%202.83a1%201%200%20001.414-.001l2.828-2.828-1.06-1.061-1.73%201.73V7h-1.5v5.04zm0-5.04V2h1.5v5h6.251c.55%200%20.999.446.999.996v13.008a.998.998%200%2001-.996.996H4.996A.998.998%200%20014%2021.004V7.996A1%201%200%20014.999%207h6.251z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-info{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.75-12v7h1.5v-7h-1.5zM12%209a1%201%200%20100-2%201%201%200%20000%202z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.75-12v7h1.5v-7h-1.5zM12%209a1%201%200%20100-2%201%201%200%20000%202z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-safe-success{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.6C315.5%2046.7%20180.4%2093.1%2057.6%20132c0%20129.3.2%20231.7.2%20339.7%200%20304.2%20248.3%20471.6%20443.1%20523.7C695.7%20943.3%20944%20775.9%20944%20471.7c0-108%20.2-210.4.2-339.7C821.4%2093.1%20686.3%2046.7%20500.9%204.6zm248.3%20349.1l-299.7%20295c-2.1%202-5.3%202-7.4-.1L304.4%20506.1c-2-2.1-2.3-5.7-.6-8l18.3-24.9c1.7-2.3%205-2.8%207.2-1l112.2%2086c2.3%201.8%206%201.7%208.1-.1l274.7-228.9c2.2-1.8%205.7-1.7%207.7.3l17%2016.8c2.2%202.1%202.2%205.3.2%207.4z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23070202%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.6C315.5%2046.7%20180.4%2093.1%2057.6%20132c0%20129.3.2%20231.7.2%20339.7%200%20304.2%20248.3%20471.6%20443.1%20523.7C695.7%20943.3%20944%20775.9%20944%20471.7c0-108%20.2-210.4.2-339.7C821.4%2093.1%20686.3%2046.7%20500.9%204.6zm248.3%20349.1l-299.7%20295c-2.1%202-5.3%202-7.4-.1L304.4%20506.1c-2-2.1-2.3-5.7-.6-8l18.3-24.9c1.7-2.3%205-2.8%207.2-1l112.2%2086c2.3%201.8%206%201.7%208.1-.1l274.7-228.9c2.2-1.8%205.7-1.7%207.7.3l17%2016.8c2.2%202.1%202.2%205.3.2%207.4z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23070202%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-safe-warn{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.5c-185.4%2042-320.4%2088.4-443.2%20127.3%200%20129.3.2%20231.7.2%20339.6%200%20304.1%20248.2%20471.4%20443%20523.6%20194.7-52.2%20443-219.5%20443-523.6%200-107.9.2-210.3.2-339.6C821.3%2092.9%20686.2%2046.5%20500.9%204.5zm-26.1%20271.1h52.1c5.8%200%2010.3%204.7%2010.1%2010.4l-11.6%20313.8c-.1%202.8-2.5%205.2-5.4%205.2h-38.2c-2.9%200-5.3-2.3-5.4-5.2L464.8%20286c-.2-5.8%204.3-10.4%2010-10.4zm26.1%20448.3c-20.2%200-36.5-16.3-36.5-36.5s16.3-36.5%2036.5-36.5%2036.5%2016.3%2036.5%2036.5-16.4%2036.5-36.5%2036.5z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23020202%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.5c-185.4%2042-320.4%2088.4-443.2%20127.3%200%20129.3.2%20231.7.2%20339.6%200%20304.1%20248.2%20471.4%20443%20523.6%20194.7-52.2%20443-219.5%20443-523.6%200-107.9.2-210.3.2-339.6C821.3%2092.9%20686.2%2046.5%20500.9%204.5zm-26.1%20271.1h52.1c5.8%200%2010.3%204.7%2010.1%2010.4l-11.6%20313.8c-.1%202.8-2.5%205.2-5.4%205.2h-38.2c-2.9%200-5.3-2.3-5.4-5.2L464.8%20286c-.2-5.8%204.3-10.4%2010-10.4zm26.1%20448.3c-20.2%200-36.5-16.3-36.5-36.5s16.3-36.5%2036.5-36.5%2036.5%2016.3%2036.5%2036.5-16.4%2036.5-36.5%2036.5z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23020202%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-success{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-success-circle{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm-1.172-6.242l5.809-5.808.848.849-5.95%205.95a1%201%200%2001-1.414%200L7%2012.426l.849-.849%202.98%202.98z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm-1.172-6.242l5.809-5.808.848.849-5.95%205.95a1%201%200%2001-1.414%200L7%2012.426l.849-.849%202.98%202.98z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-success-no-circle{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-waiting{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.75%2011.38V6h-1.5v6l4.243%204.243%201.06-1.06-3.803-3.804zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.75%2011.38V6h-1.5v6l4.243%204.243%201.06-1.06-3.803-3.804zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-waiting-circle{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.6%2011.503l3.891%203.891-.848.849L11.4%2012V6h1.2v5.503zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.6%2011.503l3.891%203.891-.848.849L11.4%2012V6h1.2v5.503zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-warn{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.763-15.864l.11%207.596h1.305l.11-7.596h-1.525zm.759%2010.967c.512%200%20.902-.383.902-.882%200-.5-.39-.882-.902-.882a.878.878%200%2000-.896.882c0%20.499.396.882.896.882z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.763-15.864l.11%207.596h1.305l.11-7.596h-1.525zm.759%2010.967c.512%200%20.902-.383.902-.882%200-.5-.39-.882-.902-.882a.878.878%200%2000-.896.882c0%20.499.396.882.896.882z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-info-circle{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zM11.4%2010h1.2v7h-1.2v-7zm.6-1a1%201%200%20110-2%201%201%200%20010%202z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zM11.4%2010h1.2v7h-1.2v-7zm.6-1a1%201%200%20110-2%201%201%200%20010%202z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-cancel{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%20fill-rule%3D%22nonzero%22%2F%3E%3Cpath%20d%3D%22M12.849%2012l3.11%203.111-.848.849L12%2012.849l-3.111%203.11-.849-.848L11.151%2012l-3.11-3.111.848-.849L12%2011.151l3.111-3.11.849.848L12.849%2012z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%20fill-rule%3D%22nonzero%22%2F%3E%3Cpath%20d%3D%22M12.849%2012l3.11%203.111-.848.849L12%2012.849l-3.111%203.11-.849-.848L11.151%2012l-3.11-3.111.848-.849L12%2011.151l3.111-3.11.849.848L12.849%2012z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E)}.weui-icon-search{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M16.31%2015.561l4.114%204.115-.848.848-4.123-4.123a7%207%200%2011.857-.84zM16.8%2011a5.8%205.8%200%2010-11.6%200%205.8%205.8%200%200011.6%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M16.31%2015.561l4.114%204.115-.848.848-4.123-4.123a7%207%200%2011.857-.84zM16.8%2011a5.8%205.8%200%2010-11.6%200%205.8%205.8%200%200011.6%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-clear{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M13.06%2012l3.006-3.005-1.06-1.06L12%2010.938%208.995%207.934l-1.06%201.06L10.938%2012l-3.005%203.005%201.06%201.06L12%2013.062l3.005%203.005%201.06-1.06L13.062%2012zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M13.06%2012l3.006-3.005-1.06-1.06L12%2010.938%208.995%207.934l-1.06%201.06L10.938%2012l-3.005%203.005%201.06%201.06L12%2013.062l3.005%203.005%201.06-1.06L13.062%2012zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-back{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm1.999-6.563L10.68%2012%2014%208.562%2012.953%207.5%209.29%2011.277a1.045%201.045%200%20000%201.446l3.663%203.777L14%2015.437z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm1.999-6.563L10.68%2012%2014%208.562%2012.953%207.5%209.29%2011.277a1.045%201.045%200%20000%201.446l3.663%203.777L14%2015.437z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-delete{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M6.774%206.4l.812%2013.648a.8.8%200%2000.798.752h7.232a.8.8%200%2000.798-.752L17.226%206.4H6.774zm11.655%200l-.817%2013.719A2%202%200%200115.616%2022H8.384a2%202%200%2001-1.996-1.881L5.571%206.4H3.5v-.7a.5.5%200%2001.5-.5h16a.5.5%200%2001.5.5v.7h-2.071zM14%203a.5.5%200%2001.5.5v.7h-5v-.7A.5.5%200%200110%203h4zM9.5%209h1.2l.5%209H10l-.5-9zm3.8%200h1.2l-.5%209h-1.2l.5-9z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M6.774%206.4l.812%2013.648a.8.8%200%2000.798.752h7.232a.8.8%200%2000.798-.752L17.226%206.4H6.774zm11.655%200l-.817%2013.719A2%202%200%200115.616%2022H8.384a2%202%200%2001-1.996-1.881L5.571%206.4H3.5v-.7a.5.5%200%2001.5-.5h16a.5.5%200%2001.5.5v.7h-2.071zM14%203a.5.5%200%2001.5.5v.7h-5v-.7A.5.5%200%200110%203h4zM9.5%209h1.2l.5%209H10l-.5-9zm3.8%200h1.2l-.5%209h-1.2l.5-9z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-success-no-circle-thin{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.864%2016.617l-5.303-5.303-1.061%201.06%205.657%205.657a1%201%200%20001.414%200L21.238%206.364l-1.06-1.06L8.864%2016.616z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.864%2016.617l-5.303-5.303-1.061%201.06%205.657%205.657a1%201%200%20001.414%200L21.238%206.364l-1.06-1.06L8.864%2016.616z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-arrow{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-arrow-bold{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20height%3D%2224%22%20width%3D%2212%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10.157%2012.711L4.5%2018.368l-1.414-1.414%204.95-4.95-4.95-4.95L4.5%205.64l5.657%205.657a1%201%200%20010%201.414z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20height%3D%2224%22%20width%3D%2212%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10.157%2012.711L4.5%2018.368l-1.414-1.414%204.95-4.95-4.95-4.95L4.5%205.64l5.657%205.657a1%201%200%20010%201.414z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-back-arrow{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M3.343%2012l7.071%207.071L9%2020.485l-7.778-7.778a1%201%200%20010-1.414L9%203.515l1.414%201.414L3.344%2012z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M3.343%2012l7.071%207.071L9%2020.485l-7.778-7.778a1%201%200%20010-1.414L9%203.515l1.414%201.414L3.344%2012z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-back-arrow-thin{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-close{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2010.586l5.657-5.657%201.414%201.414L13.414%2012l5.657%205.657-1.414%201.414L12%2013.414l-5.657%205.657-1.414-1.414L10.586%2012%204.929%206.343%206.343%204.93%2012%2010.586z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2010.586l5.657-5.657%201.414%201.414L13.414%2012l5.657%205.657-1.414%201.414L12%2013.414l-5.657%205.657-1.414-1.414L10.586%2012%204.929%206.343%206.343%204.93%2012%2010.586z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-close-thin{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-back-circle{-webkit-mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm1.999-5.363L12.953%2016.5%209.29%2012.723a1.045%201.045%200%20010-1.446L12.953%207.5%2014%208.563%2010.68%2012%2014%2015.438z%22%2F%3E%3C%2Fsvg%3E);mask-image:url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm1.999-5.363L12.953%2016.5%209.29%2012.723a1.045%201.045%200%20010-1.446L12.953%207.5%2014%208.563%2010.68%2012%2014%2015.438z%22%2F%3E%3C%2Fsvg%3E)}.weui-icon-success{color:var(--weui-BRAND)}.weui-icon-waiting{color:var(--weui-BLUE)}.weui-icon-warn{color:var(--weui-RED)}.weui-icon-info{color:var(--weui-BLUE)}.weui-icon-success-circle,.weui-icon-success-no-circle,.weui-icon-success-no-circle-thin{color:var(--weui-BRAND)}.weui-icon-waiting-circle{color:var(--weui-BLUE)}.weui-icon-circle{color:var(--weui-FG-2)}.weui-icon-download{color:var(--weui-BRAND)}.weui-icon-info-circle{color:var(--weui-FG-2)}.weui-icon-safe-success{color:var(--weui-BRAND)}.weui-icon-safe-warn{color:var(--weui-YELLOW)}.weui-icon-cancel{color:var(--weui-RED)}.weui-icon-search{color:var(--weui-FG-1)}.weui-icon-clear{color:var(--weui-FG-2)}.weui-icon-clear:active{color:var(--weui-FG-1)}.weui-icon-delete.weui-icon_gallery-delete{color:var(--weui-WHITE)}.weui-icon-arrow,.weui-icon-arrow-bold,.weui-icon-back-arrow,.weui-icon-back-arrow-thin{width:12px}.weui-icon-arrow,.weui-icon-arrow-bold{color:var(--weui-FG-2)}.weui-icon-back,.weui-icon-back-arrow,.weui-icon-back-arrow-thin,.weui-icon-back-circle{color:var(--weui-FG-0)}.weui-icon_msg{width:64px;height:64px}.weui-icon_msg.weui-icon-warn{color:var(--weui-RED)}.weui-icon_msg-primary{width:64px;height:64px}.weui-icon_msg-primary.weui-icon-warn{color:var(--weui-YELLOW)}"
  },
  {
    "path": "miniprogram/packageExtend/components/weui-wxss/dist/style/weui.wxss",
    "content": "/*!\n * WeUI v2.3.0 (https://github.com/weui/weui-wxss)\n * Copyright 2020 Tencent, Inc.\n * Licensed under the MIT license\n */\n[data-weui-theme=light],\npage {\n  --weui-BTN-DISABLED-FONT-COLOR: rgba(0, 0, 0, .2)\n}\n\n[data-weui-theme=dark] {\n  --weui-BTN-DISABLED-FONT-COLOR: hsla(0, 0%, 100%, .2)\n}\n\n[data-weui-theme=light],\npage {\n  --weui-BTN-DEFAULT-BG: #f2f2f2\n}\n\n[data-weui-theme=dark] {\n  --weui-BTN-DEFAULT-BG: hsla(0, 0%, 100%, .08)\n}\n\n[data-weui-theme=light],\npage {\n  --weui-BTN-DEFAULT-COLOR: #06ae56\n}\n\n[data-weui-theme=dark] {\n  --weui-BTN-DEFAULT-COLOR: hsla(0, 0%, 100%, .8)\n}\n\n[data-weui-theme=light],\npage {\n  --weui-BTN-DEFAULT-ACTIVE-BG: #e6e6e6\n}\n\n[data-weui-theme=dark] {\n  --weui-BTN-DEFAULT-ACTIVE-BG: hsla(0, 0%, 100%, .126)\n}\n\n[data-weui-theme=light],\npage {\n  --weui-DIALOG-LINE-COLOR: rgba(0, 0, 0, .1)\n}\n\n[data-weui-theme=dark] {\n  --weui-DIALOG-LINE-COLOR: hsla(0, 0%, 100%, .1)\n}\n\npage {\n  line-height: 1.6;\n  font-family: -apple-system-font, Helvetica Neue, sans-serif\n}\n\nicon {\n  vertical-align: middle\n}\n\n[data-weui-theme=light],\npage {\n  --weui-BG-0: #ededed;\n  --weui-BG-1: #f7f7f7;\n  --weui-BG-2: #fff;\n  --weui-BG-3: #f7f7f7;\n  --weui-BG-4: #4c4c4c;\n  --weui-BG-5: #fff;\n  --weui-FG-0: rgba(0, 0, 0, .9);\n  --weui-FG-HALF: rgba(0, 0, 0, .9);\n  --weui-FG-1: rgba(0, 0, 0, .5);\n  --weui-FG-2: rgba(0, 0, 0, .3);\n  --weui-FG-3: rgba(0, 0, 0, .1);\n  --weui-RED: #fa5151;\n  --weui-ORANGE: #fa9d3b;\n  --weui-YELLOW: #ffc300;\n  --weui-GREEN: #91d300;\n  --weui-LIGHTGREEN: #95ec69;\n  --weui-BRAND: #07c160;\n  --weui-BLUE: #10aeff;\n  --weui-INDIGO: #1485ee;\n  --weui-PURPLE: #6467f0;\n  --weui-WHITE: #fff;\n  --weui-LINK: #576b95;\n  --weui-TEXTGREEN: #06ae56;\n  --weui-FG: #000;\n  --weui-BG: #fff;\n  --weui-TAG-TEXT-ORANGE: #fa9d3b;\n  --weui-TAG-BACKGROUND-ORANGE: rgba(250, 157, 59, .1);\n  --weui-TAG-TEXT-GREEN: #06ae56;\n  --weui-TAG-BACKGROUND-GREEN: rgba(6, 174, 86, .1);\n  --weui-TAG-TEXT-BLUE: #10aeff;\n  --weui-TAG-BACKGROUND-BLUE: rgba(16, 174, 255, .1);\n  --weui-TAG-TEXT-BLACK: rgba(0, 0, 0, .5);\n  --weui-TAG-BACKGROUND-BLACK: rgba(0, 0, 0, .05)\n}\n\n[data-weui-theme=dark] {\n  --weui-BG-0: #191919;\n  --weui-BG-1: #1f1f1f;\n  --weui-BG-2: #232323;\n  --weui-BG-3: #2f2f2f;\n  --weui-BG-4: #606060;\n  --weui-BG-5: #2c2c2c;\n  --weui-FG-0: hsla(0, 0%, 100%, .8);\n  --weui-FG-HALF: hsla(0, 0%, 100%, .6);\n  --weui-FG-1: hsla(0, 0%, 100%, .5);\n  --weui-FG-2: hsla(0, 0%, 100%, .3);\n  --weui-FG-3: hsla(0, 0%, 100%, .05);\n  --weui-RED: #fa5151;\n  --weui-ORANGE: #c87d2f;\n  --weui-YELLOW: #cc9c00;\n  --weui-GREEN: #74a800;\n  --weui-LIGHTGREEN: #28b561;\n  --weui-BRAND: #07c160;\n  --weui-BLUE: #10aeff;\n  --weui-INDIGO: #1196ff;\n  --weui-PURPLE: #8183ff;\n  --weui-WHITE: hsla(0, 0%, 100%, .8);\n  --weui-LINK: #7d90a9;\n  --weui-TEXTGREEN: #259c5c;\n  --weui-FG: #fff;\n  --weui-BG: #000;\n  --weui-TAG-TEXT-ORANGE: rgba(250, 157, 59, .6);\n  --weui-TAG-BACKGROUND-ORANGE: rgba(250, 157, 59, .1);\n  --weui-TAG-TEXT-GREEN: rgba(6, 174, 86, .6);\n  --weui-TAG-BACKGROUND-GREEN: rgba(6, 174, 86, .1);\n  --weui-TAG-TEXT-BLUE: rgba(16, 174, 255, .6);\n  --weui-TAG-BACKGROUND-BLUE: rgba(16, 174, 255, .1);\n  --weui-TAG-TEXT-BLACK: hsla(0, 0%, 100%, .5);\n  --weui-TAG-BACKGROUND-BLACK: hsla(0, 0%, 100%, .05)\n}\n\n[data-weui-theme=light],\npage {\n  --weui-BG-COLOR-ACTIVE: #ececec\n}\n\n[data-weui-theme=dark] {\n  --weui-BG-COLOR-ACTIVE: #373737\n}\n\n[class*=\" weui-icon-\"],\n[class^=weui-icon-] {\n  display: inline-block;\n  vertical-align: middle;\n  width: 24px;\n  height: 24px;\n  -webkit-mask-position: 50% 50%;\n  mask-position: 50% 50%;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  background-color: currentColor\n}\n\n.weui-icon-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-download {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M11.25%2012.04l-1.72-1.72-1.06%201.06%202.828%202.83a1%201%200%20001.414-.001l2.828-2.828-1.06-1.061-1.73%201.73V7h-1.5v5.04zm0-5.04V2h1.5v5h6.251c.55%200%20.999.446.999.996v13.008a.998.998%200%2001-.996.996H4.996A.998.998%200%20014%2021.004V7.996A1%201%200%20014.999%207h6.251z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M11.25%2012.04l-1.72-1.72-1.06%201.06%202.828%202.83a1%201%200%20001.414-.001l2.828-2.828-1.06-1.061-1.73%201.73V7h-1.5v5.04zm0-5.04V2h1.5v5h6.251c.55%200%20.999.446.999.996v13.008a.998.998%200%2001-.996.996H4.996A.998.998%200%20014%2021.004V7.996A1%201%200%20014.999%207h6.251z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-info {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.75-12v7h1.5v-7h-1.5zM12%209a1%201%200%20100-2%201%201%200%20000%202z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.75-12v7h1.5v-7h-1.5zM12%209a1%201%200%20100-2%201%201%200%20000%202z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-safe-success {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.6C315.5%2046.7%20180.4%2093.1%2057.6%20132c0%20129.3.2%20231.7.2%20339.7%200%20304.2%20248.3%20471.6%20443.1%20523.7C695.7%20943.3%20944%20775.9%20944%20471.7c0-108%20.2-210.4.2-339.7C821.4%2093.1%20686.3%2046.7%20500.9%204.6zm248.3%20349.1l-299.7%20295c-2.1%202-5.3%202-7.4-.1L304.4%20506.1c-2-2.1-2.3-5.7-.6-8l18.3-24.9c1.7-2.3%205-2.8%207.2-1l112.2%2086c2.3%201.8%206%201.7%208.1-.1l274.7-228.9c2.2-1.8%205.7-1.7%207.7.3l17%2016.8c2.2%202.1%202.2%205.3.2%207.4z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23070202%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.6C315.5%2046.7%20180.4%2093.1%2057.6%20132c0%20129.3.2%20231.7.2%20339.7%200%20304.2%20248.3%20471.6%20443.1%20523.7C695.7%20943.3%20944%20775.9%20944%20471.7c0-108%20.2-210.4.2-339.7C821.4%2093.1%20686.3%2046.7%20500.9%204.6zm248.3%20349.1l-299.7%20295c-2.1%202-5.3%202-7.4-.1L304.4%20506.1c-2-2.1-2.3-5.7-.6-8l18.3-24.9c1.7-2.3%205-2.8%207.2-1l112.2%2086c2.3%201.8%206%201.7%208.1-.1l274.7-228.9c2.2-1.8%205.7-1.7%207.7.3l17%2016.8c2.2%202.1%202.2%205.3.2%207.4z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23070202%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-safe-warn {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.5c-185.4%2042-320.4%2088.4-443.2%20127.3%200%20129.3.2%20231.7.2%20339.6%200%20304.1%20248.2%20471.4%20443%20523.6%20194.7-52.2%20443-219.5%20443-523.6%200-107.9.2-210.3.2-339.6C821.3%2092.9%20686.2%2046.5%20500.9%204.5zm-26.1%20271.1h52.1c5.8%200%2010.3%204.7%2010.1%2010.4l-11.6%20313.8c-.1%202.8-2.5%205.2-5.4%205.2h-38.2c-2.9%200-5.3-2.3-5.4-5.2L464.8%20286c-.2-5.8%204.3-10.4%2010-10.4zm26.1%20448.3c-20.2%200-36.5-16.3-36.5-36.5s16.3-36.5%2036.5-36.5%2036.5%2016.3%2036.5%2036.5-16.4%2036.5-36.5%2036.5z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23020202%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.5c-185.4%2042-320.4%2088.4-443.2%20127.3%200%20129.3.2%20231.7.2%20339.6%200%20304.1%20248.2%20471.4%20443%20523.6%20194.7-52.2%20443-219.5%20443-523.6%200-107.9.2-210.3.2-339.6C821.3%2092.9%20686.2%2046.5%20500.9%204.5zm-26.1%20271.1h52.1c5.8%200%2010.3%204.7%2010.1%2010.4l-11.6%20313.8c-.1%202.8-2.5%205.2-5.4%205.2h-38.2c-2.9%200-5.3-2.3-5.4-5.2L464.8%20286c-.2-5.8%204.3-10.4%2010-10.4zm26.1%20448.3c-20.2%200-36.5-16.3-36.5-36.5s16.3-36.5%2036.5-36.5%2036.5%2016.3%2036.5%2036.5-16.4%2036.5-36.5%2036.5z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23020202%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm-1.172-6.242l5.809-5.808.848.849-5.95%205.95a1%201%200%2001-1.414%200L7%2012.426l.849-.849%202.98%202.98z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm-1.172-6.242l5.809-5.808.848.849-5.95%205.95a1%201%200%2001-1.414%200L7%2012.426l.849-.849%202.98%202.98z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success-no-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-waiting {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.75%2011.38V6h-1.5v6l4.243%204.243%201.06-1.06-3.803-3.804zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.75%2011.38V6h-1.5v6l4.243%204.243%201.06-1.06-3.803-3.804zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-waiting-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.6%2011.503l3.891%203.891-.848.849L11.4%2012V6h1.2v5.503zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.6%2011.503l3.891%203.891-.848.849L11.4%2012V6h1.2v5.503zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-warn {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.763-15.864l.11%207.596h1.305l.11-7.596h-1.525zm.759%2010.967c.512%200%20.902-.383.902-.882%200-.5-.39-.882-.902-.882a.878.878%200%2000-.896.882c0%20.499.396.882.896.882z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.763-15.864l.11%207.596h1.305l.11-7.596h-1.525zm.759%2010.967c.512%200%20.902-.383.902-.882%200-.5-.39-.882-.902-.882a.878.878%200%2000-.896.882c0%20.499.396.882.896.882z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-info-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zM11.4%2010h1.2v7h-1.2v-7zm.6-1a1%201%200%20110-2%201%201%200%20010%202z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zM11.4%2010h1.2v7h-1.2v-7zm.6-1a1%201%200%20110-2%201%201%200%20010%202z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-cancel {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%20fill-rule%3D%22nonzero%22%2F%3E%3Cpath%20d%3D%22M12.849%2012l3.11%203.111-.848.849L12%2012.849l-3.111%203.11-.849-.848L11.151%2012l-3.11-3.111.848-.849L12%2011.151l3.111-3.11.849.848L12.849%2012z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%20fill-rule%3D%22nonzero%22%2F%3E%3Cpath%20d%3D%22M12.849%2012l3.11%203.111-.848.849L12%2012.849l-3.111%203.11-.849-.848L11.151%2012l-3.11-3.111.848-.849L12%2011.151l3.111-3.11.849.848L12.849%2012z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-search {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M16.31%2015.561l4.114%204.115-.848.848-4.123-4.123a7%207%200%2011.857-.84zM16.8%2011a5.8%205.8%200%2010-11.6%200%205.8%205.8%200%200011.6%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M16.31%2015.561l4.114%204.115-.848.848-4.123-4.123a7%207%200%2011.857-.84zM16.8%2011a5.8%205.8%200%2010-11.6%200%205.8%205.8%200%200011.6%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-clear {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M13.06%2012l3.006-3.005-1.06-1.06L12%2010.938%208.995%207.934l-1.06%201.06L10.938%2012l-3.005%203.005%201.06%201.06L12%2013.062l3.005%203.005%201.06-1.06L13.062%2012zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M13.06%2012l3.006-3.005-1.06-1.06L12%2010.938%208.995%207.934l-1.06%201.06L10.938%2012l-3.005%203.005%201.06%201.06L12%2013.062l3.005%203.005%201.06-1.06L13.062%2012zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-back {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm1.999-6.563L10.68%2012%2014%208.562%2012.953%207.5%209.29%2011.277a1.045%201.045%200%20000%201.446l3.663%203.777L14%2015.437z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm1.999-6.563L10.68%2012%2014%208.562%2012.953%207.5%209.29%2011.277a1.045%201.045%200%20000%201.446l3.663%203.777L14%2015.437z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-delete {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M6.774%206.4l.812%2013.648a.8.8%200%2000.798.752h7.232a.8.8%200%2000.798-.752L17.226%206.4H6.774zm11.655%200l-.817%2013.719A2%202%200%200115.616%2022H8.384a2%202%200%2001-1.996-1.881L5.571%206.4H3.5v-.7a.5.5%200%2001.5-.5h16a.5.5%200%2001.5.5v.7h-2.071zM14%203a.5.5%200%2001.5.5v.7h-5v-.7A.5.5%200%200110%203h4zM9.5%209h1.2l.5%209H10l-.5-9zm3.8%200h1.2l-.5%209h-1.2l.5-9z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M6.774%206.4l.812%2013.648a.8.8%200%2000.798.752h7.232a.8.8%200%2000.798-.752L17.226%206.4H6.774zm11.655%200l-.817%2013.719A2%202%200%200115.616%2022H8.384a2%202%200%2001-1.996-1.881L5.571%206.4H3.5v-.7a.5.5%200%2001.5-.5h16a.5.5%200%2001.5.5v.7h-2.071zM14%203a.5.5%200%2001.5.5v.7h-5v-.7A.5.5%200%200110%203h4zM9.5%209h1.2l.5%209H10l-.5-9zm3.8%200h1.2l-.5%209h-1.2l.5-9z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success-no-circle-thin {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.864%2016.617l-5.303-5.303-1.061%201.06%205.657%205.657a1%201%200%20001.414%200L21.238%206.364l-1.06-1.06L8.864%2016.616z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.864%2016.617l-5.303-5.303-1.061%201.06%205.657%205.657a1%201%200%20001.414%200L21.238%206.364l-1.06-1.06L8.864%2016.616z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-arrow {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-arrow-bold {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20height%3D%2224%22%20width%3D%2212%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10.157%2012.711L4.5%2018.368l-1.414-1.414%204.95-4.95-4.95-4.95L4.5%205.64l5.657%205.657a1%201%200%20010%201.414z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20height%3D%2224%22%20width%3D%2212%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10.157%2012.711L4.5%2018.368l-1.414-1.414%204.95-4.95-4.95-4.95L4.5%205.64l5.657%205.657a1%201%200%20010%201.414z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-back-arrow {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M3.343%2012l7.071%207.071L9%2020.485l-7.778-7.778a1%201%200%20010-1.414L9%203.515l1.414%201.414L3.344%2012z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M3.343%2012l7.071%207.071L9%2020.485l-7.778-7.778a1%201%200%20010-1.414L9%203.515l1.414%201.414L3.344%2012z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-back-arrow-thin {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-close {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2010.586l5.657-5.657%201.414%201.414L13.414%2012l5.657%205.657-1.414%201.414L12%2013.414l-5.657%205.657-1.414-1.414L10.586%2012%204.929%206.343%206.343%204.93%2012%2010.586z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2010.586l5.657-5.657%201.414%201.414L13.414%2012l5.657%205.657-1.414%201.414L12%2013.414l-5.657%205.657-1.414-1.414L10.586%2012%204.929%206.343%206.343%204.93%2012%2010.586z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-close-thin {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-back-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm1.999-5.363L12.953%2016.5%209.29%2012.723a1.045%201.045%200%20010-1.446L12.953%207.5%2014%208.563%2010.68%2012%2014%2015.438z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm1.999-5.363L12.953%2016.5%209.29%2012.723a1.045%201.045%200%20010-1.446L12.953%207.5%2014%208.563%2010.68%2012%2014%2015.438z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success {\n  color: var(--weui-BRAND)\n}\n\n.weui-icon-waiting {\n  color: var(--weui-BLUE)\n}\n\n.weui-icon-warn {\n  color: var(--weui-RED)\n}\n\n.weui-icon-info {\n  color: var(--weui-BLUE)\n}\n\n.weui-icon-success-circle,\n.weui-icon-success-no-circle,\n.weui-icon-success-no-circle-thin {\n  color: var(--weui-BRAND)\n}\n\n.weui-icon-waiting-circle {\n  color: var(--weui-BLUE)\n}\n\n.weui-icon-circle {\n  color: var(--weui-FG-2)\n}\n\n.weui-icon-download {\n  color: var(--weui-BRAND)\n}\n\n.weui-icon-info-circle {\n  color: var(--weui-FG-2)\n}\n\n.weui-icon-safe-success {\n  color: var(--weui-BRAND)\n}\n\n.weui-icon-safe-warn {\n  color: var(--weui-YELLOW)\n}\n\n.weui-icon-cancel {\n  color: var(--weui-RED)\n}\n\n.weui-icon-search {\n  color: var(--weui-FG-1)\n}\n\n.weui-icon-clear {\n  color: var(--weui-FG-2)\n}\n\n.weui-icon-clear:active {\n  color: var(--weui-FG-1)\n}\n\n.weui-icon-delete.weui-icon_gallery-delete {\n  color: var(--weui-WHITE)\n}\n\n.weui-icon-arrow,\n.weui-icon-arrow-bold,\n.weui-icon-back-arrow,\n.weui-icon-back-arrow-thin {\n  width: 12px\n}\n\n.weui-icon-arrow,\n.weui-icon-arrow-bold {\n  color: var(--weui-FG-2)\n}\n\n.weui-icon-back,\n.weui-icon-back-arrow,\n.weui-icon-back-arrow-thin,\n.weui-icon-back-circle {\n  color: var(--weui-FG-0)\n}\n\n.weui-icon_msg {\n  width: 64px;\n  height: 64px\n}\n\n.weui-icon_msg.weui-icon-warn {\n  color: var(--weui-RED)\n}\n\n.weui-icon_msg-primary {\n  width: 64px;\n  height: 64px\n}\n\n.weui-icon_msg-primary.weui-icon-warn {\n  color: var(--weui-YELLOW)\n}\n\n.weui-link {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-link,\n.weui-link:visited {\n  color: var(--weui-LINK)\n}\n\n.weui-btn {\n  position: relative;\n  display: block;\n  width: 184px;\n  margin-left: auto;\n  margin-right: auto;\n  padding: 8px 24px;\n  box-sizing: border-box;\n  font-weight: 700;\n  font-size: 17px;\n  text-align: center;\n  text-decoration: none;\n  color: #fff;\n  line-height: 1.41176471;\n  border-radius: 4px;\n  overflow: hidden;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-btn_block {\n  width: auto\n}\n\n.weui-btn_inline {\n  display: inline-block\n}\n\n.weui-btn_default {\n  background-color: var(--weui-BTN-DEFAULT-BG)\n}\n\n.weui-btn_default,\n.weui-btn_default:not(.weui-btn_disabled):visited {\n  color: var(--weui-BTN-DEFAULT-COLOR)\n}\n\n.weui-btn_default:not(.weui-btn_disabled):active {\n  background-color: var(--weui-BTN-DEFAULT-ACTIVE-BG)\n}\n\n.weui-btn_primary {\n  background-color: var(--weui-BRAND)\n}\n\n.weui-btn_primary:not(.weui-btn_disabled):visited {\n  color: #fff\n}\n\n.weui-btn_primary:not(.weui-btn_disabled):active {\n  background-color: var(--weui-TAG-TEXT-GREEN)\n}\n\n.weui-btn_warn {\n  background-color: var(--weui-BTN-DEFAULT-BG)\n}\n\n.weui-btn_warn,\n.weui-btn_warn:not(.weui-btn_disabled):visited {\n  color: var(--weui-RED)\n}\n\n.weui-btn_warn:not(.weui-btn_disabled):active {\n  background-color: var(--weui-BTN-DEFAULT-ACTIVE-BG)\n}\n\n.weui-btn_disabled {\n  color: var(--weui-BTN-DISABLED-FONT-COLOR);\n  background-color: var(--weui-BTN-DEFAULT-BG)\n}\n\n.weui-btn_loading .weui-loading {\n  margin: -.2em .34em 0 0\n}\n\n.weui-btn_loading.weui-btn_primary {\n  background-color: var(--weui-TAG-TEXT-GREEN);\n  color: var(--weui-WHITE)\n}\n\n.weui-btn_loading.weui-btn_default,\n.weui-btn_loading.weui-btn_warn {\n  background-color: var(--weui-BTN-DEFAULT-ACTIVE-BG)\n}\n\n.weui-btn_cell {\n  position: relative;\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n  box-sizing: border-box;\n  font-size: 17px;\n  text-align: center;\n  text-decoration: none;\n  color: #fff;\n  line-height: 1.41176471;\n  padding: 16px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  overflow: hidden;\n  background-color: var(--weui-BG-5)\n}\n\n.weui-btn_cell+.weui-btn_cell {\n  margin-top: 16px\n}\n\n.weui-btn_cell:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-btn_cell__icon {\n  display: inline-block;\n  vertical-align: middle;\n  width: 24px;\n  height: 24px;\n  margin: -.2em .34em 0 0\n}\n\n.weui-btn_cell-default {\n  color: var(--weui-FG-0)\n}\n\n.weui-btn_cell-primary {\n  color: var(--weui-LINK)\n}\n\n.weui-btn_cell-warn {\n  color: var(--weui-RED)\n}\n\nbutton.weui-btn,\ninput.weui-btn {\n  border-width: 0;\n  outline: 0;\n  -webkit-appearance: none\n}\n\nbutton.weui-btn:focus,\ninput.weui-btn:focus {\n  outline: 0\n}\n\nbutton.weui-btn_inline,\nbutton.weui-btn_mini,\ninput.weui-btn_inline,\ninput.weui-btn_mini {\n  width: auto\n}\n\n.weui-btn_mini {\n  display: inline-block;\n  width: auto;\n  padding: 0 .75em;\n  line-height: 2;\n  font-size: 16px\n}\n\n.weui-btn:not(.weui-btn_mini)+.weui-btn:not(.weui-btn_mini) {\n  margin-top: 16px\n}\n\n.weui-btn.weui-btn_inline+.weui-btn.weui-btn_inline {\n  margin-top: auto;\n  margin-left: 16px\n}\n\n.weui-btn-area {\n  margin: 48px 16px 8px\n}\n\n.weui-btn-area_inline {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex\n}\n\n.weui-btn-area_inline .weui-btn {\n  margin-top: auto;\n  margin-right: 16px;\n  width: 100%;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-btn-area_inline .weui-btn:last-child {\n  margin-right: 0\n}\n\n.weui-btn_reset {\n  background: transparent;\n  border: 0;\n  padding: 0;\n  outline: 0\n}\n\n.weui-btn_icon {\n  font-size: 0\n}\n\n.weui-btn_icon:active [class*=weui-icon-] {\n  color: var(--weui-FG-1)\n}\n\n.weui-cells {\n  margin-top: 8px;\n  background-color: var(--weui-BG-2);\n  line-height: 1.41176471;\n  font-size: 17px;\n  overflow: hidden;\n  position: relative\n}\n\n.weui-cells:before {\n  top: 0;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-cells:after,\n.weui-cells:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 1px;\n  color: var(--weui-FG-3);\n  z-index: 2\n}\n\n.weui-cells:after {\n  bottom: 0;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-cells__title {\n  margin-top: 16px;\n  margin-bottom: 3px;\n  padding-left: 16px;\n  padding-right: 16px;\n  color: var(--weui-FG-1);\n  font-size: 14px;\n  line-height: 1.4\n}\n\n.weui-cells__title+.weui-cells {\n  margin-top: 0\n}\n\n.weui-cells__tips {\n  margin-top: 8px;\n  color: var(--weui-FG-1);\n  padding-left: 16px;\n  padding-right: 16px;\n  font-size: 14px;\n  line-height: 1.4\n}\n\n.weui-cells__tips a,\n.weui-cells__tips navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-cells__tips navigator {\n  display: inline\n}\n\n.weui-cell {\n  padding: 16px;\n  position: relative;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-cell:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  left: 16px;\n  z-index: 2\n}\n\n.weui-cell:first-child:before {\n  display: none\n}\n\n.weui-cell_active:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-cell_primary {\n  -webkit-box-align: start;\n  -webkit-align-items: flex-start;\n  align-items: flex-start\n}\n\n.weui-cell__bd {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-cell__ft {\n  text-align: right;\n  color: var(--weui-FG-1)\n}\n\n.weui-cell_swiped {\n  display: block;\n  padding: 0\n}\n\n.weui-cell_swiped>.weui-cell__bd {\n  position: relative;\n  z-index: 1;\n  background-color: var(--weui-BG-2)\n}\n\n.weui-cell_swiped>.weui-cell__ft {\n  position: absolute;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  color: #fff\n}\n\n.weui-swiped-btn {\n  display: block;\n  padding: 16px 1em;\n  line-height: 1.41176471;\n  color: inherit\n}\n\n.weui-swiped-btn_default {\n  background-color: var(--weui-BG-0)\n}\n\n.weui-swiped-btn_warn {\n  background-color: var(--weui-RED)\n}\n\n.weui-cell_access {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  color: inherit\n}\n\n.weui-cell_access:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-cell_access .weui-cell__ft {\n  padding-right: 22px;\n  position: relative\n}\n\n.weui-cell_access .weui-cell__ft:after {\n  content: \" \";\n  width: 12px;\n  height: 24px;\n  -webkit-mask-position: 0 0;\n  mask-position: 0 0;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  background-color: currentColor;\n  color: var(--weui-FG-2);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  position: absolute;\n  top: 50%;\n  right: 0;\n  margin-top: -12px\n}\n\n.weui-cell_link {\n  color: var(--weui-LINK);\n  font-size: 17px\n}\n\n.weui-cell_link:first-child:before {\n  display: block\n}\n\n.weui-check__label {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-check__label:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-check {\n  position: absolute;\n  left: -9999px\n}\n\n.weui-cells_radio .weui-cell__ft {\n  padding-left: 16px;\n  font-size: 0\n}\n\n.weui-cells_radio .weui-check+.weui-icon-checked {\n  min-width: 16px;\n  color: transparent\n}\n\n.weui-cells_radio .weui-check:checked+.weui-icon-checked,\n.weui-cells_radio .weui-check[aria-checked=true]+.weui-icon-checked {\n  color: var(--weui-BRAND);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-cells_checkbox .weui-check__label:before {\n  left: 55px\n}\n\n.weui-cells_checkbox .weui-cell__hd {\n  padding-right: 16px;\n  font-size: 0\n}\n\n.weui-cells_checkbox .weui-icon-checked {\n  color: var(--weui-FG-2);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-cells_checkbox .weui-check:checked+.weui-icon-checked,\n.weui-cells_checkbox .weui-check[aria-checked=true]+.weui-icon-checked {\n  color: var(--weui-BRAND);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-label {\n  display: block;\n  width: 105px;\n  word-wrap: break-word;\n  word-break: break-all\n}\n\n.weui-input {\n  width: 100%;\n  border: 0;\n  outline: 0;\n  -webkit-appearance: none;\n  background-color: transparent;\n  font-size: inherit;\n  color: inherit;\n  height: 1.41176471em;\n  line-height: 1.41176471\n}\n\n.weui-input::-webkit-inner-spin-button,\n.weui-input::-webkit-outer-spin-button {\n  -webkit-appearance: none;\n  margin: 0\n}\n\n.weui-input:focus:not(:placeholder-shown)+.weui-btn_input-clear {\n  display: inline\n}\n\n.weui-input::-webkit-input-placeholder,\n.weui-input__placeholder {\n  color: var(--weui-FG-2)\n}\n\n.weui-input::placeholder,\n.weui-input__placeholder {\n  color: var(--weui-FG-2)\n}\n\n.weui-textarea {\n  display: block;\n  border: 0;\n  resize: none;\n  background: transparent;\n  width: 100%;\n  color: inherit;\n  font-size: 1em;\n  line-height: inherit;\n  outline: 0\n}\n\n.weui-textarea-counter {\n  color: var(--weui-FG-2);\n  text-align: right;\n  font-size: 14px\n}\n\n.weui-cell_warn .weui-textarea-counter {\n  color: var(--weui-RED)\n}\n\n.weui-cells_form .weui-cell_disabled:active,\n.weui-cells_form .weui-cell_readonly:active,\n.weui-cells_form .weui-cell_switch:active,\n.weui-cells_form .weui-cell_vcode:active {\n  background-color: transparent\n}\n\n.weui-cells_form .weui-cell__ft {\n  font-size: 0\n}\n\n.weui-cells_form .weui-icon-warn {\n  display: none\n}\n\n.weui-cells_form input,\n.weui-cells_form label[for],\n.weui-cells_form textarea {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-cell_warn {\n  color: var(--weui-RED)\n}\n\n.weui-cell_warn .weui-icon-warn {\n  display: inline-block\n}\n\n.weui-cell_disabled .weui-input:disabled,\n.weui-cell_disabled .weui-textarea:disabled,\n.weui-cell_readonly .weui-input:disabled,\n.weui-cell_readonly .weui-textarea:disabled {\n  opacity: 1;\n  -webkit-text-fill-color: var(--weui-FG-1)\n}\n\n.weui-cell_disabled .weui-input[disabled],\n.weui-cell_disabled .weui-input[readonly],\n.weui-cell_disabled .weui-textarea[disabled],\n.weui-cell_disabled .weui-textarea[readonly],\n.weui-cell_readonly .weui-input[disabled],\n.weui-cell_readonly .weui-input[readonly],\n.weui-cell_readonly .weui-textarea[disabled],\n.weui-cell_readonly .weui-textarea[readonly] {\n  color: var(--weui-FG-1)\n}\n\n.weui-btn_input-clear {\n  display: none;\n  padding-left: 8px\n}\n\n.weui-btn_input-clear [class*=weui-icon-] {\n  width: 18px\n}\n\n.weui-form-preview {\n  position: relative;\n  background-color: var(--weui-BG-2)\n}\n\n.weui-form-preview:before {\n  top: 0;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-form-preview:after,\n.weui-form-preview:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 1px;\n  color: var(--weui-FG-3)\n}\n\n.weui-form-preview:after {\n  bottom: 0;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-form-preview__hd {\n  position: relative;\n  padding: 16px;\n  text-align: right;\n  line-height: 2.5em\n}\n\n.weui-form-preview__hd:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  left: 16px\n}\n\n.weui-form-preview__hd .weui-form-preview__value {\n  font-style: normal;\n  font-size: 1.6em\n}\n\n.weui-form-preview__bd {\n  padding: 16px;\n  font-size: .9em;\n  text-align: right;\n  color: var(--weui-FG-1);\n  line-height: 2\n}\n\n.weui-form-preview__ft {\n  position: relative;\n  line-height: 50px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex\n}\n\n.weui-form-preview__ft:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-DIALOG-LINE-COLOR);\n  color: var(--weui-DIALOG-LINE-COLOR);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-form-preview__item {\n  overflow: hidden\n}\n\n.weui-form-preview__label {\n  float: left;\n  margin-right: 1em;\n  min-width: 4em;\n  color: var(--weui-FG-1);\n  text-align: justify;\n  text-align-last: justify\n}\n\n.weui-form-preview__value {\n  display: block;\n  overflow: hidden;\n  word-break: normal;\n  word-wrap: break-word;\n  color: var(--weui-FG-0)\n}\n\n.weui-form-preview__btn {\n  position: relative;\n  display: block;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  color: var(--weui-LINK);\n  text-align: center;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\nbutton.weui-form-preview__btn {\n  background-color: transparent;\n  border: 0;\n  outline: 0;\n  line-height: inherit;\n  font-size: inherit\n}\n\n.weui-form-preview__btn:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-form-preview__btn:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-DIALOG-LINE-COLOR);\n  color: var(--weui-DIALOG-LINE-COLOR);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-form-preview__btn:first-child:after {\n  display: none\n}\n\n.weui-form-preview__btn_default {\n  color: var(--weui-FG-HALF)\n}\n\n.weui-form-preview__btn_primary {\n  color: var(--weui-LINK)\n}\n\n.weui-cell_select {\n  padding: 0\n}\n\n.weui-cell_select .weui-select {\n  padding-right: 30px\n}\n\n.weui-cell_select .weui-cell__bd:after {\n  content: \" \";\n  width: 12px;\n  height: 24px;\n  -webkit-mask-position: 0 0;\n  mask-position: 0 0;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  background-color: currentColor;\n  color: var(--weui-FG-2);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  position: absolute;\n  top: 50%;\n  right: 16px;\n  margin-top: -12px\n}\n\n.weui-select {\n  -webkit-appearance: none;\n  border: 0;\n  outline: 0;\n  background-color: transparent;\n  width: 100%;\n  font-size: inherit;\n  height: 56px;\n  line-height: 56px;\n  position: relative;\n  z-index: 1;\n  padding-left: 16px;\n  color: var(--weui-FG-0)\n}\n\n.weui-cell_select-before {\n  padding-right: 16px\n}\n\n.weui-cell_select-before .weui-select {\n  width: 105px;\n  box-sizing: border-box\n}\n\n.weui-cell_select-before .weui-cell__hd {\n  position: relative\n}\n\n.weui-cell_select-before .weui-cell__hd:after {\n  content: \" \";\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-right: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 100% 0;\n  transform-origin: 100% 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-cell_select-before .weui-cell__hd:before {\n  content: \" \";\n  width: 12px;\n  height: 24px;\n  -webkit-mask-position: 0 0;\n  mask-position: 0 0;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  background-color: currentColor;\n  color: var(--weui-FG-2);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  position: absolute;\n  top: 50%;\n  right: 16px;\n  margin-top: -12px\n}\n\n.weui-cell_select-before .weui-cell__bd {\n  padding-left: 16px\n}\n\n.weui-cell_select-before .weui-cell__bd:after {\n  display: none\n}\n\n.weui-cell_select-before.weui-cell_access .weui-cell__hd {\n  line-height: 56px;\n  padding-left: 32px\n}\n\n.weui-cell_select-after {\n  padding-left: 16px\n}\n\n.weui-cell_select-after .weui-select {\n  padding-left: 0\n}\n\n.weui-cell_select-after.weui-cell_access .weui-cell__bd {\n  line-height: 56px\n}\n\n.weui-cell_vcode {\n  padding-top: 0;\n  padding-right: 0;\n  padding-bottom: 0\n}\n\n.weui-vcode-btn,\n.weui-vcode-img {\n  margin-left: 5px;\n  height: 56px;\n  vertical-align: middle\n}\n\n.weui-vcode-btn {\n  display: inline-block;\n  padding: 0 .6em 0 .7em;\n  line-height: 56px;\n  font-size: 17px;\n  color: var(--weui-LINK);\n  position: relative\n}\n\n.weui-vcode-btn:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\nbutton.weui-vcode-btn {\n  background-color: transparent;\n  border: 0;\n  outline: 0\n}\n\n.weui-vcode-btn:active {\n  color: #767676\n}\n\n.weui-gallery {\n  display: none;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: #000;\n  z-index: 1000\n}\n\n.weui-gallery__img,\n.weui-gallery__opr {\n  position: absolute;\n  left: 0;\n  left: constant(safe-area-inset-left);\n  left: env(safe-area-inset-left);\n  right: 0;\n  right: constant(safe-area-inset-right);\n  right: env(safe-area-inset-right)\n}\n\n.weui-gallery__img {\n  top: 0;\n  top: constant(safe-area-inset-top);\n  top: env(safe-area-inset-top);\n  bottom: 60px;\n  bottom: calc(60px + constant(safe-area-inset-bottom));\n  bottom: calc(60px + env(safe-area-inset-bottom));\n  background: 50% no-repeat;\n  background-size: contain\n}\n\n.weui-gallery__opr {\n  position: absolute;\n  bottom: 0;\n  padding-bottom: 0;\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom);\n  background-color: #0d0d0d;\n  color: var(--weui-WHITE);\n  line-height: 60px;\n  text-align: center\n}\n\n.weui-gallery__del {\n  display: block\n}\n\n.weui-cell_switch {\n  padding-top: 12px;\n  padding-bottom: 12px\n}\n\n.weui-switch {\n  -webkit-appearance: none;\n  appearance: none\n}\n\n.weui-switch,\n.weui-switch-cp__box {\n  position: relative;\n  width: 52px;\n  height: 32px;\n  border: 2px solid var(--weui-FG-3);\n  outline: 0;\n  border-radius: 16px;\n  box-sizing: border-box;\n  -webkit-transition: background-color .1s, border .1s;\n  transition: background-color .1s, border .1s\n}\n\n.weui-switch-cp__box:before,\n.weui-switch:before {\n  content: \" \";\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  border-radius: 15px;\n  background-color: var(--weui-BG-3);\n  -webkit-transition: -webkit-transform .35s cubic-bezier(.45, 1, .4, 1);\n  transition: -webkit-transform .35s cubic-bezier(.45, 1, .4, 1);\n  transition: transform .35s cubic-bezier(.45, 1, .4, 1);\n  transition: transform .35s cubic-bezier(.45, 1, .4, 1), -webkit-transform .35s cubic-bezier(.45, 1, .4, 1)\n}\n\n.weui-switch-cp__box:after,\n.weui-switch:after {\n  content: \" \";\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 28px;\n  height: 28px;\n  border-radius: 15px;\n  background-color: #fff;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, .4);\n  -webkit-transition: -webkit-transform .35s cubic-bezier(.4, .4, .25, 1.35);\n  transition: -webkit-transform .35s cubic-bezier(.4, .4, .25, 1.35);\n  transition: transform .35s cubic-bezier(.4, .4, .25, 1.35);\n  transition: transform .35s cubic-bezier(.4, .4, .25, 1.35), -webkit-transform .35s cubic-bezier(.4, .4, .25, 1.35)\n}\n\n.weui-switch-cp__input:checked+.weui-switch-cp__box,\n.weui-switch-cp__input[aria-checked=true]+.weui-switch-cp__box,\n.weui-switch:checked {\n  border-color: var(--weui-BRAND);\n  background-color: var(--weui-BRAND)\n}\n\n.weui-switch-cp__input:checked+.weui-switch-cp__box:before,\n.weui-switch-cp__input[aria-checked=true]+.weui-switch-cp__box:before,\n.weui-switch:checked:before {\n  -webkit-transform: scale(0);\n  transform: scale(0)\n}\n\n.weui-switch-cp__input:checked+.weui-switch-cp__box:after,\n.weui-switch-cp__input[aria-checked=true]+.weui-switch-cp__box:after,\n.weui-switch:checked:after {\n  -webkit-transform: translateX(20px);\n  transform: translateX(20px)\n}\n\n.weui-switch-cp__input {\n  position: absolute;\n  left: -9999px\n}\n\n.weui-switch-cp__box {\n  display: block\n}\n\n.weui-uploader {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-uploader__hd {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  padding-bottom: 16px;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-uploader__title {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-uploader__info {\n  color: var(--weui-FG-2)\n}\n\n.weui-uploader__bd {\n  margin-bottom: -8px;\n  margin-right: -8px;\n  overflow: hidden\n}\n\n.weui-uploader__files {\n  list-style: none\n}\n\n.weui-uploader__file {\n  float: left;\n  margin-right: 8px;\n  margin-bottom: 8px;\n  width: 96px;\n  height: 96px;\n  background: no-repeat 50%;\n  background-size: cover\n}\n\n.weui-uploader__file_status {\n  position: relative\n}\n\n.weui-uploader__file_status:before {\n  content: \" \";\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: rgba(0, 0, 0, .5)\n}\n\n.weui-uploader__file_status .weui-uploader__file-content {\n  display: block\n}\n\n.weui-uploader__file-content {\n  display: none;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  color: var(--weui-WHITE)\n}\n\n.weui-uploader__file-content .weui-icon-warn {\n  display: inline-block\n}\n\n.weui-uploader__input-box {\n  float: left;\n  position: relative;\n  margin-right: 8px;\n  margin-bottom: 8px;\n  width: 96px;\n  height: 96px;\n  box-sizing: border-box;\n  background-color: #ededed\n}\n\n[data-weui-theme=dark] .weui-uploader__input-box {\n  background-color: #2e2e2e\n}\n\n.weui-uploader__input-box:after,\n.weui-uploader__input-box:before {\n  content: \" \";\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  background-color: #a3a3a3\n}\n\n[data-weui-theme=dark] .weui-uploader__input-box:after,\n[data-weui-theme=dark] .weui-uploader__input-box:before {\n  background-color: #6d6d6d\n}\n\n.weui-uploader__input-box:before {\n  width: 2px;\n  height: 32px\n}\n\n.weui-uploader__input-box:after {\n  width: 32px;\n  height: 2px\n}\n\n.weui-uploader__input-box:active:after,\n.weui-uploader__input-box:active:before {\n  opacity: .7\n}\n\n.weui-uploader__input {\n  position: absolute;\n  z-index: 1;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-msg {\n  padding-top: 48px;\n  padding: calc(48px + constant(safe-area-inset-top)) constant(safe-area-inset-right) constant(safe-area-inset-bottom) constant(safe-area-inset-left);\n  padding: calc(48px + env(safe-area-inset-top)) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);\n  text-align: center;\n  line-height: 1.4;\n  min-height: 100%;\n  box-sizing: border-box;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  background-color: var(--weui-BG-2)\n}\n\n.weui-msg a:not(.weui-btn) {\n  color: var(--weui-LINK);\n  display: inline-block;\n  vertical-align: baseline\n}\n\n.weui-msg__icon-area {\n  margin-bottom: 32px\n}\n\n.weui-msg__text-area {\n  margin-bottom: 32px;\n  padding: 0 32px;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  line-height: 1.6\n}\n\n.weui-msg__text-area:first-child {\n  padding-top: 96px\n}\n\n.weui-msg__title {\n  font-weight: 700;\n  font-size: 22px\n}\n\n.weui-msg__desc,\n.weui-msg__title {\n  margin-bottom: 16px;\n  color: var(--weui-FG-0);\n  word-wrap: break-word;\n  word-break: break-all\n}\n\n.weui-msg__desc {\n  font-size: 17px\n}\n\n.weui-msg__desc-primary {\n  font-size: 14px;\n  color: var(--weui-FG-1);\n  word-wrap: break-word;\n  word-break: break-all;\n  margin-bottom: 16px\n}\n\n.weui-msg__opr-area {\n  margin-bottom: 16px\n}\n\n.weui-msg__opr-area .weui-btn-area {\n  margin: 0\n}\n\n.weui-msg__opr-area .weui-btn+.weui-btn {\n  margin-bottom: 16px\n}\n\n.weui-msg__opr-area:last-child {\n  margin-bottom: 96px\n}\n\n.weui-msg__opr-area+.weui-msg__extra-area {\n  margin-top: 48px\n}\n\n.weui-msg__tips-area {\n  margin-bottom: 16px;\n  padding: 0 40px\n}\n\n.weui-msg__opr-area+.weui-msg__tips-area {\n  margin-bottom: 48px\n}\n\n.weui-msg__tips-area:last-child {\n  margin-bottom: 64px\n}\n\n.weui-msg__extra-area,\n.weui-msg__tips {\n  font-size: 12px;\n  color: var(--weui-FG-1)\n}\n\n.weui-msg__extra-area {\n  margin-bottom: 24px\n}\n\n.weui-msg__extra-area a,\n.weui-msg__extra-area navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-msg__extra-area navigator {\n  display: inline\n}\n\n.weui-cells__group_form:first-child .weui-cells__title {\n  margin-top: 0\n}\n\n.weui-cells__group_form .weui-cells__title {\n  margin-top: 24px;\n  margin-bottom: 8px;\n  padding: 0 32px\n}\n\n.weui-cells__group_form .weui-cell:before,\n.weui-cells__group_form .weui-cells:before {\n  left: 32px;\n  right: 32px\n}\n\n.weui-cells__group_form .weui-cells_checkbox .weui-check__label:before {\n  left: 72px\n}\n\n.weui-cells__group_form .weui-cells:after {\n  left: 32px;\n  right: 32px\n}\n\n.weui-cells__group_form .weui-cell {\n  padding: 16px 32px\n}\n\n.weui-cells__group_form .weui-cell:not(.weui-cell_link) {\n  color: var(--weui-FG-0)\n}\n\n.weui-cells__group_form .weui-cell__hd {\n  padding-right: 16px\n}\n\n.weui-cells__group_form .weui-cell__ft {\n  padding-left: 16px\n}\n\n.weui-cells__group_form .weui-cell_warn input {\n  color: var(--weui-RED)\n}\n\n.weui-cells__group_form .weui-label {\n  max-width: 5em;\n  margin-right: 8px\n}\n\n.weui-cells__group_form .weui-cells__tips {\n  margin-top: 8px;\n  padding: 0 32px;\n  color: rgba(0, 0, 0, .3)\n}\n\n.weui-cells__group_form .weui-cells__tips a {\n  font-weight: 700\n}\n\n.weui-cells__group_form .weui-cell_vcode {\n  padding: 12px 32px\n}\n\n.weui-cells__group_form .weui-vcode-btn {\n  font-size: 16px;\n  padding: 0 12px;\n  margin-left: 0;\n  height: auto;\n  width: auto;\n  line-height: 2em;\n  color: var(--weui-BTN-DEFAULT-COLOR);\n  background-color: var(--weui-BTN-DEFAULT-BG)\n}\n\n.weui-cells__group_form .weui-vcode-btn:before {\n  display: none\n}\n\n.weui-cells__group_form .weui-cell_select {\n  padding: 0\n}\n\n.weui-cells__group_form .weui-cell_select .weui-select {\n  padding: 0 32px\n}\n\n.weui-cells__group_form .weui-cell_select .weui-cell__bd:after {\n  right: 32px\n}\n\n.weui-cells__group_form .weui-cell_select-before .weui-label {\n  margin-right: 24px\n}\n\n.weui-cells__group_form .weui-cell_select-before .weui-select {\n  padding-right: 24px;\n  box-sizing: initial\n}\n\n.weui-cells__group_form .weui-cell_select-after {\n  padding-left: 32px\n}\n\n.weui-cells__group_form .weui-cell_select-after .weui-select {\n  padding-left: 0\n}\n\n.weui-cells__group_form .weui-cell_switch {\n  padding: 12px 32px\n}\n\n.weui-form {\n  padding: 56px 0 0;\n  padding: calc(56px + constant(safe-area-inset-top)) constant(safe-area-inset-right) constant(safe-area-inset-bottom) constant(safe-area-inset-left);\n  padding: calc(56px + env(safe-area-inset-top)) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  line-height: 1.4;\n  min-height: 100%;\n  box-sizing: border-box;\n  background-color: var(--weui-BG-2)\n}\n\n.weui-form .weui-footer,\n.weui-form .weui-footer__link {\n  font-size: 14px\n}\n\n.weui-form .weui-agree {\n  padding: 0\n}\n\n.weui-form__text-area {\n  padding: 0 32px;\n  color: var(--weui-FG-0);\n  text-align: center\n}\n\n.weui-form__control-area {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  margin: 48px 0\n}\n\n.weui-form__tips-area {\n  overflow: hidden\n}\n\n.weui-form__extra-area,\n.weui-form__tips-area {\n  margin-bottom: 24px;\n  text-align: center\n}\n\n.weui-form__opr-area {\n  margin-bottom: 64px\n}\n\n.weui-form__opr-area:last-child {\n  margin-bottom: 96px\n}\n\n.weui-form__title {\n  font-size: 22px;\n  font-weight: 700;\n  line-height: 1.36\n}\n\n.weui-form__desc {\n  font-size: 17px;\n  margin-top: 16px\n}\n\n.weui-form__tips {\n  color: var(--weui-FG-1);\n  font-size: 14px\n}\n\n.weui-form__tips a,\n.weui-form__tips navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-form__tips navigator {\n  display: inline\n}\n\n.weui-article {\n  padding: 24px 16px;\n  padding: 24px calc(16px + constant(safe-area-inset-right)) calc(24px + constant(safe-area-inset-bottom)) calc(16px + constant(safe-area-inset-left));\n  padding: 24px calc(16px + env(safe-area-inset-right)) calc(24px + env(safe-area-inset-bottom)) calc(16px + env(safe-area-inset-left));\n  font-size: 17px;\n  color: var(--weui-FG-0)\n}\n\n.weui-article__section {\n  margin-bottom: 1.5em\n}\n\n.weui-article__h1 {\n  font-size: 22px;\n  font-weight: 700;\n  margin-bottom: .9em;\n  line-height: 1.4\n}\n\n.weui-article__h2 {\n  font-size: 17px\n}\n\n.weui-article__h2,\n.weui-article__h3 {\n  font-weight: 700;\n  margin-bottom: .34em;\n  line-height: 1.4\n}\n\n.weui-article__h3 {\n  font-size: 15px\n}\n\n.weui-article__p {\n  margin: 0 0 .8em\n}\n\n.weui-tabbar {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  position: relative;\n  z-index: 500;\n  background-color: var(--weui-BG-1)\n}\n\n.weui-tabbar:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-tabbar__item {\n  display: block;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  padding: 8px 0;\n  padding-bottom: calc(8px + constant(safe-area-inset-bottom));\n  padding-bottom: calc(8px + env(safe-area-inset-bottom));\n  font-size: 0;\n  color: var(--weui-FG-1);\n  text-align: center;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-tabbar__item:first-child {\n  padding-left: constant(safe-area-inset-left);\n  padding-left: env(safe-area-inset-left)\n}\n\n.weui-tabbar__item:last-child {\n  padding-right: constant(safe-area-inset-right);\n  padding-right: env(safe-area-inset-right)\n}\n\n.weui-tabbar__item.weui-bar__item_on .weui-tabbar__icon,\n.weui-tabbar__item.weui-bar__item_on .weui-tabbar__icon>i,\n.weui-tabbar__item.weui-bar__item_on .weui-tabbar__label {\n  color: var(--weui-BRAND)\n}\n\n.weui-tabbar__icon {\n  display: inline-block;\n  width: 28px;\n  height: 28px;\n  margin-bottom: 2px\n}\n\n.weui-tabbar__icon>i,\ni.weui-tabbar__icon {\n  font-size: 24px;\n  color: var(--weui-FG-1)\n}\n\n.weui-tabbar__icon img {\n  width: 100%;\n  height: 100%\n}\n\n.weui-tabbar__label {\n  color: var(--weui-FG-0);\n  font-size: 10px;\n  line-height: 1.4\n}\n\n.weui-navbar {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  position: relative;\n  z-index: 500;\n  background-color: var(--weui-BG-2);\n  padding-top: constant(safe-area-inset-top);\n  padding-top: env(safe-area-inset-top)\n}\n\n.weui-navbar:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-navbar+.weui-tab__panel {\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom)\n}\n\n.weui-navbar__item {\n  position: relative;\n  display: block;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  padding: 16px 0;\n  padding-top: calc(16px + constant(safe-area-inset-top));\n  padding-top: calc(16px + env(safe-area-inset-top));\n  text-align: center;\n  font-size: 17px;\n  line-height: 1.41176471;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-navbar__item.weui-bar__item_on,\n.weui-navbar__item:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-navbar__item:after {\n  content: \" \";\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-right: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 100% 0;\n  transform-origin: 100% 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-navbar__item:first-child {\n  padding-left: constant(safe-area-inset-left);\n  padding-left: env(safe-area-inset-left)\n}\n\n.weui-navbar__item:last-child {\n  padding-right: constant(safe-area-inset-right);\n  padding-right: env(safe-area-inset-right)\n}\n\n.weui-navbar__item:last-child:after {\n  display: none\n}\n\n.weui-tab {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  height: 100%;\n  box-sizing: border-box;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column\n}\n\n.weui-tab__panel {\n  box-sizing: border-box;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch\n}\n\n.weui-tab__content {\n  display: none\n}\n\n.weui-progress {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-progress__bar {\n  background-color: var(--weui-BG-0);\n  height: 3px;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-progress__inner-bar {\n  width: 0;\n  height: 100%;\n  background-color: var(--weui-BRAND)\n}\n\n.weui-progress__opr {\n  display: block;\n  margin-left: 15px;\n  font-size: 0\n}\n\n.weui-panel {\n  background-color: var(--weui-BG-2);\n  margin-top: 10px;\n  position: relative;\n  overflow: hidden\n}\n\n.weui-panel:first-child {\n  margin-top: 0\n}\n\n.weui-panel:before {\n  top: 0;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-panel:after,\n.weui-panel:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 1px;\n  color: var(--weui-FG-3)\n}\n\n.weui-panel:after {\n  bottom: 0;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-panel__hd {\n  padding: 16px 16px 13px;\n  color: var(--weui-FG-0);\n  font-size: 15px;\n  font-weight: 700;\n  position: relative\n}\n\n.weui-panel__hd:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  left: 15px\n}\n\n.weui-media-box {\n  padding: 16px;\n  position: relative\n}\n\n.weui-media-box:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  left: 16px\n}\n\n.weui-media-box:first-child:before {\n  display: none\n}\n\na.weui-media-box {\n  color: #000;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\na.weui-media-box:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-media-box__title {\n  font-weight: 400;\n  font-size: 17px;\n  color: var(--weui-FG-0);\n  width: auto;\n  white-space: nowrap;\n  word-wrap: normal;\n  word-wrap: break-word;\n  word-break: break-all\n}\n\n.weui-media-box__desc,\n.weui-media-box__title {\n  line-height: 1.4;\n  overflow: hidden;\n  text-overflow: ellipsis\n}\n\n.weui-media-box__desc {\n  color: var(--weui-FG-2);\n  font-size: 14px;\n  padding-top: 4px;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2\n}\n\n.weui-media-box__info {\n  margin-top: 16px;\n  padding-bottom: 4px;\n  font-size: 13px;\n  color: var(--weui-FG-2);\n  line-height: 1em;\n  list-style: none;\n  overflow: hidden\n}\n\n.weui-media-box__info__meta {\n  float: left;\n  padding-right: 1em\n}\n\n.weui-media-box__info__meta_extra {\n  padding-left: 1em;\n  border-left: 1px solid var(--weui-FG-2)\n}\n\n.weui-media-box_appmsg {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-media-box_appmsg .weui-media-box__hd {\n  margin-right: 16px;\n  width: 60px;\n  height: 60px;\n  line-height: 60px;\n  text-align: center\n}\n\n.weui-media-box_appmsg .weui-media-box__thumb {\n  width: 100%;\n  max-height: 100%;\n  vertical-align: top\n}\n\n.weui-media-box_appmsg .weui-media-box__bd {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  min-width: 0\n}\n\n.weui-media-box_small-appmsg {\n  padding: 0\n}\n\n.weui-media-box_small-appmsg .weui-cells {\n  margin-top: 0\n}\n\n.weui-media-box_small-appmsg .weui-cells:before {\n  display: none\n}\n\n.weui-grids {\n  position: relative;\n  overflow: hidden\n}\n\n.weui-grids:before {\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-grids:after,\n.weui-grids:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  color: var(--weui-FG-3)\n}\n\n.weui-grids:after {\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-grid {\n  position: relative;\n  float: left;\n  padding: 20px 10px;\n  width: 33.33333333%;\n  box-sizing: border-box\n}\n\n.weui-grid:before {\n  top: 0;\n  width: 1px;\n  border-right: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 100% 0;\n  transform-origin: 100% 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-grid:after,\n.weui-grid:before {\n  content: \" \";\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  color: var(--weui-FG-3)\n}\n\n.weui-grid:after {\n  left: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-grid:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-grid__icon {\n  width: 28px;\n  height: 28px;\n  margin: 0 auto\n}\n\n.weui-grid__icon img {\n  display: block;\n  width: 100%;\n  height: 100%\n}\n\n.weui-grid__icon+.weui-grid__label {\n  margin-top: 4px\n}\n\n.weui-grid__label {\n  display: block;\n  color: var(--weui-FG-0);\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden\n}\n\n.weui-footer,\n.weui-grid__label {\n  text-align: center;\n  font-size: 14px\n}\n\n.weui-footer {\n  color: var(--weui-FG-2);\n  line-height: 1.4\n}\n\n.weui-footer a,\n.weui-footer navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-footer navigator {\n  display: inline\n}\n\n.weui-footer_fixed-bottom {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  padding-top: 16px;\n  padding-bottom: 16px;\n  padding-bottom: calc(16px + constant(safe-area-inset-bottom));\n  padding-bottom: calc(16px + env(safe-area-inset-bottom));\n  left: constant(safe-area-inset-left);\n  left: env(safe-area-inset-left);\n  right: constant(safe-area-inset-right);\n  right: env(safe-area-inset-right)\n}\n\n.weui-footer__links {\n  font-size: 0\n}\n\n.weui-footer__link {\n  display: inline-block;\n  vertical-align: top;\n  margin: 0 8px;\n  position: relative;\n  font-size: 14px\n}\n\n.weui-footer__link:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5);\n  left: -8px;\n  top: .36em;\n  bottom: .36em\n}\n\n.weui-footer__link:first-child:before {\n  display: none\n}\n\n.weui-footer__text {\n  padding: 0 16px;\n  font-size: 12px\n}\n\n.weui-flex {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex\n}\n\n.weui-flex__item {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-dialog {\n  position: fixed;\n  z-index: 5000;\n  top: 50%;\n  left: 16px;\n  right: 16px;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n  background-color: var(--weui-BG-2);\n  text-align: center;\n  border-radius: 12px;\n  overflow: hidden;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: column;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  flex-direction: column;\n  max-height: 90%\n}\n\n.weui-dialog__hd {\n  padding: 32px 24px 16px\n}\n\n.weui-dialog__title {\n  font-weight: 700;\n  font-size: 17px;\n  line-height: 1.4\n}\n\n.weui-dialog__bd {\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n  padding: 0 24px;\n  margin-bottom: 32px;\n  font-size: 17px;\n  line-height: 1.4;\n  word-wrap: break-word;\n  -webkit-hyphens: auto;\n  hyphens: auto;\n  color: var(--weui-FG-1)\n}\n\n.weui-dialog__bd:first-child {\n  min-height: 40px;\n  padding: 32px 24px 0;\n  font-weight: 700;\n  color: var(--weui-FG-0);\n  -webkit-flex-direction: column;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  flex-direction: column;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center\n}\n\n.weui-dialog__bd:first-child,\n.weui-dialog__ft {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex\n}\n\n.weui-dialog__ft {\n  position: relative;\n  line-height: 56px;\n  min-height: 56px;\n  font-size: 17px\n}\n\n.weui-dialog__ft:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-DIALOG-LINE-COLOR);\n  color: var(--weui-DIALOG-LINE-COLOR);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-dialog__btn {\n  display: block;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  color: var(--weui-LINK);\n  font-weight: 700;\n  text-decoration: none;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  position: relative\n}\n\n.weui-dialog__btn:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-dialog__btn:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-DIALOG-LINE-COLOR);\n  color: var(--weui-DIALOG-LINE-COLOR);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-dialog__btn:first-child:after {\n  display: none\n}\n\n.weui-dialog__btn_default {\n  color: var(--weui-FG-HALF)\n}\n\n.weui-skin_android .weui-dialog {\n  text-align: left;\n  box-shadow: 0 6px 30px 0 rgba(0, 0, 0, .1)\n}\n\n.weui-skin_android .weui-dialog__title {\n  font-size: 22px;\n  line-height: 1.4\n}\n\n.weui-skin_android .weui-dialog__hd {\n  text-align: left\n}\n\n.weui-skin_android .weui-dialog__bd {\n  color: var(--weui-FG-1);\n  text-align: left\n}\n\n.weui-skin_android .weui-dialog__bd:first-child {\n  color: var(--weui-FG-0)\n}\n\n.weui-skin_android .weui-dialog__ft {\n  display: block;\n  text-align: right;\n  line-height: 40px;\n  min-height: 40px;\n  padding: 0 24px 16px\n}\n\n.weui-skin_android .weui-dialog__ft:after {\n  display: none\n}\n\n.weui-skin_android .weui-dialog__btn {\n  display: inline-block;\n  vertical-align: top;\n  padding: 0 .8em\n}\n\n.weui-skin_android .weui-dialog__btn:after {\n  display: none\n}\n\n.weui-skin_android .weui-dialog__btn:last-child {\n  margin-right: -.8em\n}\n\n.weui-skin_android .weui-dialog__btn_default {\n  color: var(--weui-FG-HALF)\n}\n\n@media screen and (min-width:352px) {\n  .weui-dialog {\n    width: 320px;\n    margin: 0 auto\n  }\n}\n\n.weui-half-screen-dialog {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  max-height: 75%;\n  z-index: 5000;\n  line-height: 1.4;\n  background-color: var(--weui-BG-2);\n  border-top-left-radius: 12px;\n  border-top-right-radius: 12px;\n  overflow: hidden;\n  padding: 0 24px;\n  padding: 0 calc(24px + constant(safe-area-inset-right)) constant(safe-area-inset-bottom) calc(24px + constant(safe-area-inset-left));\n  padding: 0 calc(24px + env(safe-area-inset-right)) env(safe-area-inset-bottom) calc(24px + env(safe-area-inset-left))\n}\n\n@media only screen and (max-height:558px) {\n  .weui-half-screen-dialog {\n    max-height: none\n  }\n}\n\n.weui-half-screen-dialog__hd {\n  font-size: 8px;\n  height: 8em;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-half-screen-dialog__hd .weui-icon-btn {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%)\n}\n\n.weui-half-screen-dialog__hd .weui-icon-btn:active {\n  opacity: .5\n}\n\n.weui-half-screen-dialog__hd__side {\n  position: relative;\n  left: -8px\n}\n\n.weui-half-screen-dialog__hd__main {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-half-screen-dialog__hd__side+.weui-half-screen-dialog__hd__main {\n  text-align: center;\n  padding: 0 40px\n}\n\n.weui-half-screen-dialog__hd__main+.weui-half-screen-dialog__hd__side {\n  right: -8px;\n  left: auto\n}\n\n.weui-half-screen-dialog__hd__main+.weui-half-screen-dialog__hd__side .weui-icon-btn {\n  right: 0\n}\n\n.weui-half-screen-dialog__title {\n  display: block;\n  color: var(--weui-FG-0);\n  font-weight: 700;\n  font-size: 15px\n}\n\n.weui-half-screen-dialog__subtitle {\n  display: block;\n  color: var(--weui-FG-1);\n  font-size: 10px\n}\n\n. {\n  word-wrap: break-word;\n  -webkit-hyphens: auto;\n  hyphens: auto;\n  overflow-y: auto;\n  padding-top: 4px;\n  padding-bottom: 40px;\n  font-size: 14px;\n  color: var(--weui-FG-0)\n}\n\n.weui-half-screen-dialog__desc {\n  font-size: 17px;\n  font-weight: 700;\n  color: var(--weui-FG-0);\n  line-height: 1.4\n}\n\n.weui-half-screen-dialog__tips {\n  padding-top: 16px;\n  font-size: 14px;\n  color: var(--weui-FG-2);\n  line-height: 1.4\n}\n\n.weui-half-screen-dialog__ft {\n  padding: 0 24px 32px;\n  text-align: center\n}\n\n.weui-half-screen-dialog__ft .weui-btn:nth-last-child(n+2),\n.weui-half-screen-dialog__ft .weui-btn:nth-last-child(n+2)+.weui-btn {\n  display: inline-block;\n  vertical-align: top;\n  margin: 0 8px;\n  width: 120px\n}\n\n.weui-icon-btn {\n  outline: 0;\n  -webkit-appearance: none;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  border-width: 0;\n  background-color: transparent;\n  color: var(--weui-FG-0);\n  font-size: 0\n}\n\n.weui-icon-more {\n  width: 24px;\n  -webkit-mask: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E  %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M5 10.25a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  mask: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E  %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M5 10.25a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  -webkit-mask-size: cover;\n  mask-size: cover\n}\n\n.weui-icon-btn_goback,\n.weui-icon-more {\n  display: inline-block;\n  vertical-align: middle;\n  height: 24px;\n  background-color: currentColor;\n  color: var(--weui-FG-0)\n}\n\n.weui-icon-btn_goback {\n  width: 12px;\n  -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E\") no-repeat 50% 50%;\n  mask: url(\"data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E\") no-repeat 50% 50%;\n  -webkit-mask-size: cover;\n  mask-size: cover\n}\n\n.weui-icon-btn_close {\n  color: var(--weui-FG-0);\n  display: inline-block;\n  vertical-align: middle;\n  width: 14px;\n  height: 24px;\n  -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E\") no-repeat 50% 50%;\n  mask: url(\"data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E\") no-repeat 50% 50%;\n  -webkit-mask-size: cover;\n  mask-size: cover;\n  background-color: currentColor\n}\n\n.weui-toast {\n  position: fixed;\n  z-index: 5000;\n  width: 120px;\n  height: 120px;\n  top: 40%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  text-align: center;\n  border-radius: 5px;\n  color: hsla(0, 0%, 100%, .9);\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  background-color: #4c4c4c\n}\n\n[data-weui-theme=dark] .weui-toast {\n  background-color: #606060\n}\n\n.weui-icon_toast {\n  display: block\n}\n\n.weui-icon_toast.weui-icon-success-no-circle {\n  color: hsla(0, 0%, 100%, .9);\n  width: 55px;\n  height: 55px\n}\n\n.weui-icon_toast.weui-loading {\n  margin: 8px 0;\n  width: 38px;\n  height: 38px;\n  vertical-align: baseline\n}\n\n.weui-toast__content {\n  font-size: 14px\n}\n\n.weui-mask {\n  background: rgba(0, 0, 0, .6)\n}\n\n.weui-mask,\n.weui-mask_transparent {\n  position: fixed;\n  z-index: 1000;\n  top: 0;\n  right: 0;\n  left: 0;\n  bottom: 0\n}\n\n.weui-actionsheet {\n  position: fixed;\n  left: 0;\n  bottom: 0;\n  -webkit-transform: translateY(100%);\n  transform: translateY(100%);\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  z-index: 5000;\n  width: 100%;\n  background-color: var(--weui-BG-1);\n  -webkit-transition: -webkit-transform .3s;\n  transition: -webkit-transform .3s;\n  transition: transform .3s;\n  transition: transform .3s, -webkit-transform .3s;\n  border-top-left-radius: 12px;\n  border-top-right-radius: 12px;\n  overflow: hidden\n}\n\n.weui-actionsheet__title {\n  position: relative;\n  height: 56px;\n  padding: 0 24px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  text-align: center;\n  font-size: 12px;\n  color: var(--weui-FG-1);\n  line-height: 1.4;\n  background: var(--weui-BG-2)\n}\n\n.weui-actionsheet__title:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-actionsheet__title .weui-actionsheet__title-text {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2\n}\n\n.weui-actionsheet__menu {\n  color: var(--weui-FG-0);\n  background-color: var(--weui-BG-2)\n}\n\n.weui-actionsheet__action {\n  margin-top: 8px;\n  background-color: var(--weui-BG-2);\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom)\n}\n\n.weui-actionsheet__cell {\n  position: relative;\n  padding: 16px;\n  text-align: center;\n  font-size: 17px;\n  line-height: 1.41176471\n}\n\n.weui-actionsheet__cell:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-actionsheet__cell:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-actionsheet__cell:first-child:before {\n  display: none\n}\n\n.weui-actionsheet__cell_warn {\n  color: var(--weui-RED)\n}\n\n.weui-skin_android .weui-actionsheet {\n  position: fixed;\n  left: 50%;\n  top: 50%;\n  bottom: auto;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  width: 274px;\n  box-sizing: border-box;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  background: transparent;\n  -webkit-transition: -webkit-transform .3s;\n  transition: -webkit-transform .3s;\n  transition: transform .3s;\n  transition: transform .3s, -webkit-transform .3s;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0\n}\n\n.weui-skin_android .weui-actionsheet__action {\n  display: none\n}\n\n.weui-skin_android .weui-actionsheet__menu {\n  border-radius: 2px;\n  box-shadow: 0 6px 30px 0 rgba(0, 0, 0, .1)\n}\n\n.weui-skin_android .weui-actionsheet__cell {\n  padding: 16px;\n  font-size: 17px;\n  line-height: 1.41176471;\n  color: var(--weui-FG-0);\n  text-align: left\n}\n\n.weui-skin_android .weui-actionsheet__cell:first-child {\n  border-top-left-radius: 2px;\n  border-top-right-radius: 2px\n}\n\n.weui-skin_android .weui-actionsheet__cell:last-child {\n  border-bottom-left-radius: 2px;\n  border-bottom-right-radius: 2px\n}\n\n.weui-actionsheet_toggle {\n  -webkit-transform: translate(0);\n  transform: translate(0)\n}\n\n.weui-loadmore {\n  width: 65%;\n  margin: 1.5em auto;\n  line-height: 1.6em;\n  font-size: 14px;\n  text-align: center\n}\n\n.weui-loadmore__tips {\n  display: inline-block;\n  vertical-align: middle;\n  color: var(--weui-FG-0)\n}\n\n.weui-loadmore_line {\n  border-top: 1px solid var(--weui-FG-3);\n  margin-top: 2.4em\n}\n\n.weui-loadmore_line .weui-loadmore__tips {\n  position: relative;\n  top: -.9em;\n  padding: 0 .55em;\n  background-color: var(--weui-BG-2);\n  color: var(--weui-FG-1)\n}\n\n.weui-loadmore_dot .weui-loadmore__tips {\n  padding: 0 .16em\n}\n\n.weui-loadmore_dot .weui-loadmore__tips:before {\n  content: \" \";\n  width: 4px;\n  height: 4px;\n  border-radius: 50%;\n  background-color: var(--weui-FG-3);\n  display: inline-block;\n  position: relative;\n  vertical-align: 0;\n  top: -.16em\n}\n\n.weui-badge {\n  display: inline-block;\n  padding: .15em .4em;\n  min-width: 8px;\n  border-radius: 18px;\n  background-color: var(--weui-RED);\n  color: #fff;\n  line-height: 1.2;\n  text-align: center;\n  font-size: 12px;\n  vertical-align: middle\n}\n\n.weui-badge_dot {\n  padding: .4em;\n  min-width: 0\n}\n\n.weui-toptips {\n  display: none;\n  position: fixed;\n  -webkit-transform: translateZ(0);\n  transform: translateZ(0);\n  top: 8px;\n  left: 8px;\n  right: 8px;\n  padding: 10px;\n  border-radius: 8px;\n  font-size: 14px;\n  text-align: center;\n  color: #fff;\n  z-index: 5000;\n  word-wrap: break-word;\n  word-break: break-all\n}\n\n.weui-toptips_warn {\n  background-color: var(--weui-RED)\n}\n\n.weui-search-bar {\n  position: relative;\n  padding: 8px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  box-sizing: border-box;\n  background-color: var(--weui-BG-0);\n  -webkit-text-size-adjust: 100%;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-search-bar.weui-search-bar_focusing .weui-search-bar__cancel-btn {\n  display: block\n}\n\n.weui-search-bar.weui-search-bar_focusing .weui-search-bar__label {\n  display: none\n}\n\n.weui-search-bar .weui-icon-search {\n  width: 16px;\n  height: 16px\n}\n\n.weui-search-bar__form {\n  position: relative;\n  -webkit-box-flex: 1;\n  -webkit-flex: auto;\n  flex: auto;\n  background-color: var(--weui-BG-2);\n  border-radius: 4px\n}\n\n.weui-search-bar__box {\n  position: relative;\n  padding-left: 28px;\n  padding-right: 32px;\n  height: 100%;\n  width: 100%;\n  box-sizing: border-box;\n  z-index: 1\n}\n\n.weui-search-bar__box .weui-search-bar__input {\n  padding: 8px 0;\n  width: 100%;\n  height: 1.14285714em;\n  border: 0;\n  font-size: 14px;\n  line-height: 1.14285714em;\n  box-sizing: content-box;\n  background: transparent;\n  caret-color: var(--weui-BRAND);\n  color: var(--weui-FG-0)\n}\n\n.weui-search-bar__box .weui-search-bar__input:focus {\n  outline: none\n}\n\n.weui-search-bar__box .weui-icon-search {\n  position: absolute;\n  top: 50%;\n  left: 8px;\n  margin-top: -8px\n}\n\n.weui-search-bar__box .weui-icon-clear {\n  position: absolute;\n  top: 50%;\n  right: 0;\n  margin-top: -16px;\n  padding: 8px;\n  width: 16px;\n  height: 16px;\n  -webkit-mask-size: 16px;\n  mask-size: 16px\n}\n\n.weui-search-bar__label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 2;\n  font-size: 0;\n  border-radius: 4px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  color: var(--weui-FG-1);\n  background: var(--weui-BG-2)\n}\n\n.weui-search-bar__label span {\n  display: inline-block;\n  font-size: 14px;\n  vertical-align: middle\n}\n\n.weui-search-bar__label .weui-icon-search {\n  margin-right: 4px\n}\n\n.weui-search-bar__cancel-btn {\n  display: none;\n  margin-left: 8px;\n  line-height: 28px;\n  color: var(--weui-LINK);\n  white-space: nowrap\n}\n\n.weui-search-bar__input:not(:valid)+.weui-icon-clear {\n  display: none\n}\n\ninput[type=search]::-webkit-search-cancel-button,\ninput[type=search]::-webkit-search-decoration,\ninput[type=search]::-webkit-search-results-button,\ninput[type=search]::-webkit-search-results-decoration {\n  display: none\n}\n\n.weui-picker {\n  position: fixed;\n  width: 100%;\n  box-sizing: border-box;\n  left: 0;\n  bottom: 0;\n  z-index: 5000;\n  background-color: var(--weui-BG-2);\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom);\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  -webkit-transform: translateY(100%);\n  transform: translateY(100%);\n  -webkit-transition: -webkit-transform .3s;\n  transition: -webkit-transform .3s;\n  transition: transform .3s;\n  transition: transform .3s, -webkit-transform .3s\n}\n\n.weui-picker__hd {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  padding: 16px;\n  padding: 16px calc(16px + constant(safe-area-inset-right)) 16px calc(16px + constant(safe-area-inset-left));\n  padding: 16px calc(16px + env(safe-area-inset-right)) 16px calc(16px + env(safe-area-inset-left));\n  position: relative;\n  text-align: center;\n  font-size: 17px;\n  line-height: 1.4\n}\n\n.weui-picker__hd:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-picker__bd {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  position: relative;\n  background-color: var(--weui-BG-2);\n  height: 240px;\n  overflow: hidden\n}\n\n.weui-picker__group {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  position: relative;\n  height: 100%\n}\n\n.weui-picker__group:first-child .weui-picker__item {\n  padding-left: constant(safe-area-inset-left);\n  padding-left: env(safe-area-inset-left)\n}\n\n.weui-picker__group:last-child .weui-picker__item {\n  padding-right: constant(safe-area-inset-right);\n  padding-right: env(safe-area-inset-right)\n}\n\n.weui-picker__mask {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  margin: 0 auto;\n  z-index: 3;\n  background-image: -webkit-linear-gradient(top, hsla(0, 0%, 100%, .95), hsla(0, 0%, 100%, .6)), -webkit-linear-gradient(bottom, hsla(0, 0%, 100%, .95), hsla(0, 0%, 100%, .6));\n  background-image: linear-gradient(180deg, hsla(0, 0%, 100%, .95), hsla(0, 0%, 100%, .6)), linear-gradient(0deg, hsla(0, 0%, 100%, .95), hsla(0, 0%, 100%, .6));\n  background-position: top, bottom;\n  background-size: 100% 92px;\n  background-repeat: no-repeat;\n  -webkit-transform: translateZ(0);\n  transform: translateZ(0)\n}\n\n[data-weui-theme=dark] .weui-picker__mask {\n  background-image: -webkit-linear-gradient(top, rgba(35, 35, 35, .95), rgba(35, 35, 35, .6)), -webkit-linear-gradient(bottom, rgba(35, 35, 35, .95), rgba(35, 35, 35, .6));\n  background-image: linear-gradient(180deg, rgba(35, 35, 35, .95), rgba(35, 35, 35, .6)), linear-gradient(0deg, rgba(35, 35, 35, .95), rgba(35, 35, 35, .6))\n}\n\n.weui-picker__indicator {\n  width: 100%;\n  height: 56px;\n  position: absolute;\n  left: 0;\n  top: 92px;\n  z-index: 3\n}\n\n.weui-picker__indicator:before {\n  top: 0;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-picker__indicator:after,\n.weui-picker__indicator:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 1px;\n  color: var(--weui-FG-3)\n}\n\n.weui-picker__indicator:after {\n  bottom: 0;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-picker__content {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%\n}\n\n.weui-picker__item {\n  height: 48px;\n  line-height: 48px;\n  text-align: center;\n  color: var(--weui-FG-0);\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden\n}\n\n.weui-picker__item_disabled {\n  color: var(--weui-FG-1)\n}\n\n@-webkit-keyframes a {\n  0% {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0)\n  }\n\n  to {\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0)\n  }\n}\n\n@keyframes a {\n  0% {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0)\n  }\n\n  to {\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0)\n  }\n}\n\n.weui-animate-slide-up {\n  -webkit-animation: a ease .3s forwards;\n  animation: a ease .3s forwards\n}\n\n@-webkit-keyframes b {\n  0% {\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0)\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0)\n  }\n}\n\n@keyframes b {\n  0% {\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0)\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0)\n  }\n}\n\n.weui-animate-slide-down {\n  -webkit-animation: b ease .3s forwards;\n  animation: b ease .3s forwards\n}\n\n@-webkit-keyframes c {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n@keyframes c {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n.weui-animate-fade-in {\n  -webkit-animation: c ease .3s forwards;\n  animation: c ease .3s forwards\n}\n\n@-webkit-keyframes d {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n@keyframes d {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n.weui-animate-fade-out {\n  -webkit-animation: d ease .3s forwards;\n  animation: d ease .3s forwards\n}\n\n.weui-agree {\n  display: block;\n  padding: 8px 15px 0;\n  font-size: 14px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-agree a,\n.weui-agree navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-agree navigator {\n  display: inline\n}\n\n.weui-agree__text {\n  color: var(--weui-FG-1);\n  margin-left: 2px\n}\n\n.weui-agree__checkbox {\n  -webkit-appearance: none;\n  appearance: none;\n  display: inline-block;\n  border: 0;\n  outline: 0;\n  vertical-align: middle;\n  background-color: currentColor;\n  -webkit-mask-position: 0 0;\n  mask-position: 0 0;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);\n  color: var(--weui-FG-2);\n  width: 1em;\n  height: 1em;\n  font-size: 17px;\n  margin-top: -.2em\n}\n\n.weui-agree__checkbox-check {\n  position: absolute;\n  left: -9999px\n}\n\n.weui-agree__checkbox-check[aria-checked=true]+.weui-agree__checkbox,\n.weui-agree__checkbox:checked {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);\n  color: var(--weui-BRAND)\n}\n\n.weui-agree_animate {\n  -webkit-animation: e .3s 1;\n  animation: e .3s 1\n}\n\n@-webkit-keyframes e {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  16% {\n    -webkit-transform: translateX(-8px);\n    transform: translateX(-8px)\n  }\n\n  28% {\n    -webkit-transform: translateX(-16px);\n    transform: translateX(-16px)\n  }\n\n  44% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  59% {\n    -webkit-transform: translateX(-16px);\n    transform: translateX(-16px)\n  }\n\n  73% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  82% {\n    -webkit-transform: translateX(16px);\n    transform: translateX(16px)\n  }\n\n  94% {\n    -webkit-transform: translateX(8px);\n    transform: translateX(8px)\n  }\n\n  to {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n}\n\n@keyframes e {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  16% {\n    -webkit-transform: translateX(-8px);\n    transform: translateX(-8px)\n  }\n\n  28% {\n    -webkit-transform: translateX(-16px);\n    transform: translateX(-16px)\n  }\n\n  44% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  59% {\n    -webkit-transform: translateX(-16px);\n    transform: translateX(-16px)\n  }\n\n  73% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  82% {\n    -webkit-transform: translateX(16px);\n    transform: translateX(16px)\n  }\n\n  94% {\n    -webkit-transform: translateX(8px);\n    transform: translateX(8px)\n  }\n\n  to {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n}\n\n.weui-loading {\n  width: 20px;\n  height: 20px;\n  display: inline-block;\n  vertical-align: middle;\n  -webkit-animation: f 1s steps(12) infinite;\n  animation: f 1s steps(12) infinite;\n  background: transparent url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E9E9E9' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23989697' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%239B999A' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23A3A1A2' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23ABA9AA' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23B2B2B2' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23BAB8B9' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23C2C0C1' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23CBCBCB' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23D2D2D2' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23DADADA' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E2E2E2' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E\") no-repeat;\n  background-size: 100%\n}\n\n.weui-btn_loading.weui-btn_primary .weui-loading,\n.weui-loading.weui-loading_transparent {\n  background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect xmlns='http://www.w3.org/2000/svg' width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.56)' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.5)' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.43)' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.38)' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.32)' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.28)' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.25)' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.2)' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.17)' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.14)' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.1)' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.03)' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E\")\n}\n\n@-webkit-keyframes f {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg)\n  }\n\n  to {\n    -webkit-transform: rotate(1turn);\n    transform: rotate(1turn)\n  }\n}\n\n@keyframes f {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg)\n  }\n\n  to {\n    -webkit-transform: rotate(1turn);\n    transform: rotate(1turn)\n  }\n}\n\n.weui-slider {\n  padding: 15px 18px;\n  -webkit-user-select: none;\n  user-select: none\n}\n\n.weui-slider__inner {\n  position: relative;\n  height: 2px;\n  background-color: var(--weui-FG-3)\n}\n\n.weui-slider__track {\n  height: 2px;\n  background-color: var(--weui-BRAND);\n  width: 0\n}\n\n.weui-slider__handler {\n  position: absolute;\n  left: 0;\n  top: 50%;\n  width: 28px;\n  height: 28px;\n  margin-left: -14px;\n  margin-top: -14px;\n  border-radius: 50%;\n  background-color: #fff;\n  box-shadow: 0 0 4px var(--weui-FG-3)\n}\n\n.weui-slider-box {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-slider-box .weui-slider {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-slider-box__value {\n  margin-left: .5em;\n  min-width: 24px;\n  color: var(--weui-FG-1);\n  text-align: center;\n  font-size: 14px\n}\n\n.wx_dot_loading,\n.wx_dot_loading:after,\n.wx_dot_loading:before {\n  display: inline-block;\n  vertical-align: middle;\n  width: 6px;\n  height: 6px;\n  border-radius: 50%;\n  background-color: rgba(0, 0, 0, .3);\n  font-size: 0;\n  -webkit-animation: h 1.6s step-start infinite;\n  animation: h 1.6s step-start infinite\n}\n\n.wx_dot_loading {\n  position: relative\n}\n\n.wx_dot_loading:before {\n  content: \"\";\n  position: absolute;\n  left: -12px;\n  background-color: rgba(0, 0, 0, .1);\n  -webkit-animation: g 1.6s step-start infinite;\n  animation: g 1.6s step-start infinite\n}\n\n.wx_dot_loading:after {\n  content: \"\";\n  position: absolute;\n  right: -12px;\n  background-color: rgba(0, 0, 0, .5);\n  -webkit-animation: i 1.6s step-start infinite;\n  animation: i 1.6s step-start infinite\n}\n\n@-webkit-keyframes g {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .1)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .3)\n  }\n}\n\n@keyframes g {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .1)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .3)\n  }\n}\n\n@-webkit-keyframes h {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .3)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .1)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .5)\n  }\n}\n\n@keyframes h {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .3)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .1)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .5)\n  }\n}\n\n@-webkit-keyframes i {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .3)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .1)\n  }\n}\n\n@keyframes i {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .3)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .1)\n  }\n}\n\n.wx_dot_loading_white {\n  background-color: hsla(0, 0%, 100%, .3);\n  -webkit-animation: k 1.6s step-start infinite;\n  animation: k 1.6s step-start infinite\n}\n\n.wx_dot_loading_white:before {\n  background-color: hsla(0, 0%, 100%, .5);\n  -webkit-animation: j 1.6s step-start infinite;\n  animation: j 1.6s step-start infinite\n}\n\n.wx_dot_loading_white:after {\n  background-color: hsla(0, 0%, 100%, .1);\n  -webkit-animation: l 1.6s step-start infinite;\n  animation: l 1.6s step-start infinite\n}\n\n@-webkit-keyframes j {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n}\n\n@keyframes j {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n}\n\n@-webkit-keyframes k {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n}\n\n@keyframes k {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n}\n\n@-webkit-keyframes l {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n}\n\n@keyframes l {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n}\n\n:host {\n  width: 100%\n}\n\n.weui-slideview {\n  position: relative;\n  overflow: hidden\n}\n\n.weui-slideview__left {\n  position: relative;\n  z-index: 10\n}\n\n.weui-slideview__right {\n  position: absolute;\n  z-index: 1;\n  left: 100%;\n  top: 0;\n  height: 100%\n}\n\n.weui-slideview__btn__wrp {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  text-align: center;\n  min-width: 69px;\n  height: 100%;\n  white-space: nowrap\n}\n\n.weui-slideview__btn {\n  color: #fff;\n  padding: 0 17px\n}\n\n.weui-slideview__btn-group_default .weui-slideview__btn {\n  background: #c7c7cc\n}\n\n[data-weui-theme=dark] .weui-slideview__btn-group_default .weui-slideview__btn {\n  background: var(--weui-BG-4)\n}\n\n.weui-slideview__btn-group_default~.weui-slideview__btn-group_default:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid #fff;\n  color: #fff;\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n[data-weui-theme=dark] .weui-slideview__btn-group_default~.weui-slideview__btn-group_default:before {\n  border-left-color: var(--weui-FG-3)\n}\n\n.weui-slideview__btn-group_default:first-child:before {\n  display: none\n}\n\n.weui-slideview__btn-group_warn .weui-slideview__btn {\n  background: #fe3b30\n}\n\n.weui-slideview__btn-group_warn~.weui-slideview__btn-group_warn:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid #fff;\n  color: #fff;\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-slideview__btn-group_warn:first-child:before {\n  display: none\n}\n\n.weui-slideview_icon .weui-slideview__btn__wrp {\n  background: transparent;\n  font-size: 0\n}\n\n.weui-slideview_icon .weui-slideview__btn__wrp:first-child {\n  padding-left: 16px\n}\n\n.weui-slideview_icon .weui-slideview__btn__wrp:last-child {\n  padding-right: 8px\n}\n\n.weui-slideview_icon .weui-slideview__btn {\n  width: 48px;\n  height: 48px;\n  line-height: 48px;\n  padding: 0;\n  display: inline-block;\n  vertical-align: middle;\n  border-radius: 50%;\n  background-color: #fff\n}\n\n[data-weui-theme=dark] .weui-slideview_icon .weui-slideview__btn {\n  background-color: var(--weui-BG-4)\n}\n\n.weui-slideview_icon .weui-slideview__btn__icon {\n  display: inline-block;\n  vertical-align: middle;\n  width: 22px;\n  height: 22px\n}\n\npage {\n  --height: 44px;\n  --right: 95px\n}\n\n.weui-navigation-bar {\n  overflow: hidden;\n  color: var(--weui-FG-0)\n}\n\n.weui-navigation-bar .android {\n  --height: 48px;\n  --right: 221px\n}\n\n.weui-navigation-bar__inner {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 5001;\n  height: var(--height);\n  padding-right: var(--right);\n  width: calc(100% - var(--right))\n}\n\n.weui-navigation-bar__inner,\n.weui-navigation-bar__inner .weui-navigation-bar__left {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left {\n  position: relative;\n  width: var(--right);\n  padding-left: 16px\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left .weui-navigation-bar__btn {\n  display: inline-block;\n  vertical-align: middle;\n  background-repeat: no-repeat\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left .weui-navigation-bar__btn_goback {\n  font-size: 12px;\n  width: 1em;\n  height: 2em;\n  -webkit-mask: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='24' viewBox='0 0 12 24'%3E  %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M10 19.438L8.955 20.5l-7.666-7.79a1.02 1.02 0 0 1 0-1.42L8.955 3.5 10 4.563 2.682 12 10 19.438z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  mask: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='24' viewBox='0 0 12 24'%3E  %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M10 19.438L8.955 20.5l-7.666-7.79a1.02 1.02 0 0 1 0-1.42L8.955 3.5 10 4.563 2.682 12 10 19.438z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  -webkit-mask-size: cover;\n  mask-size: cover;\n  background-color: currentColor\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left .weui-navigation-bar__btn_goback:active {\n  opacity: .5\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__center {\n  font-size: 17px;\n  text-align: center;\n  position: relative;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__loading {\n  margin-right: 4px;\n  font-size: 0\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__loading .weui-loading {\n  margin-left: 0\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__right {\n  margin-right: 16px\n}\n\n.weui-navigation-bar__placeholder {\n  height: var(--height);\n  background: var(--weui-BG-1);\n  position: relative;\n  z-index: 50\n}\n\n.weui-uploader__hd {\n  display: block\n}\n\n.weui-uploader__overview {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-uploader__tips {\n  color: var(--weui-FG-2);\n  font-size: 14px;\n  line-height: 1.4;\n  padding-top: 4px\n}\n\n.weui-uploader__img {\n  display: block;\n  width: 100%;\n  height: 100%\n}\n\n.weui-gallery {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -webkit-flex-wrap: nowrap;\n  flex-wrap: nowrap\n}\n\n.weui-gallery__info {\n  color: #fff;\n  font-size: 17px;\n  line-height: 60px;\n  min-height: 60px;\n  text-align: center\n}\n\n.weui-gallery__img__wrp {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  position: relative;\n  font-size: 0\n}\n\n.weui-gallery__img {\n  position: absolute;\n  width: 100%;\n  height: 100%\n}\n\n.weui-gallery__opr {\n  position: static\n}\n\n.weui-search-bar .weui-search-bar__box .weui-search-bar__input {\n  height: inherit;\n  line-height: inherit\n}\n\n.weui-search-bar .weui-search-bar__box .weui-icon-clear {\n  display: block\n}\n\n.weui-loadmore .weui-loading {\n  margin-right: .3em\n}\n\n.weui-btn_input-clear {\n  display: block\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/freelayout/freelayout.js",
    "content": "Page({\n  data: {\n    theme: 'light'\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  onShareAppMessage() {\n    return {\n      title: '自由布局',\n      path: 'packageExtend/pages/adapt/freelayout/freelayout'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/freelayout/freelayout.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-col\": \"../../../components/col/index\",\n    \"mp-row\": \"../../../components/row/index\"\n  },\n  \"renderer\": \"webview\",\n  \"navigationBarTitleText\": \"自由布局\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/freelayout/freelayout.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <view class=\"flexbox\">\n    <mp-row>\n      <mp-col xs=\"{{24}}\" span=\"{{0}}\">\n        <view>\n          <view class=\"item item-A\">A</view>\n        </view>\n      </mp-col>\n      <mp-col xs=\"{{24}}\" span=\"{{0}}\">\n        <view>\n          <view class=\"item item-B\">B</view>\n        </view>\n      </mp-col>\n      <mp-col xs=\"{{24}}\" span=\"{{0}}\">\n        <view>\n          <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item item-C'}}\">C</view>\n        </view>\n      </mp-col>\n    </mp-row>\n    <!-- 宽屏左右布局 -->\n    <mp-row>\n      <mp-col xs=\"{{0}}\" span=\"{{16}}\">\n        <mp-row>\n          <mp-col>\n            <view>\n              <view class=\"item item-A\">A</view>\n            </view>\n          </mp-col>\n          <mp-col>\n            <view>\n              <view class=\"item item-B\">B</view>\n            </view>\n          </mp-col>\n        </mp-row>\n      </mp-col>\n      <mp-col xs=\"{{0}}\" span=\"{{8}}\">\n        <view>\n          <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item item-C'}}\" style=\"height: 490px; line-height:480px;\">\n            C\n          </view>\n        </view>\n      </mp-col>\n    </mp-row>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/freelayout/freelayout.wxss",
    "content": "page>view {\n  width: 100vw;\n  max-width: 100vw;\n}\n\nview, image, navigator {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\n.container {\n  display: block;\n  width: 100vw;\n  padding: 20rpx;\n  color: #ffffff;\n  font-size: 28px;\n}\n\n.item {\n  margin: 6px;\n  height: 240px;\n  line-height: 240px;\n  text-align: center;\n  background: #ecebec;\n  /* border: 1px solid #555050; */\n}\n.item-A {\n  background: #1aad19;\n}\n.item-B {\n  background: #2782d7;\n}\n\n.item-C {\n  background: #d8d8d8;\n  height: 100%;\n  color: #353535;\n}\n.dark-C {\n  background: #f1f1f1;\n  color: #353535;\n}\n\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/horizontalexpansion/horizontalexpansion.js",
    "content": "Page({\n  data: {\n    theme: 'light'\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  onShareAppMessage() {\n    return {\n      title: '横向拓展',\n      path: 'packageExtend/pages/adapt/horizontalexpansion/horizontalexpansion'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/horizontalexpansion/horizontalexpansion.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-col\": \"../../../components/col/index\",\n    \"mp-row\": \"../../../components/row/index\"\n  },\n  \"renderer\": \"webview\",\n  \"navigationBarTitleText\": \"横向拓展\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/horizontalexpansion/horizontalexpansion.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <view>\n    <swiper class=\"item-swiper\">\n      <swiper-item>\n        <view class=\"item item-A\">A</view>\n      </swiper-item>\n      <swiper-item>\n        <view class=\"item item-B\">B</view>\n      </swiper-item>\n      <swiper-item>\n        <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item'}}\">C</view>\n      </swiper-item>\n    </swiper>\n  </view>\n  <view>\n    <mp-row>\n      <mp-col xs=\"{{0}}\" span=\"{{8}}\">\n        <view>\n          <view class=\"item item-A\">A</view>\n        </view>\n      </mp-col>\n      <mp-col xs=\"{{0}}\" span=\"{{8}}\">\n        <view>\n          <view class=\"item item-B\">B</view>\n        </view>\n      </mp-col>\n      <mp-col xs=\"{{0}}\" span=\"{{8}}\">\n        <view>\n          <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item item-C'}}\">C</view>\n        </view>\n      </mp-col>\n    </mp-row>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/horizontalexpansion/horizontalexpansion.wxss",
    "content": "page>view {\n  width: 100vw;\n  max-width: 100vw;\n}\n\nview, image, navigator {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\n.container {\n  display: block;\n  width: 100vw;\n  padding: 20rpx;\n  color: #ffffff;\n  font-size: 28px;\n}\n\n.item {\n  margin: 6px;\n  height: 240px;\n  line-height: 240px;\n  text-align: center;\n  background: #d8d8d8;\n  color: #353535;\n  /* border: 1px solid #555050; */\n}\n.item-swiper {\n  display: none;\n  height: 250px;\n}\n\n@media (max-width: 767px) {\n  .item-swiper {\n    display: block;\n  }\n}\n\n.item-A {\n  background: #1aad19;\n  color: #ffffff;\n}\n.item-B {\n  background: #2782d7;\n  color: #ffffff;\n}\n\n.item-C {\n  background: #d8d8d8;\n  color: #353535;\n}\n.dark-C {\n  background: #f1f1f1;\n  color: #353535;\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/layeredpresentation/layeredpresentation.js",
    "content": "Page({\n  data: {\n    theme: 'light',\n    hide1: false,\n    hide2: false\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  onClick(e) {\n    this.setData({ [e.target.dataset.set]: true })\n  },\n  onShareAppMessage() {\n    return {\n      title: '分层展现',\n      path: 'packageExtend/pages/adapt/layeredpresentation/layeredpresentation'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/layeredpresentation/layeredpresentation.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-col\": \"../../../components/col/index\",\n    \"mp-row\": \"../../../components/row/index\"\n  },\n  \"renderer\": \"webview\",\n  \"navigationBarTitleText\": \"分层展现\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/layeredpresentation/layeredpresentation.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <view>\n    <mp-row>\n      <mp-col xs=\"{{24}}\" span=\"{{4}}\">\n        <view>\n          <view class=\"item item-A\">A</view>\n        </view>\n      </mp-col>\n      <mp-col xs=\"{{0}}\" span=\"{{8}}\">\n        <view>\n          <view class=\"item item-B\">B</view>\n        </view>\n      </mp-col>\n      <mp-col xs=\"{{0}}\" span=\"{{12}}\">\n        <view>\n          <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item item-C'}}\">C</view>\n        </view>\n      </mp-col>\n    </mp-row>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/layeredpresentation/layeredpresentation.wxss",
    "content": "page>view {\n  width: 100vw;\n  max-width: 100vw;\n}\n\nview, image, navigator {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\n.container {\n  display: block;\n  width: 100vw;\n  padding: 20rpx;\n  color: #ffffff;\n  font-size: 28px;\n}\n\n.item {\n  margin: 6px;\n  height: 240px;\n  line-height: 240px;\n  text-align: center;\n  background: #ecebec;\n  border: 1px solid #555050;\n}\n\n.item-A {\n  background: #1aad19;\n  height: 100%;\n}\n.item-B {\n  background: #2782d7;\n  height: 100%;\n}\n\n.item-C {\n  background: #d8d8d8;\n  height: 100%;\n  color: #353535;\n}\n\n.item {\n  border: 0px;\n  margin: 0px;\n  height: 450px;\n  line-height: 450px;\n}\n.dark-C {\n  background: #f1f1f1;\n  color: #353535;\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/linebreak/linebreak.js",
    "content": "Page({\n  data: {\n    theme: 'light',\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  onShareAppMessage() {\n    return {\n      title: '换行排列',\n      path: 'packageExtend/pages/adapt/linebreak/linebreak'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/linebreak/linebreak.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-col\": \"../../../components/col/index\",\n    \"mp-row\": \"../../../components/row/index\"\n  },\n  \"renderer\": \"webview\",\n  \"navigationBarTitleText\": \"换行排列\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/linebreak/linebreak.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <mp-row>\n    <mp-col xs=\"{{24}}\" span=\"{{4}}\">\n      <view>\n        <view class=\"item\"></view>\n      </view>\n    </mp-col>\n    <mp-col xs=\"{{24}}\" span=\"{{4}}\">\n      <view>\n        <view class=\"item\"></view>\n      </view>\n    </mp-col>\n    <mp-col xs=\"{{24}}\" span=\"{{4}}\">\n      <view>\n        <view class=\"item\"></view>\n      </view>\n    </mp-col>\n    <mp-col xs=\"{{24}}\" span=\"{{4}}\">\n      <view>\n        <view class=\"item\"></view>\n      </view>\n    </mp-col>\n    <mp-col xs=\"{{24}}\" span=\"{{4}}\">\n      <view>\n        <view class=\"item\"></view>\n      </view>\n    </mp-col>\n    <mp-col xs=\"{{24}}\" span=\"{{4}}\">\n      <view>\n        <view class=\"item\"></view>\n      </view>\n    </mp-col>\n  </mp-row>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/linebreak/linebreak.wxss",
    "content": "page>view {\n  width: 100vw;\n  max-width: 100vw;\n}\n\nview, image, navigator {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\n.container {\n  width: 100vw;\n  padding: 20rpx;\n  color: #191919;\n  font-size: 28px;\n}\n\n.item {\n  margin: 6px;\n  height: 240px;\n  line-height: 240px;\n  text-align: center;\n  background: #1aad19;\n  /* border: 1px solid #555050; */\n}\n\n.container .flexbox {\n  display: flex;\n  flex-wrap: wrap;\n}\n\n.container .flexbox .item {\n  flex: 0 0 100%;\n  height: 150px;\n  padding: 6px;\n}\n\n.container .flexbox .item .block {\n  width: 100%;\n  height: 100%;\n  background: #ecebec;\n}\n\n@media only screen and (min-width: 420px) {\n  .container .flexbox .item {\n    flex: 0 0 50%;\n  }\n}\n\n@media only screen and (min-width: 768px) {\n  .container .flexbox .item {\n    flex: 0 0 33.33%;\n  }\n}\n\n@media only screen and (min-width: 1024px) {\n  .container .flexbox .item {\n    flex: 0 0 25%;\n  }\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/pagination/pagination.js",
    "content": "Page({\n  data: {\n    theme: 'light',\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  onShareAppMessage() {\n    return {\n      title: '分页展现',\n      path: 'packageExtend/pages/adapt/pagination/pagination'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/pagination/pagination.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-col\": \"../../../components/col/index\",\n    \"mp-row\": \"../../../components/row/index\"\n  },\n  \"renderer\": \"webview\",\n  \"navigationBarTitleText\": \"分页展现\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/pagination/pagination.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <mp-row>\n    <mp-col xs=\"{{24}}\" span=\"{{12}}\">\n      <view>\n        <view class=\"item item-A\">A</view>\n      </view>\n    </mp-col>\n    <mp-col xs=\"{{24}}\" span=\"{{12}}\">\n      <view>\n        <view class=\"item item-B\">B</view>\n      </view>\n    </mp-col>\n  </mp-row>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/pagination/pagination.wxss",
    "content": "page>view {\n  width: 100vw;\n  max-width: 100vw;\n}\n\nview, image, navigator {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\n.container {\n  display: block;\n  width: 100vw;\n  padding: 20rpx;\n  color: #ffffff;\n  font-size: 28px;\n}\n\n.item {\n  margin: 6px;\n  height: 240px;\n  line-height: 240px;\n  text-align: center;\n  background: #ecebec;\n  /* border: 1px solid #555050; */\n}\n.item-A {\n  background: #1aad19;\n}\n.item-B {\n  background: #2782d7;\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/sidenavigation/sidenavigation.js",
    "content": "Page({\n  data: {\n    show: false,\n    theme: 'light'\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  show() {\n    this.setData({ show: true })\n  },\n  hide() {\n    this.setData({ show: false })\n  },\n  onShareAppMessage() {\n    return {\n      title: '侧边导航栏',\n      path: 'packageExtend/pages/adapt/sidenavigation/sidenavigation'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/sidenavigation/sidenavigation.json",
    "content": "{\n  \"usingComponents\": {},\n  \"renderer\": \"webview\",\n  \"navigationBarTitleText\": \"侧边导航栏\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/sidenavigation/sidenavigation.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <view class=\"mobile {{show ? 'active' : ''}}\">\n    <view class=\"{{theme === 'dark' ? 'left dark-bg' : 'left'}}\">\n      <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item'}}\"></view>\n      <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item'}}\"></view>\n      <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item'}}\"></view>\n      <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item'}}\"></view>\n    </view>\n    <view class=\"right\">\n      <view class=\"nav-bar\">\n        <image class=\"button\" bindtap=\"show\" src=\"../../image/button.png\" mode=\"aspectFill\"></image>\n      </view>\n      <view class=\"section\" bindtap=\"hide\"></view>\n    </view>\n  </view>\n  <view class=\"laptop\">\n    <view class=\"nav-bar\"></view>\n    <view class=\"flexbox\">\n      <view class=\"left\">\n        <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item'}}\"></view>\n        <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item'}}\"></view>\n        <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item'}}\"></view>\n        <view class=\"{{theme === 'dark' ? 'item dark-C' : 'item'}}\"></view>\n      </view>\n      <view class=\"right\"></view>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/sidenavigation/sidenavigation.wxss",
    "content": ".container {\n  height: 100vh;\n}\n\n.mobile {\n  height: 100%;\n  position: relative;\n}\n\n.mobile > view {\n  transition: all .3s ease-in-out;\n}\n\n.mobile .left {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 0;\n  height: 100%;\n  background: #ecebec;\n  z-index: 3;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.mobile .left .item {\n  width: 80%;\n  height: 60rpx;\n  background: #d8d8d8;\n  margin-top: 40rpx;\n  border-radius: 4px;\n  border: 0px;\n}\n\n.mobile.active .left {\n  width: 66.66%;\n}\n\n.mobile.active .right {\n  opacity: .3;\n}\n\n.mobile .right {\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n}\n\n.mobile .nav-bar {\n  height: 80rpx;\n  position: relative;\n  background: #2782d7;\n  border-radius: 4px;\n  margin-bottom: 30rpx;\n}\n\n.mobile .nav-bar .button {\n  width: 50rpx;\n  height: 50rpx;\n  position: absolute;\n  top: 50%;\n  left: 30rpx;\n  transform: translateY(-50%);\n}\n\n.mobile .section {\n  flex: auto;\n  background: #1aad19;\n  border-radius: 4px;\n}\n\n.laptop {\n  display: none;\n}\n\n.laptop .nav-bar {\n  height: 40rpx;\n  position: relative;\n  background: #2782d7;\n  border-radius: 4px;\n  margin-bottom: 20rpx;\n}\n\n.laptop .flexbox {\n  display: flex;\n}\n\n.laptop .flexbox .left {\n  flex: 1;\n}\n\n.laptop .flexbox .left .item {\n  width: 90%;\n  height: 30rpx;\n  background: #d8d8d8;\n  margin-bottom: 15rpx;\n  border-radius: 4px;\n}\n\n.laptop .flexbox .right {\n  flex: 3;\n  height: 500rpx;\n  background: #1aad19;\n  border-radius: 4px;\n}\n\n@media only screen and (min-width: 576px) {\n  .mobile {\n    display: none;\n  }\n  .laptop {\n    display: block;\n  }\n}\n\npage>view {\n  width: 100vw;\n  max-width: 100vw;\n}\n\nview, image, navigator {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\n.container {\n  display: block;\n  width: 100vw;\n  padding: 20rpx;\n  color: #191919;\n  font-size: 28px;\n}\n\n.item {\n  margin: 6px;\n  height: 240px;\n  line-height: 240px;\n  text-align: center;\n  background: #ecebec;\n  /* border: 1px solid #555050; */\n}\n.mobile .left .dark-C, .laptop .flexbox .left .dark-C {\n  background: #f1f1f1;\n  color: #353535;\n}\n.mobile .dark-bg {\n  background-color: #1F1F1F; \n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/telescopic/telescopic.js",
    "content": "Page({\n  data: {\n    theme: 'light',\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n    // wx.showModal({\n    //   content: '暂不支持该功能，可在windows版微信（2.9.5及以上版本）中拖动窗口大小查看效果',\n    //   showCancel: false,\n    //   confirmText: '我知道了'\n    // })\n  },\n  onShareAppMessage() {\n    return {\n      title: '左右伸缩',\n      path: 'packageExtend/pages/adapt/telescopic/telescopic'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/telescopic/telescopic.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-col\": \"../../../components/col/index\",\n    \"mp-row\": \"../../../components/row/index\"\n  },\n  \"renderer\": \"webview\",\n  \"navigationBarTitleText\": \"左右伸缩\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/telescopic/telescopic.wxml",
    "content": "<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <mp-row>\n    <mp-col span=\"{{12}}\">\n      <view>\n        <view class=\"item\"></view>\n      </view>\n    </mp-col>\n    <mp-col span=\"{{12}}\">\n      <view>\n        <view class=\"item\"></view>\n      </view>\n    </mp-col>\n  </mp-row>\n  <mp-row>\n    <mp-col span=\"{{12}}\">\n      <view>\n        <view class=\"item\"></view>\n      </view>\n    </mp-col>\n    <mp-col span=\"{{12}}\">\n      <view>\n        <view class=\"item\"></view>\n      </view>\n    </mp-col>\n  </mp-row>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/adapt/telescopic/telescopic.wxss",
    "content": ".container .flex-row {\n  display: flex;\n  justify-content: space-between;\n}\n\n\n.item {\n  margin: 6px;\n  height: 240px;\n  background: #ecebec;\n  /* border: 1px solid #555050; */\n}\n\npage>view {\n  width: 100vw;\n  max-width: 100vw;\n}\n\nview, image, navigator {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\n.container {\n  display: block;\n  width: 100vw;\n  padding: 20rpx;\n  color: #191919;\n  font-size: 28px;\n}\n\n.item {\n  margin: 6px;\n  height: 240px;\n  line-height: 240px;\n  text-align: center;\n  background: #1aad19;\n  /* border: 1px solid #555050; */\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/article/article.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/article/article.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/article/article.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Article\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Article</view>\n            <view class=\"page__desc\">文章</view>\n        </view>\n        <view class=\"page__bd\">\n            <view class=\"weui-article\">\n                <view class=\"weui-article__h1\">大标题</view>\n                <view class=\"weui-article__section\">\n                    <view class=\"weui-article__h2\">章标题</view>\n                    <view class=\"weui-article__section\">\n                        <view class=\"weui-article__h3\">1.1 节标题</view>\n                        <view class=\"weui-article__p\">\n                            Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                            tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n                            quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n                            consequat.\n                        </view>\n                        <view class=\"weui-article__p\">\n                            <image class=\"weui-article__img\" src=\"../images/pic_article.png\" mode=\"aspectFit\" style=\"height: 180px\" />\n                            <image class=\"weui-article__img\" src=\"../images/pic_article.png\" mode=\"aspectFit\" style=\"height: 180px\" />\n                        </view>\n                    </view>\n                    <view class=\"weui-article__section\">\n                        <view class=\"weui-article__h3\">1.2 节标题</view>\n                        <view class=\"weui-article__p\">\n                            Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                            tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n                            cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\n                            proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n                        </view>\n                    </view>\n                </view>\n            </view>\n        </view>\n    </scroll-view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/article/article.wxss",
    "content": "@import '../../common.wxss';\n\npage{\n    /* background-color: #FFFFFF; */\n}\nimage{\n    margin: 4px 0;\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/badge/badge.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/badge/badge.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n    \"mp-cells\": \"weui-miniprogram/cells/cells\",\n    \"mp-cell\": \"weui-miniprogram/cell/cell\",\n    \"mp-badge\": \"weui-miniprogram/badge/badge\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/badge/badge.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Badge\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Badge</view>\n            <view class=\"page__desc\">徽章</view>\n        </view>\n\n        <view class=\"page__bd\">\n            <mp-cells title=\"新消息提示跟摘要信息后，统一在列表右侧\">\n                <mp-cell title=\"单行列表\" link>\n                    <view slot=\"footer\" style=\"display: flex; flex-direction: row; align-items: center;\">\n                        <view style=\"display: inline-block;vertical-align:middle; font-size: 17px;\">详细信息</view>\n                        <mp-badge style=\"margin-left: 5px;margin-right: 5px;\" ext-class=\"blue\"/>\n                    </view>\n                </mp-cell>\n            </mp-cells>\n\n            <mp-cells title=\"未读数红点跟在主题信息后，统一在列表左侧\">\n                <mp-cell>\n                    <view slot=\"title\" style=\"position: relative;margin-right: 10px;\">\n                        <image src=\"../../images/pic_160.png\" style=\"width: 50px; height: 50px; display: block\"/>\n                        <mp-badge aria-label=\"未读\" content=\"99+\" style=\"position: absolute;top: -0.4rem;right: -0.4rem;\"/>\n                    </view>\n                    <view>联系人名称</view>\n                    <view style=\"font-size: 13px;color: #888888;\">摘要信息</view>\n                </mp-cell>\n                <mp-cell link>\n                    <view style=\"display: flex; flex-direction: row; align-items: center;\">\n                        <view style=\"display: inline-block; vertical-align: middle\">单行列表</view>\n                        <mp-badge content=\"8\" style=\"margin-left: 5px;\"/>\n                    </view>\n                </mp-cell>\n                <mp-cell link>\n                    <view style=\"display: flex; flex-direction: row; align-items: center;\">\n                        <view style=\"display: inline-block; vertical-align: middle\">单行列表</view>\n                        <mp-badge style=\"margin-left: 5px;\" content=\"New\"/>\n                    </view>\n                </mp-cell>\n            </mp-cells>\n        </view>\n    </scroll-view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/badge/badge.wxss",
    "content": "/* example/badge/badge.wxss */\n@import '../../common.wxss';\n\n.blue {\n  background: blue;\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/flex/flex.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/flex/flex.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/flex/flex.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Flex\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Flex</view>\n            <view class=\"page__desc\">Flex布局</view>\n        </view>\n        <view class=\"page__bd page__bd_spacing\">\n            <view class=\"weui-flex\">\n                <view class=\"weui-flex__item\"><view class=\"placeholder\">weui</view></view>\n            </view>\n            <view class=\"weui-flex\">\n                <view class=\"weui-flex__item\"><view class=\"placeholder\">weui</view></view>\n                <view class=\"weui-flex__item\"><view class=\"placeholder\">weui</view></view>\n            </view>\n            <view class=\"weui-flex\">\n                <view class=\"weui-flex__item\"><view class=\"placeholder\">weui</view></view>\n                <view class=\"weui-flex__item\"><view class=\"placeholder\">weui</view></view>\n                <view class=\"weui-flex__item\"><view class=\"placeholder\">weui</view></view>\n            </view>\n            <view class=\"weui-flex\">\n                <view class=\"weui-flex__item\"><view class=\"placeholder\">weui</view></view>\n                <view class=\"weui-flex__item\"><view class=\"placeholder\">weui</view></view>\n                <view class=\"weui-flex__item\"><view class=\"placeholder\">weui</view></view>\n                <view class=\"weui-flex__item\"><view class=\"placeholder\">weui</view></view>\n            </view>\n            <view class=\"weui-flex\">\n                <view><view class=\"placeholder\">weui</view></view>\n                <view class=\"weui-flex__item\"><view class=\"placeholder\">weui</view></view>\n                <view><view class=\"placeholder\">weui</view></view>\n            </view>\n        </view>\n    </scroll-view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/flex/flex.wxss",
    "content": "@import '../../common.wxss';\n\n.placeholder{\n    margin: 5px;\n    padding: 0 10px;\n    text-align: center;\n    background-color: var(--weui-BG-1);\n    height: 2.3em;\n    line-height: 2.3em;\n    color: var(--weui-FG-1);\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/footer/footer.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/footer/footer.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/footer/footer.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Footer\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Footer</view>\n            <view class=\"page__desc\">页脚</view>\n        </view>\n        <view class=\"page__bd page__bd_spacing\">\n            <view class=\"weui-footer\">\n                <view class=\"weui-footer__text\">Copyright © 2008-2016 weui.io</view>\n            </view>\n\n\n            <view class=\"weui-footer\">\n                <view class=\"weui-footer__links\">\n                    <navigator url=\"\" class=\"weui-footer__link\">底部链接</navigator>\n                </view>\n                <view class=\"weui-footer__text\">Copyright © 2008-2016 weui.io</view>\n            </view>\n\n\n            <view class=\"weui-footer\">\n                <view class=\"weui-footer__links\">\n                    <navigator url=\"\" class=\"weui-footer__link\">底部链接</navigator>\n                    <navigator url=\"\" class=\"weui-footer__link\">底部链接</navigator>\n                </view>\n                <view class=\"weui-footer__text\">Copyright © 2008-2016 weui.io</view>\n            </view>\n\n            <view class=\"weui-footer weui-footer_fixed-bottom\">\n                <view class=\"weui-footer__links\">\n                    <navigator url=\"\" class=\"weui-footer__link\">WeUI首页</navigator>\n                </view>\n                <view class=\"weui-footer__text\">Copyright © 2008-2016 weui.io</view>\n            </view>\n        </view>\n    </scroll-view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/footer/footer.wxss",
    "content": "/* 作为展示用的样式 */\n@import '../../common.wxss';\n\n.weui-footer{\n    margin-bottom: 50px;\n}\n.weui-footer_fixed-bottom{\n    margin-bottom: 0;\n}\n\n.weui-footer__links {\n\tdisplay: flex; /* skyline 不支持 inline */\n\tflex-direction: row;\n\tjustify-content: center;\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/gallery/gallery.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  data: {\n    imgUrls: [\n      'https://res.wx.qq.com/op_res/0TZreUFL8sWsS1cFx5_f7MF5aY767_cWsd9JiKdHxL9Ktu6O6JLAJwvF-jLVxpB3',\n      'https://res.wx.qq.com/op_res/0TZreUFL8sWsS1cFx5_f7MF5aY767_cWsd9JiKdHxL9Ktu6O6JLAJwvF-jLVxpB3',\n      'https://res.wx.qq.com/op_res/0TZreUFL8sWsS1cFx5_f7MF5aY767_cWsd9JiKdHxL9Ktu6O6JLAJwvF-jLVxpB3'\n    ],\n    show: true\n  },\n  openGallery() {\n    this.setData({ show: true })\n  },\n  change(e) {\n    console.log('current index has changed', e.detail)\n  },\n  delete(e) {\n    console.log('delete', e.detail)\n  },\n  hide() {\n    console.log('component hide')\n    setTimeout(() => {\n      console.log('component show')\n      this.setData({\n        show: true\n      })\n    }, 1000)\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/gallery/gallery.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n\t\t\"mp-gallery\": \"weui-miniprogram/gallery/gallery\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/gallery/gallery.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Gallery\"></mp-navigation-bar>\n    <view class=\"page__hd\">\n        <view class=\"page__title\">Gallery</view>\n        <view class=\"page__desc\">画廊，类似原生的wx.previewImage的展示。</view>\n    </view>\n    <button class=\"weui-btn weui-btn_default\" bindtap=\"openGallery\">open</button>\n    <mp-gallery show=\"{{show}}\" bindchange=\"change\" binddelete=\"delete\" bindhide=\"hide\" img-urls=\"{{imgUrls}}\" delete hide-on-click=\"{{true}}\" current=\"1\"></mp-gallery>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/gallery/gallery.wxss",
    "content": "/* example/gallery/gallery.wxss */\n@import '../../common.wxss';\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/grid/grid.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nconst { GRID_DEMO_URL } = getApp().globalData\nconst app = getApp()\n\nCustomPage({\n  data: {\n    grids: [\n      {\n        imgUrl: app.globalData.iconTabbar,\n        url: GRID_DEMO_URL,\n        text: 'Grid'\n      },\n      {\n        imgUrl: app.globalData.iconTabbar,\n        url: GRID_DEMO_URL,\n        text: 'Grid'\n      },\n      {\n        imgUrl: app.globalData.iconTabbar,\n        url: GRID_DEMO_URL,\n        text: 'Grid'\n      },\n      {\n        imgUrl: app.globalData.iconTabbar,\n        url: GRID_DEMO_URL,\n        text: 'Grid'\n      },\n      {\n        imgUrl: app.globalData.iconTabbar,\n        url: GRID_DEMO_URL,\n        text: 'Grid'\n      },\n      {\n        imgUrl: app.globalData.iconTabbar,\n        url: GRID_DEMO_URL,\n        text: 'Grid'\n      },\n      {\n        imgUrl: app.globalData.iconTabbar,\n        url: GRID_DEMO_URL,\n        text: 'Grid'\n      },\n      {\n        imgUrl: app.globalData.iconTabbar,\n        url: GRID_DEMO_URL,\n        text: 'Grid'\n      },\n      {\n        imgUrl: app.globalData.iconTabbar,\n        url: GRID_DEMO_URL,\n        text: 'Grid'\n      }\n    ]\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/grid/grid.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n\t\t\"mp-grids\": \"weui-miniprogram/grids/grids\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/grid/grid.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Grid\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Grid</view>\n            <view class=\"page__desc\">九宫格</view>\n        </view>\n        <view class=\"page__bd\">\n            <mp-grids grids=\"{{grids}}\"></mp-grids>\n        </view>\n    </scroll-view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/grid/grid.wxss",
    "content": "/* example/grid/grid.wxss */\n@import '../../common.wxss';\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/icons/icons.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nconst colorLight = 'rgba(0, 0, 0, .9)'\nconst colorDark = 'rgba(255, 255, 255, .8)'\n\nCustomPage({\n  data: {\n    iconList: [\n      {\n        icon: 'add-friends',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'add',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'add2',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'album',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'arrow',\n        color: colorLight,\n        size: 12,\n        name: ''\n      },\n      {\n        icon: 'at',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'back',\n        color: colorLight,\n        size: 12,\n        name: ''\n      },\n      {\n        icon: 'back2',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'bellring-off',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'bellring-on',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'camera',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'cellphone',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'clip',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'close',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'close2',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'comment',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'contacts',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'copy',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'delete-on',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'delete',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'discover',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'display',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'done',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'done2',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'download',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'email',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'error',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'eyes-off',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'eyes-on',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'folder',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'group-detail',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'help',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'home',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'imac',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'info',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'keyboard',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'like',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'link',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'location',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'lock',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'max-window',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'me',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'mike',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'mike2',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'mobile-contacts',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'more',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'more2',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'mosaic',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'music-off',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'music',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'note',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'pad',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'pause',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'pencil',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'photo-wall',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'play',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'play2',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'previous',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'previous2',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'qr-code',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'refresh',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'report-problem',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'search',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'sending',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'setting',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'share',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'shop',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'star',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'sticker',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'tag',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'text',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'time',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'transfer-text',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'transfer2',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'translate',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'tv',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'video-call',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'voice',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'volume-down',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'volume-off',\n        color: colorLight,\n        size: 25,\n        name: ''\n      },\n      {\n        icon: 'volume-up',\n        color: colorLight,\n        size: 25,\n        name: ''\n      }\n    ]\n  },\n  onLoad() {\n    this.setIconColor(this.data.theme)\n    const app = getApp()\n    if (app.watchThemeChange) {\n      app.watchThemeChange(this.setIconColor)\n    }\n  },\n  setIconColor(theme) {\n    const color = theme === 'dark' ? colorDark : colorLight\n\n    this.setData({\n      iconList: this.data.iconList.map((icon) => {\n        icon.color = color\n        return icon\n      })\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/icons/icons.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n\t\t\"mp-icon\": \"weui-miniprogram/icon/icon\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/icons/icons.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Icons\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Icons</view>\n            <view class=\"page__desc\">图标</view>\n        </view>\n        <view class=\"page__bd\">\n            <view class=\"icon-box\">\n                <view class=\"icon-box__title\">描边型</view>\n                <view class=\"weui-grids\">\n                    <block wx:for=\"{{iconList}}\" wx:key=\"*this\">\n                        <view class=\"weui-grid\">\n                            <mp-icon icon=\"{{item.icon}}\" color=\"{{item.color}}\" size=\"{{item.size}}\"></mp-icon>\n                            <view class=\"weui-grid__label\">{{item.icon}}</view>\n                        </view>\n                    </block>\n                </view>\n            </view>\n            <view class=\"icon-box\">\n                <view class=\"icon-box__title\">填充型</view>\n                <view class=\"weui-grids\">\n                    <block wx:for=\"{{iconList}}\" wx:key=\"*this\">\n                        <view class=\"weui-grid\">\n                            <mp-icon type=\"filled\" icon=\"{{item.icon}}\" color=\"{{item.color}}\" size=\"{{item.size}}\"></mp-icon>\n                            <view class=\"weui-grid__label\">{{item.icon}}</view>\n                        </view>\n                    </block>\n                </view>\n            </view>\n        </view>\n    </scroll-view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/icons/icons.wxss",
    "content": "@import '../../common.wxss'\n\nicon{\n    margin-right: 13px;\n}\n\n.weui-grid {\n    text-align: center;\n    padding: 36px 10px;\n}\n\n.page__bd {\n    padding-left: 15px;\n    padding-right: 15px;\n    text-align: left;\n}\n.icon-box{\n    margin-bottom: 25px;\n}\n.icon-box__ctn{\n    flex-shrink: 100;\n}\n.icon-item_box {\n    display: inline-block;\n    width: 25%;\n    padding: 3px;\n    height: 80px;\n    line-height: 30px;\n    text-align: center;\n    box-sizing: border-box;\n}\n.icon-name {\n    font-size: 12px;\n    overflow: hidden;\n    white-space:nowrap;\n    text-overflow:ellipsis; \n}\n.icon-box__title{\n    font-size: 18px;\n    margin: 5px 0;\n}\n\n/** skyline 不支持 float: left */\n.weui-grids {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n\n/** skyline 不支持 float: left */\n.weui-grid {\n\tfloat: none;\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/loading/loading.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  data: {\n    tips: '请稍后',\n    show: true,\n    animated: true\n  },\n  onShow() {\n    this.timer = setInterval(() => {\n      this.setData({\n        show: !this.data.show\n      })\n    }, 2000)\n  },\n  close() {\n    this.setData({\n      animated: !this.data.animated\n    })\n  },\n  onUnload() {\n    clearInterval(this.timer)\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/loading/loading.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n    \"mp-loading\": \"weui-miniprogram/loading/loading\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/loading/loading.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Loading\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Loading</view>\n            <view class=\"page__desc\">加载中</view>\n        </view>\n        <view class=\"page__bd\">\n            <!-- <button bindtap=\"close\">关闭animateion</button> -->\n            <mp-loading type=\"circle\"></mp-loading>\n            <!-- <mp-loading type=\"circle\" tips=\"{{tips}}\"></mp-loading> -->\n            <mp-loading duration=\"{{900}}\" ext-class=\"demo0\" type=\"dot-gray\" show=\"{{show}}\" animated=\"{{animated}}\"></mp-loading>\n            <mp-loading type=\"dot-white\" ext-class=\"demo1\"></mp-loading>\n        </view>\n    </scroll-view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/loading/loading.wxss",
    "content": "@import '../../common.wxss';\n\n.page .demo0 {\n  height: 60px;\n  background: white;\n}\n\n.page .demo1 {\n  height: 60px;\n  background: rgba(0,0,0,.1);\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/loadmore/loadmore.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/loadmore/loadmore.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n    \"mp-loading\": \"weui-miniprogram/loading/loading\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/loadmore/loadmore.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Loadmore\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Loadmore</view>\n            <view class=\"page__desc\">加载更多</view>\n        </view>\n        <view class=\"page__bd\">\n            <mp-loading type=\"circle\" show=\"{{true}}\"></mp-loading>\n            <!-- <view class=\"weui-loadmore\">\n                <view class=\"weui-loading\"></view>\n                <view class=\"weui-loadmore__tips\">正在加载</view>\n            </view> -->\n            <view class=\"weui-loadmore weui-loadmore_line\">\n                <view class=\"weui-loadmore__tips weui-loadmore__tips_in-line\">暂无数据</view>\n            </view>\n            <view class=\"weui-loadmore weui-loadmore_line weui-loadmore_dot\">\n                <view class=\"weui-loadmore__tips weui-loadmore__tips_in-line weui-loadmore__tips_in-dot\"></view>\n            </view>\n        </view>\n    </scroll-view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/loadmore/loadmore.wxss",
    "content": "@import '../../common.wxss';\n\n.page {\n    background-color: var(--weui-BG-2)\n}\n\n.weui-loadmore {\n  display: flex; /* skyline 不支持 inline */\n  justify-content: center;\n  align-items: center;\n}\n\n.weui-loadmore_line .weui-loadmore__tips {\n  top: -11.859px; /* skyline 不支持 em */\n  line-height: 21.0824px;\n  height: 21.0824px;\n}\n\n.weui-loadmore_dot .weui-loadmore__tips {\n  display: flex; /* skyline 不支持 inline */\n  justify-content: center;\n  align-items: center;\n}\n\n.weui-loadmore_dot .weui-loadmore__tips::before {\n  top: -2.108px; /* skyline 不支持 em */\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/panel/panel.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nconst base64 = require('../../images/base64')\n\nCustomPage({\n  onLoad() {\n    this.setData({\n      icon20: base64.icon20,\n      icon60: base64.icon60\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/panel/panel.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n    \"mp-cell\": \"weui-miniprogram/cell/cell\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/panel/panel.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Panel\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Panel</view>\n            <view class=\"page__desc\">面板</view>\n        </view>\n        <view class=\"page__bd\">\n            <view class=\"weui-panel weui-panel_access\">\n                <view class=\"weui-panel__hd\">图文组合列表</view>\n                <view class=\"weui-panel__bd\">\n                    <view url=\"\" class=\"weui-media-box weui-media-box_appmsg\" hover-class=\"weui-cell_active\">\n                        <view class=\"weui-media-box__hd weui-media-box__hd_in-appmsg\">\n                            <image class=\"weui-media-box__thumb\" src=\"{{icon60}}\" />\n                        </view>\n                        <view class=\"weui-media-box__bd weui-media-box__bd_in-appmsg\">\n                            <view class=\"weui-media-box__title\">标题一</view>\n                            <view class=\"weui-media-box__desc\">由各种物质组成的巨型球状天体，叫做星球。星球有一定的形状，有自己的运行轨道。</view>\n                        </view>\n                    </view>\n                    <view url=\"\" class=\"weui-media-box weui-media-box_appmsg\" hover-class=\"weui-cell_active\">\n                        <view class=\"weui-media-box__hd weui-media-box__hd_in-appmsg\">\n                            <image class=\"weui-media-box__thumb\" src=\"{{icon60}}\" />\n                        </view>\n                        <view class=\"weui-media-box__bd weui-media-box__bd_in-appmsg\">\n                            <view class=\"weui-media-box__title\">标题二</view>\n                            <view class=\"weui-media-box__desc\">由各种物质组成的巨型球状天体，叫做星球。星球有一定的形状，有自己的运行轨道。</view>\n                        </view>\n                    </view>\n                </view>\n                <view class=\"weui-panel__ft\">\n                    <mp-cell link ext-class=\"weui-cell_link\">查看更多</mp-cell>\n                </view>\n            </view>\n            <view class=\"weui-panel weui-panel_access\">\n                <view class=\"weui-panel__hd\">文字组合列表</view>\n                <view class=\"weui-panel__bd\">\n                    <view class=\"weui-media-box weui-media-box_text\">\n                        <view class=\"weui-media-box__title weui-media-box__title_in-text\">标题一</view>\n                        <view class=\"weui-media-box__desc\">由各种物质组成的巨型球状天体，叫做星球。星球有一定的形状，有自己的运行轨道。</view>\n                    </view>\n                    <view class=\"weui-media-box weui-media-box_text\">\n                        <view class=\"weui-media-box__title weui-media-box__title_in-text\">标题二</view>\n                        <view class=\"weui-media-box__desc\">由各种物质组成的巨型球状天体，叫做星球。星球有一定的形状，有自己的运行轨道。</view>\n                    </view>\n                </view>\n                <view class=\"weui-panel__ft\">\n                    <mp-cell link ext-class=\"weui-cell_link\">查看更多</mp-cell>\n                </view>\n            </view>\n            <view class=\"weui-panel\">\n                <view class=\"weui-panel__hd\">小图文组合列表</view>\n                <view class=\"weui-panel__bd\">\n                    <view class=\"weui-media-box weui-media-box_small-appmsg\">\n                        <view class=\"weui-cells weui-cells_in-small-appmsg\">\n                            <view url=\"\" class=\"weui-cell weui-cell_example weui-cell_access\" hover-class=\"weui-cell_active\">\n                                <view class=\"weui-cell__hd\"><image src=\"{{icon20}}\" style=\"width: 20px;height: 20px;margin-right: 16px;vertical-align:middle;\" /></view>\n                                <view class=\"weui-cell__bd weui-cell_primary\">\n                                    <view>文字标题</view>\n                                </view>\n                                <view class=\"weui-cell__ft weui-cell__ft_in-access\"></view>\n                            </view>\n                            <view url=\"\" class=\"weui-cell weui-cell_example weui-cell_access\" hover-class=\"weui-cell_active\">\n                                <view class=\"weui-cell__hd\"><image src=\"{{icon20}}\" style=\"width: 20px;height: 20px;margin-right: 16px;vertical-align:middle;\" /></view>\n                                <view class=\"weui-cell__bd weui-cell_primary\">\n                                    <view>文字标题</view>\n                                </view>\n                                <view class=\"weui-cell__ft weui-cell__ft_in-access\"></view>\n                            </view>\n                        </view>\n                    </view>\n                </view>\n            </view>\n            <view class=\"weui-panel\">\n                <view class=\"weui-panel__hd\">文字列表附来源</view>\n                <view class=\"weui-panel__bd\">\n                    <view class=\"weui-media-box weui-media-box_text\">\n                        <view class=\"weui-media-box__title weui-media-box__title_in-text\">标题一</view>\n                        <view class=\"weui-media-box__desc\">由各种物质组成的巨型球状天体，叫做星球。星球有一定的形状，有自己的运行轨道。</view>\n                        <view class=\"weui-media-box__info\">\n                            <view class=\"weui-media-box__info__meta\">文字来源</view>\n                            <view class=\"weui-media-box__info__meta\">时间</view>\n                            <view class=\"weui-media-box__info__meta weui-media-box__info__meta_extra\">其它信息</view>\n                        </view>\n                    </view>\n                </view>\n            </view>\n        </view>\n    </scroll-view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/panel/panel.wxss",
    "content": "/* example/panel/panel.wxss */\n@import '../../common.wxss';\n\n.weui-media-box__info {\n  display: flex;\n  flex-direction: row;\n}\n\n.weui-media-box__info__meta {\n  float: none; /* skyline 不支持 float */\n  padding-right: 12.235px; /* skyline 不支持 em */\n}\n\n.weui-media-box__info__meta_extra {\n  padding-left: 12.235px; /* skyline 不支持 em */\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/preview/preview.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/preview/preview.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/preview/preview.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Preview\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Preview</view>\n            <view class=\"page__desc\">表单预览</view>\n        </view>\n        <view class=\"page__bd\">\n            <view class=\"weui-form-preview\">\n                <view class=\"weui-form-preview__hd\">\n                    <view class=\"weui-form-preview__item\">\n                        <view class=\"weui-form-preview__label\">付款金额</view>\n                        <view class=\"weui-form-preview__value_in-hd\">¥2400.00</view>\n                    </view>\n                </view>\n                <view class=\"weui-form-preview__bd\">\n                    <view class=\"weui-form-preview__item\">\n                        <view class=\"weui-form-preview__label\">商品</view>\n                        <view class=\"weui-form-preview__value\">电动打蛋机</view>\n                    </view>\n                    <!-- <view class=\"weui-form-preview__item\">\n                        <view class=\"weui-form-preview__label\">标题标题</view>\n                        <view class=\"weui-form-preview__value\">名字名字名字</view>\n                    </view>\n                    <view class=\"weui-form-preview__item\">\n                        <view class=\"weui-form-preview__label\">标题标题</view>\n                        <view class=\"weui-form-preview__value\">很长很长的名字很长很长的名字很长很长的名字很长很长的名字很长很长的名字</view>\n                    </view> -->\n                </view>\n                <view class=\"weui-form-preview__ft\">\n                    <navigator url=\"\" class=\"weui-form-preview__btn weui-form-preview__btn_primary\" hover-class=\"weui-hover-active\">操作</navigator>\n                </view>\n            </view>\n            <view class=\"weui-form-preview\">\n                <view class=\"weui-form-preview__hd\">\n                    <view class=\"weui-form-preview__label\">付款金额</view>\n                    <view class=\"weui-form-preview__value_in-hd\">¥2400.00</view>\n                </view>\n                <view class=\"weui-form-preview__bd\">\n                    <view class=\"weui-form-preview__item\">\n                        <view class=\"weui-form-preview__label\">商品</view>\n                        <view class=\"weui-form-preview__value\">电动打蛋机</view>\n                    </view>\n                    <view class=\"weui-form-preview__item\">\n                        <view class=\"weui-form-preview__label\">标题标题</view>\n                        <view class=\"weui-form-preview__value\">名字名字名字</view>\n                    </view>\n                    <view class=\"weui-form-preview__item\">\n                        <view class=\"weui-form-preview__label\">标题标题</view>\n                        <view class=\"weui-form-preview__value\">很长很长的名字很长很长的名字很长很长的名字很长很长的名字很长很长的名字</view>\n                    </view>\n                </view>\n                <view class=\"weui-form-preview__ft\">\n                    <navigator class=\"weui-form-preview__btn weui-form-preview__btn_default\" hover-class=\"weui-hover-active\">辅助操作</navigator>\n                    <navigator class=\"weui-form-preview__btn weui-form-preview__btn_primary\" hover-class=\"weui-hover-active\">操作</navigator>\n                </view>\n            </view>\n        </view>\n    </scroll-view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/base/preview/preview.wxss",
    "content": "@import '../../common.wxss';\n\n.weui-form-preview{\n\tmargin-bottom: 25px;\n}\n\n.weui-form-preview__bd {\n\tfont-size: 13.5529px; /* skyline 不支持 em */\n}\n\n.weui-form-preview__item {\n\tdisplay: flex; /* skyline 不支持 float */\n}\n\n.weui-form-preview__item .weui-form-preview__value {\n\tflex: 1 1 0;\n}\n\n.weui-form-preview__bd .weui-form-preview__label {\n\tmargin-right: 15px;\n\twidth: 56.922px;\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/common.wxss",
    "content": ".page {\n  display: flex;\n  width: 100vw;\n  height: 100vh;\n  flex-direction: column;\n}\n.page-height {\n  height: 100%;\n  flex: 1 1 0;\n  overflow: hidden;\n}\nnavigator text,\ntext text,\ntext navigator {\n  display: inline;\n}\n.wx-scroll-view-flex:is(div):not(.wx-scroll-view-flex) {\n  width: auto !important;\n}\n\npage{height:100%}.page{min-height:100%;background-color:var(--weui-BG-0);color:var(--weui-FG-0);font-size:0.9411764705882353rem;font-family:system-ui,-apple-system,Helvetica Neue,sans-serif}image{max-width:100%;max-height:100%}.link{display:inline;color:var(--weui-LINK)}.fadeIn{-webkit-animation:fadeIn .3s forwards;animation:fadeIn .3s forwards}.fadeOut{-webkit-animation:fadeOut .3s forwards;animation:fadeOut .3s forwards}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.weui-msg__extra-area{position:static}.page__hd{padding:40px}.page__bd{padding-bottom:40px}.page__bd_spacing{padding-left:15px;padding-right:15px}.page__ft{padding-top:20px;padding-bottom:10px;padding-bottom:calc(10px + constant(safe-area-inset-bottom));padding-bottom:calc(10px + env(safe-area-inset-bottom));text-align:center}[data-weui-theme=\"dark\"] .page__ft image{-webkit-filter:invert(100) hue-rotate(180deg);filter:invert(100) hue-rotate(180deg)}.page__title{text-align:left;font-size:1.1764705882352942rem;font-weight:400}.page__desc{margin-top:5px;color:var(--weui-FG-1);text-align:left;font-size:0.8235294117647058rem}.weui-cell_example::before{left:52px}.page_bottom_tips{color:var(--weui-FG-4);font-size:0.7058823529411765rem;line-height:1.4;margin-top:4px}\n\n@media (prefers-color-scheme: dark) {\n\tpage {\n\t\t\tbackground-color: #1f1f1f;\n\t}\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/barrage/barrage.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nconst { mockData } = require('./utils')\n\nCustomPage({\n  onShareAppMessage() {\n    return {\n      title: 'barrage',\n      path: 'packageExtend/pages/extend/barrage/barrage'\n    }\n  },\n  data: {\n    src: 'http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400',\n    toggle: true,\n    barrageValue: '',\n    showBarrage: false,\n  },\n  onReady() {\n    this.addBarrage()\n  },\n  addBarrage() {\n    const barrageComp = this.selectComponent('.barrage')\n    this.barrage = barrageComp.getBarrageInstance({\n      font: 'bold 16px sans-serif', // 字体\n      duration: 15, // 弹幕时间 （移动 2000px 所需时长）\n      lineHeight: 2, // 弹幕行高\n      mode: 'overlap', // 弹幕重叠 overlap 不重叠 separate\n      padding: [10, 10, 10, 10], // 弹幕区四周\n      range: [0, 1],\n      tunnelShow: false,\n    })\n    // this.barrage.open()\n    // const data = mockData(100)\n    // this.barrage.addData(data)\n    // this.timer = setInterval(() => {\n    //   const data = mockData(100);\n    //   this.barrage.addData(data);\n    // }, 2000)\n  },\n  fullscreenchange() {\n    this.setData({\n      toggle: false\n    })\n    setTimeout(() => {\n      if (this.barrage) this.barrage.close()\n      this.setData({ toggle: true })\n      this.addBarrage()\n    }, 1000)\n  },\n  handleOpenClick() {\n    this.setData({\n      showBarrage: true,\n    })\n    this.barrage.open()\n    const data = mockData(3)\n    this.barrage.addData(data)\n    this.timer = setInterval(() => {\n      const data = mockData(5)\n      this.barrage.addData(data)\n    }, 2000)\n  },\n  handleCloseClick() {\n    this.barrage.close()\n    this.setData({\n      showBarrage: false,\n    })\n  },\n  handleInput(e) {\n    this.setData({\n      barrageValue: e.detail.value,\n    })\n  },\n  handleAddClick() {\n    const data = mockData(1, [this.data.barrageValue])\n    this.barrage.addData(data)\n    this.setData({\n      barrageValue: '',\n    })\n  },\n  handleTunnelShowClick() {\n    this.barrage.showTunnel()\n  },\n  handleTunnelHideClick() {\n    this.barrage.hideTunnel()\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/barrage/barrage.json",
    "content": "{\n  \"disableScroll\": true,\n\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"barrage\",\n  \"usingComponents\": {\n    \"barrage\": \"miniprogram-barrage\"\n  }\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/barrage/barrage.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n\n  <video \n    id=\"myVideo\" \n    class=\"video\" \n    src=\"{{src}}\" \n    loop controls \n    bindfullscreenchange=\"fullscreenchange\" \n    vslide-gesture \n    vslide-gesture-in-fullscreen \n    autoplay \n    enable-play-gesture\n  >\n    <barrage \n      class=\"barrage\" \n      wx:if=\"{{toggle}}\"\n    ></barrage>\n  </video>\n  <button type=\"primary\" bind:tap=\"handleOpenClick\">开启弹幕</button>\n  <button type=\"primary\" bind:tap=\"handleCloseClick\">关闭弹幕</button>\n  <block wx:if=\"{{showBarrage}}\" >\n    <input \n      style=\"width: 80%;margin: 30px auto;border-bottom: 1px grey solid\"\n      bindinput=\"handleInput\"\n      placeholder=\"请输入弹幕信息\" \n      value=\"{{barrageValue}}\"\n    />\n    <button type=\"primary\" bind:tap=\"handleAddClick\">发送弹幕</button>\n    <button type=\"primary\" bind:tap=\"handleTunnelShowClick\">显示弹道</button>\n      <button type=\"primary\" bind:tap=\"handleTunnelHideClick\">隐藏弹道</button>\n  </block>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/barrage/barrage.wxss",
    "content": ".barrage {\n  width: 100%;\n  height: 80%;\n  position: absolute;\n  box-sizing: border-box;\n}\n\n.video {\n  width: 100%;\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/barrage/utils.js",
    "content": "const msgs = [\n  '666666',\n  '保护',\n  '妈妈我上电视了！！',\n  '我要上电视！！',\n  '老板晚上好',\n  '前方高能预警',\n  '主播迟到了~~~',\n  '干的漂亮',\n  '广东人民发来贺电',\n]\n\nconst color = ['red', 'rgb(0, 255, 0)', '#0000FF']\n\nconst getRandom = (max = 10, min = 0) => Math.floor(Math.random() * (max - min) + min)\n\nconst mockData = (num, message = msgs) => {\n  const data = []\n  for (let i = 0; i < num; i++) {\n    const msgId = getRandom(message.length)\n    const colorId = getRandom(color.length)\n    data.push({\n      content: message[msgId],\n      color: color[colorId]\n    })\n  }\n  return data\n}\n\nmodule.exports = {\n  mockData\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/common.wxss",
    "content": "/*!\n * WeUI v2.3.0 (https://github.com/weui/weui-wxss)\n * Copyright 2020 Tencent, Inc.\n * Licensed under the MIT license\n */\n/* @import '../components/weui-wxss/dist/style/weui.wxss'; */\n\npage {\n  height: 100%;\n  display: flex;\n  justify-content: center;\n}\n\n.page {\n  min-height: 100%;\n  background-color: var(--weui-BG-1);\n  color: var(--weui-FG-0);\n  font-size: 16px;\n  font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif;\n  max-width: 600px;\n}\n\nimage {\n  max-width: 100%;\n  max-height: 100%\n}\n\n.link {\n  display: inline;\n  color: var(--weui-LINK)\n}\n\n.fadeIn {\n  -webkit-animation: a .3s forwards;\n  animation: a .3s forwards\n}\n\n.fadeOut {\n  -webkit-animation: b .3s forwards;\n  animation: b .3s forwards\n}\n\n@-webkit-keyframes a {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n@keyframes a {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n@-webkit-keyframes b {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n@keyframes b {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n.weui-msg__extra-area {\n  position: static\n}\n\n.page__hd {\n  padding: 40px\n}\n\n.page__bd {\n  padding-bottom: 40px\n}\n\n.page__bd_spacing {\n  padding-left: 15px;\n  padding-right: 15px\n}\n\n.page__ft {\n  padding-top: 40px;\n  padding-bottom: 10px;\n  padding-bottom: calc(10px + constant(safe-area-inset-bottom));\n  padding-bottom: calc(10px + env(safe-area-inset-bottom));\n  text-align: center\n}\n\n[data-weui-theme=dark] .page__ft image {\n  -webkit-filter: invert(100) hue-rotate(180deg);\n  filter: invert(100) hue-rotate(180deg)\n}\n\n.page__title {\n  text-align: left;\n  font-size: 20px;\n  font-weight: 400\n}\n\n.page__desc {\n  margin-top: 5px;\n  color: var(--weui-FG-1);\n  text-align: left;\n  font-size: 14px\n}\n\n.weui-cell_example:before {\n  left: 52px\n}\n\n@media (prefers-color-scheme: dark) {\n  page {\n    background-color: #1F1F1F;\n  }\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/emoji/emoji.js",
    "content": "import CustomPage from '../../../base/CustomPage'\nimport { compareVersion } from '../../../../util/util'\n\nCustomPage({\n  onShareAppMessage() {\n    return {\n      title: 'emoji',\n      path: 'packageExtend/pages/extend/emoji/emoji'\n    }\n  },\n  data: {\n    lineHeight: 24,\n    functionShow: false,\n    emojiShow: false,\n    comment: '',\n    focus: false,\n    cursor: 0,\n    _keyboardShow: false,\n    emojiSource: 'https://res.wx.qq.com/op_res/eROMsLpnNC10dC40vzF8qviz63ic7ATlbGg20lr5pYykOwHRbLZFUhgg23RtVorX',\n    // parsedComment: []\n    historyList: [],\n    layoutHeight: '0px',\n    safeHeight: 0,\n    keyboardHeight: 0,\n    isIOS: false,\n    canIUse: true,\n  },\n\n  onLoad() {\n    const system = wx.getSystemInfoSync()\n    const isIOS = system.platform === 'ios'\n\n    this.safeHeight = (system.screenHeight - system.safeArea.bottom)\n    const layoutHeight = wx.getSystemInfoSync().windowHeight - (this.safeHeight / 2)\n    this.setData({\n      isIOS,\n      safeHeight: this.safeHeight,\n      layoutHeight,\n\n    })\n    const emojiInstance = this.selectComponent('.mp-emoji')\n    this.emojiNames = emojiInstance.getEmojiNames()\n    this.parseEmoji = emojiInstance.parseEmoji\n  },\n  onReady() {\n    // 解决基础库小于 2.9.2 的兼容问题\n    const { SDKVersion } = wx.getSystemInfoSync()\n    if (compareVersion(SDKVersion, '2.9.1') < 0) {\n      this.setData({\n        canIUse: false,\n      })\n    }\n  },\n  onkeyboardHeightChange(e) {\n    const { height } = e.detail\n    if (height === 0) {\n      this.data._keyboardShow = false\n\n      this.setData({\n        safeHeight: this.safeHeight,\n        keyboardHeight: height\n      })\n    } else {\n      this.data._keyboardShow = true\n      this.setData({\n        safeHeight: 0,\n        functionShow: false,\n        emojiShow: false,\n        keyboardHeight: height\n      })\n    }\n  },\n\n  hideAllPanel() {\n    this.setData({\n      functionShow: false,\n      emojiShow: false\n    })\n  },\n  showEmoji() {\n    this.setData({\n      functionShow: false,\n      emojiShow: this.data._keyboardShow || !this.data.emojiShow\n    })\n  },\n  showFunction() {\n    this.setData({\n      functionShow: this.data._keyboardShow || !this.data.functionShow,\n      emojiShow: false\n    })\n  },\n  chooseImage() {},\n  onFocus() {\n    this.data._keyboardShow = true\n\n    this.hideAllPanel()\n  },\n  onBlur(e) {\n    this.data._keyboardShow = false\n    this.data.cursor = e.detail.cursor || 0\n  },\n  onInput(e) {\n    const value = e.detail.value\n    this.data.comment = value\n  },\n  onConfirm() {\n    this.onsend()\n  },\n  insertEmoji(evt) {\n    const emotionName = evt.detail.emotionName\n    const { cursor, comment } = this.data\n    const newComment =\n      comment.slice(0, cursor) + emotionName + comment.slice(cursor)\n    this.setData({\n      comment: newComment,\n      cursor: cursor + emotionName.length\n    })\n  },\n  onsend() {\n    // const comment = this.data.comment\n    const parsedComment = {\n      emoji: this.parseEmoji(this.data.comment),\n      id: `emoji_${this.data.historyList.length}`\n    }\n    this.setData({\n      historyList: [...this.data.historyList, parsedComment],\n      comment: '',\n      emojiShow: false,\n    })\n  },\n  deleteEmoji() {\n    const pos = this.data.cursor\n    const comment = this.data.comment\n    let result = ''\n    let cursor = 0\n\n    let emojiLen = 6\n    let startPos = pos - emojiLen\n    if (startPos < 0) {\n      startPos = 0\n      emojiLen = pos\n    }\n    const str = comment.slice(startPos, pos)\n    const matchs = str.match(/\\[([\\u4e00-\\u9fa5\\w]+)\\]$/g)\n    // 删除表情\n    if (matchs) {\n      const rawName = matchs[0]\n      const left = emojiLen - rawName.length\n      if (this.emojiNames.indexOf(rawName) >= 0) {\n        const replace = str.replace(rawName, '')\n        result = comment.slice(0, startPos) + replace + comment.slice(pos)\n        cursor = startPos + left\n      }\n      // 删除字符\n    } else {\n      let endPos = pos - 1\n      if (endPos < 0) endPos = 0\n      const prefix = comment.slice(0, endPos)\n      const suffix = comment.slice(pos)\n      result = prefix + suffix\n      cursor = endPos\n    }\n    this.setData({\n      comment: result,\n      cursor\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/emoji/emoji.json",
    "content": "{\n  \"disableScroll\": true,\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"emoji\",\n  \"usingComponents\": {\n    \"mp-emoji\": \"../../../components/emoji/emoji\"\n\n  }\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/emoji/emoji.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <block wx:if=\"{{canIUse}}\">\n    <scroll-view  scroll-y style=\"height: {{layoutHeight}}px\" scroll-into-view=\"{{historyList[historyList.length - 1].id}}\">\n      <block wx:for=\"{{historyList}}\" wx:for-index=\"idx\" wx:for-item=\"historyItem\">\n        <view class=\"record\" hidden=\"{{historyItem.length === 0}}\" id=\"{{historyItem.id}}\">\n          <view class=\"avator\"></view>\n          <view class=\"comment\">\n            <block wx:for=\"{{historyItem.emoji}}\" wx:key=\"*this\">\n              <block wx:if=\"{{item.type === 1}}\">{{item.content}}</block>\n              <view \n                wx:if=\"{{item.type === 2}}\" \n                style=\"display: inline-block; width: {{lineHeight}}px; height: {{lineHeight}}px\">\n                <view \n                  class=\"{{item.imageClass}}\"\n                  style=\"background-image: url({{emojiSource}});transform-origin: 0 0; transform: scale({{lineHeight / 64}});\"></view>\n              </view>\n            </block>\n          </view>\n        </view>\n      </block>\n    </scroll-view>\n    <view class=\"reply_wrp\" style=\"bottom: {{isIOS ? keyboardHeight + safeHeight : keyboardHeight}}px\">\n      <view class=\"reply_tool\">\n        <view hover-class=\"active\" class=\"reply_button replay_quick_button\">\n          <image src=\"{{theme === 'dark' ? './images/reply_tool_keyboard_dark.svg' : './images/reply_tool_keyboard.svg'}}\" mode='aspectFit' class=\"reply_tool_pic\"></image>\n        </view>\n        <view class=\"reply_form_wrp\">\n          <label for=\"\" class=\"reply_label\">\n            <input \n              class=\"reply_input\" \n              cursor-spacing=\"8px\" \n              confirm-type=\"send\" \n              adjust-position=\"{{false}}\" \n              confirm-hold value=\"{{comment}}\" \n              cursor=\"{{cursor}}\" \n              focus=\"{{focus}}\" \n              bindblur=\"onBlur\" \n              bind:focus=\"onFocus\" \n              bindinput=\"onInput\" \n              bindconfirm=\"onConfirm\" \n              bind:keyboardheightchange=\"onkeyboardHeightChange\"\n            />\n          </label>\n        </view>\n        <view hover-class=\"active\" class=\"reply_button replay_emotion_button\" bindtap=\"showEmoji\">\n          <image src=\"{{theme === 'dark' ? './images/reply_tool_emoji_dark.svg' : './images/reply_tool_emoji.svg'}}\" mode='aspectFit' class=\"reply_tool_pic\"></image>\n        </view>\n        <view hover-class=\"active\" class=\"reply_button replay_media_button\" bindtap=\"showFunction\">\n          <image src=\"{{theme === 'dark' ? './images/reply_tool_add_dark.png' : './images/reply_tool_add.png'}}\" mode='aspectFit' class=\"reply_tool_pic\"></image>\n        </view>\n      </view>\n      <view class=\"reply_panel_wrp\" style=\"height: {{emojiShow ? 300 : 200}}px;\" hidden=\"{{!emojiShow && !functionShow}}\">\n        <view class=\"reply_panel {{emojiShow ? 'show': ''}}\" hidden=\"{{!emojiShow}}\">\n          <mp-emoji source=\"{{emojiSource}}\" class=\"mp-emoji\" bindinsertemoji=\"insertEmoji\" binddelemoji=\"deleteEmoji\" bindsend=\"onsend\" backgroundColor=\"{{theme === 'dark' ? '#191919' : '#EDEDED'}}\" theme=\"{{theme}}\"></mp-emoji>\n        </view>\n        <view class=\"reply_panel {{functionShow ? 'show': ''}}\" hidden=\"{{!functionShow}}\">\n          <swiper indicator-dots=\"{{true}}\" indicator-color=\"#bbbbbb\" indicator-active-color=\"#8c8c8c\">\n            <swiper-item>\n              <view class=\"function_list\">\n                <view class=\"function_item\" bindtap=\"chooseImage\">\n                  <image src=\"{{theme === 'dark' ? './images/reply_function_image_dark.svg' : './images/reply_function_image.svg'}}\" class=\"reply_function_pic\"></image>\n                </view>\n              </view>\n            </swiper-item>\n          </swiper>\n        </view>\n      </view>\n    </view>\n    <view wx:if=\"{{isIOS}}\" class=\"{{(emojiShow || functionShow) ? 'safearea_emojiShow' : 'safearea'}}\" style=\"position:fixed; bottom: 0px; width: 100%; height: {{safeHeight}}px;\"></view>\n  </block>\n  <view wx:else style=\"text-align: center; padding: 100px 0\">\n    微信版本过低，暂不支持本功能\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/emoji/emoji.wxss",
    "content": "@import '../../common.wxss';\n\n.page {\n  background-color: var(--weui-BG-0)\n}\n\n.record {\n  padding: 15px 0;\n  margin-left: 10px;\n  display: flex;\n}\n\n.avator {\n  display: inline-block;\n  width: 30px;\n  height: 30px;\n  border-radius: 5px;\n  background-color: indianred;\n  margin-right: 10px;\n}\n.comment {\n  padding: 5px;\n  background-color: var(--weui-BG-3);\n  border-color: var(--weui-BG-0);\n  border-radius: 5px;\n  font-size: 18px;\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  line-height: 24px;\n  max-width: 200px;\n}\n\n\n.emoji-wrp {\n  display: inline-block;\n  width: 24px;\n  height: 24px;\n}\n\n.emoji-icon {\n  display: inline-block;\n  transform-origin: 0 0;\n  transform: scale(0.375);\n}\n\n.reply_wrp {\n  position: fixed;\n  bottom: 0;\n  width: 100%;\n  max-width: 600px;\n  /* background-color: #F9F9F9; */\n}\n\n\n.reply_tool {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  font-size: 0;\n  padding: 8px 12px;\n  background-color: var(--weui-BG-1);\n  position: relative;\n}\n\n\n.reply_tool:before {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n  color: rgba(0, 0, 0, 0.1);\n}\n\n.reply_form_wrp {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  min-width: 0;\n}\n\n.reply_label {\n  display: block;\n  background-color: var(--weui-BG-2);\n  -webkit-border-radius: 5px;\n  border-radius: 5px;\n  margin-right: 8px;\n}\n\n\n.reply_input {\n  font-size: 17px;\n  min-height: 40px;\n  /* height: 40px;  */\n  padding: 0 12px;\n  width: 100%;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  -webkit-border-radius: 4px;\n  border-radius: 4px;\n  caret-color: #1AAD19;\n}\n.reply_input[disabled] {\n  background-color: #E8E8E8;\n  color: #888888;\n}\n.reply_button {\n  width: 32px;\n  height: 32px;\n  overflow: hidden;\n  margin-right: 8px;\n}\n.reply_button.active {\n  opacity: 0.5;\n}\n.reply_button image {\n  width: 32px;\n  height: 32px;\n}\n.reply_button image:active {\n  opacity: 50%;\n}\n.reply_button:last-child {\n  margin-right: 0;\n}\n.reply_panel_wrp {\n  height: 200px;\n  overflow: hidden;\n  position: relative;\n}\n\n/* .reply_panel__dark {\n  background: var(--weui-BG-1);\n} */\n\n.reply_panel {\n  height: 200px;\n  overflow: auto;\n  position: absolute;\n  left: 0;\n  right: 0;\n  top: 300px;\n  -webkit-transition: top .2s;\n  transition: top .2s;\n  /* background: var(--weui-BG-3); */\n  -webkit-overflow-scrolling: touch;\n\n}\n.reply_panel[hidden] {\n  display: block;\n}\n.reply_panel.show {\n  height: 300px;\n  top: 0;\n}\n.reply_panel:before {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n  color: rgba(0, 0, 0, 0.1);\n}\n.reply_quick_item {\n  position: relative;\n  padding: 16px 12px;\n  font-size: 17px;\n  background-color: #FFFFFF;\n  border-radius: 4px;\n  margin: 8px;\n  color: rgba(0, 0, 0, 0.9);\n  word-wrap: break-word;\n  word-break: break-all;\n}\n.reply_quick_item:last-child {\n  margin-bottom: 0;\n}\n.reply_quick_item:after {\n  content: \"\";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid rgba(0, 0, 0, 0.05);\n  color: rgba(0, 0, 0, 0.05);\n}\n.reply_quick_item:last-child:after {\n  display: none;\n}\n.reply_quick_tool {\n  text-align: center;\n  padding: 16px 12px;\n  font-size: 14px;\n}\n.reply_quick_tool navigator {\n  color: #204495;\n}\n.reply_quick_empty {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  text-align: center;\n  font-size: 17px;\n}\n.reply_quick_empty:active image {\n  opacity: 0.5;\n}\n.pic_reply_quick_edit {\n  vertical-align: middle;\n  width: 18px;\n  height: 18px;\n  vertical-align: middle;\n  margin-top: -3px;\n  margin-right: 8px;\n}\n.reply_quick_empty:after {\n  content: \"\";\n  display: inline-block;\n  vertical-align: middle;\n  width: 0;\n  height: 100%;\n}\n.reply_quick_empty navigator {\n  color: #000000;\n}\n.function_list {\n  text-align: justify;\n}\n.function_item {\n  display: inline-block;\n  vertical-align: middle;\n  padding: 12px;\n}\n.function_item .reply_function_pic.active {\n  display: none;\n}\n.function_item:active .reply_function_pic {\n  display: none;\n}\n.function_item:active .reply_function_pic.active {\n  display: inline-block;\n}\n.reply_function_pic {\n  width: 64px;\n  height: 64px;\n}\n\n.safearea {\n  background-color: var(--weui-BG-1);\n\n}\n.safearea_emojiShow {\n  background-color: var(--weui-BG-0);\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/index-list/index-list.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  onShareAppMessage() {\n    return {\n      title: 'index-list',\n      path: 'packageExtend/pages/extend/index-list/index-list'\n    }\n  },\n  onLoad() {\n    this.getCitys()\n  },\n\n  getCitys() {\n    const db = wx.cloud.database({\n      env: 'release-b86096'\n    })\n    const mapCity = db.collection('mapCity')\n    const _this = this\n\n    mapCity.doc('6af880a55eb9574b008b78aa53a48405').get({\n      success(re) {\n        console.log(re)\n        const cities = re.data.cities\n        // 按拼音排序\n        cities.sort((c1, c2) => {\n          const pinyin1 = c1.pinyin.join('')\n          const pinyin2 = c2.pinyin.join('')\n          return pinyin1.localeCompare(pinyin2)\n        })\n        // 添加首字母\n        const map = new Map()\n        for (const city of cities) {\n          const alpha = city.pinyin[0].charAt(0).toUpperCase()\n          if (!map.has(alpha)) map.set(alpha, [])\n          map.get(alpha).push({ name: city.fullname })\n        }\n\n        const keys = []\n        for (const key of map.keys()) {\n          keys.push(key)\n        }\n        keys.sort()\n\n        const list = []\n        for (const key of keys) {\n          list.push({\n            alpha: key,\n            subItems: map.get(key)\n          })\n        }\n\n        _this.setData({ list })\n      }\n    })\n  }\n\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/index-list/index-list.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-indexList\": \"../../../components/index-list/index-list\"\n  },\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"index-list\"\n\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/index-list/index-list.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n\n<mp-indexList class=\"city__list\" list=\"{{list}}\">\n    <view class=\"page\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Index List</view>\n            <view class=\"page__desc\">类通讯录列表</view>\n        </view>\n        <view class=\"page__bd\">\n        </view>\n    </view>\n</mp-indexList>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/index-list/index-list.wxss",
    "content": "@import '../common.wxss';\n\npage{\n    background-color: #FFFFFF;\n    height: 100%;\n}\n\n.city__list {\n    height: 100%;\n}\n\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/recycle-view/recycle-view.js",
    "content": "const createRecycleContext = require('miniprogram-recycle-view')\n\n// fakeList\n\nconst imgUrlList = [\n  'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSEV5QjxLDJaL6ibHLSZ02TIcve0ocPXrdTVqGGbqAmh5Mw9V7504dlEiatSvnyibibHCrVQO2GEYsJicPA/0?wx_fmt=jpeg',\n  'http://mmbiz.qpic.cn/sz_mmbiz_png/GEWVeJPFkSHALb0g5rCc4Jf5IqDfdwhWJ43I1IvriaV5uFr9fLAuv3uxHR7DQstbIxhNXFoQEcxGzWwzQUDBd6Q/0?wx_fmt=png',\n  'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSGqys4ibO2a8L9nnIgH0ibjNXfbicNbZQQYfxxUpmicQglAEYQ2btVXjOhY9gRtSTCxKvAlKFek7sRUFA/0?wx_fmt=jpeg',\n  'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSH2Eic4Lt0HkZeEN08pWXTticVRgyNGgBVHMJwMtRhmB0hE4m4alSuwsBk3uBBOhdCr91bZlSFbYhFg/0?wx_fmt=jpeg',\n  'http://mmbiz.qpic.cn/mmbiz_jpg/TcDuyasB5T3Eg34AYwjMw7xbEK2n01ekiaicPiaMInEMTkOQtuv1yke5KziaYF4MLia4IAbxlm0m5NxkibicFg4IZ92EA/0?wx_fmt=jpeg',\n  'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSFrhQolODuh9lGqFKoicqKGxweRdS2zzibxicBMYkTic4WCJrbBNqoMchCWf02UbOvMBI6d32TAKFuqTQ/0?wx_fmt=jpeg',\n  'http://mmbiz.qpic.cn/mmbiz_jpg/TcDuyasB5T0MfAGwtAs4jz0vTC0PHJEv2UErsjBhNDNujSwLhy7icf0DjDe7BYSIFkwqpMbekcwKDBic0ygBoFtw/0?wx_fmt=jpeg',\n  'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSGrMuuicv6QLQAe74FH1KrGUOq8VMe3Ya63tiaqaMNQibvB4T3SLoEWV3WrMvlySd3NXRXJGG75LAtjA/0?wx_fmt=jpeg',\n  'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSEQF22uXNecrTYIrCsEwo9Zolu6XnibTXNaZ1c19RozKjLqmR4oWl3DZhpLcDzwmtMOmIOuNuricrNA/0?wx_fmt=jpeg',\n  'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSEQF22uXNecrTYIrCsEwo9ZhibT6gPEoZfiaRGy9w9QyWB2vtOkxYUJPcEjePQTrVYpRF0PqicC4EEvw/0?wx_fmt=jpeg'\n\n]\n\nconst newList = new Array(300).fill(0)\nlet count = 0\nfor (let i = 0; i < newList.length; i++) {\n  newList[i] = {\n    idx: i,\n    title: `${i}、文本`,\n    image_url: imgUrlList[(count++) % imgUrlList.length],\n  }\n}\n\nconst rpx2px = (rpx) => (rpx / 750) * wx.getSystemInfoSync().windowWidth\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'recycle-view',\n      path: 'packageExtend/pages/extend/recycle-view/recycle-view'\n    }\n  },\n  data: {\n\n  },\n  onLoad() {\n\n  },\n  onReady() {\n    const ctx = createRecycleContext({\n      id: 'recycleId',\n      dataKey: 'recycleList',\n      page: this,\n      itemSize: {\n        height: rpx2px(300),\n        width: rpx2px(750)\n      }\n    })\n    ctx.append(newList)\n  },\n\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/recycle-view/recycle-view.json",
    "content": "{\n  \"usingComponents\": {\n    \"recycle-view\": \"miniprogram-recycle-view/recycle-view\",\n    \"recycle-item\": \"miniprogram-recycle-view/recycle-item\"\n  },\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"recycle-view\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/recycle-view/recycle-view.wxml",
    "content": "<recycle-view batch=\"{{batchSetRecycleData}}\" id=\"recycleId\">\n  <view slot=\"before\" style=\"text-align: center\">长列表前面的内容</view>\n  <recycle-item wx:for=\"{{recycleList}}\" wx:key=\"id\" class=\"item\">\n    <view class=\"item-content\">\n      <text>{{item.title}}</text>\n      <image src=\"{{item.image_url}}\" mode=\"aspectFit\" style=\"height: 100px; width: 240px\"></image>\n    </view>\n  </recycle-item>\n  <view slot=\"after\" style=\"text-align: center\">长列表后面的内容</view>\n</recycle-view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/recycle-view/recycle-view.wxss",
    "content": ".item+.item {\n  /* border-top: 1px solid #ccc; */\n}\n\n.item, .item > view {\n  display: flex;\n  align-items: center;\n  height: 150px;\n  width: 100%;\n}\n.item-content {\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  justify-content: space-around;\n  height: 150px;\n  align-items: center;\n}\n/* .wrap {\n  height: 100% !important;\n} */\n/* .wx-recycle-item {\n  width: 100%;\n} */"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/select-text/select-text.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  onShareAppMessage() {\n    return {\n      title: 'select-text',\n      path: 'packageExtend/pages/extend/select-text/select-text'\n    }\n  },\n  data: {\n    arr: [{\n      value: '长按，上侧复制',\n      placement: 'top'\n    }, {\n      value: '长按，右侧复制',\n      placement: 'right'\n    }, {\n      value: '长按，左侧复制',\n      placement: 'left'\n    }, {\n      value: '长按，下侧复制',\n      placement: 'bottom'\n    }]\n  },\n\n  onLoad() {\n\n  },\n\n  onCopy(e) {\n    console.log('onCopy', e)\n  },\n\n  handleTouchStart(e) {\n    console.log('@@ touchstart', e)\n  },\n\n  handleTap(e) {\n    console.log('@@ tap', e)\n    this.setData({\n      evt: e\n    })\n  }\n\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/select-text/select-text.json",
    "content": "{\n  \"disableScroll\": true,\n\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"select-text\",\n  \"usingComponents\": {\n    \"mp-select-text\": \"../../../components/select-text/select-text\"\n  }\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/select-text/select-text.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n\n<view bind:tap=\"handleTap\">\n  <view class=\"demo-block\">\n    <block wx:for=\"{{arr}}\" wx:key=\"placement\">\n      <view class=\"list-item\">\n        <mp-select-text \n          show-copy-btn \n          placement=\"{{item.placement}}\" \n          value=\"{{item.value}}\" \n          data-id=\"{{index}}\" \n          bindcopy=\"onCopy\"\n          on-document-tap=\"{{evt}}\"\n        >\n        </mp-select-text>\n      </view>\n    </block>\n    <view class=\"list-item\">\n      <mp-select-text value=\"默认的长按效果与浏览器一致\"></mp-select-text>\n    </view>\n  </view>\n</view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/select-text/select-text.wxss",
    "content": "@import '../common.wxss';\n\npage{\n    height: 100%;\n}\n\n.demo-block {\n    margin-bottom: 20px;\n    padding: 20px;\n}\n\n.list-item {\n    text-align: center;\n    margin: 50px;\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/sticky/sticky.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  onShareAppMessage() {\n    return {\n      title: 'sticky',\n      path: 'packageExtend/pages/extend/sticky/sticky'\n    }\n  },\n  data: {\n\n  },\n\n  onLoad() {\n\n  },\n\n  onReady() {\n    this.setData({\n      container: () => wx.createSelectorQuery().select('#container')\n    })\n  },\n\n  onScroll(e) {\n    console.log('onScroll', e)\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/sticky/sticky.json",
    "content": "{\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"sticky\",\n  \"usingComponents\": {\n    \"mp-sticky\": \"../../../components/sticky/sticky\"\n  }\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/sticky/sticky.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n\n<view class=\"demo-block\">\n  <view class=\"demo-title\">基础用法</view>\n  <view class=\"demo-body\">\n    <mp-sticky bindscroll=\"onScroll\">\n      <button size=\"mini\" type=\"primary\" style=\"margin-left: 15px; margin-top: 0;margin-bottom: 0\">基础用法</button>\n    </mp-sticky>\n  </view>\n</view>\n\n<view class=\"demo-block\">\n  <view class=\"demo-title\">吸顶距离</view>\n  <view class=\"demo-body\">\n    <mp-sticky offset-top=\"32\">\n      <button size=\"mini\" type=\"primary\" style=\"margin-left: 115px; background-color: #1989fa;margin-top: 0; margin-bottom: 0\">吸顶距离</button>\n    </mp-sticky>\n  </view>\n</view>\n\n<view class=\"demo-block\">\n  <view class=\"demo-title\">指定容器</view>\n  <view class=\"demo-body\">\n    <view id=\"container\" style=\"height: 250px; background-color: #E0E0E0;\">\n      <view style=\"height: 100px; background-color: #FFFF99;\"></view>\n      <mp-sticky container=\"{{container}}\" offset-top=\"64\">\n        <button size=\"mini\" type=\"primary\" style=\"margin-left: 215px; background-color: #ff976a;margin-top: 0; margin-bottom: 0\">指定容器</button>\n      </mp-sticky>\n    </view>\n  </view>\n</view>\n\n<view style=\"height: 2000px\"></view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/sticky/sticky.wxss",
    "content": "@import '../common.wxss';\n\n.page{\n    background-color: var(--weui-BG-0);\n    height: 100%;\n}\n\n.demo-block {\n    /* margin: 10px 0; */\n}\nbutton {\n    font-size: 14px;\n    border-radius: 0;\n}\n\n.demo-title {\n    font-size: 14px;\n    color: gray;\n    padding-left: 15px;\n}\n.demo-body {\n    margin: 20px 0;\n    height: 100px;\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/tabs/tabs.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  onShareAppMessage() {\n    return {\n      title: 'tabs',\n      path: 'packageExtend/pages/extend/tabs/tabs'\n    }\n  },\n  data: {\n    tabs: [],\n    activeTab: 0,\n  },\n\n  onLoad() {\n    const tabs = [\n      {\n        title: '技术开发',\n        title2: '小程序开发进阶',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSEV5QjxLDJaL6ibHLSZ02TIcve0ocPXrdTVqGGbqAmh5Mw9V7504dlEiatSvnyibibHCrVQO2GEYsJicPA/0?wx_fmt=jpeg',\n        desc: '本视频系列课程，由腾讯课堂NEXT学院与微信团队联合出品，通过实战案例，深入浅出地进行讲解。',\n      },\n      {\n        title: '产品解析',\n        title2: '微信小程序直播',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_png/GEWVeJPFkSHALb0g5rCc4Jf5IqDfdwhWJ43I1IvriaV5uFr9fLAuv3uxHR7DQstbIxhNXFoQEcxGzWwzQUDBd6Q/0?wx_fmt=png',\n        desc: '微信小程序直播系列课程持续更新中，帮助大家更好地理解、应用微信小程序直播功能。',\n      },\n      {\n        title: '运营规范',\n        title2: '常见问题和解决方案',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSGqys4ibO2a8L9nnIgH0ibjNXfbicNbZQQYfxxUpmicQglAEYQ2btVXjOhY9gRtSTCxKvAlKFek7sRUFA/0?wx_fmt=jpeg',\n        desc: '提高审核质量',\n      },\n      {\n        title: '营销经验',\n        title2: '流量主小程序',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSH2Eic4Lt0HkZeEN08pWXTticVRgyNGgBVHMJwMtRhmB0hE4m4alSuwsBk3uBBOhdCr91bZlSFbYhFg/0?wx_fmt=jpeg',\n        desc: '本课程共四节，将分阶段为开发者展示如何开通流量主功能、如何接入广告组件、不同类型小程序接入的建议，以及如何通过工具调优小程序变现效率。',\n      },\n      {\n        title: '高校大赛',\n        title2: '2020中国高校计算机大赛',\n        img: 'http://mmbiz.qpic.cn/mmbiz_jpg/TcDuyasB5T3Eg34AYwjMw7xbEK2n01ekiaicPiaMInEMTkOQtuv1yke5KziaYF4MLia4IAbxlm0m5NxkibicFg4IZ92EA/0?wx_fmt=jpeg',\n        desc: '微信小程序应用开发赛',\n      },\n    ]\n    this.setData({ tabs })\n  },\n\n  onTabClick(e) {\n    const index = e.detail.index\n    this.setData({\n      activeTab: index\n    })\n  },\n\n  onChange(e) {\n    const index = e.detail.index\n    this.setData({\n      activeTab: index\n    })\n  },\n  handleClick() {\n    wx.navigateTo({\n      url: './webview',\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/tabs/tabs.json",
    "content": "{\n  \"disableScroll\": true,\n\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"tabs\",\n  \"usingComponents\": {\n    \"mp-tabs\": \"../../../components/tabs/tabs\"\n  }\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/tabs/tabs.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n\n<mp-tabs \n  tabs=\"{{tabs}}\" \n  activeTab=\"{{activeTab}}\" \n  swiperClass=\"weui-tabs-swiper\"\n  bindtabclick=\"onTabClick\"\n  bindchange=\"onChange\"\n  activeClass=\"tab-bar-title__selected\"\n  \n>\n  <block wx:for=\"{{tabs}}\" wx:key=\"title\">\n    <view class=\"tab-content\" data-set=\"{{item}}\" slot=\"tab-content-{{index}}\" bind:tap=\"handleClick\" >\n      <image src=\"{{item.img}}\" mode=\"widthFix\"></image>\n      <view class=\"item-title\">\n        {{item.title2}}\n      </view>\n      <view class=\"item-desc\">\n        {{item.desc}}\n      </view>\n    </view>\n  </block>\n</mp-tabs>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/tabs/tabs.wxss",
    "content": "@import '../common.wxss';\n\n.page{\n    background-color: var(--weui-BG-2);\n    height: 100%;\n}\n\n.weui-tabs-bar__wrp {\n    border-bottom: 1px solid var(--weui-BG-2);\n    margin-top: 10px;\n}\n\n.weui-tabs-swiper {\n    width: 100%;\n    height: 100%;\n\n    background-color: var(--weui-BG-2);\n\n}\n\n.tab-content {\n    /* height: 100px; */\n    width: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n    box-sizing: border-box;\n    padding: 20px;\n}\n\n.weui-tabs-bar__title {\n    margin: 0px 10px;\n}\n\n.tab-bar-title__selected {\n    font-size: 20px;\n    font-weight: bold;\n}\n.item-title {\n    margin: 10px 10px 5px;\n    font-size: 18px;\n    width: 100%;\n}\n.item-desc {\n    margin: 5px 10px 0;\n    width: 100%;\n    color: var(--weui-FG-1)\n}\n.weui-tabs-bar__item {\n    background-color: var(--weui-BG-2) !important;\n    color: var(--weui-FG-0) !important;\n}\n\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/tabs/webview.js",
    "content": "// miniprogram/packageExtend/pages/extend/tabs/webview.js\nPage({\n  data: {\n    src: 'https://developers.weixin.qq.com/community/business'\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide() {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload() {\n\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n    return {\n      title: 'webview',\n      path: 'packageExtend/pages/extend/webview/webview'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/tabs/webview.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/tabs/webview.wxml",
    "content": "<web-view src=\"{{src}}\"></web-view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/tabs/webview.wxss",
    "content": "/* miniprogram/packageExtend/pages/extend/tabs/webview.wxss */"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/video-swiper/video-swiper.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nconst urls = [\n\n  'https://res.wx.qq.com/wxaliveplayer/htdocs/video14e1eea.mov',\n  'https://res.wx.qq.com/wxaliveplayer/htdocs/video24e1eeb.mov',\n  'https://res.wx.qq.com/wxaliveplayer/htdocs/video34e1eeb.mov',\n  'https://res.wx.qq.com/wxaliveplayer/htdocs/video44e1eeb.mov',\n  'https://res.wx.qq.com/wxaliveplayer/htdocs/video54e1eeb.mov'\n\n]\n\nCustomPage({\n  onShareAppMessage() {\n    return {\n      title: 'video-swiper',\n      path: 'packageExtend/pages/extend/video-swiper/video-swiper'\n    }\n  },\n  data: {\n    videoList: [],\n  },\n  onLoad() {\n    const videoList = urls.map((item, index) => ({\n      id: index,\n      url: item,\n      objectFit: 'contain'\n    }))\n    this.setData({\n      videoList,\n    })\n  },\n  onReady() {\n\n  },\n  onShow() {\n\n  },\n  onHide() {\n\n  },\n  onUnload() {\n\n  },\n  onPlay() {},\n\n  onPause() {\n    //  console.log('pause', e.detail.activeId)\n  },\n\n  onEnded() {},\n\n  onError() {},\n\n  onWaiting() {},\n\n  onTimeUpdate() {},\n\n  onProgress() {},\n\n  onLoadedMetaData(e) {\n    console.log('LoadedMetaData', e)\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/video-swiper/video-swiper.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-video-swiper\": \"../../../components/video-swiper/video-swiper\"\n  },\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"video-swiper\"\n\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/video-swiper/video-swiper.wxml",
    "content": "<!-- <view class=\"page\" data-weui-theme=\"{{theme}}\"> -->\n\n<mp-video-swiper \n  class=\"video-swiper\" \n  video-list=\"{{videoList}}\" \n  bindplay=\"onPlay\"\n  bindpause=\"onPause\"\n  bindtimeupdate=\"onTimeUpdate\"\n  bindended=\"onEnded\"\n  binderror=\"onError\"\n  bindwaiting=\"onWaiting\"\n  bindprogress=\"onProgress\"\n  bindloadedmetadata=\"onLoadedMetaData\"\n></mp-video-swiper>\n<!-- <video src=\"\"></video> -->\n<!-- </view> -->"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/video-swiper/video-swiper.wxss",
    "content": "@import '../common.wxss';\n\n.page{\n    background-color: var(--weui-BG-0);\n    height: 100%;\n}\n\nmp-video-swiper {\n    width: 100%;\n    height: 100%;\n    max-width: 600px;\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/vtabs/vtabs.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  onShareAppMessage() {\n    return {\n      title: 'vtabs',\n      path: 'packageExtend/pages/extend/vtabs/vtabs'\n    }\n  },\n  data: {\n    vtabs: [],\n    activeTab: 0,\n  },\n\n  onLoad() {\n    const tabs = [\n      {\n        title: '技术开发',\n        title2: '小程序开发进阶',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSEV5QjxLDJaL6ibHLSZ02TIcve0ocPXrdTVqGGbqAmh5Mw9V7504dlEiatSvnyibibHCrVQO2GEYsJicPA/0?wx_fmt=jpeg',\n        desc: '本视频系列课程，由腾讯课堂NEXT学院与微信团队联合出品，通过实战案例，深入浅出地进行讲解。',\n      },\n      {\n        title: '产品解析',\n        title2: '微信小程序直播',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_png/GEWVeJPFkSHALb0g5rCc4Jf5IqDfdwhWJ43I1IvriaV5uFr9fLAuv3uxHR7DQstbIxhNXFoQEcxGzWwzQUDBd6Q/0?wx_fmt=png',\n        desc: '微信小程序直播系列课程持续更新中，帮助大家更好地理解、应用微信小程序直播功能。',\n      },\n      {\n        title: '运营规范',\n        title2: '常见问题和解决方案',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSGqys4ibO2a8L9nnIgH0ibjNXfbicNbZQQYfxxUpmicQglAEYQ2btVXjOhY9gRtSTCxKvAlKFek7sRUFA/0?wx_fmt=jpeg',\n        desc: '提高审核质量',\n      },\n      {\n        title: '营销经验',\n        title2: '流量主小程序',\n        img: 'http://mmbiz.qpic.cn/sz_mmbiz_jpg/GEWVeJPFkSH2Eic4Lt0HkZeEN08pWXTticVRgyNGgBVHMJwMtRhmB0hE4m4alSuwsBk3uBBOhdCr91bZlSFbYhFg/0?wx_fmt=jpeg',\n        desc: '本课程共四节，将分阶段为开发者展示如何开通流量主功能、如何接入广告组件、不同类型小程序接入的建议。',\n      },\n      {\n        title: '高校大赛',\n        title2: '2020中国高校计算机大赛',\n        img: 'http://mmbiz.qpic.cn/mmbiz_jpg/TcDuyasB5T3Eg34AYwjMw7xbEK2n01ekiaicPiaMInEMTkOQtuv1yke5KziaYF4MLia4IAbxlm0m5NxkibicFg4IZ92EA/0?wx_fmt=jpeg',\n        desc: '微信小程序应用开发赛',\n      },\n    ]\n    this.setData({ vtabs: tabs })\n  },\n\n  onTabClick(e) {\n    const index = e.detail.index\n    console.log('tabClick', index)\n  },\n\n  onChange(e) {\n    const index = e.detail.index\n    console.log('change', index)\n  },\n  handleClick() {\n    wx.navigateTo({\n      url: '../tabs/webview',\n    })\n  }\n\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/vtabs/vtabs.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-vtabs\": \"../../../components/vtabs/vtabs\",\n    \"mp-vtabs-content\": \"../../../components/vtabs-content/vtabs-content\"\n  },\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"vtabs\"\n\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/vtabs/vtabs.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n\n<mp-vtabs \n  vtabs=\"{{vtabs}}\" \n  activeTab=\"{{activeTab}}\" \n  bindtabclick=\"onTabClick\"\n  bindchange=\"onChange\"\n  class=\"test\"\n>\n  <block wx:for=\"{{vtabs}}\" wx:key=\"title\" >\n    <mp-vtabs-content tabIndex=\"{{index}}\">\n      <view class=\"vtabs-content-item\" style=\"margin-bottom: {{vtabs.length - 1 === index ? 600 : 0}}px\" bindtap=\"handleClick\">\n        <image src=\"{{item.img}}\" mode=\"widthFix\"></image>\n        <view class=\"item-title\">\n          {{item.title2}}\n        </view>\n        <view class=\"item-desc\">\n          {{item.desc}}\n        </view>\n      </view>\n    </mp-vtabs-content>\n  </block>\n  <view style=\"height: 1px;width: 100%\"></view>\n\n</mp-vtabs>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/vtabs/vtabs.wxss",
    "content": "@import '../common.wxss';\n\n.page{\n    background-color: var(--weui-BG-2);\n    height: 100%;\n}\n\n.vtabs-content-item {\n    width: 100%;\n    height: 300px;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n    box-sizing: border-box;\n    /* border-bottom: 1px solid #ccc; */\n    padding-bottom: 20px;\n}\n\n.item-title {\n    font-size: 18px;\n    margin: 0 10px;\n}\n.item-desc {\n    margin: 0 10px;\n\n    color: var(--weui-FG-1)\n}\n\n.weui-vtabs-bar__wrp {\n    background-color: var(--weui-BG-0) !important;\n}\n\n.weui-vtabs-bar__item {\n    background-color: var(--weui-BG-0);\n    color: var(--weui-FG-0);\n    border-left-color: var(--weui-FG-0);\n\n}\n\n.weui-vtabs-bar__activeitem {\n    background-color: var(--weui-BG-2) !important;\n    color: var(--weui-FG-0)!important;\n    border-left-color: #07c160 !important;\n}\n\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/wxml-to-canvas/demo.js",
    "content": "const wxml = (url) => `<view class=\"container\">\n  <image class=\"img\" mode=\"aspectFit\" src=\"${url}\"></image>\n  <text class=\"title\">\n    微信开放社区简介（视频）\n  </text>\n  <text class=\"desc\">\n    微信开放社区，是一个为使用者提供交流、服务的平台。\n  </text>\n</view>\n`\n\nconst style = {\n\n  img: {\n    width: 200,\n    height: 120,\n  },\n  container: {\n    height: 200,\n    width: 200,\n    flexDirection: 'column'\n  },\n  title: {\n    height: 20,\n    width: 200,\n    color: '#15c15f',\n    margin: 4,\n\n  },\n  desc: {\n    fontSize: 13,\n    height: 40,\n    width: 200,\n    color: '#4c4c4c',\n    margin: 4,\n  }\n}\n\nmodule.exports = {\n  wxml,\n  style\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/wxml-to-canvas/wxml-to-canvas.js",
    "content": "const { wxml, style } = require('./demo.js')\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: 'wxml-to-canvas',\n      path: 'packageExtend/pages/extend/wxml-to-canvas/wxml-to-canvas'\n    }\n  },\n  data: {\n    src: '',\n    wxmlTemplate: wxml('your_img_url'),\n    showCanvas: false,\n  },\n  onLoad() {\n    this.widget = this.selectComponent('.widget')\n    wx.cloud.getTempFileURL({\n      fileList: ['cloud://release-b86096.7265-release-b86096-1258211818/开放社区.jpeg'],\n      success: res => {\n        const url = res.fileList[0].tempFileURL\n        console.log(url)\n        this.url = url\n      },\n      fail: console.error\n    })\n  },\n  renderToCanvas() {\n    console.log(wxml(this.url))\n    const p1 = this.widget.renderToCanvas({ wxml: wxml(this.url), style })\n    p1.then((re) => {\n      console.log('container', re.layoutBox)\n      this.data.showCanvas = true\n      this.container = re\n      return re\n    }).catch(() => {})\n  },\n  extraImage() {\n    console.log(this.widget, this.widget.canvasToTempFilePath)\n    if (!this.data.showCanvas) {\n      wx.showModal({\n        title: '提示',\n        content: '请先渲染到canvas'\n      })\n      return\n    }\n    const p2 = this.widget.canvasToTempFilePath()\n    p2.then(res => {\n      this.setData({\n        src: res.tempFilePath,\n        width: this.container.layoutBox.width,\n        height: this.container.layoutBox.height\n      })\n      return res\n    }).catch(() => {})\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/wxml-to-canvas/wxml-to-canvas.json",
    "content": "{\n  \"usingComponents\": {\n    \"wxml-to-canvas\": \"../../../../miniprogram_npm/wxml-to-canvas\"\n  },\n  \"renderer\": \"webview\",\n\"navigationBarTitleText\": \"wxml-to-canvas\"\n\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/wxml-to-canvas/wxml-to-canvas.wxml",
    "content": "<view class=\"page\">\n  <view>WXML</view>\n  <scroll-view scroll-y scroll-x class=\"scroll-view-wxml\" >{{wxmlTemplate}}</scroll-view>\n  <button type=\"primary\" bindtap=\"renderToCanvas\">渲染到canvas</button>\n  <button type=\"primary\" bindtap=\"extraImage\">导出图片</button>\n  <view style=\"margin: 5px\">canvas</view>\n  <view class=\"center\">\n  <wxml-to-canvas class=\"widget\" height=\"200\" width=\"200\" ></wxml-to-canvas>\n  </view>\n  <view style=\"margin: 5px\">图片</view>\n  <image wx:id=\"{{src}}\" src=\"{{src}}\" style=\"width: {{width}}px; height: {{height}}px\"></image>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/extend/wxml-to-canvas/wxml-to-canvas.wxss",
    "content": ".page {\n  /* display: flex; */\n  /* flex-direction: column; */\n  /* height: 100%; */\n  /* align-items: center; */\n  text-align: center;\n}\n.scroll-view-wxml {\n  background-color: var(--weui-BG-2);\n  margin: 5px;\n  border: 1px solid #1AAD19;\n  white-space: pre;\n  box-sizing: border-box;\n  padding: 5px 15px;\n}\n.text-center {\n  text-align: center;\n}\n.center {\n  display: flex;\n  flex-direction: column;\n  /* height: 100%; */\n  align-items: center;\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/cell/cell.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nconst base64 = require('../../images/base64')\n\nCustomPage({\n  onLoad() {\n    this.setData({\n      icon: base64.icon20,\n      slideButtons: [{\n        text: '普通',\n        src: global.isDemo ? '/page/weui/example/cell/icon_love.svg' : '/example/cell/icon_love.svg', // icon的路径\n      }, {\n        text: '普通',\n        extClass: 'test',\n        src: global.isDemo ? '/page/weui/example/cell/icon_star.svg' : '/example/cell/icon_star.svg', // icon的路径\n      }, {\n        type: 'warn',\n        text: '警示',\n        extClass: 'test',\n        src: global.isDemo ? '/page/weui/example/cell/icon_del.svg' : '/example/cell/icon_del.svg', // icon的路径\n      }],\n    })\n  },\n  slideButtonTap(e) {\n    console.log('slide button tap', e.detail)\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/cell/cell.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n    \"mp-cells\": \"weui-miniprogram/cells/cells\",\n    \"mp-cell\": \"weui-miniprogram/cell/cell\",\n    \"mp-slideview\": \"weui-miniprogram/slideview/slideview\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/cell/cell.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Cell\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Cell</view>\n            <view class=\"page__desc\">列表</view>\n        </view>\n        <view class=\"page__bd\">\n            <mp-cells ext-class=\"my-cells\" title=\"带说明的列表项\">\n                <mp-cell value=\"标题文字\" footer=\"说明文字\"></mp-cell>\n                <mp-cell>\n                    <view>标题文字（使用slot）</view>\n                    <view slot=\"footer\">说明文字</view>\n                </mp-cell>\n                <mp-slideview show=\"{{true}}\" buttons=\"{{slideButtons}}\" bindbuttontap=\"slideButtonTap\">\n                    <mp-cell value=\"左滑可以删除\" footer=\"说明文字\"></mp-cell>\n                </mp-slideview>\n            </mp-cells>\n\n            <mp-cells title=\"带图标、说明的列表项\" footer=\"底部说明文字\">\n                <mp-cell value=\"标题文字\" footer=\"说明文字\">\n                    <image slot=\"icon\" src=\"{{icon}}\" style=\"margin-right: 16px;vertical-align: middle;width:20px; height: 20px;\"></image>\n                </mp-cell>\n                <mp-cell value=\"标题文字\" footer=\"说明文字\">\n                    <image slot=\"icon\" src=\"{{icon}}\" style=\"margin-right: 16px;vertical-align: middle;width:20px; height: 20px;\"></image>\n                </mp-cell>\n            </mp-cells>\n\n            <mp-cells title=\"带跳转的列表项\">\n                <mp-cell hover value=\"有hover效果，无跳转URL\" footer=\"说明文字\">\n                    <image slot=\"title\" src=\"{{icon}}\" style=\"margin-right: 16px;vertical-align: middle;width:20px; height: 20px;\"></image>\n                </mp-cell>\n                <mp-cell link url=\"./cell\" value=\"有跳转URL\" footer=\"说明文字\">\n                    <image slot=\"icon\" src=\"{{icon}}\" style=\"margin-right: 16px;vertical-align: middle;width:20px; height: 20px;\"></image>\n                </mp-cell>\n            </mp-cells>\n\n        </view>\n    </scroll-view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/cell/cell.wxss",
    "content": "@import '../../common.wxss';\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/form/form.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  data: {\n    showTopTips: false,\n\n    radioItems: [\n      { name: 'cell standard', value: '0', checked: true },\n      { name: 'cell standard', value: '1' }\n    ],\n    checkboxItems: [\n      { name: 'standard is dealt for u.', value: '0', checked: true },\n      { name: 'standard is dealicient for u.', value: '1' }\n    ],\n    items: [\n      { name: 'USA', value: '美国' },\n      { name: 'CHN', value: '中国', checked: 'true' },\n      { name: 'BRA', value: '巴西' },\n      { name: 'JPN', value: '日本' },\n      { name: 'ENG', value: '英国' },\n      { name: 'TUR', value: '法国' },\n    ],\n\n    date: '2016-09-01',\n    time: '12:01',\n\n    countryCodes: ['+86', '+80', '+84', '+87'],\n    countryCodeIndex: 0,\n\n    countries: ['中国', '美国', '英国'],\n    countryIndex: 0,\n\n    accounts: ['微信号', 'QQ', 'Email'],\n    accountIndex: 0,\n\n    isAgree: false,\n    formData: {\n\n    },\n    rules: [{\n      name: 'radio',\n      rules: { required: false, message: '单选列表是必选项' },\n    }, {\n      name: 'checkbox',\n      rules: { required: true, message: '多选列表是必选项' },\n    }, {\n      name: 'name',\n      rules: { required: true, message: '请输入姓名' },\n    }, {\n      name: 'qq',\n      rules: { required: true, message: 'qq必填' },\n    }, {\n      name: 'mobile',\n      rules: [{ required: true, message: 'mobile必填' }, { mobile: true, message: 'mobile格式不对' }],\n    }, {\n      name: 'vcode',\n      rules: { required: true, message: '验证码必填' },\n    }, {\n      name: 'idcard',\n      rules: {\n        validator(rule, value) {\n          if (!value || value.length !== 18) {\n            return 'idcard格式不正确'\n          }\n          return ''\n        }\n      },\n    }]\n  },\n  radioChange(e) {\n    console.log('radio发生change事件，携带value值为：', e.detail.value)\n\n    const radioItems = this.data.radioItems\n    for (let i = 0, len = radioItems.length; i < len; ++i) {\n      radioItems[i].checked = radioItems[i].value === e.detail.value\n    }\n\n    this.setData({\n      radioItems,\n      'formData.radio': e.detail.value\n    })\n  },\n  checkboxChange(e) {\n    console.log('checkbox发生change事件，携带value值为：', e.detail.value)\n\n    const checkboxItems = this.data.checkboxItems; const\n      values = e.detail.value\n    for (let i = 0, lenI = checkboxItems.length; i < lenI; ++i) {\n      checkboxItems[i].checked = false\n\n      for (let j = 0, lenJ = values.length; j < lenJ; ++j) {\n        if (checkboxItems[i].value === values[j]) {\n          checkboxItems[i].checked = true\n          break\n        }\n      }\n    }\n\n    this.setData({\n      checkboxItems,\n      'formData.checkbox': e.detail.value\n    })\n  },\n  bindDateChange(e) {\n    this.setData({\n      date: e.detail.value,\n      'formData.date': e.detail.value\n    })\n  },\n  formInputChange(e) {\n    const { field } = e.currentTarget.dataset\n    this.setData({\n      [`formData.${field}`]: e.detail.value\n    })\n  },\n  bindTimeChange(e) {\n    this.setData({\n      time: e.detail.value\n    })\n  },\n  bindCountryCodeChange(e) {\n    console.log('picker country code 发生选择改变，携带值为', e.detail.value)\n\n    this.setData({\n      countryCodeIndex: e.detail.value\n    })\n  },\n  bindCountryChange(e) {\n    console.log('picker country 发生选择改变，携带值为', e.detail.value)\n\n    this.setData({\n      countryIndex: e.detail.value\n    })\n  },\n  bindAccountChange(e) {\n    console.log('picker account 发生选择改变，携带值为', e.detail.value)\n\n    this.setData({\n      accountIndex: e.detail.value\n    })\n  },\n  bindAgreeChange(e) {\n    this.setData({\n      isAgree: !!e.detail.value.length\n    })\n  },\n  submitForm() {\n    this.selectComponent('#form').validate((valid, errors) => {\n      console.log('valid', valid, errors)\n      if (!valid) {\n        const firstError = Object.keys(errors)\n        if (firstError.length) {\n          this.setData({\n            error: errors[firstError[0]].message\n          })\n        }\n      } else {\n        wx.showToast({\n          title: '校验通过'\n        })\n      }\n    })\n    // this.selectComponent('#form').validateField('mobile', (valid, errors) => {\n    //     console.log('valid', valid, errors)\n    // })\n  }\n\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/form/form.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-nagivation-bar\": \"weui-miniprogram/nagivation-bar/nagivation-bar\",\n    \"mp-form-page\": \"weui-miniprogram/form-page/form-page\",\n    \"mp-toptips\": \"weui-miniprogram/toptips/toptips\",\n    \"mp-cells\": \"weui-miniprogram/cells/cells\",\n    \"mp-cell\": \"weui-miniprogram/cell/cell\",\n    \"mp-checkbox\": \"weui-miniprogram/checkbox/checkbox\",\n    \"mp-checkbox-group\": \"weui-miniprogram/checkbox-group/checkbox-group\",\n    \"mp-form\": \"weui-miniprogram/form/form\"\n\t},\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/form/form.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"form\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <mp-toptips msg=\"{{error}}\" type=\"error\" show=\"{{error}}\"></mp-toptips>\n\n        <mp-form-page title=\"表单结构\" subtitle=\"展示表单页面的信息结构样式, 分别由头部区域/控件区域/提示区域/操作区域和底部信息区域组成。\">\n            <mp-form id=\"form\" rules=\"{{rules}}\" models=\"{{formData}}\">\n                <mp-cells title=\"单选列表项\">\n                    <mp-checkbox-group prop=\"radio\" multi=\"{{false}}\" bindchange=\"radioChange\">\n                        <mp-checkbox wx:for=\"{{radioItems}}\" wx:key=\"value\" label=\"{{item.name}}\" value=\"{{item.value}}\" checked=\"{{item.checked}}\"></mp-checkbox>\n                    </mp-checkbox-group>\n                </mp-cells>\n                <mp-cells title=\"复选列表项\">\n                    <mp-checkbox-group prop=\"checkbox\" multi=\"{{true}}\" bindchange=\"checkboxChange\">\n                        <mp-checkbox wx:for=\"{{checkboxItems}}\" wx:key=\"value\" label=\"{{item.name}}\" value=\"{{item.value}}\" checked=\"{{item.checked}}\"></mp-checkbox>\n                    </mp-checkbox-group>\n                </mp-cells>\n\n                <mp-cells title=\"表单\" footer=\"底部说明文字底部说明文字\">\n                    <label>\n                        <mp-cell prop=\"name\" title=\"姓名\" ext-class=\"\">\n                            <input bindinput=\"formInputChange\" data-field=\"name\" class=\"weui-input\" placeholder=\"请输入姓名\"/>\n                        </mp-cell>\n                    </label>\n                    <label>\n                        <mp-cell prop=\"qq\" title=\"qq\" ext-class=\"\">\n                            <input bindinput=\"formInputChange\" data-field=\"qq\" class=\"weui-input\" placeholder=\"请输入qq\"/>\n                        </mp-cell>\n                    </label>\n                    <label>\n                        <mp-cell prop=\"mobile\" title=\"手机号\" ext-class=\" weui-cell_vcode\">\n                            <input bindinput=\"formInputChange\" data-field=\"mobile\" class=\"weui-input\" placeholder=\"请输入手机号\"/>\n                            <button slot=\"footer\" type=\"default\" class=\"weui-vcode-btn\">获取验证码</button>\n                        </mp-cell>\n                    </label>\n                    <label>\n                        <mp-cell prop=\"date\" title=\"日期\" ext-class=\"\">\n                            <picker data-field=\"date\" mode=\"date\" value=\"{{date}}\" start=\"2015-09-01\" end=\"2017-09-01\" bindchange=\"bindDateChange\">\n                                <view class=\"weui-input\">{{date}}</view>\n                            </picker>\n                        </mp-cell>\n                    </label>\n                    <mp-cell prop=\"vcode\" title=\"验证码\" ext-class=\" weui-cell_vcode\">\n                        <input bindinput=\"formInputChange\" data-field=\"vcode\" class=\"weui-input\" placeholder=\"请输入验证码\"/>\n                        <image slot=\"footer\" class=\"weui-vcode-img\" src=\"../images/vcode.jpg\" style=\"width: 108px\"></image>\n                    </mp-cell>\n                </mp-cells>\n                <mp-cells title=\"提交后表单项报错\">\n                    <mp-cell show-error prop=\"idcard\" title=\"卡号\" ext-class=\"\">\n                        <input bindinput=\"formInputChange\" data-field=\"idcard\" class=\"weui-input\" placeholder=\"请输入卡号\"/>\n                    </mp-cell>\n                </mp-cells>\n                <mp-cells title=\"开关\">\n                    <mp-cell title=\"标题文字\" ext-class=\"\">\n                        <switch slot=\"footer\" checked />\n                    </mp-cell>\n                </mp-cells>\n                <mp-cells title=\"文本框\">\n                    <mp-cell title=\"标题文字\" ext-class=\"\">\n                        <input class=\"weui-input\" placeholder=\"请输入文本\" />\n                    </mp-cell>\n                </mp-cells>\n                <mp-cells title=\"文本域\">\n                    <mp-cell has-header=\"{{false}}\" has-footer=\"{{false}}\" title=\"\" ext-class=\"\">\n                        <textarea placeholder=\"请输入文本\" style=\"height: 80px\"/>\n                        <view class=\"weui-textarea-counter\">0/200</view>\n                    </mp-cell>\n                </mp-cells>\n                <mp-cells title=\"选择\">\n                    <mp-cell ext-class=\"weui-cell_select weui-cell_select-before\">\n                        <view slot=\"title\" style=\"width: 105px\">\n                            <picker aria-role=\"listbox\"  bindchange=\"bindCountryCodeChange\" value=\"{{countryCodeIndex}}\" range=\"{{countryCodes}}\">\n                            <view class=\"weui-select\">{{countryCodes[countryCodeIndex]}}</view>\n                            </picker>\n                        </view>\n                        <input class=\"weui-input\" placeholder=\"请输入号码\" />\n                    </mp-cell>\n                </mp-cells>\n                <mp-cells title=\"选择\">\n                    <label>\n                        <mp-cell has-header=\"{{false}}\" ext-class=\"weui-cell_select\">\n                            <picker bindchange=\"bindAccountChange\" value=\"{{accountIndex}}\" range=\"{{accounts}}\">\n                                <view class=\"weui-select\">{{accounts[accountIndex]}}</view>\n                            </picker>\n                        </mp-cell>\n                    </label>\n                    <label>\n                        <mp-cell ext-class=\"weui-cell_select weui-cell_select-after\">\n                            <view slot=\"title\" class=\"weui-label\">国家/地区</view>\n                            <picker bindchange=\"bindCountryChange\" value=\"{{countryIndex}}\" range=\"{{countries}}\">\n                                <view class=\"weui-select\">{{countries[countryIndex]}}</view>\n                            </picker>\n                        </mp-cell>\n                    </label>\n                </mp-cells>\n            </mp-form>\n\n            <checkbox-group slot=\"tips\" bindchange=\"bindAgreeChange\">\n                <label class=\"weui-agree\">\n                    <checkbox class=\"weui-agree__checkbox-check\" />\n                    <text class=\"weui-agree__checkbox\" />\n                    <view class=\"weui-agree__text\"><text>阅读并同意</text><navigator>《相关条款》</navigator></view>\n                </label>\n            </checkbox-group>\n\n            <view slot=\"button\">\n                <button class=\"weui-btn\" type=\"primary\" bindtap=\"submitForm\">确定</button>\n            </view>\n        </mp-form-page>\n    </scroll-view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/form/form.wxss",
    "content": "/* example/input/input.wxss */\n@import '../../common.wxss';\n\n.weui-agree {\n  display: flex; /* skyline 不支持 inline */\n  flex-direction: row;\n  justify-content: center;\n}\n\n.weui-agree .weui-agree__text {\n  display: flex; /* skyline 不支持 inline */\n  flex-direction: row;\n}\n\n/* skyline 不支持 currentColor */\n.weui-cell_select .weui-cell__bd::after {\n  background-color: var(--weui-FG-2);\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/slideview/slideview.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nconst base64 = require('../../images/base64')\n\nCustomPage({\n  onLoad() {\n    this.setData({\n      icon: base64.icon20,\n      slideButtons: [{\n        text: '普通',\n        src: global.isDemo ? '/packageExtend/pages/form/cell/icon_love.svg' : '/example/cell/icon_love.svg', // icon的路径\n      }, {\n        text: '普通',\n        extClass: 'test',\n        src: global.isDemo ? '/packageExtend/pages/form/cell/icon_star.svg' : '/example/cell/icon_star.svg', // icon的路径\n      }, {\n        type: 'warn',\n        text: '警示',\n        extClass: 'test',\n        src: global.isDemo ? '/packageExtend/pages/form/cell/icon_del.svg' : '/example/cell/icon_del.svg', // icon的路径\n      }],\n    })\n  },\n  slideButtonTap(e) {\n    console.log('slide button tap', e.detail)\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/slideview/slideview.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n    \"mp-cells\": \"weui-miniprogram/cells/cells\",\n    \"mp-cell\": \"weui-miniprogram/cell/cell\",\n    \"mp-slideview\": \"weui-miniprogram/slideview/slideview\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/slideview/slideview.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <mp-navigation-bar title=\"SlideView\"></mp-navigation-bar>\n  <scroll-view type=\"list\" scroll-y class=\"page-height\">\n    <view class=\"page__hd\">\n        <view class=\"page__title\">Slideview</view>\n        <view class=\"page__desc\">左滑操作</view>\n    </view>\n    <view class=\"page__bd\">\n      <view class=\"weui-cells\">\n          <mp-slideview show=\"{{true}}\" buttons=\"{{slideButtons}}\" bindshow=\"show\" bindhide=\"hide\" bindbuttontap=\"slideButtonTap\">\n              <mp-cell value=\"左滑可以删除\" footer=\"说明文字\"></mp-cell>\n          </mp-slideview>\n      </view>\n\n      <view class=\"weui-slidecells\">\n        <mp-slideview buttons=\"{{slideButtons}}\" icon=\"{{true}}\" bindshow=\"show\" bindhide=\"hide\" bindbuttontap=\"slideButtonTap\">\n          <view class=\"weui-slidecell\">\n            左滑可以删除（图标Button）\n          </view>\n        </mp-slideview>\n      </view>\n    </view>\n  </scroll-view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/slideview/slideview.wxss",
    "content": "@import '../../common.wxss';\n\n.weui-slidecells {\n  margin:8px;\n}\n\n.weui-slidecell {\n  background-color: var(--weui-BG-2);\n  border-radius: 8px;\n  padding: 26px;\n  line-height: 1.4;\n  font-size: 17px;\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/uploader/uploader.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  data: {\n    files: [{\n      url: 'http://mmbiz.qpic.cn/mmbiz_png/VUIF3v9blLsicfV8ysC76e9fZzWgy8YJ2bQO58p43Lib8ncGXmuyibLY7O3hia8sWv25KCibQb7MbJW3Q7xibNzfRN7A/0',\n    }]\n  },\n  onLoad() {\n    this.setData({\n      selectFile: this.selectFile.bind(this),\n      uplaodFile: this.uplaodFile.bind(this)\n    })\n  },\n  chooseImage() {\n    const that = this\n    wx.chooseImage({\n      sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图，默认二者都有\n      sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机，默认二者都有\n      success(res) {\n        // 返回选定照片的本地文件路径列表，tempFilePath可以作为img标签的src属性显示图片\n        that.setData({\n          files: that.data.files.concat(res.tempFilePaths)\n        })\n      }\n    })\n  },\n  previewImage(e) {\n    wx.previewImage({\n      current: e.currentTarget.id, // 当前显示图片的http链接\n      urls: this.data.files // 需要预览的图片http链接列表\n    })\n  },\n  selectFile(files) {\n    console.log('files', files)\n    // 返回false可以阻止某次文件上传\n  },\n  uplaodFile(files) {\n    console.log('upload files', files)\n    // 文件上传的函数，返回一个promise\n    return new Promise((resolve, reject) => {\n      setTimeout(() => {\n        reject(new Error('some error'))\n      }, 1000)\n    })\n  },\n  uploadError(e) {\n    console.log('upload error', e.detail)\n  },\n  uploadSuccess(e) {\n    console.log('upload success', e.detail)\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/uploader/uploader.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n    \"mp-uploader\": \"weui-miniprogram/uploader/uploader\",\n    \"mp-cells\": \"weui-miniprogram/cells/cells\",\n    \"mp-cell\": \"weui-miniprogram/cell/cell\"\n  },\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/uploader/uploader.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Uploader\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Uploader</view>\n            <view class=\"page__desc\">上传组件</view>\n        </view>\n        <view class=\"page__bd\">\n            <mp-cells>\n                <mp-cell>\n                    <mp-uploader bindfail=\"uploadError\" bindsuccess=\"uploadSuccess\" select=\"{{selectFile}}\" upload=\"{{uploadFile}}\" files=\"{{files}}\" max-count=\"5\" title=\"图片上传\" tips=\"图片上传提示\"></mp-uploader>\n                </mp-cell>\n            </mp-cells>\n        </view>\n    </scroll-view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/form/uploader/uploader.wxss",
    "content": "/* example/uploader/uploader.wxss */\n@import '../../common.wxss';\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/images/base64.js",
    "content": "module.exports = {\n  icon20: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAMAAABgZ9sFAAAAVFBMVEXx8fHMzMzr6+vn5+fv7+/t7e3d3d2+vr7W1tbHx8eysrKdnZ3p6enk5OTR0dG7u7u3t7ejo6PY2Njh4eHf39/T09PExMSvr6+goKCqqqqnp6e4uLgcLY/OAAAAnklEQVRIx+3RSRLDIAxE0QYhAbGZPNu5/z0zrXHiqiz5W72FqhqtVuuXAl3iOV7iPV/iSsAqZa9BS7YOmMXnNNX4TWGxRMn3R6SxRNgy0bzXOW8EBO8SAClsPdB3psqlvG+Lw7ONXg/pTld52BjgSSkA3PV2OOemjIDcZQWgVvONw60q7sIpR38EnHPSMDQ4MjDjLPozhAkGrVbr/z0ANjAF4AcbXmYAAAAASUVORK5CYII=',\n  icon60: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAMAAAAOusbgAAAAeFBMVEUAwAD///+U5ZTc9twOww7G8MYwzDCH4YcfyR9x23Hw+/DY9dhm2WZG0kbT9NP0/PTL8sux7LFe115T1VM+zz7i+OIXxhes6qxr2mvA8MCe6J6M4oz6/frr+us5zjn2/fa67rqB4IF13XWn6ad83nxa1loqyirn+eccHxx4AAAC/klEQVRo3u2W2ZKiQBBF8wpCNSCyLwri7v//4bRIFVXoTBBB+DAReV5sG6lTXDITiGEYhmEYhmEYhmEYhmEY5v9i5fsZGRx9PyGDne8f6K9cfd+mKXe1yNG/0CcqYE86AkBMBh66f20deBc7wA/1WFiTwvSEpBMA2JJOBsSLxe/4QEEaJRrASP8EVF8Q74GbmevKg0saa0B8QbwBdjRyADYxIhqxAZ++IKYtciPXLQVG+imw+oo4Bu56rjEJ4GYsvPmKOAB+xlz7L5aevqUXuePWVhvWJ4eWiwUQ67mK51qPj4dFDMlRLBZTqF3SDvmr4BwtkECu5gHWPkmDfQh02WLxXuvbvC8ku8F57GsI5e0CmUwLz1kq3kD17R1In5816rGvQ5VMk5FEtIiWislTffuDpl/k/PzscdQsv8r9qWq4LRWX6tQYtTxvI3XyrwdyQxChXioOngH3dLgOFjk0all56XRi/wDFQrGQU3Os5t0wJu1GNtNKHdPqYaGYQuRDfbfDf26AGLYSyGS3ZAK4S8XuoAlxGSdYMKwqZKM9XJMtyqXi7HX/CiAZS6d8bSVUz5J36mEMFDTlAFQzxOT1dzLRljjB6+++ejFqka+mXIe6F59mw22OuOw1F4T6lg/9VjL1rLDoI9Xzl1MSYDNHnPQnt3D1EE7PrXjye/3pVpr1Z45hMUdcACc5NVQI0bOdS1WA0wuz73e7/5TNqBPhQXPEFGJNV2zNqWI7QKBd2Gn6AiBko02zuAOXeWIXjV0jNqdKegaE/kJQ6Bfs4aju04lMLkA2T5wBSYPKDGF3RKhFYEa6A1L1LG2yacmsaZ6YPOSAMKNsO+N5dNTfkc5Aqe26uxHpx7ZirvgCwJpWq/lmX1hA7LyabQ34tt5RiJKXSwQ+0KU0V5xg+hZrd4Bn1n4EID+WkQdgLfRNtvil9SPfwy+WQ7PFBWQz6dGWZBLkeJFXZGCfLUjCgGgqXo5TuSu3cugdcTv/HjqnBTEMwzAMwzAMwzAMwzAMw/zf/AFbXiOA6frlMAAAAABJRU5ErkJggg=='\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/navigation/navigation/navigation.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  data: {\n    loading: false,\n    show: true,\n    animated: false,\n    title: 'UI组件库'\n  },\n  toggleLoading() {\n    this.setData({\n      loading: !this.data.loading\n    })\n  },\n  changeTitle() {\n    this.setData({\n      title: '修改标题内容之后的标题长这个样子'\n    })\n  },\n  changeColor() {\n    this.setData({\n      color: '#07C160'\n    })\n  },\n  changeBgColor() {\n    this.setData({\n      background: '#adadad'\n    })\n  },\n  toggleShow() {\n    this.setData({\n      show: !this.data.show\n    })\n  },\n  toggleAnimated() {\n    this.setData({\n      animated: !this.data.animated,\n      show: !this.data.show\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/navigation/navigation/navigation.json",
    "content": "{\n    \"usingComponents\": {\n        \"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\"\n    },\n    \"navigationStyle\": \"custom\",\n\t\t\"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/navigation/navigation/navigation.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar loading=\"{{loading}}\" show=\"{{show}}\" animated=\"{{animated}}\" color=\"{{color}}\" background=\"{{background}}\" title=\"{{title}}\" back=\"{{true}}\"></mp-navigation-bar>\n    <view class=\"page__hd\">\n        <view class=\"page__title\">Navigation</view>\n        <view class=\"page__desc\">小程序自定义导航栏</view>\n    </view>\n    <view class=\"page__bd page__bd_spacing\">\n        <button class=\"weui-btn\" type=\"primary\" bindtap=\"toggleLoading\">触发loading</button>\n        <button class=\"weui-btn mrt16\" type=\"primary\" bindtap=\"changeTitle\">修改标题内容</button>\n        <button class=\"weui-btn mrt16\" type=\"primary\" bindtap=\"changeColor\">修改文字颜色</button>\n        <button class=\"weui-btn mrt16\" type=\"primary\" bindtap=\"changeBgColor\">修改背景颜色</button>\n        <button class=\"weui-btn mrt16\" type=\"primary\" bindtap=\"toggleShow\">显示 / 隐藏</button>\n        <button class=\"weui-btn mrt16\" type=\"primary\" bindtap=\"toggleAnimated\">设置显示 / 隐藏opacity动画</button>\n    </view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/navigation/navigation/navigation.wxss",
    "content": "@import '../../common.wxss';\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/navigation/tabbar/tabbar.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nconst app = getApp()\n\nCustomPage({\n  data: {\n    list: [\n      {\n        text: '微信',\n        iconPath: app.globalData.iconTabbar,\n        selectedIconPath: app.globalData.iconTabbar,\n        badge: '8',\n        ariaLabel: '8个新通知'\n      },\n      {\n        text: '通讯录',\n        iconPath: app.globalData.iconTabbar,\n        selectedIconPath: app.globalData.iconTabbar\n      },\n      {\n        text: '发现',\n        iconPath: app.globalData.iconTabbar,\n        selectedIconPath: app.globalData.iconTabbar,\n        dot: true,\n        ariaLabel: '未读'\n      },\n      {\n        text: '我',\n        iconPath: app.globalData.iconTabbar,\n        selectedIconPath: app.globalData.iconTabbar\n      }\n    ]\n  },\n  tabChange(e) {\n    console.log('tab change', e)\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/navigation/tabbar/tabbar.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n    \"mp-tabbar\": \"weui-miniprogram/tabbar/tabbar\"\n  },\n  \"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/navigation/tabbar/tabbar.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Tabbar\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Tabbar</view>\n            <view class=\"page__desc\">类似小程序原生tabbar的组件，可用于自定义tabbar</view>\n        </view>\n        <root-portal>\n            <view class=\"tabbar-container\">\n                <mp-tabbar class=\"tabbar\" list=\"{{list}}\" bindchange=\"tabChange\"></mp-tabbar>\n            </view>\n        </root-portal>\n    </scroll-view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/navigation/tabbar/tabbar.wxss",
    "content": "@import '../../common.wxss';\n\n/* example/tabbar/tabbar.wxss */\n\n\n/* @media only screen and (min-width: 450px) {\n  .page__hd {\n    margin-left: 60px;\n  }\n\n  .tabbar {\n    position:fixed;\n    top: 0;\n    bottom:0;\n    width: unset;\n    height: 100%;\n    left:0;\n    right: unset;\n  }\n} */\n\n.tabbar-container {\n  width: 100vw;\n  height: 100vh;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.tabbar {\n  display: fixed;\n  position: absolute;\n  bottom: 0;\n  width: 100vw;\n  left: 0;\n  right: 0;\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/actionsheet/actionsheet.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  open() {\n    wx.showActionSheet({\n      itemList: ['A', 'B', 'C'],\n      success(res) {\n        if (!res.cancel) {\n          console.log(res.tapIndex)\n        }\n      }\n    })\n  },\n  data: {\n    showDialog: false,\n    groups: [\n      { text: '示例菜单', value: 1 },\n      { text: '示例菜单', value: 2 },\n      { text: '负向菜单', type: 'warn', value: 3 }\n    ]\n  },\n  openDialog() {\n    this.setData({\n      showDialog: true\n    })\n  },\n  closeDialog() {\n    this.setData({\n      showDialog: false\n    })\n  },\n  btnClick(e) {\n    console.log(e)\n    this.closeDialog()\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/actionsheet/actionsheet.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n\t\t\"mp-actionSheet\": \"weui-miniprogram/actionsheet/actionsheet\",\n\t\t\"mp-icon\": \"weui-miniprogram/icon/icon\"\n\t},\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/actionsheet/actionsheet.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"ActionSheet\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">ActionSheet</view>\n            <view class=\"page__desc\">弹出式菜单</view>\n        </view>\n        <view class=\"page__bd\">\n            <view class=\"weui-btn-area\">\n                <!-- <button class=\"weui-btn\" type=\"default\" bindtap=\"open\">原生 ActionSheet</button> -->\n                <button class=\"weui-btn\" type=\"default\" bindtap=\"openDialog\">模拟 ActionSheet</button>\n            </view>\n        </view>\n        <mp-actionSheet bindactiontap=\"btnClick\" show=\"{{showDialog}}\" actions=\"{{groups}}\" title=\"这是一个标题，可以为一行或者两行。\">\n            <view slot=\"{{'actionSlot' + '1'}}\" class=\"custom-action\">\n                <view class=\"custom-action_desc\">前往图中包含的小程序：</view>\n                <view class=\"custom-action_content\">\n                    <mp-icon icon=\"qr-code\" size=\"{{20}}\"></mp-icon>\n                    <text class=\"custom-action_name\">小程序名称</text>\n                    <mp-icon icon=\"arrow\" size=\"{{12}}\"></mp-icon>\n                </view>\n            </view>\n        </mp-actionSheet>\n    </scroll-view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/actionsheet/actionsheet.wxss",
    "content": "@import '../../common.wxss';\n\n\n.custom-action {\n  padding: 16px 0;\n  text-align: center;\n\n}\n.custom-action .custom-action_desc {\n    color: #999999\n}\n\n.custom-action .custom-action_name {\n  margin: 10px 5px;\n  line-height: 1;\n  vertical-align: middle;\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/dialog/dialog.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  data: {\n    dialogShow: false,\n    showOneButtonDialog: false,\n    buttons: [{ text: '取消' }, { text: '确定' }],\n    oneButton: [{ text: '确定' }]\n  },\n  openConfirm() {\n    this.setData({\n      dialogShow: true\n    })\n  },\n  tapDialogButton(e) {\n    this.setData({\n      dialogShow: false,\n      showOneButtonDialog: false\n    })\n  },\n  tapOneDialogButton(e) {\n    this.setData({\n      showOneButtonDialog: true\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/dialog/dialog.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n    \"mp-dialog\": \"weui-miniprogram/dialog/dialog\"\n\t},\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/dialog/dialog.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Dialog\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">Dialog</view>\n            <view class=\"page__desc\">对话框</view>\n        </view>\n        <view class=\"page__bd\">\n            <view class=\"weui-btn-area\">\n                <button class=\"weui-btn\" type=\"default\" bindtap=\"openConfirm\">确认取消按钮</button>\n                <button class=\"weui-btn mrt16\" type=\"default\" bindtap=\"tapOneDialogButton\">只有确认按钮</button>\n            </view>\n        </view>\n        <mp-dialog title=\"test\" show=\"{{dialogShow}}\" bindbuttontap=\"tapDialogButton\" buttons=\"{{buttons}}\">\n            <view>test content</view>\n        </mp-dialog>\n        <mp-dialog title=\"test1\" show=\"{{showOneButtonDialog}}\" bindbuttontap=\"tapDialogButton\" buttons=\"{{oneButton}}\">\n            <view>test content1</view>\n        </mp-dialog>\n    </scroll-view>\n</view>"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/dialog/dialog.wxss",
    "content": "@import '../../common.wxss';\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/half-screen-dialog/half-screen-dialog.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  onShareAppMessage() {\n    return {\n      title: 'half-screen-dialog',\n      path: 'page/weui/example/half-screen-dialog/half-screen-dialog'\n    }\n  },\n  data: {\n    typeF: false,\n    typeS: false,\n    typeT: false,\n    buttons: [\n      {\n        type: 'default',\n        className: '',\n        text: '辅助操作',\n        value: 0\n      },\n      {\n        type: 'primary',\n        className: '',\n        text: '主操作',\n        value: 1\n      }\n    ]\n  },\n  openTypeF() {\n    this.setData({\n      typeF: true\n    })\n  },\n  openTypeS() {\n    this.setData({\n      typeS: true\n    })\n  },\n  openTypeT() {\n    this.setData({\n      typeT: true\n    })\n  },\n  buttontap(e) {\n    console.log(e.detail)\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/half-screen-dialog/half-screen-dialog.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n    \"mp-halfScreenDialog\": \"weui-miniprogram/half-screen-dialog/half-screen-dialog\"\n\t},\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/half-screen-dialog/half-screen-dialog.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <mp-navigation-bar title=\"Half Screen Dialog\"></mp-navigation-bar>\n  <scroll-view type=\"list\" scroll-y class=\"page-height\">\n    <view class=\"page__hd\">\n        <view class=\"page__title\">Half Screen Dialog</view>\n        <view class=\"page__desc\">半屏弹窗，辅助完成当前页面任务时；提醒用户并引导用户的下一步操作；用户主动发起的任务时。</view>\n    </view>\n    <view class=\"page__bd\">\n        <view class=\"weui-btn-area\">\n            <button class=\"weui-btn\" type=\"primary\" bindtap=\"openTypeF\">样式一</button>\n            <button class=\"weui-btn mrt16\" type=\"primary\" bindtap=\"openTypeS\">样式二</button>\n            <button class=\"weui-btn mrt16\" type=\"primary\" bindtap=\"openTypeT\">样式三</button>\n        </view>\n        <mp-halfScreenDialog show=\"{{typeF}}\">\n          <view slot=\"title\">测试标题A</view>\n          <view slot=\"desc\">这是自定义描述区</view>\n          <view slot=\"footer\">\n            <button type=\"default\" class=\"weui-btn\">按钮A</button>\n            <button type=\"primary\" class=\"weui-btn\">按钮B</button>\n          </view>\n        </mp-halfScreenDialog>\n        <mp-halfScreenDialog show=\"{{typeT}}\" closabled=\"{{false}}\">\n          <view slot=\"title\">测试标题A</view>\n          <view slot=\"desc\">这是自定义描述区</view>\n          <view slot=\"footer\">\n            <button type=\"default\" class=\"weui-btn\">按钮A</button>\n            <button type=\"primary\" class=\"weui-btn\">按钮B</button>\n          </view>\n        </mp-halfScreenDialog>\n        <mp-halfScreenDialog\n          bindbuttontap=\"buttontap\"\n          show=\"{{typeS}}\"\n          maskClosable=\"{{false}}\"\n          title=\"测试标题B\"\n          subTitle=\"测试标题B的副标题\"\n          desc=\"辅助描述内容，可根据实际需要安排\"\n          tips=\"辅助提示内容，可根据实际需要安排\"\n          buttons=\"{{buttons}}\"\n        ></mp-halfScreenDialog>\n    </view>\n  </scroll-view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/half-screen-dialog/half-screen-dialog.wxss",
    "content": "@import '../../common.wxss';\n/* .weui-demo-dialog{\n  visibility:hidden;\n  opacity:0;\n  transition:all .3s;\n}\n.weui-half-screen-dialog{\n  transition:all .3s;\n  transform:translateY(100%);\n}\n.weui-demo-dialog_show{\n  visibility:visible;\n  opacity:1;\n}\n.weui-demo-dialog_show .weui-half-screen-dialog{\n    transform:translateY(0);\n}\n\n.fontSize {\n  font-size: 13px;\n} */\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  openSuccess() {\n    wx.navigateTo({\n      url: 'msg_success'\n    })\n  },\n  openText() {\n    wx.navigateTo({\n      url: 'msg_text'\n    })\n  },\n  openTextPrimary() {\n    wx.navigateTo({\n      url: 'msg_text_primary'\n    })\n  },\n  openFail() {\n    wx.navigateTo({\n      url: 'msg_fail'\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg.json",
    "content": "{\n  \"usingComponents\": {\n    \"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\"\n\t},\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Msg\"></mp-navigation-bar>\n    <view class=\"page__hd\">\n        <view class=\"page__title\">Msg</view>\n        <view class=\"page__desc\">提示页</view>\n    </view>\n    <view class=\"page__bd\">\n        <view class=\"weui-btn-area\">\n            <button class=\"weui-btn\" type=\"default\" bindtap=\"openSuccess\">成功提示页</button>\n            <button class=\"weui-btn mrt16\" type=\"default\" bindtap=\"openFail\">失败提示页</button>\n            <button class=\"weui-btn mrt16\" type=\"default\" bindtap=\"openText\">无图标提示页</button>\n            <button class=\"weui-btn mrt16\" type=\"default\" bindtap=\"openTextPrimary\">无图标提示页</button>\n        </view>\n    </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg.wxss",
    "content": "@import '../../common.wxss';\n\npage{\n    /* background-color: #FFFFFF; */\n}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_fail.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_fail.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n\t\t\"mp-msg\": \"weui-miniprogram/msg/msg\"\n\t},\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_fail.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Msg\"></mp-navigation-bar>\n    <mp-msg type=\"warn\" title=\"操作失败\">\n        <view slot=\"desc\">内容详情，可根据实际需要安排，如果换行则不超过规定长度，居中展现<navigator url=\"\" class=\"weui-msg__link\">文字链接</navigator></view>\n        <view slot=\"extend\">\n            <view>1. 说明1</view>\n            <view>2. 说明2</view>\n        </view>\n        <view slot=\"handle\">\n            <button class=\"weui-btn\" type=\"default\">辅助操作</button>\n        </view>\n        <view slot=\"footer\">\n            <view class=\"weui-footer__links\">\n                <navigator url=\"\" class=\"weui-footer__link\">底部链接文本</navigator>\n            </view>\n            <view class=\"weui-footer__text\">Copyright © 2008-2016 weui.io</view>\n        </view>\n    </mp-msg>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_fail.wxss",
    "content": "@import '../../common.wxss';\n\npage{\n    background-color: #FFFFFF;\n}\npage,.page{height:100%;}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_success.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_success.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n\t\t\"mp-msg\": \"weui-miniprogram/msg/msg\"\n\t},\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_success.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Msg\"></mp-navigation-bar>\n    <mp-msg type=\"success\" title=\"操作成功\">\n        <view slot=\"desc\">内容详情，可根据实际需要安排，如果换行则不超过规定长度，居中展现<navigator url=\"\" class=\"weui-msg__link\">文字链接</navigator></view>\n        <view slot=\"extend\">\n            <view>1. 说明1</view>\n            <view>2. 说明2</view>\n        </view>\n        <view slot=\"handle\">\n            <button class=\"weui-btn\" type=\"primary\">主要操作</button>\n            <button class=\"weui-btn mrt16\" type=\"default\">辅助操作</button>\n        </view>\n        <view slot=\"footer\">\n            <view class=\"weui-footer__links\">\n                <navigator url=\"\" class=\"weui-footer__link\">底部链接文本</navigator>\n            </view>\n            <view class=\"weui-footer__text\">Copyright © 2008-2016 weui.io</view>\n        </view>\n    </mp-msg>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_success.wxss",
    "content": "@import '../../common.wxss';\n\npage{\n    background-color: #FFFFFF;\n}\npage,.page{height:100%;}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_text.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_text.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n\t\t\"mp-msg\": \"weui-miniprogram/msg/msg\"\n\t},\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_text.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Msg\"></mp-navigation-bar>\n    <mp-msg title=\"操作提示的text\">\n        <view slot=\"desc\">内容详情，可根据实际需要安排，如果换行则不超过规定长度，居中展现<navigator url=\"\" class=\"weui-msg__link\">文字链接</navigator></view>\n        <view slot=\"extend\">\n            <view>1. 说明1</view>\n            <view>2. 说明2</view>\n        </view>\n        <view slot=\"handle\">\n            <button class=\"weui-btn\" type=\"default\">辅助操作</button>\n        </view>\n        <view slot=\"footer\">\n            <view class=\"weui-footer__links\">\n                <navigator url=\"\" class=\"weui-footer__link\">底部链接文本</navigator>\n            </view>\n            <view class=\"weui-footer__text\">Copyright © 2008-2016 weui.io</view>\n        </view>\n    </mp-msg>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_text.wxss",
    "content": "@import '../../common.wxss';\n\npage{\n    background-color: #FFFFFF;\n}\npage,.page{height:100%;}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_text_primary.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_text_primary.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n\t\t\"mp-msg\": \"weui-miniprogram/msg/msg\"\n\t},\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_text_primary.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Msg\"></mp-navigation-bar>\n    <mp-msg title=\"操作提示primary text\">\n        <view slot=\"desc\">内容详情，可根据实际需要安排，如果换行则不超过规定长度，居中展现<navigator url=\"\" class=\"weui-msg__link\">文字链接</navigator></view>\n        <view slot=\"extend\">\n            <view>1. 说明1</view>\n            <view>2. 说明2</view>\n        </view>\n        <view slot=\"handle\">\n            <button class=\"weui-btn\" type=\"primary\">主要操作</button>\n        </view>\n        <view slot=\"footer\">\n            <view class=\"weui-footer__links\">\n                <navigator url=\"\" class=\"weui-footer__link\">底部链接文本</navigator>\n            </view>\n            <view class=\"weui-footer__text\">Copyright © 2008-2016 weui.io</view>\n        </view>\n    </mp-msg>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/msg/msg_text_primary.wxss",
    "content": "@import '../../common.wxss';\n\npage{\n    background-color: #FFFFFF;\n}\npage,.page{height:100%;}\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/toptips/toptips.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  data: {\n    show1: false,\n    show2: false,\n    show3: false\n  },\n  showToptips1() {\n    this.setData({\n      show1: true\n    })\n  },\n  showToptips2() {\n    this.setData({\n      show2: true\n    })\n  },\n  showToptips3() {\n    this.setData({\n      show3: true\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/toptips/toptips.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n\t\t\"mp-toptips\": \"weui-miniprogram/toptips/toptips\"\n\t},\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/toptips/toptips.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"Toptips\"></mp-navigation-bar>\n    <view class=\"page__hd\">\n        <view class=\"page__title\">Toptips</view>\n    </view>\n    <view class=\"page__bd\">\n        <button class=\"weui-btn\" type=\"primary\" bindtap=\"showToptips1\">显示1</button>\n        <button class=\"weui-btn mrt16\" type=\"primary\" bindtap=\"showToptips2\">显示2</button>\n        <button class=\"weui-btn mrt16\" type=\"primary\" bindtap=\"showToptips3\">显示3</button>\n\n        <mp-toptips ext-class=\"top100\" msg=\"距离顶部100px\" type=\"error\" show=\"{{show1}}\"></mp-toptips>\n        <mp-toptips ext-class=\"top200\" msg=\"距离顶部200px\" type=\"info\" show=\"{{show2}}\"></mp-toptips>\n        <mp-toptips ext-class=\"top300\" msg=\"距离顶部300px\" type=\"success\" show=\"{{show3}}\"></mp-toptips>\n    </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/operate/toptips/toptips.wxss",
    "content": "@import \"../../../../common/lib/weui.wxss\";\n\n\n.weui-toptips.top100 {\n\ttop: 100px;\n}\n.weui-toptips.top200 {\n\ttop: 200px;\n}\n.weui-toptips.top300 {\n\ttop: 300px;\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/search/searchbar/searchbar.js",
    "content": "import CustomPage from '../../../base/CustomPage'\n\nCustomPage({\n  data: {\n    inputShowed: false,\n    inputVal: '',\n    i: 0\n  },\n  onLoad() {\n    this.setData({\n      search: this.search.bind(this)\n    })\n  },\n  search(value) {\n    return new Promise((resolve, reject) => {\n      if (this.data.i % 2 === 0) {\n        setTimeout(() => {\n          resolve([{ text: '搜索结果', value: 1 }, { text: '搜索结果2', value: 2 }])\n        }, 200)\n      } else {\n        setTimeout(() => {\n          resolve([])\n        }, 200)\n      }\n      this.setData({\n        i: this.data.i + 1\n      })\n    })\n  },\n  selectResult(e) {\n    console.log('select result', e.detail)\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/search/searchbar/searchbar.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n\t\t\"mp-searchbar\": \"weui-miniprogram/searchbar/searchbar\"\n\t},\n\t\"navigationStyle\": \"custom\",\n  \"renderer\": \"skyline\"\n}"
  },
  {
    "path": "miniprogram/packageExtend/pages/search/searchbar/searchbar.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"SearchBar\"></mp-navigation-bar>\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__title\">SearchBar</view>\n            <view class=\"page__desc\">搜索栏</view>\n        </view>\n        <view class=\"page__bd\">\n            <mp-searchbar bindselectresult=\"selectResult\" search=\"{{search}}\"></mp-searchbar>\n        </view>\n    </scroll-view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageExtend/pages/search/searchbar/searchbar.wxss",
    "content": "@import '../../common.wxss';\n\n.searchbar-result{\n    margin-top: 0;\n    font-size: 14px;\n}\n\n.searchbar-result:before{\n    display: none;\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/common/custom-route/common.js",
    "content": "export const GestureState = {\n  POSSIBLE: 0, // 0 此时手势未识别，如 panDown等\n  BEGIN: 1, // 1 手势已识别\n  ACTIVE: 2, // 2 连续手势活跃状态\n  END: 3, // 3 手势终止\n  CANCELLED: 4, // 4 手势取消，\n}\n\nexport const ScrollState = {\n  scrollStart: 0,\n  scrollUpdate: 1,\n  scrollEnd: 2,\n}\n\nexport const AnimationStatus = {\n  // / The animation is stopped at the beginning.\n  dismissed: 0,\n\n  // / The animation is running from beginning to end.\n  forward: 1,\n\n  // / The animation is running backwards, from end to beginning.\n  reverse: 2,\n\n  // / The animation is stopped at the end.\n  completed: 3,\n}\n\nexport const Curves = {}\n\nif (wx.worklet) {\n  const { Easing } = wx.worklet\n  Object.assign(Curves, {\n    fastLinearToSlowEaseIn: Easing.bezier(0.18, 1.0, 0.04, 1.0).factory(),\n    linearToEaseOut: Easing.bezier(0.35, 0.91, 0.33, 0.97).factory(),\n    easeInToLinear: Easing.bezier(0.67, 0.03, 0.65, 0.09).factory(),\n    fastOutSlowIn: Easing.bezier(0.4, 0.0, 0.2, 1.0).factory(),\n  })\n}\n\nexport const lerp = function (begin, end, t) {\n  'worklet'\n\n  return begin + (end - begin) * t\n}\n\nexport const clamp = function (cur, lowerBound, upperBound) {\n  'worklet'\n\n  if (cur > upperBound) return upperBound\n  if (cur < lowerBound) return lowerBound\n  return cur\n}\n\nexport function CurveAnimation({\n  animation, animationStatus, curve, reverseCurve\n}) {\n  const { derived } = wx.worklet\n\n  return derived(() => {\n    'worklet'\n\n    const useForwardCurve = !reverseCurve || animationStatus.value !== AnimationStatus.reverse\n    const activeCurve = useForwardCurve ? curve : reverseCurve\n\n    const t = animation.value\n    if (!activeCurve) return t\n    if (t === 0 || t === 1) return t\n    return activeCurve(t)\n  })\n}\n\nconst emptyFn = function () {\n  'worklet'\n}\n\nexport const _kMinFlingVelocity = 1.0\nexport const _kMaxPageBackAnimationTime = 300\nexport const _kMaxDroppedSwipePageForwardAnimationTime = 300\nexport const timing = (wx.worklet && wx.worklet.timing) || emptyFn\n"
  },
  {
    "path": "miniprogram/packageSkyline/common/custom-route/cupertino-route.js",
    "content": "import { CurveAnimation, Curves } from './common'\n\n/**\n * 仿 iOS 返回自定义路由\n */\nexport const CupertinoRouteBuilder = ({\n  primaryAnimation,\n  secondaryAnimation,\n  primaryAnimationStatus,\n  secondaryAnimationStatus,\n  userGestureInProgress,\n}) => {\n  const { windowWidth } = wx.getSystemInfoSync()\n\n  const _curvePrimaryAnimation = CurveAnimation({\n    animation: primaryAnimation,\n    animationStatus: primaryAnimationStatus,\n    curve: Curves.linearToEaseOut,\n    reverseCurve: Curves.easeInToLinear,\n  })\n\n  const handlePrimaryAnimation = () => {\n    'worklet'\n\n    /**\n     * 1. 手势拖动时采用原始值\n     * 2. 页面进入时采用 curve 曲线生成的值\n     * 3. 页面返回时采用 reverseCurve 生成的值\n     */\n    let t = primaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n\n    // 页面从右至左推入\n    return {\n      transform: [{ translateX: windowWidth * (1 - t) }],\n    }\n  }\n\n  const _curveSecondaryAnimation = CurveAnimation({\n    animation: secondaryAnimation,\n    animationStatus: secondaryAnimationStatus,\n    curve: Curves.linearToEaseOut,\n    reverseCurve: Curves.easeInToLinear,\n  })\n\n  const handleSecondaryAnimation = () => {\n    'worklet'\n\n    let t = secondaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curveSecondaryAnimation.value\n    }\n\n    // 下一个页面推入时，当前页面继续向左推入 1/3\n    return {\n      transform: [{ translateX: (-1 / 3) * windowWidth * t }],\n    }\n  }\n\n  // const handleDragStart = () => {\n  //   'worklet';\n  //   startUserGesture();\n  // };\n\n  // const handleDragUpdate = (delta: number) => {\n  //   'worklet';\n  //   const newVal = primaryAnimation.value - delta;\n  //   primaryAnimation.value = clamp(newVal, 0.0, 1.0);\n  // };\n\n  // const handleDragEnd = (velocity: number) => {\n  //   'worklet';\n  //   let animateForward = false;\n  //   if (Math.abs(velocity) >= _kMinFlingVelocity) {\n  //     animateForward = velocity <= 0;\n  //   } else {\n  //     animateForward = primaryAnimation.value > 0.5;\n  //   }\n  //   const t = primaryAnimation.value;\n  //   const animationCurve = Curves.fastLinearToSlowEaseIn;\n  //   if (animateForward) {\n  //     const droppedPageForwardAnimationTime = Math.min(\n  //       Math.floor(lerp(_kMaxDroppedSwipePageForwardAnimationTime, 0, t)),\n  //       _kMaxPageBackAnimationTime,\n  //     );\n  //     primaryAnimation.value = timing(\n  //       1.0,\n  //       {\n  //         duration: droppedPageForwardAnimationTime,\n  //         easing: animationCurve,\n  //       },\n  //       () => {\n  //         stopUserGesture();\n  //       },\n  //     );\n  //   } else {\n  //     const droppedPageBackAnimationTime = Math.floor(lerp(0, _kMaxDroppedSwipePageForwardAnimationTime, t));\n  //     primaryAnimation.value = timing(\n  //       0.0,\n  //       {\n  //         duration: droppedPageBackAnimationTime,\n  //         easing: animationCurve,\n  //       },\n  //       () => {\n  //         didPop();\n  //         stopUserGesture();\n  //       },\n  //     );\n  //   }\n  // };\n\n  // const handleHorizontalDrag = (gestureEvent: any) => {\n  //   'worklet';\n  //   if (gestureEvent.state === GestureState.BEGIN) {\n  //     handleDragStart();\n  //   } else if (gestureEvent.state === GestureState.ACTIVE) {\n  //     const delta = gestureEvent.deltaX / windowWidth;\n  //     handleDragUpdate(delta);\n  //   } else if (gestureEvent.state === GestureState.END) {\n  //     const velocity = gestureEvent.velocityX / windowWidth;\n  //     handleDragEnd(velocity);\n  //   } else if (gestureEvent.state === GestureState.CANCELLED) {\n  //     handleDragEnd(0.0);\n  //   }\n  // };\n  return {\n    opaque: true,\n    handlePrimaryAnimation,\n    handleSecondaryAnimation,\n    transitionDuration: 300,\n    reverseTransitionDuration: 300,\n    canTransitionTo: true,\n    canTransitionFrom: true,\n  }\n}\n\nexport default CupertinoRouteBuilder\n"
  },
  {
    "path": "miniprogram/packageSkyline/common/custom-route/hafl-screen-route.js",
    "content": "import { CurveAnimation, Curves } from './common'\n\nconst HalfScreenDialogRouteBuilder = ({\n  primaryAnimation,\n  primaryAnimationStatus,\n  userGestureInProgress,\n}) => {\n  const { screenHeight } = getApp().globalData\n  console.info('HalfScreenDialogRouteBuilder ', screenHeight)\n\n  const _curvePrimaryAnimation = CurveAnimation({\n    animation: primaryAnimation,\n    animationStatus: primaryAnimationStatus,\n    curve: Curves.linearToEaseOut,\n    reverseCurve: Curves.easeInToLinear,\n  })\n\n  const handlePrimaryAnimation = () => {\n    'worklet'\n\n    /**\n     * 1. 手势拖动时采用原始值\n     * 2. 页面进入时采用 curve 曲线生成的值\n     * 3. 页面返回时采用 reverseCurve 生成的值\n     */\n    let t = primaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n    const top = 0.12\n    const selfHeight = (1 - top) * screenHeight\n\n    const marginTop = top * screenHeight\n    const translateY = selfHeight * (1 - t)\n    return {\n      marginTop: `${marginTop}px`,\n      borderRadius: '10px',\n      height: `${selfHeight}px`,\n      transform: `translateY(${translateY}px)`,\n    }\n  }\n\n  return {\n    opaque: false,\n    handlePrimaryAnimation,\n    transitionDuration: 300,\n    reverseTransitionDuration: 300,\n    canTransitionTo: true,\n    canTransitionFrom: true,\n  }\n}\n\nexport default HalfScreenDialogRouteBuilder\n"
  },
  {
    "path": "miniprogram/packageSkyline/common/custom-route/index.js",
    "content": "import OpacityTransitionRouteBuilder from './opacity-route'\nimport ScaleTransitionRouteBuilder from './scale-route'\nimport HalfScreenDialogRouteBuilder from './hafl-screen-route'\n\n/**\n * 示例用法\n * wx.navigateTo({url, routeType: Cupertino})\n */\n\nlet hasInstalled = false\nexport function installRouteBuilder() {\n  if (hasInstalled) {\n    return\n  }\n\n  if (!wx.worklet) {\n    console.warn('worklet not support on current version')\n    return\n  }\n\n  console.info('installRouteBuilder')\n  wx.router.addRouteBuilder('ScaleTransition', ScaleTransitionRouteBuilder)\n  wx.router.addRouteBuilder('OpacityTransition', OpacityTransitionRouteBuilder)\n  wx.router.addRouteBuilder('HalfScreenDialog', HalfScreenDialogRouteBuilder)\n\n  hasInstalled = true\n  console.info('----------installRouteBuilder', hasInstalled)\n}\n\nconst CustomRouteType = {\n  Cupertino: 'Cupertino',\n  ScaleTransition: 'ScaleTransition',\n  HalfScreenDialog: 'HalfScreenDialog',\n  OpacityTransition: 'OpacityTransition',\n}\n\nexport default CustomRouteType\n"
  },
  {
    "path": "miniprogram/packageSkyline/common/custom-route/opacity-route.js",
    "content": "import { Curves } from './common'\n\nconst OpacityTransitionRouteBuilder = ({ primaryAnimation }) => {\n  const handlePrimaryAnimation = () => {\n    'worklet'\n\n    return {\n      opacity: Curves.fastOutSlowIn(primaryAnimation.value),\n    }\n  }\n\n  return {\n    handlePrimaryAnimation,\n    transitionDuration: 1000,\n    reverseTransitionDuration: 1000,\n    canTransitionTo: true,\n    canTransitionFrom: false,\n  }\n}\n\nexport default OpacityTransitionRouteBuilder\n"
  },
  {
    "path": "miniprogram/packageSkyline/common/custom-route/scale-route.js",
    "content": "import { CurveAnimation, Curves } from './common'\n\nconst ScaleTransitionRouteBuilder = ({\n  primaryAnimation,\n  secondaryAnimation,\n  primaryAnimationStatus,\n  secondaryAnimationStatus,\n  userGestureInProgress,\n}) => {\n  const { windowWidth } = getApp().globalData\n  const { screenHeight } = getApp().globalData\n  console.info('ScaleTransitionRouteBuilder ', windowWidth)\n\n  const _curvePrimaryAnimation = CurveAnimation({\n    animation: primaryAnimation,\n    animationStatus: primaryAnimationStatus,\n    curve: Curves.linearToEaseOut,\n    reverseCurve: Curves.easeInToLinear,\n  })\n\n  const handlePrimaryAnimation = () => {\n    'worklet'\n\n    /**\n     * 1. 手势拖动时采用原始值\n     * 2. 页面进入时采用 curve 曲线生成的值\n     * 3. 页面返回时采用 reverseCurve 生成的值\n     */\n    let t = primaryAnimation.value\n\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n    const translateX = windowWidth * (1 - t)\n\n    return {\n      transform: `translateX(${translateX}px)`,\n    }\n  }\n\n  const _curveSecondaryAnimation = CurveAnimation({\n    animation: secondaryAnimation,\n    animationStatus: secondaryAnimationStatus,\n    curve: Curves.fastOutSlowIn,\n  })\n\n  const handleSecondaryAnimation = () => {\n    'worklet'\n\n    let t = secondaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curveSecondaryAnimation.value\n    }\n    const top = 0.1\n    const scaleRatio = 0.08\n\n    const translateY = screenHeight * (top - 0.5 * scaleRatio) * t\n    const scale = 1 - scaleRatio * t\n    const radius = 12 * t\n    return {\n      borderRadius: `${radius}px`,\n      transform: `translateY(${translateY}px) scale(${scale})`,\n    }\n  }\n\n  return {\n    opaque: true,\n    handleSecondaryAnimation,\n    transitionDuration: 300,\n    reverseTransitionDuration: 300,\n    canTransitionTo: true,\n    canTransitionFrom: true,\n  }\n}\n\nexport default ScaleTransitionRouteBuilder\n"
  },
  {
    "path": "miniprogram/packageSkyline/common/custom-route/util.js",
    "content": "function compareVersion(v1, v2) {\n  v1 = v1.split('.')\n  v2 = v2.split('.')\n  const len = Math.max(v1.length, v2.length)\n\n  while (v1.length < len) {\n    v1.push('0')\n  }\n  while (v2.length < len) {\n    v2.push('0')\n  }\n\n  for (let i = 0; i < len; i++) {\n    const num1 = parseInt(v1[i])\n    const num2 = parseInt(v2[i])\n\n    if (num1 > num2) {\n      return 1\n    } else if (num1 < num2) {\n      return -1\n    }\n  }\n\n  return 0\n}\n\nexport function isOfficialSkyline() {\n  if (!wx.getSkylineInfoSync) return false\n  const { isSupported, version } = wx.getSkylineInfoSync()\n  if (!isSupported) return false\n  return compareVersion(version, '1.0.1') >= 0\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/common/mixin.less",
    "content": ".row-center-cnt {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: center;\n}\n\n.ellipsis {\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.navigation-bar-right-btn {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  right: 15px;\n  width: 45px;\n  z-index: 80;\n}\n\n.navigation-bar-right-btn-unread {\n  position: absolute;\n  right: -5px;\n  top: 0px;\n  min-width: 23px;\n  height: 23px;\n  background-color: #D0BB8E;\n  border-radius: 12px;\n  font-size: 10px;\n  padding: auto 8px;\n}\n\n.custom-tabbar-bar-btn-unread {\n  position: absolute;\n  left: 55%;\n  top: 0;\n  min-width: 23px;\n  height: 23px;\n  background-color: #D0BB8E;\n  border-radius: 12px;\n  font-size: 10px;\n  padding: auto 8px;\n}\n\n.btn-unread {\n  min-width: 23px;\n  height: 23px;\n  background-color: #D0BB8E;\n  border-radius: 12px;\n  font-size: 10px;\n  padding: auto 8px;\n}\n\n"
  },
  {
    "path": "miniprogram/packageSkyline/common/tips.js",
    "content": "export function showTips() {\n  wx.showToast({\n    title: '该版本暂不支持 Skyline',\n    icon: 'none',\n    duration: 3000\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/common/types.js",
    "content": "export const GestureState = {\n  POSSIBLE: 0, // 0 此时手势未识别，如 panDown等\n  BEGIN: 1, // 1 手势已识别\n  ACTIVE: 2, // 2 连续手势活跃状态\n  END: 3, // 3 手势终止\n  CANCELLED: 4, // 4 手势取消，\n}\n\nexport const IPointerEvent = {\n  identifier: 'number',\n  type: 'string',\n  deltaX: 'number',\n  deltaY: 'number',\n  localX: 'number',\n  localY: 'number',\n  clientX: 'number',\n  clientY: 'number',\n  radiusX: 'number',\n  radiusY: 'number',\n  rotationAngle: 'number',\n  tilt: 'number',\n  force: 'number',\n  timeStamp: 'number',\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/common/worklet-api.js",
    "content": "function foo() {}\n\nfunction bar() {\n  'worklet'\n}\n\nexport const worklet = {\n  shared: foo,\n  derived: foo,\n  delay: bar,\n  repeat: bar,\n  sequence: bar,\n  spring: bar,\n  timing: bar,\n  decay: bar,\n  Easing: {},\n}\n\nexport const router = {\n  addRouteBuilder: foo,\n  removeRouteBuilder: foo,\n  getRouteContext: foo,\n}\n\nif (wx.worklet) {\n  Object.assign(worklet, wx.worklet)\n}\n\nif (wx.router) {\n  Object.assign(router, wx.router)\n}\n\nexport function supportWorklet() {\n  return typeof wx.worklet === 'object' && typeof wx.worklet.shared === 'function'\n}\n\nexport function shared(args) {\n  return wx.worklet.shared(args)\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/base.js",
    "content": "const runOnUI = wx.worklet.runOnUI\n\nexport default Behavior({\n  lifetimes: {\n    created() {\n      runOnUI(() => {\n        'worklet'\n\n        if (!globalThis.temp) globalThis.temp = {}\n        if (!globalThis.eventBus) {\n          const eventBus = {\n            map: {},\n            on(eventName, handler) {\n              eventBus.map[eventName] = eventBus.map[eventName] || []\n              eventBus.map[eventName].push(handler)\n            },\n            off(eventName, handler) {\n              const handlerList = eventBus.map[eventName]\n              if (!handlerList || !handlerList.length) return\n\n              const index = handlerList.indexOf(handler)\n              if (index !== -1) handlerList.splice(index, 1)\n            },\n            emit(eventName, args) {\n              const handlerList = eventBus.map[eventName]\n              if (!handlerList || !handlerList.length) return\n\n              for (let i = handlerList.length - 1; i >= 0; i--) {\n                handlerList[i](args)\n              }\n            },\n          }\n          globalThis.eventBus = eventBus\n        }\n      })()\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/half-page/half-page/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"page-scroll\": \"/components/page-scroll/index\"\n  },\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/half-page/half-page/index.less",
    "content": "page {\n  padding: 15px 0;\n}\n\n.comment-container {\n  width: 100%;\n  height: 100%;\n  padding-top: 40px;\n  display: flex;\n  flex-direction: column;\n}\n\n.bottom-sheet {\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: center;\n  height: 50px;\n}\n\n.bottom-sheet .btn-wrp {\n  position: absolute;\n  left: 0;\n  height: 100%;\n  padding: 0 32rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.bottom-sheet .btn {\n  width: 24px;\n  height: 24px;\n  background-color: #f2f2f2;\n  border-radius: 12px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.bottom-sheet .icon {\n  width: 12px;\n  height: 12px;\n}\n\n.bottom-sheet .title {\n  font-size: 18px;\n}\n\n.comment-item {\n  // width: 100%;\n  // height: 60px;\n  padding: 0 30px;\n  background-color: #f7f7f7;\n  // flex-direction: row;\n  // align-items: center;\n}\n\n.avatar {\n  width: 40px;\n  height: 40px;\n  margin-right: 15px;\n  border-radius: 50%;\n  background: #ccc;\n}\n\n/* .comment {\n  height: 40px;\n  flex-grow: 1;\n  background: #ccc;\n} */\n\n.ellipsis {\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.row-center-cnt {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: center;\n}\n\n.comment {\n  // margin-bottom: 20px;\n  padding-bottom: 20px;\n  font-size: 13px;\n  line-height: 1.4;\n\n  .main-comment,\n  .sub-comment {\n    width: 100%;\n    display: flex;\n    flex-direction: row;\n  }\n\n  .sub-comment {\n    // margin-top: 5px;\n    padding-top: 10px;\n  }\n\n  .user-head-img {\n    width: 33px;\n    height: 33px;\n    border-radius: 50%;\n    margin-top: 5px;\n  }\n\n  .others {\n    flex: 1;\n    margin-left: 10px;\n  }\n\n  .user-name {\n    .ellipsis;\n  }\n\n  .content {\n    margin-top: 2px;\n  }\n\n  .sub-comment-list {\n    // padding: 22px;\n    padding: 0 22px 0;\n  }\n}\n\n\n\n/* # sourceMappingURL=index.wxss.map */"
  },
  {
    "path": "miniprogram/packageSkyline/pages/half-page/half-page/index.ts",
    "content": "// index.js\nimport {\n  GestureState,\n  lerp,\n  clamp,\n  Curves,\n  _kMinFlingVelocity,\n  _kMaxPageBackAnimationTime,\n  _kMaxDroppedSwipePageForwardAnimationTime,\n  timing,\n} from '../../../common/custom-route/common';\nimport { getCommentList } from '../../../utils/comment'\n\nconst app = getApp();\n\nconst { windowHeight } = app.globalData;\n\nPage({\n  data: {\n    list: getCommentList() //new Array(40).fill(1),\n  },\n\n  onLoad() {\n    this.setData({\n      renderer: this.renderer,\n    });\n\n    this._useWorklet = this.renderer === 'skyline' && !!wx.worklet;\n    if (this._useWorklet) {\n      this.customRouteContext = wx.router?.getRouteContext(this);\n      this.scrollTop = wx.worklet.shared(0);\n      this.startPan = wx.worklet.shared(false);\n      wx.setNavigationBarColor({\n        frontColor: '#ffffff',\n        backgroundColor: '#000000',\n        duration: 300,\n      });\n    }\n  },\n\n  onUnload() {\n    wx.setNavigationBarColor({\n      frontColor: '#000000',\n      backgroundColor: '#ffffff',\n      duration: 300,\n    });\n  },\n\n  back() {\n    wx.navigateBack({\n      delta: 1,\n    });\n  },\n  shouldPanResponse() {\n    'worklet';\n    return this.startPan.value;\n  },\n  shouldScrollViewResponse(pointerEvent) {\n    'worklet';\n    const { primaryAnimation } = this.customRouteContext;\n    if (primaryAnimation.value < 1) return false;\n    const scrollTop = this.scrollTop.value;\n    const { deltaY } = pointerEvent;\n    const result = !(scrollTop <= 0 && deltaY > 0);\n    this.startPan.value = !result;\n    return result;\n  },\n  adjustDecelerationVelocity(velocity) {\n    'worklet';\n    const scrollTop = this.scrollTop.value;\n    return scrollTop <= 0 ? 0 : velocity;\n  },\n  handleScroll(event) {\n    'worklet';\n    if (!this._useWorklet) return;\n    this.scrollTop.value = event.detail.scrollTop;\n  },\n  handleDragStart() {\n    'worklet';\n    this.startPan.value = true;\n    const { startUserGesture } = this.customRouteContext;\n    startUserGesture();\n  },\n\n  handleDragUpdate(delta) {\n    'worklet';\n    const { primaryAnimation } = this.customRouteContext;\n    const newVal = primaryAnimation.value - delta;\n    primaryAnimation.value = clamp(newVal, 0.0, 1.0);\n  },\n\n  handleDragEnd(velocity) {\n    'worklet';\n    this.startPan.value = false;\n    const { primaryAnimation, stopUserGesture, didPop } = this.customRouteContext;\n\n    let animateForward = false;\n    if (Math.abs(velocity) >= _kMinFlingVelocity) {\n      animateForward = velocity <= 0;\n    } else {\n      animateForward = primaryAnimation.value > 0.7;\n    }\n    const t = primaryAnimation.value;\n    const animationCurve = Curves.fastLinearToSlowEaseIn;\n    if (animateForward) {\n      const droppedPageForwardAnimationTime = Math.min(\n        Math.floor(lerp(_kMaxDroppedSwipePageForwardAnimationTime, 0, t)),\n        _kMaxPageBackAnimationTime,\n      );\n      primaryAnimation.value = timing(\n        1.0,\n        {\n          duration: droppedPageForwardAnimationTime,\n          easing: animationCurve,\n        },\n        () => {\n          'worklet'\n          stopUserGesture();\n        },\n      );\n    } else {\n      const droppedPageBackAnimationTime = Math.floor(lerp(0, _kMaxDroppedSwipePageForwardAnimationTime, t));\n      primaryAnimation.value = timing(\n        0.0,\n        {\n          duration: droppedPageBackAnimationTime,\n          easing: animationCurve,\n        },\n        () => {\n          'worklet'\n          stopUserGesture();\n          didPop();\n        },\n      );\n    }\n  },\n\n  handleVerticalDrag(gestureEvent) {\n    'worklet';\n    if (gestureEvent.state === GestureState.BEGIN) {\n      this.handleDragStart();\n    } else if (gestureEvent.state === GestureState.ACTIVE) {\n      const delta = gestureEvent.deltaY / windowHeight;\n      this.handleDragUpdate(delta);\n    } else if (gestureEvent.state === GestureState.END) {\n      const velocity = gestureEvent.velocityY / windowHeight;\n      this.handleDragEnd(velocity);\n    } else if (gestureEvent.state === GestureState.CANCELLED) {\n      this.handleDragEnd(0.0);\n    }\n  },\n});\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/half-page/half-page/index.wxml",
    "content": "<!-- index.wxml -->\n<vertical-drag-gesture-handler id=\"pan\" worklet:should-response-on-move=\"shouldPanResponse\" simultaneousHandlers=\"{{ ['scroll'] }}\" worklet:ongesture=\"handleVerticalDrag\" style=\"flex: 1; overflow: auto;width: 100%;\">\n\t<view class=\"comment-container\">\n\t\t<view class=\"bottom-sheet\">\n\t\t\t<view class=\"btn-wrp\" bind:tap=\"back\">\n\t\t\t\t<view class=\"btn\">\n\t\t\t\t\t<image class=\"icon\" src=\"../../../resources/icon_down_arrow.svg\" mode=\"aspectFit\"/>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t\t<view class=\"title\">评论列表</view>\n\t\t</view>\n\t\t<vertical-drag-gesture-handler id=\"scroll\" native-view=\"scroll-view\" worklet:should-response-on-move=\"shouldScrollViewResponse\" simultaneousHandlers=\"{{ ['pan'] }}\">\n\t\t\t<scroll-view style=\"flex: 1; overflow: auto; width: 100%;\" scroll-y bindscroll=\"handleScroll\" worklet:adjust-deceleration-velocity=\"adjustDecelerationVelocity\" bounces=\"{{ false }}\" refresher-enabled=\"{{ false }}\" type=\"list\">\n\t\t\t\t<view class=\"comment-item comment\" wx:for=\"{{ list }}\">\n\t\t\t\t\t<!-- <image class=\"avatar\" src=\"{{ item.userHeadImg }}\"/>\n\t\t\t\t\t<view class=\"comment\">\n            {{ item.comment }}\n          </view> -->\n          <view class=\"main-comment\">\n            <image class=\"user-head-img\" src=\"{{item.userHeadImg}}\"></image>\n            <view class=\"others\">\n              <text class=\"user-name\">{{item.userName}}</text>\n              <text class=\"content\">{{item.comment}}</text>\n            </view>\n          </view>\n\n          <view wx:if=\"{{item.subCommentList.length}}\" class=\"sub-comment-list\">\n            <view class=\"sub-comment\" wx:for=\"{{item.subCommentList}}\" wx:key=\"id\" wx:for-item=\"subItem\" wx:for-index=\"subIndex\">\n              <image class=\"user-head-img\" src=\"{{subItem.userHeadImg}}\"></image>\n              <view class=\"others\">\n                <text class=\"user-name\">{{subItem.userName}} 回复 {{subItem.replyUserName}}</text>\n                <text class=\"content\">{{subItem.comment}}</text>\n              </view>\n            </view>\n          </view>\n            \n\t\t\t\t</view>\n\t\t\t</scroll-view>\n\t\t</vertical-drag-gesture-handler>\n\t</view>\n</vertical-drag-gesture-handler>\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/half-page/scale-page/index.js",
    "content": "import { showTips } from '../../../common/tips'\nimport { worklet, supportWorklet } from '../../../common/worklet-api'\n\nPage({\n  data: {},\n  onLoad: function onLoad() {\n    if (this.renderer !== 'skyline' || !supportWorklet()) {\n      showTips()\n    }\n  },\n  jump: function jump() {\n    wx.navigateTo({\n      routeType: 'HalfScreenDialog',\n      url: '/packageSkyline/pages/half-page/half-page/index'\n    })\n  },\n  back: function back() {\n    wx.navigateBack()\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n    return {\n      title: '自定义路由',\n      path: 'packageSkyline/pages/half-page/scale-page/index'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/half-page/scale-page/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"page-scroll\": \"/components/page-scroll/index\"\n  },\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/half-page/scale-page/index.less",
    "content": "/* packageSkyline/pages/half-page/scale-page/index.wxss */\npage, view, text, image, button, video, map, cover-view, cover-image, scroll-view, swiper, input, textarea, navigator {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-start;\n  align-content: flex-start;\n  align-items: stretch;\n  box-sizing: border-box;\n  background-origin: border-box;\n}\n\n.container {\n  align-items: center;\n  margin-top: 200px;\n  min-height: auto;\n}\n.card {\n  background-color: #88d514;\n  width: 80%;\n  margin: 10px 0;\n  border: 1px solid #ccc;\n  text-align: center;\n  padding: 10px ;\n}\nbutton {\n  height: auto;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\n\n\n/* # sourceMappingURL=index.wxss.map */"
  },
  {
    "path": "miniprogram/packageSkyline/pages/half-page/scale-page/index.wxml",
    "content": "<!-- index.wxml -->\n<mp-navigation-bar title=\"自定义路由\" back=\"{{true}}\"></mp-navigation-bar>\n<view class=\"container\">\n\t<button type=\"primary\" bind:tap=\"jump\">打开半屏页面</button>\n\t<button type=\"primary\" bind:tap=\"back\">返回上一级</button>\n</view>\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/half-page/scale-page/index.wxss",
    "content": "page, view, text, image, button, video, map, cover-view, cover-image, scroll-view, swiper, input, textarea, navigator {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-start;\n  align-content: flex-start;\n  align-items: stretch;\n  box-sizing: border-box;\n  background-origin: border-box;\n}\n\n.container {\n  align-items: center;\n  margin-top: 200px;\n  min-height: auto;\n}\n.card {\n  background-color: #88d514;\n  width: 80%;\n  margin: 10px 0;\n  border: 1px solid #ccc;\n  text-align: center;\n  padding: 10px ;\n}\nbutton {\n  height: auto;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\n\n\n/* # sourceMappingURL=index.wxss.map */"
  },
  {
    "path": "miniprogram/packageSkyline/pages/preview/index.js",
    "content": "import Base from '../base'\nimport { getAlbum } from '../../utils/tool'\n\nComponent({\n  behaviors: [Base],\n\n  properties: {\n    imageid: {\n      type: String,\n      value: '',\n    },\n    sourcepageid: {\n      type: String,\n      value: '',\n    },\n  },\n\n  data: {\n    imageId: '',\n    sourcePageId: '',\n    list: [],\n  },\n\n  lifetimes: {\n    attached() {\n      // 因为页面的 onLoad 太迟，所以选用 component 构造器的 attached 生命周期来设置 shareKey，确保 share-element 动画正常执行\n      const query = this.data\n      const imageId = decodeURIComponent(query.imageid || '')\n      const sourcePageId = decodeURIComponent(query.sourcepageid || '')\n      const list = getAlbum()\n      this.setData({ imageId, sourcePageId, list })\n    },\n\n    /**\n     * 用户点击右上角分享\n     */\n    onShareAppMessage() {\n      return {\n        title: '图片预览',\n        path: 'packageSkyline/pages/preview/index'\n      }\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/preview/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"previewer\": \"../../components/previewer/index\"\n  },\n  \"navigationStyle\": \"custom\",\n  \"backgroundColorContent\": \"#00000000\",\n  \"disableScroll\": true,\n  \"renderer\": \"skyline\",\n  \"componentFramework\": \"glass-easel\"\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/preview/index.wxml",
    "content": "<view class=\"box-cotainer\">\n  <previewer\n    imageId=\"{{imageId}}\"\n    sourcePageId=\"{{sourcePageId}}\"\n    list=\"{{list}}\"\n  ></previewer>\n</view>"
  },
  {
    "path": "miniprogram/packageSkyline/pages/preview/index.wxss",
    "content": "page {\n  background-color: transparent;\n}\n\n.box-cotainer {\n  width: 100vw;\n  height: 100vh;\n  position: relative;\n}\n\n.previewer {\n  width: 100%;\n  height: 100%;\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/share-element/card/index.js",
    "content": "import { cardList } from '../data'\n\nComponent({\n  properties: {\n    idx: {\n      type: Number,\n      value: -1,\n      observer(newVal) {\n        this.setData({\n          cardData: cardList[newVal],\n        })\n      },\n    },\n  },\n  data: {\n    cardData: {},\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n    return {\n      title: '共享元素动画',\n      path: 'packageSkyline/pages/share-element/card/index'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/share-element/card/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"page-scroll\": \"/components/page-scroll/index\"\n  },\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/share-element/card/index.wxml",
    "content": "<!-- index.wxml -->\n<mp-navigation-bar title=\"card\" back=\"{{true}}\"></mp-navigation-bar>\n<view class=\"page-container\">\n\t<view class=\"card-wrp\">\n\t\t<view class=\"card-item\">\n\t\t\t<share-element key=\"{{ cardData.description }}\">\n\t\t\t\t<view class=\"img-wrp\">\n\t\t\t\t\t<image mode=\"aspectFit\" src=\"{{ cardData.imgSrc }}\"/>\n\t\t\t\t</view>\n\t\t\t</share-element>\n\t\t</view>\n\t\t<view class=\"description\">{{cardData.description}}</view>\n\t</view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/share-element/card/index.wxss",
    "content": ".page-container {\n  width: 100%;\n  height: 100%;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n.card-wrp {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  padding: 12px;\n}\n.card-item {\n  width: 256px;\n  height: 256px;\n}\nshare-element {\n  width: 100%;\n  height: 100%;\n}\n.img-wrp {\n  background-color: #a1cfec8b;\n  border-radius: 32px;\n  overflow: hidden;\n  height: 100%; \n  width: 100%\n}\n.description {\n  font-size: 40px;\n  font-weight: bold;\n  margin-top: 16px;\n}\nimage {\n  width: 100%;\n  height: 100%;\n}\n\n\n\n/* # sourceMappingURL=index.wxss.map */"
  },
  {
    "path": "miniprogram/packageSkyline/pages/share-element/data.js",
    "content": "export const cardList = [{\n  id: 1,\n  imgSrc: 'https://res.wx.qq.com/op_res/BctIVId6FBWoAwrQ6I0FrKM6ykZ_qKB5VCXTjyr_zROHEgQ5DhPNY1kjORtCPVZsQlmhMQK2X3rTYp8l3Kunwg',\n  description: 'Chair',\n}, {\n  id: 2,\n  imgSrc: 'https://res.wx.qq.com/op_res/BctIVId6FBWoAwrQ6I0FrM-5EYl3C-ZPW8YgYAp-iu6ocX_7Yw_CEoHIVPmGjOlQYHwYC_AzHz-ylyyxdk1dFg',\n  description: 'Binoculars',\n}, {\n  id: 3,\n  imgSrc: 'https://res.wx.qq.com/op_res/BctIVId6FBWoAwrQ6I0FrK3_9PJxusGs559eLA7Fa0xDR23BpoYarHJNH89kDhEtKNqXq98WhEksowUFkNLI2Q',\n  description: 'Beach ball',\n}\n]\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/share-element/list/index.js",
    "content": "// @ts-nocheck\nimport { supportWorklet } from '../../../common/worklet-api'\nimport { cardList } from '../data'\nimport CustomRouteType from '../../../common/custom-route/index'\nimport { showTips } from '../../../common/tips'\n\nPage({\n  data: {\n    cardList\n  },\n\n  onLoad() {\n    if (this.renderer !== 'skyline' || !supportWorklet()) {\n      showTips()\n    }\n  },\n\n  go(e) {\n    const { idx } = e.currentTarget.dataset\n    wx.navigateTo({\n      url: `/packageSkyline/pages/share-element/card/index?idx=${idx}`,\n      routeType: CustomRouteType.OpacityTransition,\n    })\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n    return {\n      title: '共享元素动画',\n      path: 'packageSkyline/pages/share-element/list/index'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/share-element/list/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"page-scroll\": \"/components/page-scroll/index\"\n  },\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/share-element/list/index.wxml",
    "content": "<!-- index.wxml -->\n<mp-navigation-bar title=\"共享元素动画\" back=\"{{true}}\"></mp-navigation-bar>\n<view class=\"card-list\">\n\t<view class=\"card-item\" wx:for=\"{{ cardList }}\" wx:key=\"{{ id }}\">\n\t\t<share-element key=\"{{ item.description }}\">\n\t\t\t<view class=\"img-wrp\" bind:tap=\"go\" data-idx=\"{{ index }}\">\n\t\t\t\t<image mode=\"aspectFit\" src=\"{{ item.imgSrc }}\"/>\n\t\t\t</view>\n\t\t</share-element>\n\t</view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/share-element/list/index.wxss",
    "content": ".card-list {\n  position: absolute;\n  padding: 32px;\n  bottom: 0;\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n}\n.card-item {\n  width: 64px;\n  height: 64px;\n}\nshare-element {\n  width: 100%;\n  height: 100%;\n}\n.img-wrp {\n  background-color: #a1cfec8b;\n  border-radius: 32px;\n  overflow: hidden;\n  height: 100%;\n  width: 100%;\n}\nimage {\n  width: 100%;\n  height: 100%;\n}\n/* image {\n  width: 100%;\n  height: 100%;\n} */\n\n\n/* # sourceMappingURL=index.wxss.map */"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/animation/index.js",
    "content": "import { worklet, supportWorklet } from '../../../common/worklet-api'\nimport { showTips } from '../../../common/tips'\n\nconst {\n  shared, repeat, sequence, spring, timing, Easing, cancelAnimation\n} = worklet\n\nconst app = getApp()\nconst windowWidth = app.globalData.windowWidth - 100\nPage({\n  data: {\n    list: ['Basic Move', 'Timing Move', 'Spring Animation', 'Repeat Animation', 'Sequence Animation' // 'Decay Animation',\n    ]\n  },\n  onLoad: function onLoad() {\n    const _this = this\n\n    if (this.renderer !== 'skyline' || !supportWorklet()) {\n      showTips()\n      return\n    }\n    const numsOfBox = this.data.list.length\n    const sharedValueArr = []\n\n    const _loop = function _loop(i) {\n      const translate = shared(0)\n      sharedValueArr.push(translate)\n\n      _this.applyAnimatedStyle('.box'.concat(i), function () {\n        'worklet'\n\n        return {\n          transform: 'translateX('.concat(translate.value, 'px)')\n        }\n      })\n    }\n\n    for (let i = 0; i < numsOfBox; i++) {\n      _loop(i)\n    }\n\n    this.sharedValueArr = sharedValueArr\n  },\n  startAnimation: function startAnimation() {\n    const toValue = this.toValue === windowWidth ? 0 : windowWidth\n    this.didBasic(0, toValue)\n    this.didTiming(1, toValue)\n    this.didSpring(2, toValue)\n    this.didRepeat(3, toValue)\n    this.didSequence(4, toValue)\n\n    this.toValue = toValue\n  },\n  cancelAnimation() {\n    for (const sv of this.sharedValueArr) {\n      cancelAnimation(sv)\n    }\n  },\n  didBasic: function didBasic(idx, toValue) {\n    this.sharedValueArr[idx].value = toValue\n  },\n  didTiming: function didTiming(idx, toValue) {\n    this.sharedValueArr[idx].value = timing(toValue, {\n      duration: 1500,\n      easing: Easing.linear\n    }, function () {\n      'worklet'\n\n      console.log('timing done')\n    })\n  },\n  didSpring: function didSpring(idx, toValue) {\n    this.sharedValueArr[idx].value = spring(toValue, {}, function () {\n      'worklet'\n\n      console.log('spring done')\n    })\n  },\n  didRepeat: function didRepeat(idx, toValue) {\n    this.sharedValueArr[idx].value = repeat(timing(toValue, {\n      duration: 400\n    }), 4, true, function () {\n      'worklet'\n\n      console.log('repeat done')\n    })\n  },\n  didSequence: function didSequence(idx) {\n    this.sharedValueArr[idx].value = sequence(timing(0, {\n      duration: 50\n    }), timing(300, {\n      duration: 400\n    }), timing(0, {\n      duration: 400\n    }), timing(300, {\n      duration: 400\n    }), timing(0, {\n      duration: 50\n    }))\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n    return {\n      title: 'worklet 动画',\n      path: 'packageSkyline/pages/worklet/animation/index'\n    }\n  },\n\n})\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/animation/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"page-scroll\": \"/components/page-scroll/index\"\n  },\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/animation/index.wxml",
    "content": "<mp-navigation-bar title=\"worklet 动画\" back=\"{{true}}\"></mp-navigation-bar>\n<page-scroll>\n\t<view>\n\t\t<view class=\"section-item page-section\" wx:for=\"{{list}}\">\n\t\t\t<view class=\"page-section-title\">{{item}}</view>\n\t\t\t<view class=\"box {{'box' + index}}\"/>\n\t\t</view>\n\t\t<view>\n\t\t\t<button type=\"primary\" bind:tap=\"startAnimation\">start animation</button>\n\t\t\t<button type=\"primary\" bind:tap=\"cancelAnimation\">cancel</button>\n\t\t</view>\n\t</view>\n</page-scroll>\n\n\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/animation/index.wxss",
    "content": ".section-item {\n  margin: 10px;\n}\n.title {\n  margin-bottom: 10px;\n  font-size: 20px;\n  font-weight: bold;\n}\n.action-area {\n  display: flex;\n  flex-direction: row;\n}\n.float-btn {\n  margin: 0 20px;\n  font-size: 20px;\n  border-radius: 8px;\n  padding: 6px 10px;\n  background-color: #5f9ea0;\n}\n.center {\n  flex-direction: row;\n  justify-content: center;\n  align-items: center;\n}\n.box {\n  width: 40px;\n  height: 40px;\n  border-radius: 4px;\n  background-color: #07c160;\n  /* margin: 10px 0; */\n}\n.action-item {\n  font-size: 20px;\n  text-align: center;\n  padding: 6px 10px;\n  margin: 0 20px;\n  border: 1px solid #ccc;\n}\n.mr20 {\n  margin: 10px;\n}\nbutton {\n  height: auto;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\n\n\n/* # sourceMappingURL=index.wxss.map */"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/bottom-sheet/index.js",
    "content": "import { GestureState } from '../../../common/types'\nimport { worklet, supportWorklet } from '../../../common/worklet-api'\nimport { showTips } from '../../../common/tips'\n\nconst { shared, timing } = worklet\n\nPage({\n  data: {\n    animation: null,\n    list: new Array(40).fill(1),\n  },\n  onLoad() {\n    if (this.renderer !== 'skyline' || !supportWorklet()) {\n      showTips()\n      return\n    }\n    const transY = shared(0)\n    this.applyAnimatedStyle('.list-wrp', () => {\n      'worklet'\n\n      return { transform: `translateY(${transY.value}px)` }\n    })\n    this.transY = transY\n    this.scrollTop = shared(0)\n    this.startPan = shared(false)\n  },\n  shouldPanResponse() {\n    'worklet'\n\n    return this.startPan.value\n  },\n  shouldScrollViewResponse(pointerEvent) {\n    'worklet'\n\n    if (this.transY.value > 0) return false\n    const scrollTop = this.scrollTop.value\n    const { deltaY } = pointerEvent\n    const result = !(scrollTop <= 0 && deltaY > 0)\n    this.startPan.value = !result\n    return result\n  },\n  handlePan(gestureEvent) {\n    'worklet'\n\n    if (gestureEvent.state === GestureState.ACTIVE) {\n      const curPosition = this.transY.value\n      const destination = Math.max(0, curPosition + gestureEvent.deltaY)\n      if (curPosition === destination) return\n      this.transY.value = destination\n    }\n\n    if (gestureEvent.state === GestureState.END || gestureEvent.state === GestureState.CANCELLED) {\n      this.transY.value = timing(0)\n      this.startPan.value = false\n    }\n  },\n  adjustDecelerationVelocity(velocity) {\n    'worklet'\n\n    const scrollTop = this.scrollTop.value\n    return scrollTop <= 0 ? 0 : velocity\n  },\n  handleScroll(evt) {\n    'worklet'\n\n    this.scrollTop.value = evt.detail.scrollTop\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n    return {\n      title: '手势协商',\n      path: 'packageSkyline/pages/worklet/bottom-sheet/index'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/bottom-sheet/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"page-scroll\": \"/components/page-scroll/index\"\n  },\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/bottom-sheet/index.wxml",
    "content": "<!-- index.wxml -->\n<mp-navigation-bar title=\"手势协商\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" type=\"list\" scroll-top=\"0\">\n\t<view class=\"page-container\">\n\t\t<view class=\"place-hodler-widget\"/>\n\t\t<pan-gesture-handler id=\"pan\" worklet:should-response-on-move=\"shouldPanResponse\" simultaneousHandlers=\"{{['scroll']}}\" worklet:ongesture=\"handlePan\">\n\t\t\t<vertical-drag-gesture-handler id=\"scroll\" native-view=\"scroll-view\" worklet:should-response-on-move=\"shouldScrollViewResponse\" simultaneousHandlers=\"{{['pan']}}\">\n\t\t\t\t<scroll-view class=\"list-wrp\" scroll-y bounces=\"{{false}}\" refresher-enabled=\"{{false}}\" worklet:adjust-deceleration-velocity=\"adjustDecelerationVelocity\" bindscroll=\"handleScroll\" type=\"list\">\n\t\t\t\t\t<view class=\"item\" wx:for=\"{{list}}\">\n\t\t\t\t\t\t<view class=\"avatar\"/>\n\t\t\t\t\t\t<view class=\"comment\"/>\n\t\t\t\t\t</view>\n\t\t\t\t</scroll-view>\n\t\t\t</vertical-drag-gesture-handler>\n\t\t</pan-gesture-handler>\n\t</view>\n</scroll-view>"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/bottom-sheet/index.wxss",
    "content": "@import \"/common/reset.wxss\";\n.page-container {\n  width: 100%;\n  height: 100%;\n  background: #ccc;\n  display: flex;\n  flex-direction: column;\n}\n.place-hodler-widget {\n  width: 100%;\n  height: 300px;\n}\n.list-wrp {\n  border-radius: 15px;\n  background: #fff;\n  width: 100%;\n  flex: 1;\n  padding-top: 20px;\n}\n.item {\n  width: 100%;\n  height: 60px;\n  padding: 10px 20px;\n  background: #fff;\n  flex-direction: row;\n  align-items: center;\n}\n.avatar {\n  width: 40px;\n  height: 40px;\n  margin-right: 15px;\n  border-radius: 50%;\n  background: #ccc;\n}\n.comment {\n  height: 40px;\n  flex-grow: 1;\n  background: #ccc;\n}\n\n\n\n/* # sourceMappingURL=index.wxss.map */"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/common.wxss",
    "content": ".section-item {\n  margin: 10px;\n}\n\n.title {\n  margin-bottom: 10px;\n  font-size: 20px;\n  font-weight: bold;\n}\n\n.action-area {\n  display: flex;\n  flex-direction: row;\n}\n\n.float-btn {\n  margin: 0 20px;\n  font-size: 20px;\n  border-radius: 8px;\n  padding: 6px 10px;\n  background-color: #5f9ea0;\n}\n\n.center {\n  flex-direction: row;\n  justify-content: center;\n  align-items: center;\n}\n\n.box {\n  width: 50px;\n  height: 50px;\n  border-radius: 8px;\n  background-color: #adff2f;\n  margin: 10px 0;\n}\n\n.action-item {\n  font-size: 20px;\n  text-align: center;\n  padding: 6px 10px;\n  margin: 0 20px;\n  border: 1px solid #ccc;\n}"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/gesture/index.js",
    "content": "import { GestureState } from '../../../common/types'\nimport { worklet, supportWorklet } from '../../../common/worklet-api'\nimport { showTips } from '../../../common/tips'\n\nconst { shared, derived, spring } = worklet\n\nPage({\n  data: {},\n\n  onLoad() {\n    if (this.renderer !== 'skyline' || !supportWorklet()) {\n      showTips()\n      return\n    }\n    const x = shared(0)\n    const y = shared(0)\n    const pressed = shared(false)\n    const scale = derived(() => spring(pressed.value ? 1.2 : 1))\n    this.applyAnimatedStyle('.circle', () => {\n      'worklet'\n\n      return {\n        backgroundColor: pressed.value ? '#5f9ea0' : '#adff2f',\n        transform: `translate(${x.value}px, ${y.value}px) scale(${scale.value})`,\n      }\n    })\n\n    this.x = x\n    this.y = y\n    this.pressed = pressed\n  },\n\n  handlepan(gestureEvent) {\n    'worklet'\n\n    console.log('gestureEvent--------------', gestureEvent.state)\n    if (gestureEvent.state === GestureState.POSSIBLE) {\n      this.pressed.value = true\n    } else if (gestureEvent.state === GestureState.END || gestureEvent.state === GestureState.CANCELLED) {\n      this.pressed.value = false\n      this.x.value = spring(0)\n      this.y.value = spring(0)\n    } else if (gestureEvent.state === GestureState.ACTIVE) {\n      this.x.value += gestureEvent.deltaX\n      this.y.value += gestureEvent.deltaY\n    }\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage() {\n    return {\n      title: '手势系统',\n      path: 'packageSkyline/pages/worklet/gesture/index'\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/gesture/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"page-scroll\": \"/components/page-scroll/index\"\n  },\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/gesture/index.wxml",
    "content": "<mp-navigation-bar title=\"手势系统\" back=\"{{true}}\"></mp-navigation-bar>\n<view class=\"section-item\">\n\t<pan-gesture-handler worklet:ongesture=\"handlepan\">\n\t\t<view class=\"circle\"/>\n\t</pan-gesture-handler>\n  <view class=\"title\">拖动小球</view>\n</view>\n\n\n"
  },
  {
    "path": "miniprogram/packageSkyline/pages/worklet/gesture/index.wxss",
    "content": ".section-item {\n  margin: 10px;\n  position: initial;\n}\n.title {\n  margin-bottom: 10px;\n  font-size: 20px;\n  font-weight: bold;\n  text-align: center;\n}\n.action-area {\n  display: flex;\n  flex-direction: row;\n}\n.float-btn {\n  margin: 0 20px;\n  font-size: 20px;\n  border-radius: 8px;\n  padding: 6px 10px;\n  background-color: #5f9ea0;\n}\n.center {\n  flex-direction: row;\n  justify-content: center;\n  align-items: center;\n}\n.box {\n  width: 40px;\n  height: 40px;\n  border-radius: 4px;\n  background-color: #07c160;\n  /* margin: 10px 0; */\n}\n.action-item {\n  font-size: 20px;\n  text-align: center;\n  padding: 6px 10px;\n  margin: 0 20px;\n  border: 1px solid #ccc;\n}\n.circle {\n  width: 100px;\n  height: 100px;\n  border-radius: 50px;\n  background-color: #07c160;\n  margin-left: calc(50vw - 50px);\n}\n\n\n\n/* # sourceMappingURL=index.wxss.map */"
  },
  {
    "path": "miniprogram/packageSkyline/utils/comment.js",
    "content": "// 获取留言列表\nexport function getCommentList() {\n  return [\n    {\n      comment: '为了进一步优化小程序性能，提供更为接近原生的用户体验，我们在 WebView 渲染之外新增了一个渲染引擎 Skyline，其使用更精简高效的渲染管线，并带来诸多增强特性，让 Skyline 拥有更接近原生渲染的性能体验。',\n      userName: 'binnie',\n      userHeadImg: 'http://wx.qlogo.cn/mmhead/uI5pczeERTajXl904XSbHwAtGENC5ccKvo2F54sgYeqibHxOXNAFKdg/132',\n      subCommentList: [\n        {\n          comment: '界面更不容易被逻辑阻塞，进一步减少卡顿。',\n          userName: '拖拉机🚜',\n          userHeadImg: 'https://res.wx.qq.com/op_res/0AG3_hOKnGAqBhAhBx_a__0nu3Q_hGgnBQgiQhJMqZrvroKqdtYXhcSUdlp59bXjx7qF-ddTwGCcB-AqzYmlrw',\n          replyUserName: 'binnie'\n        },\n        {\n          comment: '无需为每个页面新建一个 JS 引擎实例（WebView），减少了内存、时间开销。',\n          userName: 'binnie',\n          userHeadImg: 'http://wx.qlogo.cn/mmhead/uI5pczeERTajXl904XSbHwAtGENC5ccKvo2F54sgYeqibHxOXNAFKdg/132',\n          replyUserName: '拖拉机🚜',\n        },\n        {\n          comment: '框架可以在页面之间共享更多的资源，进一步减少运行时内存、时间开销。',\n          userName: '拖拉机🚜',\n          userHeadImg: 'https://res.wx.qq.com/op_res/0AG3_hOKnGAqBhAhBx_a__0nu3Q_hGgnBQgiQhJMqZrvroKqdtYXhcSUdlp59bXjx7qF-ddTwGCcB-AqzYmlrw',\n          replyUserName: 'binnie'\n        },\n        {\n          comment: '框架的代码之间无需再通过 JSBridge 进行数据交换，减少了大量通信时间开销。',\n          userName: 'binnie',\n          userHeadImg: 'http://wx.qlogo.cn/mmhead/uI5pczeERTajXl904XSbHwAtGENC5ccKvo2F54sgYeqibHxOXNAFKdg/132',\n          replyUserName: '拖拉机🚜',\n        }\n      ]\n    },\n    {\n      comment: 'Skyline 以性能为首要目标，因此特性上在满足基本需求的前提下进行了大幅精简，目前 Skyline 只实现了 CSS 特性的子集。在编码上，Skyline 与 WebView 模式保持一致，仍使用 WXML 和 WXSS 编写界面。在不采用 Skyline 新增特性的情况下，适配了 Skyline 的小程序在低版本或未支持 Skyline 的平台上可无缝自动退回到 WebView 渲染。',\n      userName: '拖拉机🚜',\n      userHeadImg: 'https://res.wx.qq.com/op_res/0AG3_hOKnGAqBhAhBx_a__0nu3Q_hGgnBQgiQhJMqZrvroKqdtYXhcSUdlp59bXjx7qF-ddTwGCcB-AqzYmlrw',\n      subCommentList: [\n        {\n          comment: '基于 Worklet 机制的 动画模块，能够在渲染线程同步运行动画相关逻辑。',\n          userName: '拖拉机🚜',\n          userHeadImg: 'https://res.wx.qq.com/op_res/0AG3_hOKnGAqBhAhBx_a__0nu3Q_hGgnBQgiQhJMqZrvroKqdtYXhcSUdlp59bXjx7qF-ddTwGCcB-AqzYmlrw',\n          replyUserName: 'binnie'\n        },\n        {\n          comment: '基于 Worklet 机制的 手势系统。在渲染线程同步监听手势、执行手势相关逻辑；支持手势协商处理；',\n          userName: '小苹果🍎',\n          userHeadImg: 'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJBAK7KJg9KId_6N1-rJ4OyCCQoJGVMOaTabboo2viRucoxkPvHRkn2fVl6tectlzBg',\n          replyUserName: 'binnie'\n        },\n        {\n          comment: '基于 Worklet 机制的 自定义路由模块，支持实现自定义路由动画和交互。',\n          userName: '流星雨',\n          userHeadImg: 'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYf3q0W302-kseD8VxLKoItZ6HgneLkgpQSEMIgEKz_xVE7putZxs2YEYqB13Uh37_w',\n          replyUserName: 'binnie'\n        },\n        {\n          comment: '支持 跨页面共享元素，能够将上一个页面的元素“共享”到下一个页面，并伴随着过渡动画。',\n          userName: '落日余晖',\n          userHeadImg: 'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYYjda9Dp372N3T05q_nn3PgvoXBoReXvaXBfkthtXQLN7m5_YI6FoTre-xvJBDFLMA',\n          replyUserName: 'binnie'\n        },\n      ]\n    },\n    {\n      comment: 'Skyline 能很好地保持和原有架构的兼容性，基于 WebView 环境的小程序代码基本上无需任何改动即可直接在新的架构下运行。',\n      userName: '小苹果🍎',\n      userHeadImg: 'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJBAK7KJg9KId_6N1-rJ4OyCCQoJGVMOaTabboo2viRucoxkPvHRkn2fVl6tectlzBg',\n      subCommentList: []\n    },\n    {\n      comment: 'Skyline 支持了一些 Web 所缺失的但很重要的能力，以满足开发者实现更好的交互体验。',\n      userName: 'binnie',\n      userHeadImg: 'http://wx.qlogo.cn/mmhead/uI5pczeERTajXl904XSbHwAtGENC5ccKvo2F54sgYeqibHxOXNAFKdg/132',\n      subCommentList: [\n\n      ]\n    },\n    {\n      comment: 'worklet 动画可以做到类原生动画般的体验。',\n      userName: '流星雨',\n      userHeadImg: 'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYf3q0W302-kseD8VxLKoItZ6HgneLkgpQSEMIgEKz_xVE7putZxs2YEYqB13Uh37_w',\n      subCommentList: [\n        {\n          comment: '提供如 timing、spring 等常见动画方式的封装方法，开发者可自定义动画曲线，同时可对不同的动画类型进行组合、重复，形成交织动画。😄',\n          userName: 'binnie',\n          userHeadImg: 'http://wx.qlogo.cn/mmhead/uI5pczeERTajXl904XSbHwAtGENC5ccKvo2F54sgYeqibHxOXNAFKdg/132',\n          replyUserName: '流星雨'\n        }\n      ]\n    },\n    {\n      comment: 'Skyline 中 wxs 代码运行在 AppService 线程，而事件产生在 UI 线程，因此 wxs 动画 性能有所降低，为了提升小程序交互体验的效果，我们内置了一批手势组件。',\n      userName: '落日余晖',\n      userHeadImg: 'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYYjda9Dp372N3T05q_nn3PgvoXBoReXvaXBfkthtXQLN7m5_YI6FoTre-xvJBDFLMA',\n      subCommentList: [\n        {\n          comment: '免去开发者监听 touch 事件，自行计算手势逻辑的复杂步骤；',\n          userName: 'binnie',\n          userHeadImg: 'http://wx.qlogo.cn/mmhead/uI5pczeERTajXl904XSbHwAtGENC5ccKvo2F54sgYeqibHxOXNAFKdg/132',\n          replyUserName: '落日余晖'\n        },\n        {\n          comment: '手势组件直接在 UI 线程响应，避免了传递到 JS 线程带来的延迟；',\n          userName: '落日余晖',\n          userHeadImg: 'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYYjda9Dp372N3T05q_nn3PgvoXBoReXvaXBfkthtXQLN7m5_YI6FoTre-xvJBDFLMA',\n          replyUserName: 'binnie'\n        }\n      ]\n    },\n    {\n      comment: '在连续的 Skyline 页面间跳转时，可实现自定义路由效果，路由动画的曲线、时长均可交由开发者控制。',\n      userName: 'binnie',\n      userHeadImg: 'http://wx.qlogo.cn/mmhead/uI5pczeERTajXl904XSbHwAtGENC5ccKvo2F54sgYeqibHxOXNAFKdg/132',\n      subCommentList: []\n    },\n    {\n      comment: '在连续的两个 Skyline 页面跳转时，可以将上一个页面的元素“共享”到下一个页面，并伴随着过渡动画。',\n      userName: '绿意盎然',\n      userHeadImg: 'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJH2f0R4uXyqnNGlrivO8cKbn0nz1DE_6s22rc91zluwIrqiAVZNREvCeVYAUS8aaZw',\n      subCommentList: []\n    },\n  ]\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/utils/constant.js",
    "content": "export const PREVIEWER_GESTURE_STATE = {\n  Init: 0, // 初始\n  Moving: 1, // 移动图片\n  Toggle: 2, // 切换图片\n  Back: 3, // 退出页面\n}\n\nexport const THUMBNAIL_CNT_HEIGHT = 80\n"
  },
  {
    "path": "miniprogram/packageSkyline/utils/event-bus.js",
    "content": "const map = {}\n\nfunction on(eventName, handler) {\n  map[eventName] = map[eventName] || []\n  map[eventName].push(handler)\n}\n\nfunction off(eventName, handler) {\n  const handlerList = map[eventName]\n  if (!handlerList || !handlerList.length) return\n\n  const index = handlerList.indexOf(handler)\n  if (index !== -1) handlerList.splice(index, 1)\n}\n\nfunction emit(eventName, ...args) {\n  const handlerList = map[eventName]\n  if (!handlerList || !handlerList.length) return\n\n  for (let i = handlerList.length - 1; i >= 0; i--) {\n    handlerList[i](...args)\n  }\n}\n\nexport default {\n  on,\n  off,\n  emit,\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/utils/route.js",
    "content": "const fastOutSlowIn = wx.worklet.Easing.bezier(0.4, 0.0, 0.2, 1.0).factory()\n\nexport function initRoute() {\n  wx.router.addRouteBuilder('fadeToggle', ({ primaryAnimation }) => {\n    const handlePrimaryAnimation = () => {\n      'worklet'\n\n      return {\n        opacity: fastOutSlowIn(primaryAnimation.value),\n      }\n    }\n\n    return {\n      opaque: false,\n      handlePrimaryAnimation,\n      transitionDuration: 300,\n      reverseTransitionDuration: 300,\n      canTransitionTo: false,\n      canTransitionFrom: false,\n    }\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageSkyline/utils/tool.js",
    "content": "const imageList = []\nexport function getAlbum() {\n  if (!imageList.length) {\n    const srcList = [\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYcv7mQABQVg50gh51-Kb1mlBq0c8Difu3rXn0ldrZdZwVx9REPbKVyZb3E9Wq6YFLA',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYVtRBEXZ74JLECYN4Hc3Cdml3x7cJcbcBj3sIdYb2L_7DJ14X8TAHiZ7Ydct52WIYA',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYfaqohk6ndcC6_CBkUZszfSpKbqUAV7S2xWRbAQ459YsPWAmLKkicEOPS1L3NmnnRA',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYYa7k4CAG71Ci0SRPExPB1sGiiVPcYwSD5CAYgq8Ni2RhGQlqIrIwnBlt90mUzL7Lg',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYYjda9Dp372N3T05q_nn3PgvoXBoReXvaXBfkthtXQLN7m5_YI6FoTre-xvJBDFLMA',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYTIqRBCdQgzZm3KO3usZT7zM2O0EoylisontlH4TZAC_qfVjFVU4L4CPjLm0mppQwg',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYfa6mRnywhNbBFV5eAt7oTz3zjlNJeujfQx0PVA1ufenPHBvxYXRNJ5chyi6RPaE7A',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYYY1OalScOn4EMcQpkPaJ1Sxhri8CScjnhqVfjAZnLuVFl0JAM4VziHhSzHLZXtAaQ',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYSPfXw5qxNvP3f5uJhy0kdkaTAbIZ187IFWmBiluEs8Puw0tXgBlBgGKN-irLPOIDw',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYZB1p48LLH-Pc7Rzr4nN0YF-uZg7FW7zksw_Kjp0BNDHcZp9R9SRKbg0rA1HBaeK3Q',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYYXMoGlbo8DkSiia6d-_3Dv15DjMGCEhBkPYd5BrNkSUTPtomAm0CVeHgC244sapKw',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYf3q0W302-kseD8VxLKoItZ6HgneLkgpQSEMIgEKz_xVE7putZxs2YEYqB13Uh37_w',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYRu0VRyVvePJ4pB4_Dvj0ytF-ovjQzMl6WMLyuCeKk3579HNjKLIeNrHE7OprTBx5w',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYc-vygvNNpz1fcZZjZ6B0Jm0X2dpOWJBn4u4T15gwL-1Qr70v6fkFgUswldiPhQG0Q',\n      'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYUo-SgGpk2gpFNixuaCMxDadRvvWxqC5jc1ma-oobJf4mWVg3F3iRt1Bkv-sR0l3-Q',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJCk-lm-hNrvdJ9paSPqTXkCKLE6eIuc6zAs3Lr1Qh6jEMxdfgP_rvTftB0SQiZeQNQ',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJImpE8Sm-oMoeJizjFr8mxotXQSFlSm8ZUD6GLf_ptM5ozLvnc2eczwSN09Y5M0ovg',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJBAK7KJg9KId_6N1-rJ4OyCCQoJGVMOaTabboo2viRucoxkPvHRkn2fVl6tectlzBg',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJGVi_kGQppwXClflw43wtANVzuw0_Y8ij9VzW1O8hr6cR195D87X7zQS_1gjRo8IdQ',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJHhlMVj_svRRdDMHjtAvwGwU2d_VAJ-y3SigDx2XjjA22Y63oStS-fw5gooV5rX42Q',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJPRaN5CDI6NZFg_qbSxeqF8UBpM4lXJ_1o9S9bsOOxMpuXGLeKyAKleWlAXmVLmQOw',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJMQYuLq5q6_CWdtW3RnWbYMaNhzew60nGsQfBtyeogj3vRfGimJBi87ThS577HC6ag',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJBalQKoYXBze_mRhoUHIh5OfHiR95JEa18ob-y7uu8W1gpOjO87BbOcki3xM_RrO1Q',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJAqHss14EPHStg3OpHjtIYzOGQgxvsDcACMxQc2waTpAMsJBFxVlp1JkZQJy2gXu3g',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJH2f0R4uXyqnNGlrivO8cKbn0nz1DE_6s22rc91zluwIrqiAVZNREvCeVYAUS8aaZw',\n    ]\n    const thumbnailList = [\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJDaOeA5r3yDpl5AjlRxMmKPaX0WbJIRr0PjZzsfxIGq1n5Q0o65EpxFGpGpbT9e8QQ',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJACGFAh31lY9OxoD1iSXsyYpk2adWITN6b7gT7RcBEeDXhppBLYI3JhSMJDyIvPrcg',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJJX5J79IIhayRchEZTln15RdpFkFfsqsvng5dqMa12Vm9rmcT-hhw1alfHvxTXVVRw',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJApluxMePb-2yj-XeDSDlr-pNZnbKpaNwl4BUXyZ0bKXWMcqKQSGDdOWFPOP08-4Sw',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJI8Xazme5-MIIJYUg9t2ibxTp-PtGPUXes9XZj8rRIfyhZJgyfejqwzwpSDBh-K5eg',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJHOt1gRAQQbf2Bx8mJoYj_8hoN17WusJ_kEzxqYbkN6X1dRjDMdp0gS9jJf-VAezfg',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJNLlVMP9qArsQkkz294mrVFbI2pxwKxf0I1F8S86W4zZ8bcpuDv4xIWioikrD-85Dw',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJOY6-yX_tVBt6ZC4ffTUqdnMXaCEKf0mYb8ebfl0l-VUKHzayRrbipPLqsynrTN0FA',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJMgKiLq4XOYd9BtY9HCvD4BvuYDo9ro9XBb3_fQk90z8odHLs4eYvoHwkyKaM3ztZA',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJH3eO7DeTKRV0Ys2vZ2aqUom-xWvymxzS3uiu06syi2vlj8hzWyIK1_inNHTVkuWPw',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJA7-uaVSCPgd7Q32x1_vmHrDLaretZxRboZv2wZiNBkRdgihEvRhcWRHrm0vBUggzw',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJBUmVY1MDz1vsXTJlQCPd-fHF8AsVCi6yVK4BxhjBXs085BQZaI6LoWW4GfnqMRqbg',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJKh4kMbGYKCPnBu-ZWsQnn3NEFKDEN0DgdKH_R9v8Snkp-cfiU8dZd_abw5QcyiWBQ',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJKPDdtcGoJzhB8HdWlDtWaxeIOvdYSmQoihkYQPrHDoGr2PJD31RPzqcz5u8b3rpoQ',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJFryDUHWInyL4LeRP6y_wIUpf7kQSfrcGPcGeZbLuOtan8ml9SbJ1k0Qdgelf6iEBg',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJE1YvpBMZCjoKqX1Sy1xqlqntchR2vwtu82wt0XLsCMUtsJ0x2K5fFvEiaouWbViFg',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJIJE5jTu_BNqZ_LR4E82Kj6hBC7UlZ1BDeqhJEKDtQ-vTzpwv8m3Rj16kJtE2dSBAg',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJBi8YFt3WToEbW0L6-BmqV4_HjXOvB0Z5IJ3GLVtBj8hcRP_O4mf9Ia6T8ITbfkKBw',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJFIvGogPbbDumfRVNxlgPRqYwmSTuhsE2OyzcnJXRc49-6SanEHKsiPM-vIlUlGOFQ',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJNt8AklXWChR3D1545zHosDzkcT6gNUv9UwevKbgsGE6_Skgr9Et86OA8tw3PgW0ew',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJMNA5xeVo8u0lFyyFwLvexHmQTRi_oaiYuS6wCrZHm3931x3KbVeeLJv8hI2YvL1yQ',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJD3V9rkvi7OQ852nZavb3k2sdVOl_JEjqRbhYBhgPPqhgaIkawklFj-4w5oQ9BR1xg',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJDLPwxnddCKwDrDOjA9lWQkB1_2KcFc9L48-AjNV7lMTDV7EvpwWRy3aLVmvXmmi-w',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJNMTtzowAlaXSt-ZZajhbZeYcZj9njs9Czy2iRLoh6m-PrGRaCb7koaoeVzHvMwrFg',\n      'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJMQV_yLC-b3ewPS_sYPnmdwvIlB-IlyEjoyVtv13rE7Qulx6GR2H-p5JIIZNDWXg6Q',\n    ]\n    const now = Date.now()\n    srcList.forEach((src, index) => {\n      const id = (now + index).toString()\n      imageList.push({\n        id,\n        src,\n        thumbnail: thumbnailList[index],\n        createTime: now - (index * 3600 * 1000)\n      })\n    })\n  }\n\n  return imageList\n}\n\nlet rectInfo = null\nexport function getRectInfo() {\n  if (!rectInfo) {\n    const {\n      safeArea, screenWidth, screenHeight, windowWidth, windowHeight\n    } = wx.getSystemInfoSync()\n    const menuButtomRect = wx.getMenuButtonBoundingClientRect()\n\n    rectInfo = {\n      safeArea,\n      statusBarHeight: safeArea.top,\n      navigationBarHeight: menuButtomRect.height + ((menuButtomRect.top - safeArea.top) * 2),\n      safeAreaInsetBottom: screenHeight - safeArea.bottom,\n      windowWidth,\n      windowHeight,\n      screenWidth,\n      screenHeight,\n    }\n  }\n\n  return rectInfo\n}\n\nexport function timeFormat(date, reg) {\n  date = date instanceof Date ? date : new Date(date)\n  const map = {}\n  map.yyyy = date.getFullYear()\n  map.yy = ('' + map.yyyy).substr(2)\n  map.M = date.getMonth() + 1\n  map.MM = (map.M < 10 ? '0' : '') + map.M\n  map.d = date.getDate()\n  map.dd = (map.d < 10 ? '0' : '') + map.d\n  map.H = date.getHours()\n  map.HH = (map.H < 10 ? '0' : '') + map.H\n  map.m = date.getMinutes()\n  map.mm = (map.m < 10 ? '0' : '') + map.m\n  map.s = date.getSeconds()\n  map.ss = (map.s < 10 ? '0' : '') + map.s\n\n  return reg.replace(/\\byyyy|yy|MM|M|dd|d|HH|H|mm|m|ss|s\\b/g, $1 => map[$1])\n}\n\nexport function getShowTime(timeStamp) {\n  const date = new Date(timeStamp)\n  const nextDate = new Date(date.getTime() + (24 * 60 * 60 * 1000))\n  const now = new Date()\n\n  if (date.getFullYear() !== now.getFullYear()) {\n    return timeFormat(date, 'yyyy-MM-dd HH:mm')\n  } else if (date.getMonth() === now.getMonth() && date.getDate() === now.getDate()) {\n    return timeFormat(date, '今天 HH:mm')\n  } else if (nextDate.getMonth() === now.getMonth() && nextDate.getDate() === now.getDate()) {\n    return timeFormat(date, '昨天 HH:mm')\n  } else {\n    return timeFormat(date, 'MM-dd HH:mm')\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/example-card/index.js",
    "content": "// components/example-card/index.js\nComponent({\n\n  /**\n   * Component properties\n   */\n  properties: {\n\n  },\n\n  /**\n   * Component initial data\n   */\n  data: {\n\n  },\n\n  /**\n   * Component methods\n   */\n  methods: {\n\n  }\n})"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/example-card/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/example-card/index.wxml",
    "content": "<view class=\"container\">\n  <view class=\"img-wrap center\">\n    <image mode=\"aspectFit\" class=\"img\" src=\"/assets/play.png\"></image>\n  </view>\n\n  <view class=\"intro\">\n    <view class=\"title\">Title</view>\n    <view class=\"sub-title\">Secondary text</view>\n    <view class=\"content\">\n      Lorem ipsum dolor sit amet, consectetur \n      adipiscing elit, sed do eiusmod tempor.\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/example-card/index.wxss",
    "content": "/* components/example-card/index.wxss */\n.container {\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  height: 300px;\n  border-radius: 4px;\n  overflow: hidden;\n  box-shadow: 0px 1px 2px 1px #E3E8E5;\n}\n\n.img-wrap {\n  flex: 1;\n  width: 100%;\n  box-sizing: border-box;\n  background-color: rgba(0, 0, 0, 0.38);\n}\n\n.center {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.intro {\n  color: rgba(0, 0, 0, 0.54);\n  font-size: 14px;\n  padding: 16px;\n  font-style: italic;\n}\n\n.title {\n  color: #000;\n  font-size: 20px;\n}\n\n.img {\n  width: 100px;\n  height: 100px;\n}\n\n.content {\n  margin-top: 16px;\n  width: 100%;\n  color: rgba(0, 0, 0, 0.54);\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/example-single-title/index.js",
    "content": "// components/example-card/index.js\nComponent({\n\n  /**\n   * Component properties\n   */\n  properties: {\n\n  },\n\n  /**\n   * Component initial data\n   */\n  data: {\n\n  },\n\n  /**\n   * Component methods\n   */\n  methods: {\n\n  }\n})"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/example-single-title/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/example-single-title/index.wxml",
    "content": "<view class=\"container\">\n  <view class=\"img-wrap center\">\n    <image mode=\"aspectFit\" class=\"img\" src=\"/assets/play.png\"></image>\n  </view>\n\n  <view class=\"intro\">\n    <view class=\"title\">Title</view>\n    <view class=\"content\">\n      Lorem ipsum dolor sit, consectetur adipiscing elit\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/example-single-title/index.wxss",
    "content": "/* components/example-card/index.wxss */\n.container {\n  display: flex;\n  flex-direction: row;\n  height: 100px;\n  border-radius: 4px;\n  overflow: hidden;\n  box-shadow: 0px 1px 2px 1px #E3E8E5;\n}\n\n.img-wrap {\n  width: 100px;\n  height: 100px;\n  box-sizing: border-box;\n  background-color: rgba(0, 0, 0, 0.38);\n}\n\n.img {\n  width: 60px;\n  height: 60px;\n}\n\n.center {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.intro {\n  flex: 1;\n  color: rgba(0, 0, 0, 0.54);\n  font-size: 14px;\n  font-style: italic;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  padding:0 20px;\n}\n\n.title {\n  color: #000;\n  font-size: 20px;\n}\n\n.content {\n  margin-top: 16px;\n  width: 100%;\n  color: rgba(0, 0, 0, 0.54);\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/float-action-button/index.js",
    "content": "// components/float-action-button/index.js\nComponent({\n\n  /**\n   * Component properties\n   */\n  properties: {\n\n  },\n\n  options: {\n    virtualHost: true\n  },\n\n  /**\n   * Component initial data\n   */\n  data: {\n\n  },\n\n  /**\n   * Component methods\n   */\n  methods: {\n\n  }\n})"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/float-action-button/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/float-action-button/index.wxml",
    "content": "<!--components/float-action-button/index.wxml-->\n<view class=\"float-button\">\n  +\n</view>"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/float-action-button/index.wxss",
    "content": "/* components/float-action-button/index.wxss */\n.float-button {\n  width: 56px;\n  height: 56px;\n  border-radius: 50%;\n  background-color: plum;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 24px;\n  position: absolute;\n  right: 20px;\n  bottom: 60px;\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/small-card/index.js",
    "content": "// components/example-card/index.js\nComponent({\n\n  /**\n   * Component properties\n   */\n  properties: {\n\n  },\n\n  /**\n   * Component initial data\n   */\n  data: {\n\n  },\n\n  /**\n   * Component methods\n   */\n  methods: {\n\n  }\n})"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/small-card/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/small-card/index.wxml",
    "content": "<view class=\"container\">\n  <view class=\"img-wrap center\">\n    <image mode=\"aspectFit\" class=\"img\" src=\"/assets/play.png\"></image>\n  </view>\n\n  <view class=\"intro\">\n    <view class=\"title\">Title</view>\n    <view class=\"sub-title\">Secondary</view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/small-card/index.wxss",
    "content": "/* components/example-card/index.wxss */\n.container {\n  display: flex;\n  flex-direction: column;\n  height: 225px;\n  border-radius: 4px;\n  overflow: hidden;\n  box-shadow: 0px 1px 2px 1px #E3E8E5;\n}\n\n.img-wrap {\n  height: 150px;\n  width: 100%;\n  box-sizing: border-box;\n  background-color: rgba(0, 0, 0, 0.38);\n}\n\n.center {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.intro {\n  color: rgba(0, 0, 0, 0.54);\n  font-size: 14px;\n  padding: 10px;\n  font-style: italic;\n}\n\n.title {\n  color: #000;\n  font-size: 20px;\n}\n\n.sub-title {\n  margin-top: 4px;\n}\n\n.img {\n  width: 80px;\n  height: 80px;\n}\n\n.content {\n  margin-top: 16px;\n  width: 100%;\n  color: rgba(0, 0, 0, 0.54);\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/swipe-back/index.js",
    "content": "// components/swiper-back/index.js\nimport {\n  GestureState,\n  lerp,\n  clamp,\n  Curves,\n} from '../../custom-route/util'\n\nconst {\n  timing,\n} = wx.worklet\n\nconst {\n  screenWidth\n} = wx.getSystemInfoSync()\n\nComponent({\n  options: {\n    virtualHost: true\n  },\n  /**\n     * 组件的属性列表\n     */\n  properties: {\n\n  },\n\n  /**\n     * 组件的初始数据\n     */\n  data: {\n    isHomePage: false\n  },\n\n  lifetimes: {\n    attached() {\n      const pageStack = getCurrentPages()\n      if (pageStack.length === 1) {\n        this.setData({\n          isHomePage: true\n        })\n      }\n      this.customRouteContext = wx.router.getRouteContext(this) || {}\n    }\n  },\n\n  /**\n     * 组件的方法列表\n     */\n  methods: {\n    handleDragStart() {\n      'worklet'\n\n      const {\n        startUserGesture\n      } = this.customRouteContext\n      startUserGesture()\n    },\n\n    handleDragUpdate(delta) {\n      'worklet'\n\n      const {\n        primaryAnimation\n      } = this.customRouteContext\n      const newVal = primaryAnimation.value - delta\n      primaryAnimation.value = clamp(newVal, 0.0, 1.0)\n    },\n\n    handleDragEnd(velocity) {\n      'worklet'\n\n      const {\n        primaryAnimation,\n        stopUserGesture,\n        didPop\n      } = this.customRouteContext\n\n      let animateForward = false\n      if (Math.abs(velocity) >= 1.0) {\n        animateForward = velocity <= 0\n      } else {\n        animateForward = primaryAnimation.value > 0.5\n      }\n      const t = primaryAnimation.value\n      const animationCurve = Curves.fastLinearToSlowEaseIn\n      if (animateForward) {\n        const droppedPageForwardAnimationTime = Math.min(\n          Math.floor(lerp(300, 0, t)),\n          300,\n        )\n        primaryAnimation.value = timing(\n          1.0,\n          {\n            duration: droppedPageForwardAnimationTime,\n            easing: animationCurve,\n          },\n          () => {\n            'worklet'\n\n            stopUserGesture()\n          },\n        )\n      } else {\n        const droppedPageBackAnimationTime = Math.floor(lerp(0, 300, t))\n        primaryAnimation.value = timing(\n          0.0,\n          {\n            duration: droppedPageBackAnimationTime,\n            easing: animationCurve,\n          },\n          () => {\n            'worklet'\n\n            stopUserGesture()\n            didPop()\n          },\n        )\n      }\n    },\n\n    onSwipeBack(evt) {\n      'worklet'\n\n      if (evt.state === GestureState.BEGIN) {\n        this.handleDragStart()\n      } else if (evt.state === GestureState.ACTIVE) {\n        const delta = evt.deltaX / screenWidth\n        this.handleDragUpdate(delta)\n      } else if (evt.state === GestureState.END) {\n        const velocity = evt.velocityX / screenWidth\n        this.handleDragEnd(velocity)\n      } else if (evt.state === GestureState.CANCELLED) {\n        this.handleDragEnd(0.0)\n      }\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/swipe-back/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/swipe-back/index.wxml",
    "content": "<!-- components/swiper-back/index.wxml -->\n<horizontal-drag-gesture-handler wx:if=\"{{!isHomePage}}\" onGestureEvent=\"onSwipeBack\">\n  <view class=\"gesture-back-area\"></view>\n</horizontal-drag-gesture-handler>"
  },
  {
    "path": "miniprogram/packageSkylineRouter/components/swipe-back/index.wxss",
    "content": "/* components/swiper-back/index.wxss */\n.gesture-back-area {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 30px;\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/custom-route/bottom-sheet.js",
    "content": "import {\n  CurveAnimation,\n  Curves,\n  Colors\n} from './util'\n\nconst BottomSheet = (customRouteContext) => {\n  const {\n    primaryAnimation,\n    primaryAnimationStatus,\n    userGestureInProgress,\n  } = customRouteContext\n\n  const _curvePrimaryAnimation = CurveAnimation({\n    animation: primaryAnimation,\n    animationStatus: primaryAnimationStatus,\n    curve: Curves.linearToEaseOut,\n    reverseCurve: Curves.easeInToLinear\n  })\n\n  const handlePrimaryAnimation = () => {\n    'worklet'\n    let t = primaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n\n    const topRadius = 12\n    \n    return {\n      overflow: 'hidden',\n      borderRadius: `${topRadius}px ${topRadius}px 0px 0px`,\n      marginTop: '40vh',\n      transform: `translateY(${(1 - t) * 100}%)`,\n    }\n  }\n\n  const handlePreviousPageAnimation = () => {\n    'worklet'\n    return {}\n  }\n\n  return {\n    opaque: false,\n    barrierColor: Colors.black87,\n    barrierDismissible: true,\n    transitionDuration: 400,\n    reverseTransitionDuration: 400,\n    fullscreenDrag: true,\n    handlePrimaryAnimation,\n    handlePreviousPageAnimation\n  }\n}\n\nexport default BottomSheet"
  },
  {
    "path": "miniprogram/packageSkylineRouter/custom-route/cupertino-modal-inside.js",
    "content": "import {\n  CurveAnimation,\n  Curves,\n} from './util'\n\nconst CupertinoModalInside = (customRouteContext) => {\n  const menuRect = wx.getMenuButtonBoundingClientRect()\n\n  const {\n    primaryAnimation,\n    primaryAnimationStatus,\n    userGestureInProgress,\n  } = customRouteContext\n\n  const topRadius = 12\n  const offsetToMuenu = 2\n  const prevPageBrightness = 0.9\n  const prevPageVisibleOffset = 10\n  const prevPageTop = menuRect.bottom + offsetToMuenu\n  const nextPageTop = prevPageTop + prevPageVisibleOffset\n  const nextPageBoxShadow = '0px 0px 10px 5px rgba(0, 0, 0, 0.12)'\n\n  const _curvePrimaryAnimation = CurveAnimation({\n    animation: primaryAnimation,\n    animationStatus: primaryAnimationStatus,\n    curve: Curves.linearToEaseOut,\n    reverseCurve: Curves.easeInToLinear\n  })\n\n  const handlePrimaryAnimation = () => {\n    'worklet'\n    let t = primaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n\n    return {\n      overflow: 'hidden',\n      boxShadow: nextPageBoxShadow,\n      borderRadius: `${topRadius}px ${topRadius}px 0px 0px`,\n      marginTop: `${nextPageTop}px`,\n      transform: `translateY(${(1 - t) * 100}%)`,\n    }\n  }\n\n  const handlePreviousPageAnimation = () => {\n    'worklet'\n    let t = primaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n\n    const scale = 1 - t / 10\n    const brightness = 1 + (prevPageBrightness - 1) * t\n    \n    return {\n      overflow: 'hidden',\n      filter: `brightness(${brightness})`,\n      borderRadius: `${topRadius}px ${topRadius}px 0px 0px`,\n      transformOrigin: 'top center',\n      transform: `translateY(${-prevPageVisibleOffset * t}px) scale(${scale})`,\n    }\n\n  }\n\n  return {\n    opaque: false,\n    transitionDuration: 400,\n    reverseTransitionDuration: 400,\n    handlePrimaryAnimation,\n    handlePreviousPageAnimation,\n  }\n}\n\nexport default CupertinoModalInside"
  },
  {
    "path": "miniprogram/packageSkylineRouter/custom-route/cupertino-modal.js",
    "content": "import {\n  CurveAnimation,\n  Curves,\n} from './util'\n\nconst {\n  shared,\n  runOnJS\n} = wx.worklet\n\nconst setNavigationBarColor = () => {\n  wx.setNavigationBarColor({\n      frontColor: '#ffffff',\n      backgroundColor: '#000000',\n      duration: 50,\n  });\n}\n\nconst resetNavigationBarColor = () => {\n  wx.setNavigationBarColor({\n      frontColor: '#000000',\n      backgroundColor: '#ffffff',\n      duration: 50,\n  });\n}\n\nconst NavBarColorStatus = {\n  white: 0,\n  black: 1,\n}\n\nconst CupertinoModal = (customRouteContext) => {\n  const menuRect = wx.getMenuButtonBoundingClientRect()\n\n  const {\n    primaryAnimation,\n    primaryAnimationStatus,\n    userGestureInProgress,\n  } = customRouteContext\n\n  const topRadius = 12\n  const offsetToMuenu = 2\n  const navBarColoThreshold = 0.3\n  const prevPageBrightness = 0.9\n  const prevPageVisibleOffset = 10\n  const prevPageTop = menuRect.bottom + offsetToMuenu\n  const nextPageTop = prevPageTop + prevPageVisibleOffset\n  const nextPageBoxShadow = '0px 0px 10px 5px rgba(0, 0, 0, 0.12)'\n\n  const _curvePrimaryAnimation = CurveAnimation({\n    animation: primaryAnimation,\n    animationStatus: primaryAnimationStatus,\n    curve: Curves.linearToEaseOut,\n    reverseCurve: Curves.easeInToLinear\n  })\n\n  const navBarColor = shared(NavBarColorStatus.black)\n\n  const handlePrimaryAnimation = () => {\n    'worklet'\n    let t = primaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n    \n    if (t > navBarColoThreshold) {\n      if (navBarColor.value === NavBarColorStatus.black) {\n        navBarColor.value = NavBarColorStatus.white\n        runOnJS(setNavigationBarColor)()\n      }\n    } else {\n      if (navBarColor.value === NavBarColorStatus.white) {\n        navBarColor.value = NavBarColorStatus.black\n        runOnJS(resetNavigationBarColor)()\n      }\n    }\n\n    return {\n      overflow: 'hidden',\n      boxShadow: nextPageBoxShadow,\n      borderRadius: `${topRadius}px ${topRadius}px 0px 0px`,\n      marginTop: `${nextPageTop}px`,\n      transform: `translateY(${(1 - t) * 100}%)`,\n    }\n  }\n\n  const handlePreviousPageAnimation = () => {\n    'worklet'\n    let t = primaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n\n    const scale = 1 - t / 10\n    const brightness = 1 + (prevPageBrightness - 1) * t\n    \n    return {\n      overflow: 'hidden',\n      filter: `brightness(${brightness})`,\n      borderRadius: `${topRadius}px ${topRadius}px 0px 0px`,\n      transformOrigin: 'top center',\n      transform: `translateY(${prevPageTop * t}px) scale(${scale})`,\n    }\n\n  }\n\n  return {\n    opaque: false,\n    transitionDuration: 400,\n    reverseTransitionDuration: 400,\n    handlePrimaryAnimation,\n    handlePreviousPageAnimation,\n  }\n}\n\nexport default CupertinoModal"
  },
  {
    "path": "miniprogram/packageSkylineRouter/custom-route/cupertino.js",
    "content": "import {\n  CurveAnimation,\n  Curves,\n  genSecondaryAnimationHandler\n} from './util'\n\nconst Cupertino = (customRouteContext) => {\n  const {\n    primaryAnimation,\n    primaryAnimationStatus,\n    userGestureInProgress\n  } = customRouteContext\n\n  const _curvePrimaryAnimation = CurveAnimation({\n    animation: primaryAnimation,\n    animationStatus: primaryAnimationStatus,\n    curve: Curves.linearToEaseOut,\n    reverseCurve: Curves.easeInToLinear\n  })\n\n  const handlePrimaryAnimation = () => {\n    'worklet'\n    let t = primaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n    return {\n      transform: `translateX(${(1 - t ) * 100}%)`\n    }\n  }\n\n  const handlePreviousPageAnimation = () => {\n    'worklet'\n    let t = primaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n    return {\n      transform: `translateX(${-1 / 3 * t * 100}%)`\n    }\n  }\n\n  const handleSecondaryAnimation = genSecondaryAnimationHandler(customRouteContext)\n\n  return {\n    transitionDuration: 400,\n    reverseTransitionDuration: 400,\n    handlePrimaryAnimation,\n    handlePreviousPageAnimation,\n    handleSecondaryAnimation\n  }\n}\n\nexport default Cupertino"
  },
  {
    "path": "miniprogram/packageSkylineRouter/custom-route/fade-upwards.js",
    "content": "import {\n  Curves,\n  genSecondaryAnimationHandler\n} from './util'\n\nconst FadeUpwards = (customRouteContext) => {\n  const {\n    primaryAnimation,\n  } = customRouteContext\n\n  const handlePrimaryAnimation = () => {\n    'worklet'\n    let t = primaryAnimation.value\n    const oProgress = Curves.easeIn(t)\n    const yProgress = Curves.fastOutSlowIn(t)\n    const transY = 0.25 * (1 - yProgress)\n\n    return {\n      opacity: 1 * oProgress,\n      transform: `translateY(${transY * 100}%)`\n    }\n  }\n\n  const handlePreviousPageAnimation = () => {\n    'worklet'\n    return {}\n  }\n\n  const handleSecondaryAnimation = genSecondaryAnimationHandler(customRouteContext)\n\n  return {\n    transitionDuration: 400,\n    reverseTransitionDuration: 400,\n    handlePrimaryAnimation,\n    handlePreviousPageAnimation,\n    handleSecondaryAnimation\n  }\n}\n\nexport default FadeUpwards"
  },
  {
    "path": "miniprogram/packageSkylineRouter/custom-route/index.js",
    "content": "import CupertinoModal from './cupertino-modal'\nimport CupertinoModalInside from './cupertino-modal-inside'\nimport ModalNavigation from './modal-navigation'\nimport Modal from './modal'\nimport FadeUpwards from './fade-upwards'\nimport Upwards from './upwards'\nimport Zoom from './zoom'\nimport Cupertino from './cupertino'\nimport BottomSheet from './bottom-sheet'\n\nlet hasInstallRouteBuiler = false\nexport function installRouteBuilder() {\n  if (hasInstallRouteBuiler) return\n  wx.router.addRouteBuilder('CupertinoModal', CupertinoModal)\n  wx.router.addRouteBuilder('CupertinoModalInside', CupertinoModalInside)\n  wx.router.addRouteBuilder('ModalNavigation', ModalNavigation)\n  wx.router.addRouteBuilder('Modal', Modal)\n  wx.router.addRouteBuilder('FadeUpwards', FadeUpwards)\n  wx.router.addRouteBuilder('Upwards', Upwards)\n  wx.router.addRouteBuilder('Zoom', Zoom)\n  wx.router.addRouteBuilder('Cupertino', Cupertino)\n  wx.router.addRouteBuilder('BottomSheet', BottomSheet)\n\n  hasInstallRouteBuiler = true\n\n  console.info('skyline: installRouteBuilder')\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/custom-route/modal-navigation.js",
    "content": "import {\n  CurveAnimation,\n  Curves,\n} from './util'\n\nconst ModalNavigation = (customRouteContext) => {\n  const menuRect = wx.getMenuButtonBoundingClientRect()\n\n  const {\n    primaryAnimation,\n    primaryAnimationStatus,\n    userGestureInProgress,\n  } = customRouteContext\n\n  const topRadius = 12\n  const offsetToMuenu = 2\n  const prevPageVisibleOffset = 10\n  const prevPageTop = menuRect.bottom + offsetToMuenu\n  const nextPageTop = prevPageTop + prevPageVisibleOffset\n  const nextPageBoxShadow = '0px 0px 10px 5px rgba(0, 0, 0, 0.12)'\n\n  const _curvePrimaryAnimation = CurveAnimation({\n    animation: primaryAnimation,\n    animationStatus: primaryAnimationStatus,\n    curve: Curves.linearToEaseOut,\n    reverseCurve: Curves.easeInToLinear\n  })\n\n  const handlePrimaryAnimation = () => {\n    'worklet'\n    let t = primaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n\n    return {\n      overflow: 'hidden',\n      boxShadow: nextPageBoxShadow,\n      borderRadius: `${topRadius}px ${topRadius}px 0px 0px`,\n      marginTop: `${nextPageTop}px`,\n      transform: `translateX(${(1 - t) * 100}%)`,\n    }\n  }\n\n  return {\n    opaque: false,\n    handlePrimaryAnimation,\n  }\n}\n\nexport default ModalNavigation"
  },
  {
    "path": "miniprogram/packageSkylineRouter/custom-route/modal.js",
    "content": "import {\n  Colors,\n  CurveAnimation,\n  Curves,\n} from './util'\n\nconst Modal = (customRouteContext) => {\n  const menuRect = wx.getMenuButtonBoundingClientRect()\n\n  const {\n    primaryAnimation,\n    primaryAnimationStatus,\n    userGestureInProgress,\n  } = customRouteContext\n\n  const topRadius = 12\n  const offsetToMuenu = 2\n  const prevPageVisibleOffset = 10\n  const prevPageTop = menuRect.bottom + offsetToMuenu\n  const nextPageTop = prevPageTop + prevPageVisibleOffset\n\n  const _curvePrimaryAnimation = CurveAnimation({\n    animation: primaryAnimation,\n    animationStatus: primaryAnimationStatus,\n    curve: Curves.linearToEaseOut,\n    reverseCurve: Curves.easeInToLinear\n  })\n\n  const handlePrimaryAnimation = () => {\n    'worklet'\n    let t = primaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n\n    return {\n      overflow: 'hidden',\n      borderRadius: `${topRadius}px ${topRadius}px 0px 0px`,\n      marginTop: `${nextPageTop}px`,\n      transform: `translateY(${(1 - t) * 100}%)`,\n    }\n  }\n\n  const handlePreviousPageAnimation = () => {\n    'worklet'\n    return {}\n  }\n\n  return {\n    opaque: false,\n    barrierColor: Colors.black87,\n    barrierDismissible: true,\n    transitionDuration: 400,\n    reverseTransitionDuration: 400,\n    handlePrimaryAnimation,\n    handlePreviousPageAnimation\n  }\n}\n\nexport default Modal"
  },
  {
    "path": "miniprogram/packageSkylineRouter/custom-route/upwards.js",
    "content": "import {\n  CurveAnimation,\n  Curves,\n  Colors,\n  genSecondaryAnimationHandler,\n} from './util'\n\nconst {\n  Easing\n} = wx.worklet\n\nconst Upwards = (customRouteContext) => {\n  const {\n    primaryAnimation,\n    primaryAnimationStatus,\n    userGestureInProgress,\n  } = customRouteContext\n\n  const transitionCurve = Easing.cubicBezier(0.20, 0.00, 0.00, 1.00)\n  \n  const _curvePrimaryAnimation = CurveAnimation({\n    animation: primaryAnimation,\n    animationStatus: primaryAnimationStatus,\n    curve: transitionCurve,\n    reverseCurve: Easing.out(transitionCurve)\n  })\n\n  const handlePrimaryAnimation = () => {\n    'worklet'\n    let t = primaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curvePrimaryAnimation.value\n    }\n\n    return {\n      overflow: 'hidden',\n      transform: `translateY(${(1 - t) * 100}%)`\n    }\n  }\n\n  const handlePreviousPageAnimation = () => {\n    'worklet'\n    return {}\n  }\n\n  const handleSecondaryAnimation = genSecondaryAnimationHandler(customRouteContext)\n\n  return {\n    barrierColor: Colors.black26,\n    transitionDuration: 400,\n    reverseTransitionDuration: 400,\n    handlePrimaryAnimation,\n    handlePreviousPageAnimation,\n    handleSecondaryAnimation\n  }\n}\n\nexport default Upwards"
  },
  {
    "path": "miniprogram/packageSkylineRouter/custom-route/util.js",
    "content": "const { derived, Easing } = wx.worklet\n\nexport const GestureState = {\n  POSSIBLE: 0,\n  BEGIN: 1,\n  ACTIVE: 2,\n  END: 3,\n  CANCELLED: 4,\n}\n\nexport const clamp = (v, lower, upper) => {\n  'worklet'\n  if (v < lower) return lower\n  if (v > upper) return upper\n  return v\n}\n\nexport const lerp = (begin, end, t) => {\n  'worklet'\n  return begin + (end - begin) * t\n}\n\nexport const AnimationStatus = {\n  dismissed: 0,\n  forward: 1,\n  reverse: 2,\n  completed: 3,\n}\n\nexport const Colors = {\n  black12: 'rgba(0, 0, 0, 0.12)',\n  black26: 'rgba(0, 0, 0, 0.26)',\n  black38: 'rgba(0, 0, 0, 0.38)',\n  black45: 'rgba(0, 0, 0, 0.45)',\n  black54: 'rgba(0, 0, 0, 0.54)',\n  black87: 'rgba(0, 0, 0, 0.87)',\n}\n\nexport const Curves = {\n  fastLinearToSlowEaseIn: Easing.cubicBezier(0.18, 1.0, 0.04, 1.0),\n  linearToEaseOut: Easing.cubicBezier(0.35, 0.91, 0.33, 0.97),\n  easeInToLinear: Easing.cubicBezier(0.67, 0.03, 0.65, 0.09),\n  fastOutSlowIn: Easing.cubicBezier(0.4, 0.0, 0.2, 1.0),\n  decelerateEasing: Easing.cubicBezier(0.0, 0.0, 0.2, 1.0),\n  easeOutCubic: Easing.cubicBezier(0.215, 0.61, 0.355, 1.0),\n  easeIn: Easing.in(Easing.ease),\n  easeOut: Easing.out(Easing.ease),\n  ease: Easing.ease,\n}\n\nexport const bottomSheetSuspendedCurve = (startingPoint, curve = Curves.easeOutCubic) => {\n  'worklet'\n  return (t) => {\n    'worklet'\n    if (t < startingPoint) return t\n    if (t === 1.0) return t\n    const curveProgress = (t - startingPoint) / (1 - startingPoint)\n    const transformed = curve(curveProgress)\n    return startingPoint + (1 - startingPoint) * transformed\n  }\n}\n\nexport function CurveAnimation({\n  animation,\n  animationStatus,\n  curve,\n  reverseCurve\n}) {\n  return derived(() => {\n    'worklet'\n    const useForwardCurve = !reverseCurve || animationStatus.value !== AnimationStatus.reverse\n    const activeCurve = useForwardCurve ? curve : reverseCurve\n    const t = animation.value\n    if (!activeCurve) return t\n    if (t === 0 || t === 1) return t\n    return activeCurve(t)\n  })\n}\n\nexport function genSecondaryAnimationHandler(customRouteContext) {\n  const {\n    secondaryAnimation,\n    secondaryAnimationStatus,\n    userGestureInProgress,\n  } = customRouteContext\n\n  const _curveSecondaryAnimation = CurveAnimation({\n    animation: secondaryAnimation,\n    animationStatus: secondaryAnimationStatus,\n    curve: Curves.linearToEaseOut,\n    reverseCurve: Curves.easeInToLinear\n  })\n\n  const handleSecondaryAnimation = () => {\n    'worklet'\n    let t = secondaryAnimation.value\n    if (!userGestureInProgress.value) {\n      t = _curveSecondaryAnimation.value\n    }\n    return {\n      transform: `translateX(${-1 / 3 * t * 100}%)`\n    }\n  }\n  return handleSecondaryAnimation\n}\n"
  },
  {
    "path": "miniprogram/packageSkylineRouter/custom-route/zoom.js",
    "content": "import {\n  genSecondaryAnimationHandler,\n  AnimationStatus\n} from './util'\n\nconst {\n  shared,\n  derived,\n  Easing\n} = wx.worklet\n\n\nconst Zoom = (customRouteContext) => {\n  const {\n    primaryAnimation,\n    primaryAnimationStatus,\n  } = customRouteContext\n\n  const intervalCurve = (begin, end) => {\n    return (t) => {\n      'worklet'\n      const clamp = (v, lower, upper) => {\n        if (v < lower) return lower\n        if (v > upper) return upper\n        return v\n      }\n      t = clamp((t - begin) / (end - begin), 0.0, 1.0)\n      return t\n    }\n  }\n\n  const chainTween = (begin, end, curve) => {\n    return (t) => {\n      'worklet'\n      if (t === 0.0) {\n        return begin\n      }\n      if (t === 1.0) {\n        return end\n      }\n      const transform_t = curve(t)\n      const current = begin + (end - begin) * transform_t\n      return current\n    }\n  }\n\n  const fastOutExtraSlowInTweenSequenceItems = [{\n    tween: chainTween(0.0, 0.4, Easing.cubicBezier(0.05, 0.0, 0.133333, 0.06)),\n    weight: 0.166666\n  }, {\n    tween: chainTween(0.4, 1.0, Easing.cubicBezier(0.208333, 0.82, 0.25, 1.0)),\n    weight: 1.0 - 0.166666\n  }]\n\n  const tweenSequence = (tweenSequenceItems = []) => {\n    const _interval = (start, end) => {\n      const value = (t) => {\n        'worklet'\n        return (t - start) / (end - start)\n      }\n\n      const contains = (t) => {\n        'worklet'\n        return t >= start && t < end\n      }\n      return {\n        value,\n        contains\n      }\n    }\n\n    const _items = tweenSequenceItems.slice()\n\n    let totalWeight = 0.0\n    for (let item of _items) {\n      totalWeight += item.weight\n    }\n\n    const _intervals = []\n    let start = 0.0\n    for (let i = 0; i < _items.length; i++) {\n      const end = i === _items.length - 1 ? 1.0 : (start + _items[i].weight / totalWeight)\n      _intervals.push(_interval(start, end))\n      start = end\n    }\n\n    return (t) => {\n      'worklet'\n      const _evaluateAt = (t, index) => {\n        const element = _items[index]\n        const tInterval = _intervals[index].value(t)\n        return element.tween(tInterval)\n      }\n\n      if (t === 0) {\n        return _evaluateAt(t, _items.length - 1)\n      }\n      for (let index = 0; index < _items.length; index++) {\n        if (_intervals[index].contains(t)) {\n          return _evaluateAt(t, index)\n        }\n      }\n    }\n  }\n\n  const scaleCurveSequence = tweenSequence(fastOutExtraSlowInTweenSequenceItems)\n\n  let zoomEnterTransition, zoomExitTransition\n\n  (() => {\n    const _fadeInTransition = chainTween(0.00, 1.00, intervalCurve(0.125, 0.250))\n    const _scaleDownTransition = chainTween(1.10, 1.00, scaleCurveSequence)\n    const _scaleUpTransition = chainTween(0.85, 1.00, scaleCurveSequence)\n\n    zoomEnterTransition = (reverse = false) => {\n      if (reverse) {\n        return (t) => {\n          'worklet'\n          const opacity = 1.0\n          const scale = _scaleDownTransition(t)\n          return {\n            opacity,\n            transform: `scale(${scale})`\n          }\n        }\n      }\n      return (t) => {\n        'worklet'\n        const opacity = _fadeInTransition(t)\n        const scale = _scaleUpTransition(t)\n        return {\n          opacity,\n          transform: `scale(${scale})`\n        }\n      }\n    }\n  })();\n\n  (() => {\n    const _fadeOutTransition = chainTween(1.0, 0.0, intervalCurve(0.0825, 0.2075))\n    const _scaleUpTransition = chainTween(1.00, 1.05, scaleCurveSequence)\n    const _scaleDownTransition = chainTween(1.00, 0.90, scaleCurveSequence)\n\n    zoomExitTransition = (reverse = false) => {\n      if (reverse) {\n        return (t) => {\n          'worklet'\n          const opacity = _fadeOutTransition(t)\n          const scale = _scaleDownTransition(t)\n          return {\n            opacity,\n            transform: `scale(${scale})`\n          }\n        }\n      }\n      return (t) => {\n        'worklet'\n        const opacity = 1.0\n        const scale = _scaleUpTransition(t)\n        return {\n          opacity,\n          transform: `scale(${scale})`\n        }\n      }\n    }\n  })();\n\n  const _generateAnimationHandler = (animation, animationStatus, forwardTransition, reverseTransition) => {\n    const _effectiveAnimationStatus = shared(animationStatus.value)\n    return () => {\n      'worklet'\n      const _calculateEffectiveAnimationStatus = (lastEffective, current) => {\n        switch (current) {\n          case AnimationStatus.dismissed:\n          case AnimationStatus.completed:\n            return current\n          case AnimationStatus.forward:\n            switch (lastEffective) {\n              case AnimationStatus.dismissed:\n              case AnimationStatus.completed:\n              case AnimationStatus.forward:\n                return current\n              case AnimationStatus.reverse:\n                return lastEffective\n            }\n          case AnimationStatus.reverse:\n            switch (lastEffective) {\n              case AnimationStatus.dismissed:\n              case AnimationStatus.completed:\n              case AnimationStatus.reverse:\n                return current\n              case AnimationStatus.forward:\n                return lastEffective\n            }\n        }\n      }\n\n      const progress = animation.value\n      const currentStatus = animationStatus.value\n      const lastEffectiveStatus = _effectiveAnimationStatus.value\n\n      const effectiveAnimationStatus = _calculateEffectiveAnimationStatus(\n        lastEffectiveStatus,\n        currentStatus,\n      )\n      _effectiveAnimationStatus.value = effectiveAnimationStatus\n\n      let style\n      switch (effectiveAnimationStatus) {\n        case AnimationStatus.dismissed:\n        case AnimationStatus.forward:\n          style = forwardTransition(progress)\n          break\n        case AnimationStatus.reverse:\n        case AnimationStatus.completed:\n          style = reverseTransition(1 - progress)\n          break\n      }\n      return style\n    }\n  }\n\n  const reverseAnimation = derived(() => {\n    'worklet'\n    return 1 - primaryAnimation.value\n  })\n\n  const reverseAnimationStatus = derived(() => {\n    'worklet'\n    const status = primaryAnimationStatus.value\n    switch (status) {\n      case AnimationStatus.forward: return AnimationStatus.reverse\n      case AnimationStatus.reverse: return AnimationStatus.forward\n      case AnimationStatus.completed: return AnimationStatus.dismissed\n      case AnimationStatus.dismissed: return AnimationStatus.completed\n    }\n  })\n\n  const handlePrimaryAnimation = _generateAnimationHandler(primaryAnimation, primaryAnimationStatus, zoomEnterTransition(), zoomExitTransition(true))\n\n  const handlePreviousPageAnimation = _generateAnimationHandler(reverseAnimation, reverseAnimationStatus, zoomEnterTransition(true), zoomExitTransition())\n\n  const handleSecondaryAnimation = genSecondaryAnimationHandler(customRouteContext)\n\n\n  return {\n    transitionDuration: 400,\n    reverseTransitionDuration: 400,\n    handlePrimaryAnimation,\n    handlePreviousPageAnimation,\n    handleSecondaryAnimation\n  }\n}\n\nexport default Zoom"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/open-container/detail/index.js",
    "content": "// pages/detail/index.js\nComponent({\n\n  /**\n   * Component properties\n   */\n  properties: {\n\n  },\n\n  /**\n   * Component initial data\n   */\n  data: {\n\n  },\n\n  /**\n   * Component methods\n   */\n  methods: {\n    goOther() {\n      wx.navigateTo({\n        url: '../other/index',\n      })\n    },\n\n    goOther2() {\n      wx.navigateTo({\n        url: '../other/index',\n        routeType: 'wx://cupertino-modal'\n      })\n    }\n  }\n})"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/open-container/detail/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/open-container/detail/index.wxml",
    "content": "<mp-navigation-bar title=\"Details Page\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view type=\"list\" scroll-y class=\"scrollable\" show-scrollbar=\"{{false}}\">\n  <view class=\"img-wrap center\">\n    <image mode=\"aspectFit\" class=\"img\" src=\"/assets/play.png\" />\n  </view>\n  <view class=\"article\">\n    <view class=\"title\">\n      <text>Title</text>\n    </view>\n    <view style=\"margin-bottom: 20px;\">\n      <view bind:tap=\"goOther\" style=\"height: 30px;\">正常跳转 other 页</view>\n      <view bind:tap=\"goOther2\" style=\"height: 30px;\">半屏跳转 other 页</view>\n    </view>\n    <view>\n      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod\n      tempor incididunt ut labore et dolore magna aliqua. Vulputate dignissim\n      suspendisse in est. Ut ornare lectus sit amet. Eget nunc lobortis mattis\n      aliquam faucibus purus in. Hendrerit gravida rutrum quisque non tellus\n      orci ac auctor. Mattis aliquam faucibus purus in massa. Tellus rutrum\n      tellus pellentesque eu tincidunt tortor. Nunc eget lorem dolor sed. Nulla\n      at volutpat diam ut venenatis tellus in metus. Tellus cras adipiscing enim\n      eu turpis. Pretium fusce id velit ut tortor. Adipiscing enim eu turpis\n      egestas pretium. Quis varius quam quisque id. Blandit aliquam etiam erat\n      velit scelerisque. In nisl nisi scelerisque eu. Semper risus in hendrerit\n      gravida rutrum quisque. Suspendisse in est ante in nibh mauris cursus\n      mattis molestie. Adipiscing elit duis tristique sollicitudin nibh sit\n      amet commodo nulla. Pretium viverra suspendisse potenti nullam ac tortor\n      vitae.\n      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod\n      tempor incididunt ut labore et dolore magna aliqua. Vulputate dignissim\n      suspendisse in est. Ut ornare lectus sit amet. Eget nunc lobortis mattis\n      aliquam faucibus purus in. Hendrerit gravida rutrum quisque non tellus\n      orci ac auctor. Mattis aliquam faucibus purus in massa. Tellus rutrum\n      tellus pellentesque eu tincidunt tortor. Nunc eget lorem dolor sed. Nulla\n      at volutpat diam ut venenatis tellus in metus. Tellus cras adipiscing enim\n      eu turpis. Pretium fusce id velit ut tortor. Adipiscing enim eu turpis\n      egestas pretium. Quis varius quam quisque id. Blandit aliquam etiam erat\n      velit scelerisque. In nisl nisi scelerisque eu. Semper risus in hendrerit\n      gravida rutrum quisque. Suspendisse in est ante in nibh mauris cursus\n      mattis molestie. Adipiscing elit duis tristique sollicitudin nibh sit\n      amet commodo nulla. Pretium viverra suspendisse potenti nullam ac tortor\n      vitae;\n    </view>\n  </view>\n</scroll-view>"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/open-container/detail/index.wxss",
    "content": "/* pages/detail/index.wxss */\npage {\n  height: 100vh;\n  display: flex;\n  flex-direction: column;\n}\n\n.scrollable {\n  flex: 1;\n  overflow: hidden;\n}\n\n.center {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.img-wrap {\n  height: 250px;\n  width: 100%;\n  padding: 70px;\n  box-sizing: border-box;\n  background-color: rgba(0, 0, 0, 0.38);\n}\n\n.img {\n  width: 25vw;\n  height: 25vw;\n}\n\n.article {\n  padding: 20px;\n  font-size: 16px;\n  font-style: italic;\n  line-height: 1.5;\n  color: rgba(0, 0, 0, 0.54);\n}\n\n.title {\n  font-size: 30px;\n  margin-bottom: 10px;\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/open-container/index/index.js",
    "content": "const genList = (num) => {\n  const ans = []\n  for (let i = 0; i < num; i++) {\n    ans.push({\n      id: i,\n    })\n  }\n  return ans\n}\nPage({\n  data: {\n    type: 'fade',\n    duration: 300,\n    closedElevation: 1,\n    closedBorderRadius: 4,\n    openElevation: 4,\n    openBorderRadius: 0,\n    list: genList(10),\n    detailPage: '../detail/index',\n    renderer: '',\n  },\n  onShareAppMessage() {\n    return {\n      title: 'open-container',\n      path: 'packageSkylineRouter/page/open-container/index/index'\n    }\n  },\n  onLoad() {\n    this.setData({\n      renderer: this.renderer\n    })\n  },\n\n  goDetail() {\n    wx.navigateTo({\n      url: '../detail/index'\n    })\n  },\n\n  toggleType() {\n    const type = this.data.type === 'fade' ? 'fadeThrough' : 'fade'\n    this.setData({\n      type\n    })\n    wx.showToast({\n      info: 'none',\n      title: `${type}`,\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/open-container/index/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"example-card\": \"../../../components/example-card/index\",\n    \"small-card\": \"../../../components/small-card/index\",\n    \"example-single-title\": \"../../../components/example-single-title/index\"\n  },\n  \"navigationBarTitleText\": \"Open Container Demo\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/open-container/index/index.wxml",
    "content": "<mp-navigation-bar title=\"Open Container Demo\" back=\"{{true}}\"></mp-navigation-bar>\n<scroll-view type=\"list\" scroll-y class=\"scrollable\" padding=\"{{[8, 8, 8, 8]}}\" show-scrollbar=\"{{false}}\" style=\"{{renderer === 'webview' ? 'padding: 8px;' : ''}}\">\n  <view class=\"card-row\">\n    <open-container closed-elevation=\"{{closedElevation}}\" closed-border-radius=\"{{closedBorderRadius}}\" open-elevation=\"{{openElevation}}\" open-border-radius=\"{{openBorderRadius}}\" transition-type=\"{{type}}\" transition-duration=\"{{duration}}\" bind:tap=\"goDetail\">\n      <example-card />\n    </open-container>\n  </view>\n  <open-container closed-elevation=\"{{closedElevation}}\" closed-border-radius=\"{{closedBorderRadius}}\" open-elevation=\"{{openElevation}}\" open-border-radius=\"{{openBorderRadius}}\" transition-type=\"{{type}}\" transition-duration=\"{{duration}}\" bind:tap=\"goDetail\">\n    <example-single-title />\n  </open-container>\n  <view class=\"card-row\" />\n  <view class=\"card-row\">\n    <block wx:for=\"{{[0, 1]}}\">\n      <open-container class=\"card-item\" closed-elevation=\"{{closedElevation}}\" closed-border-radius=\"{{closedBorderRadius}}\" open-elevation=\"{{openElevation}}\" open-border-radius=\"{{openBorderRadius}}\" transition-type=\"{{type}}\" transition-duration=\"{{duration}}\" bind:tap=\"goDetail\">\n        <small-card class=\"card-item\" />\n      </open-container>\n      <view wx:if=\"{{index < 1}}\" class=\"split\" />\n    </block>\n  </view>\n  <view class=\"card-row\">\n    <block wx:for=\"{{[0, 1, 2]}}\">\n      <open-container class=\"card-item\" closed-elevation=\"{{closedElevation}}\" closed-border-radius=\"{{closedBorderRadius}}\" open-elevation=\"{{openElevation}}\" open-border-radius=\"{{openBorderRadius}}\" transition-type=\"{{type}}\" transition-duration=\"{{duration}}\" bind:tap=\"goDetail\">\n        <small-card />\n      </open-container>\n      <view wx:if=\"{{index < 2}}\" class=\"split\" />\n    </block>\n  </view>\n  <block wx:for=\"{{list}}\">\n    <open-container url=\"{{detailPage}}\" closed-elevation=\"0\" closed-border-radius=\"0\" open-elevation=\"{{openElevation}}\" open-border-radius=\"{{openBorderRadius}}\" transition-type=\"{{type}}\" transition-duration=\"{{duration}}\" bind:tap=\"goDetail\">\n      <view class=\"list-title\">\n        <view class=\"list-item-leading\">\n          <image class=\"avatar\" src=\"/assets/play.png\" />\n        </view>\n        <view class=\"list-item-content\">\n          <view class=\"item-title\">List item {{index + 1}}</view>\n          <view>Secondary text</view>\n        </view>\n      </view>\n    </open-container>\n  </block>\n</scroll-view>\n<open-container class=\"float-button\" closed-color=\"plum\" middle-color=\"yellow\" open-color=\"white\" closed-border-radius=\"28\" open-border-radius=\"{{openBorderRadius}}\" transition-type=\"{{type}}\" transition-duration=\"{{duration}}\" bind:tap=\"goDetail\">\n  <view class=\"center ball\" bind:longpress=\"toggleType\">+</view>\n</open-container>"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/open-container/index/index.wxss",
    "content": "/* pages/detail/index.wxss */\npage {\n  height: 100vh;\n  display: flex;\n  flex-direction: column;\n}\n\n.scrollable {\n  flex: 1;\n  overflow: hidden;\n  box-sizing: border-box;\n}\n\n.center {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.img-wrap {\n  height: 250px;\n  width: 100%;\n  padding: 70px;\n  box-sizing: border-box;\n  background-color: rgba(0, 0, 0, 0.38);\n}\n\n.img {\n  width: 100%;\n  height: 100%;\n}\n\n.article {\n  padding: 20px;\n  font-size: 16px;\n  line-height: 1.5;\n  color: rgba(0, 0, 0, 0.54);\n}\n\n.title {\n  font-size: 30px;\n  margin-bottom: 10px;\n}\n\n.card-row {\n  margin-bottom: 16px;\n  display: flex;\n  flex-direction: row;\n}\n\n.card-item {\n  flex: 1;\n}\n\n.split {\n  width: 8px;\n  height: 100%;\n}\n\n.list-title {\n  display: flex;\n  flex-direction: row;\n  padding: 10px 0 15px;\n  font-style: italic;\n  font-size: 14px;\n  color: rgba(0, 0, 0, 0.54);\n}\n\n.list-item-leading {\n  margin-left: 20px;\n  margin-right: 15px;\n}\n\n.avatar {\n  width: 40px;\n  height: 40px;\n  border-radius: 50%;\n}\n\n.list-item-content {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n}\n\n.item-title {\n  font-size: 16px;\n  color: #000;\n}\n\n.float-button {\n  width: 56px;\n  height: 56px;\n  position: absolute;\n  right: 20px;\n  bottom: 60px;\n}\n\n.ball {\n  height: 100%; \n  border-radius: 50%;\n  background-color: plum;\n  font-size: 24px;\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/open-container/other/index.js",
    "content": "// pages/other/index.js\nPage({\n\n  /**\n   * Page initial data\n   */\n  data: {\n\n  },\n\n  /**\n   * Lifecycle function--Called when page load\n   */\n  onLoad(options) {\n\n  },\n\n  /**\n   * Lifecycle function--Called when page is initially rendered\n   */\n  onReady() {\n\n  },\n\n  /**\n   * Lifecycle function--Called when page show\n   */\n  onShow() {\n\n  },\n\n  /**\n   * Lifecycle function--Called when page hide\n   */\n  onHide() {\n\n  },\n\n  /**\n   * Lifecycle function--Called when page unload\n   */\n  onUnload() {\n\n  },\n\n  /**\n   * Page event handler function--Called when user drop down\n   */\n  onPullDownRefresh() {\n\n  },\n\n  /**\n   * Called when page reach bottom\n   */\n  onReachBottom() {\n\n  },\n\n  /**\n   * Called when user click on the top right corner to share\n   */\n  onShareAppMessage() {\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/open-container/other/index.json",
    "content": "{\n  \"usingComponents\": {},\n  \"styleIsolation\": \"isolated\"\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/open-container/other/index.wxml",
    "content": "<!--pages/other/index.wxml-->\n<mp-navigation-bar title=\"other\" back=\"{{true}}\"></mp-navigation-bar>\n<text>pages/other/index.wxml</text>"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/open-container/other/index.wxss",
    "content": "text {\n  padding: 16px;\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/page-return-gesture/index/index.js",
    "content": "const CustomRotue = {\n  BottomSheet: 'wx://bottom-sheet',\n  Upwards: 'wx://upwards',\n  FadeUpwards: 'wx://fade-upwards',\n  Zoom: 'wx://zoom',\n  Modal: 'wx://modal',\n  Cupertino: 'wx://cupertino',\n  CupertinoModal: 'wx://cupertino-modal',\n  CupertinoModalInside: 'wx://cupertino-modal-inside',\n  ModalNavigation: 'wx://modal-navigation',\n}\n\nPage({\n  data: {\n    round: true,\n    popGestureDirection: 'vertical',\n    range: ['horizontal', 'vertical', 'multi'],\n    list: [\n      {\n        id: 0,\n        routeType: CustomRotue.BottomSheet,\n        disableDrag: 1,\n        content: 'BottomSheet'\n      },\n      {\n        id: 1,\n        routeType: CustomRotue.Upwards,\n        nextRouteType: CustomRotue.Upwards,\n        content: 'Upwards',\n        fullscreen: 1,\n      },\n      {\n        id: 2,\n        routeType: CustomRotue.FadeUpwards,\n        nextRouteType: CustomRotue.FadeUpwards,\n        fullscreen: 1,\n        content: 'Fade Upwards'\n      },\n      {\n        id: 3,\n        routeType: CustomRotue.Zoom,\n        nextRouteType: CustomRotue.Zoom,\n        fullscreen: 1,\n        content: 'Zoom'\n      },\n      {\n        id: 4,\n        routeType: CustomRotue.Modal,\n        nextRouteType: CustomRotue.ModalNavigation,\n        content: 'Modal with navigation'\n      },\n      // {\n      //   id: 5,\n      //   routeType: CustomRotue.Cupertino,\n      //   nextRouteType: CustomRotue.Cupertino,\n      //   fullscreen: 1,\n      //   content: 'Cupertino (iOS default)'\n      // },\n      {\n        id: 6,\n        routeType: CustomRotue.CupertinoModal,\n        nextRouteType: CustomRotue.CupertinoModalInside,\n        content: 'Cupertino Modal inside modal'\n      },\n      {\n        id: 7,\n        routeType: CustomRotue.CupertinoModal,\n        nextRouteType: CustomRotue.ModalNavigation,\n        fullscreen: 1,\n        content: 'Cupertino Modal with navigation'\n      },\n    ]\n  },\n  onShareAppMessage() {\n    return {\n      title: 'page-return-gesture',\n      path: 'packageSkylineRouter/page/page-return-gesture/index/index'\n    }\n  },\n  onLoad() {},\n\n  goNextPage(e) {\n    const { routeType, nextRouteType, fullscreen, disableDrag } = e.currentTarget.dataset\n    wx.navigateTo({\n      url: `/packageSkylineRouter/pages/preset-router/list/index?disableDrag=${disableDrag}&fullscreen=${fullscreen}&nextRouteType=${nextRouteType || ''}`,\n      routeType,\n      routeOptions: {\n        round: this.data.round,\n      },\n      routeConfig: {\n        fullscreenDrag: true,\n        popGestureDirection: this.data.popGestureDirection\n      }\n    });\n  },\n  onChange(e) {\n    const popGestureDirection = this.data.range[e.detail.value]\n    this.setData({\n      popGestureDirection\n    })\n  },\n\n  toggleRound() {\n    this.setData({\n      round: !this.data.round\n    })\n  }\n});"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/page-return-gesture/index/index.json",
    "content": "{\n  \"usingComponents\": {},\n  \"navigationStyle\": \"custom\",\n  \"styleIsolation\": \"isolated\"\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/page-return-gesture/index/index.wxml",
    "content": "<mp-navigation-bar title=\"Skyline Route\" back=\"{{true}}\"></mp-navigation-bar>\n<view class=\"section\">Custom Page Route Example</view>\n<block wx:for=\"{{list}}\" wx:key=\"id\">\n  <view\n    class=\"item\"\n    bind:tap=\"goNextPage\"\n    data-route-type=\"{{item.routeType}}\"\n    data-next-route-type=\"{{item.nextRouteType}}\"\n    data-disable-drag=\"{{item.disableDrag}}\"\n    data-fullscreen=\"{{item.fullscreen}}\"\n    >{{item.content}}\n    </view>\n</block>\n\n<view style=\"margin: 20px; color: red;\" bind:tap=\"toggleRound\">\n  <text> BottomSheet round: {{round}}，点击切换</text>\n</view>\n\n<view style=\"margin: 20px; color: red;\">\n  <picker mode=\"selector\" range=\"{{range}}\" bind:change=\"onChange\">\n    <view>\n      <text>popGestureDirection: {{popGestureDirection}}</text>\n    </view>\n  </picker>\n</view>"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/page-return-gesture/index/index.wxss",
    "content": ".section {\n  padding: 15px;  \n  font-size: 24px;\n}\n\n.intro {\n  padding: 15px;\n  font-size: 14px;\n  color: grey\n}\n\n.item {\n  padding: 15px;\n  font-size: 18px;\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/preset-router/index/index.js",
    "content": "const CustomRotue = {\n  BottomSheet: 'wx://bottom-sheet',\n  Upwards: 'wx://upwards',\n  FadeUpwards: 'wx://fade-upwards',\n  Zoom: 'wx://zoom',\n  Modal: 'wx://modal',\n  Cupertino: 'wx://cupertino',\n  CupertinoModal: 'wx://cupertino-modal',\n  CupertinoModalInside: 'wx://cupertino-modal-inside',\n  ModalNavigation: 'wx://modal-navigation',\n}\n\nPage({\n  data: {\n    list: [\n      {\n        id: 0,\n        routeType: CustomRotue.BottomSheet,\n        disableDrag: 1,\n        content: 'BottomSheet'\n      },\n      {\n        id: 1,\n        routeType: CustomRotue.Upwards,\n        nextRouteType: CustomRotue.Upwards,\n        content: 'Upwards',\n        fullscreen: 1,\n      },\n      {\n        id: 2,\n        routeType: CustomRotue.FadeUpwards,\n        nextRouteType: CustomRotue.FadeUpwards,\n        fullscreen: 1,\n        content: 'Fade Upwards'\n      },\n      {\n        id: 3,\n        routeType: CustomRotue.Zoom,\n        nextRouteType: CustomRotue.Zoom,\n        fullscreen: 1,\n        content: 'Zoom'\n      },\n      {\n        id: 4,\n        routeType: CustomRotue.Modal,\n        nextRouteType: CustomRotue.ModalNavigation,\n        content: 'Modal with navigation'\n      },\n      // {\n      //   id: 5,\n      //   routeType: CustomRotue.Cupertino,\n      //   nextRouteType: CustomRotue.Cupertino,\n      //   fullscreen: 1,\n      //   content: 'Cupertino (iOS default)'\n      // },\n      {\n        id: 6,\n        routeType: CustomRotue.CupertinoModal,\n        nextRouteType: CustomRotue.CupertinoModalInside,\n        content: 'Cupertino Modal inside modal'\n      },\n      {\n        id: 7,\n        routeType: CustomRotue.CupertinoModal,\n        nextRouteType: CustomRotue.ModalNavigation,\n        fullscreen: 1,\n        content: 'Cupertino Modal with navigation'\n      },\n    ]\n  },\n  onShareAppMessage() {\n    return {\n      title: 'preset-router',\n      path: 'packageSkylineRouter/page/preset-router/index/index'\n    }\n  },\n  onLoad() { },\n\n  goNextPage(e) {\n    const {\n      routeType, nextRouteType, fullscreen, disableDrag\n    } = e.currentTarget.dataset\n    wx.navigateTo({\n      url: `/packageSkylineRouter/pages/preset-router/list/index?disableDrag=${disableDrag}&fullscreen=${fullscreen}&nextRouteType=${nextRouteType || ''}`,\n      routeType\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/preset-router/index/index.json",
    "content": "{\n  \"usingComponents\": {},\n  \"navigationStyle\": \"custom\",\n  \"styleIsolation\": \"isolated\"\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/preset-router/index/index.wxml",
    "content": "<mp-navigation-bar title=\"Skyline Route\" back=\"{{true}}\"></mp-navigation-bar>\n<view class=\"section\">Custom Page Route Example</view>\n<block wx:for=\"{{list}}\" wx:key=\"id\">\n  <view\n    class=\"item\"\n    bind:tap=\"goNextPage\"\n    data-route-type=\"{{item.routeType}}\"\n    data-next-route-type=\"{{item.nextRouteType}}\"\n    data-disable-drag=\"{{item.disableDrag}}\"\n    data-fullscreen=\"{{item.fullscreen}}\"\n    >{{item.content}}\n    </view>\n</block>\n"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/preset-router/index/index.wxss",
    "content": ".section {\n  padding: 15px;  \n  font-size: 24px;\n}\n\n.intro {\n  padding: 15px;\n  font-size: 14px;\n  color: grey\n}\n\n.item {\n  padding: 15px;\n  font-size: 18px;\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/preset-router/list/index.js",
    "content": "// half-page/index.js\nimport {\n  GestureState,\n  lerp,\n  clamp,\n  Curves,\n  bottomSheetSuspendedCurve,\n} from '../../../custom-route/util'\n\nconst getList = (num) => {\n  const ans = []\n  for (let i = 0; i < num; i++) {\n    ans.push({\n      id: i\n    })\n  }\n  return ans\n}\n\nconst {\n  timing,\n  shared\n} = wx.worklet\n\nconst _minFlingVelocity = 500\nconst _closeProgressThreshold = 0.6\nconst _duration = 400\n\nPage({\n  data: {\n    list: getList(40),\n    nextRouteType: '',\n    fullscreen: false\n  },\n\n  onLoad(query) {\n    const { nextRouteType, fullscreen, disableDrag } = query\n    this.setData({\n      nextRouteType,\n      fullscreen\n    })\n    this.disableDrag = disableDrag == '1'\n    this.initSharedValue()\n  },\n\n  goNextpage() {\n    const { nextRouteType, fullscreen } = this.data\n    if (!nextRouteType) return\n\n    wx.navigateTo({\n      url: `/packageSkylineRouter/pages/preset-router/list/index?fullscreen=${fullscreen}&nextRouteType=${nextRouteType}`,\n      routeType: nextRouteType\n    })\n  },\n\n  back() {\n    wx.navigateBack({\n      delta: 1,\n    })\n  },\n\n  initSharedValue() {\n    this.childHeight = shared(0)\n    this.scrollTop = shared(0)\n    this.startPan = shared(false)\n    this.customRouteContext = wx.router.getRouteContext(this) || {}\n\n    this.getChildHeight()\n  },\n\n  getChildHeight() {\n    this.createSelectorQuery().select('.container').boundingClientRect((rect) => {\n      this.childHeight.value = rect.height\n    }).exec()\n  },\n\n  shouldPanResponse() {\n    'worklet'\n\n    return this.startPan.value\n  },\n  shouldScrollViewResponse(pointerEvent) {\n    'worklet'\n\n    const {\n      primaryAnimation\n    } = this.customRouteContext\n    if (primaryAnimation.value < 1) return false\n    const scrollTop = this.scrollTop.value\n    const {\n      deltaY\n    } = pointerEvent\n    const result = !(scrollTop <= 0 && deltaY > 0)\n    this.startPan.value = !result\n    return result\n  },\n  adjustDecelerationVelocity(velocity) {\n    'worklet'\n\n    const scrollTop = this.scrollTop.value\n    return scrollTop <= 0 ? 0 : velocity\n  },\n  handleScroll(evt) {\n    'worklet'\n\n    this.scrollTop.value = evt.detail.scrollTop\n  },\n  handleDragStart() {\n    'worklet'\n\n    this.startPan.value = true\n    const {\n      startUserGesture\n    } = this.customRouteContext\n    startUserGesture()\n  },\n\n  handleDragUpdate(delta) {\n    'worklet'\n\n    const {\n      primaryAnimation\n    } = this.customRouteContext\n    const newVal = primaryAnimation.value - delta\n    primaryAnimation.value = clamp(newVal, 0.0, 1.0)\n  },\n\n  handleDragEnd(velocity) {\n    'worklet'\n\n    this.startPan.value = false\n    const {\n      primaryAnimation,\n      stopUserGesture,\n      userGestureInProgress,\n      didPop\n    } = this.customRouteContext\n\n    if (!userGestureInProgress.value) return\n\n    let animateForward = false\n    if (Math.abs(velocity) >= _minFlingVelocity) {\n      animateForward = velocity <= 0\n    } else {\n      animateForward = primaryAnimation.value > _closeProgressThreshold\n    }\n    const t = primaryAnimation.value\n    const animationCurve = bottomSheetSuspendedCurve(t, Curves.decelerateEasing)\n\n    if (animateForward) {\n      const remainingFraction = 1.0 - t\n      const simulationDuration = _duration * remainingFraction\n\n      primaryAnimation.value = timing(\n        1.0,\n        {\n          duration: simulationDuration,\n          easing: animationCurve,\n        },\n        () => {\n          'worklet'\n\n          stopUserGesture()\n        },\n      )\n    } else {\n      // TODO: 结合松手时的速度作 spring 动画\n      const remainingFraction = t\n      const simulationDuration = _duration * remainingFraction\n      const animationCurve = Curves.easeOutCubic\n\n      primaryAnimation.value = timing(\n        0.0,\n        {\n          duration: simulationDuration,\n          easing: animationCurve,\n        },\n        () => {\n          'worklet'\n\n          stopUserGesture()\n          didPop()\n        },\n      )\n    }\n  },\n\n  handleVerticalDrag(evt) {\n    'worklet'\n\n    if (this.disableDrag) return\n    if (evt.state === GestureState.BEGIN) {\n      this.handleDragStart()\n    } else if (evt.state === GestureState.ACTIVE) {\n      const delta = evt.deltaY / this.childHeight.value\n      this.handleDragUpdate(delta)\n    } else if (evt.state === GestureState.END) {\n      const velocity = evt.velocityY\n      this.handleDragEnd(velocity)\n    } else if (evt.state === GestureState.CANCELLED) {\n      this.handleDragEnd(0.0)\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/preset-router/list/index.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/preset-router/list/index.wxml",
    "content": "<vertical-drag-gesture-handler tag=\"pan\" shouldResponseOnMove=\"shouldPanResponse\" simultaneousHandlers=\"{{ ['scroll'] }}\" onGestureEvent=\"handleVerticalDrag\" style=\"flex: 1; overflow: auto;width: 100%;\">\n  <view class=\"container\">\n    <view style=\"height: {{fullscreen === '1' ? 44 : 0}}px; background-color: rgb(249 ,249, 249);\" />\n    <view class=\"header\">\n      <view class=\"btn-wrp left-icon\" bind:tap=\"back\">\n        <view class=\"btn\">\n          <image class=\"icon\" src=\"../../../images/icon_down_arrow.svg\" mode=\"aspectFit\" />\n        </view>\n      </view>\n      <view>New Page</view>\n    </view>\n    <vertical-drag-gesture-handler tag=\"scroll\" native-view=\"scroll-view\" shouldResponseOnMove=\"shouldScrollViewResponse\" simultaneousHandlers=\"{{ ['pan'] }}\">\n      <scroll-view style=\"flex: 1; overflow: auto; width: 100%;\" scroll-y worklet:onscrollupdate=\"handleScroll\" adjustDecelerationVelocity=\"adjustDecelerationVelocity\" bounces=\"{{ false }}\" refresher-enabled=\"{{ false }}\" type=\"list\">\n        <block wx:for=\"{{list}}\" wx:key=\"id\">\n          <view bind:tap=\"goNextpage\" class=\"item\">\n            {{nextRouteType ? 'tap item' : 'item'}} {{item.id}}\n          </view>\n        </block>\n      </scroll-view>\n    </vertical-drag-gesture-handler>\n  </view>\n</vertical-drag-gesture-handler>"
  },
  {
    "path": "miniprogram/packageSkylineRouter/pages/preset-router/list/index.wxss",
    "content": "page {\n  height: 100vh;\n}\n\n.container {\n  width: 100%; \n  height: 100%; \n  display: flex; \n  flex-direction: column;\n}\n\n.header {\n\tposition: relative;\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tjustify-content: center;\n  height: 60px;\n  background-color: rgb(249 ,249, 249);\n}\n\n.header .btn-wrp {\n\tposition: absolute;\n\tleft: 0;\n\theight: 100%;\n\tpadding: 0 32rpx;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.header .btn {\n\twidth: 30px;\n\theight: 30px;\n  border: 1px solid #ccc;\n\tborder-radius: 15px;\n\tdisplay: flex;\n\talign-items: center;\n  justify-content: center;\n  font-size: 18px;\n}\n\n.empty {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 20px;\n  flex: 1;\n}\n\n.left-icon {\n  transform: rotate(90deg);\n}\n\n.header .icon {\n\twidth: 20px;\n\theight: 20px;\n}\n\n.item {\n  display: flex;\n  align-items: center;\n  padding: 20px;\n  font-size: 16px ;\n  border-top: 1px solid rgba(0, 0, 0, 0.15);\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/common/share-behavior.js",
    "content": "export default Behavior({\n  created() {\n    this.checkInitShare()\n  },\n  methods: {\n    checkInitShare() {\n      wx.xrScene = undefined\n\n      if (!this.scene) {\n        setTimeout(() => {\n          this.checkInitShare()\n        }, 100)\n        return\n      }\n\n      if (this.scene.ar) {\n        if (this.scene.ar.ready) {\n          this.initARTrackerState(this.scene)\n        } else {\n          this.scene.event.add('ar-ready', () => this.initARTrackerState(this.scene))\n        }\n      }\n\n      if (!this.scene.share.supported) {\n        console.warn('Not support xr-frame share system now!')\n        return\n      }\n\n      this.sharing = false\n      wx.xrScene = this.scene\n    },\n    initARTrackerState(scene) {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      scene.dfs(() => {}, undefined, true, el => {\n        const comp = el.getComponent(xrFrameSystem.ARTracker)\n        if (comp) {\n          if (typeof comp.state === 'number') {\n            this.triggerEvent('arTrackerState', { state: comp.state, error: comp.errorMessage })\n            el.event.add('ar-tracker-state', tracker => {\n              this.triggerEvent('arTrackerState', { state: tracker.state, error: tracker.errorMessage })\n            })\n          }\n          return true\n        }\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/pull-down-list/index.js",
    "content": "const itemHeight = 56 * 2\nComponent({\n  data: {\n    childBoxHeight: 0,\n  },\n  externalClasses: ['t-class'],\n  properties: {\n    defaultOpen: {\n      type: Boolean,\n      value: false,\n    },\n    name: {\n      type: String,\n      value: '',\n    },\n    tag: {\n      type: String,\n      value: '',\n    },\n    root: {\n      type: String,\n      value: '',\n    },\n    childArr: {\n      type: Array,\n      value: [],\n      observer(childArr) {\n        this.setData({\n          childBoxHeight: this.data.defaultOpen ? itemHeight * childArr.length : 0,\n        })\n      },\n    },\n  },\n  methods: {\n    switchHandle() {\n      const { childArr, childBoxHeight } = this.data\n      this.setData({\n        childBoxHeight: childBoxHeight > 0 ? 0 : childArr.length * itemHeight,\n      })\n    },\n    tapChild(e) {\n      this.triggerEvent('click', {\n        ...e.target.dataset,\n        root: this.data.root\n      })\n    },\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/pull-down-list/index.json",
    "content": "{\n  \"component\": true\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/pull-down-list/index.wxml",
    "content": "<view class=\"pullDownList t-class {{ childBoxHeight > 0 ? 'actived' : '' }}\">\n  <view class=\"switchBox\" catch:tap=\"switchHandle\">\n    <view class=\"name\">{{ name }}</view>\n    <view class=\"tag type-{{tag}}\">{{ tag === 'func' ? '能力' : ''}}{{ tag === 'template' ? '模版' : ''}}{{ tag === 'case' ? '案例' : ''}}</view>\n  </view>\n  <view class=\"childBox\" style=\"height: {{ childBoxHeight }}rpx\">\n    <view class=\"child {{item.class}}\" wx:for=\"{{childArr}}\" wx:key=\"name\" data-item=\"{{item}}\" bindtap=\"tapChild\">\n      {{ item.name }} {{ item.label }}\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/pull-down-list/index.wxss",
    "content": ".pullDownList {\n  width: 100%;\n  box-sizing: border-box;\n  background-color: #fff;\n  border-radius: 8rpx;\n  margin-bottom: 24rpx;\n  overflow: hidden;\n}\n.pullDownList .switchBox {\n  height: 120rpx;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 0 32rpx;\n  font-size: 32rpx;\n  line-height: 48rpx;\n  color: #333;\n}\n.pullDownList .tag {\n  width: 100rpx;\n  text-align: center;\n  border-radius: 5rpx;\n  font-size: 26rpx;\n}\n\n.pullDownList .tag.type-func {\n  color: #fff;\n  background-color: #29bf12;\n}\n\n.pullDownList .tag.type-template {\n  color: #fff;\n  background-color: #ff9914;\n}\n\n.pullDownList .tag.type-case {\n  color: #fff;\n  background-color: #08bdbd;\n}\n.pullDownList .name,\n.pullDownList .icon {\n  transition: opacity 0.3s;\n}\n.pullDownList .name {\n  opacity: 0.9;\n}\n.pullDownList.actived .name {\n  opacity: 0.4;\n}\n.pullDownList.actived .icon {\n  opacity: 0.4;\n}\n.pullDownList .childBox {\n  transition: height 0.3s;\n}\n.pullDownList .childBox .child {\n  box-sizing: border-box;\n  border-bottom: 1rpx solid #e5e5e5;\n  border-top-width: 2rpx;\n  height: 112rpx;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding-left: 32rpx;\n  padding-right: 32rpx;\n  font-size: 28rpx;\n  opacity: 0.9;\n}\n.pullDownList .childBox .child:last-of-type {\n  border-bottom-color: transparent;\n}\n\n.message {\n  border: 20rpx solid #000;\n}\n\n.ar {\n  border: 20rpx solid #1D5B79;\n}\n\n.custom {\n  border: 20rpx solid #468B97;\n}\n\n.gltf {\n  border: 20rpx solid #EF6262;\n}\n\n.tool {\n  border: 20rpx solid #F3AA60;\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arGlasses/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      xrScene.event.add('tick', this.handleTick.bind(this))\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n\n      // 延时保证场上存在脸模\n      setTimeout(() => {\n        const xrSystem = wx.getXrFrameSystem()\n\n        // 替换状态\n        const faceElm = this.scene.getElementById('face')\n        const faceGLTF = faceElm.getComponent(xrSystem.GLTF)\n\n        for (const mesh of faceGLTF.meshes) {\n          // 通过alphaMode 的 Setter 设置，或者写入renderState，但需要手动控制宏\n          mesh.material.alphaMode = 'BLEND'\n          mesh.material.setVector('u_baseColorFactor', xrSystem.Vector4.createFromNumber(1, 1, 1, 0.0))\n        }\n      }, 33)\n    },\n    handleARReady({ detail }) {\n      console.log('arReady')\n      this.setData({ arReady: true })\n    },\n    handleTick() {\n      const xrSystem = wx.getXrFrameSystem()\n      const trackerEl = this.scene.getElementById('tracker')\n      if (!trackerEl) {\n        return\n      }\n\n      const tracker = trackerEl.getComponent(xrSystem.ARTracker)\n      if (!tracker.arActive) {\n        return\n      }\n\n      // 这里只是例子，实际上用的是`ARTracker`的`autoSync`属性。\n      // 但也是一个更高自由度的选项。\n      // 视情况需要自己同步`tracker`的`scale`和`rotation`特定节点。\n      // 第一个参数是特征点编好，第二个是可选的复用结果，第三个是可选的是否相对于`ARTracker`。\n      // 为`false`为世界空间的位置，需要配合`scale`自己使用\n      const position = tracker.getPosition(98, new xrSystem.Vector3(), false)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arGlasses/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arGlasses/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Face;camera:Front;pose3d:true;\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-face\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/face.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-glass\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/glasses.glb\" />\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\" />\n  <xr-node>\n    <xr-ar-tracker id='tracker' mode=\"Face\">\n      <xr-gltf id=\"face\" node-id=\"gltf-face\" visible=\"{{loaded}}\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"1 1 1\" model=\"gltf-face\" never-cull></xr-gltf>\n      <xr-gltf node-id=\"gltf-glass\" visible=\"{{loaded}}\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"1 1 1\" model=\"gltf-glass\"></xr-gltf>\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera near=\"0.01\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.2\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"1\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arGlasses/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arLine/index.js",
    "content": "const colorPattern1 = [\n  [0.129, 0.612, 0.565],\n  [0.914, 0.722, 0.141],\n  [0.933, 0.576, 0.133],\n  [0.847, 0.247, 0.192],\n]\nconst colorPattern2 = [\n  [0.392, 0.6, 0.914],\n  [0.62, 0.867, 1],\n  [0.651, 0.965, 1],\n  [0.745, 1, 0.969],\n]\nComponent({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleARReady({ detail }) {\n      console.log('arReady', this.scene.ar.arVersion)\n\n      const xr = wx.getXrFrameSystem()\n      const scene = this.scene\n\n      const root = scene.getElementById('root')\n      const cursor = scene.getElementById('cursor')\n      const cursorTrs = cursor.getComponent(xr.Transform)\n\n      const geometryPoint = scene.assets.getAsset('geometry', 'sphere')\n      const geometryLine = scene.assets.getAsset('geometry', 'cube')\n      const effectStandard = scene.assets.getAsset('effect', 'standard')\n\n      let preCubeTrs\n      let touchFlag = false\n\n      // 缓存这些常量\n      const forward = xr.Vector3.createFromNumber(0, 0, 0)\n      const up = xr.Vector3.createFromNumber(0, 1, 0)\n      const useQuaternion = xr.Quaternion.createFromNumber(0, 0, 0, 0)\n\n      scene.event.add('touchstart', (e) => {\n        // 点击开始后，放置\n\n        if (touchFlag) {\n          // 控制点击频率\n          return\n        }\n        touchFlag = true\n\n        // 新的cube\n        const cubeEle = scene.createElement(xr.XRNode, {\n        })\n        const cubeTrs = cubeEle.getComponent(xr.Transform)\n        const mat = scene.createMaterial(effectStandard)\n        const color1 = colorPattern1[Math.floor(Math.random() * colorPattern1.length)]\n        mat.setVector('u_baseColorFactor', xr.Vector4.createFromNumber(color1[0], color1[1], color1[2], 1.0))\n        mat.setRenderState('cullFace', xr.ECullMode.BACK)\n        const mesh = cubeEle.addComponent(xr.Mesh, {\n          geometry: geometryPoint,\n          material: mat,\n        })\n        // 加到场上\n        root.addChild(cubeEle)\n\n        // 获取相机 cursor 位置，并设置到新元素\n        cubeTrs.setLocalMatrix(cursorTrs.worldMatrix)\n\n        // 延时，控制点击频率，并保证矩阵信息完备\n        setTimeout(() => {\n          touchFlag = false\n\n          if (preCubeTrs) {\n            // 存在上一个，进行连线\n            const preWorldPosition = preCubeTrs.worldPosition\n            const worldPosition = cubeTrs.worldPosition\n            // console.log(preWorldPosition.x, preWorldPosition.y, preWorldPosition.z, worldPosition.x, worldPosition.y, worldPosition.z)\n\n            // 算中点\n            const posX = (preWorldPosition.x + worldPosition.x) / 2\n            const posY = (preWorldPosition.y + worldPosition.y) / 2\n            const posZ = (preWorldPosition.z + worldPosition.z) / 2\n\n            // forwad 向量\n            preWorldPosition.sub(worldPosition, forward)\n            console.log(forward.x, forward.y, forward.z)\n\n            // 向量的模\n            const module = preWorldPosition.distanceTo(worldPosition)\n\n            // 方向四元数\n            xr.Quaternion.lookRotation(forward, up, useQuaternion)\n            console.log(useQuaternion.x, useQuaternion.y, useQuaternion.z, useQuaternion.w)\n\n            const lineSize = 0.02\n            // line\n            const lineEle = scene.createElement(xr.XRNode, {\n              position: `${posX} ${posY} ${posZ}`,\n              scale: `${lineSize} ${lineSize} ${module}`\n            })\n            // 加到场上\n            root.addChild(lineEle)\n            const lineTrs = lineEle.getComponent(xr.Transform)\n            lineTrs.quaternion.x = useQuaternion.x\n            lineTrs.quaternion.y = useQuaternion.y\n            lineTrs.quaternion.z = useQuaternion.z\n            lineTrs.quaternion.w = useQuaternion.w\n\n            const matLine = scene.createMaterial(effectStandard)\n            const color2 = colorPattern2[Math.floor(Math.random() * colorPattern2.length)]\n\n            matLine.setVector('u_baseColorFactor', xr.Vector4.createFromNumber(color2[0], color2[1], color2[2], 1.0))\n            matLine.setRenderState('cullFace', xr.ECullMode.FRONT)\n            const meshLine = lineEle.addComponent(xr.Mesh, {\n              geometry: geometryLine,\n              material: matLine,\n            })\n\n            preCubeTrs = cubeTrs\n          } else {\n            preCubeTrs = cubeTrs\n          }\n        }, 100)\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arLine/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arLine/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Plane\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets>\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\" />\n\n  <xr-node>\n    <xr-node node-id=\"center\" position=\"0 0 0\"></xr-node>\n    <xr-ar-tracker mode=\"Plane\">\n    </xr-ar-tracker>\n    \n    <!-- root 用于动态放置节点 -->\n    <xr-shadow id=\"root\"></xr-shadow>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    >\n      <xr-mesh id=\"cursor\" position=\"0 0 0.3\" rotation=\"0 0 0\" scale=\"0.03 0.03 0.03\" geometry=\"cube\"\n        uniforms=\"u_baseColorFactor:0.298 0.764 0.85 0.8\"\n        states=\"renderQueue: 3000, alphaMode: BLEND, cullFace: 2\"\n      ></xr-mesh>\n    </xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"0 0 0\" color=\"1 1 1\" intensity=\"0.5\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arLine/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arPreview/index.js",
    "content": "const STATE = {\n  NONE: -1,\n  MOVE: 0,\n  ZOOM_OR_PAN: 1\n}\n\nComponent({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      this.mat = new (wx.getXrFrameSystem().Matrix4)()\n      console.log('xr-scene', xrScene)\n      const { width, height } = this.scene\n      // 旋转缩放相关配置\n      this.radius = (width + height) / 4\n      this.rotateSpeed = 5\n\n      this.handleTouchStart = (event) => {\n        this.mouseInfo = {\n          startX: 0, startY: 0, isDown: false, startPointerDistance: 0, state: STATE.NONE\n        }\n        this.mouseInfo.isDown = true\n\n        const touch0 = event.touches[0]\n        const touch1 = event.touches[1]\n\n        if (event.touches.length === 1) {\n          this.mouseInfo.startX = touch0.pageX\n          this.mouseInfo.startY = touch0.pageY\n          this.mouseInfo.state = STATE.MOVE\n        } else if (event.touches.length === 2) {\n          const dx = (touch0.pageX - touch1.pageX)\n          const dy = (touch0.pageY - touch1.pageY)\n          this.mouseInfo.startPointerDistance = Math.sqrt(dx * dx + dy * dy)\n          this.mouseInfo.startX = (touch0.pageX + touch1.pageX) / 2\n          this.mouseInfo.startY = (touch0.pageY + touch1.pageY) / 2\n          this.mouseInfo.state = STATE.ZOOM_OR_PAN\n        }\n\n        this.scene.event.add('touchmove', this.handleTouchMove.bind(this))\n        this.scene.event.addOnce('touchend', this.handleTouchEnd.bind(this))\n      },\n      this.handleTouchMove = (event) => {\n        const mouseInfo = this.mouseInfo\n        if (!mouseInfo.isDown) {\n          return\n        }\n\n        switch (mouseInfo.state) {\n          case STATE.MOVE:\n            if (event.touches.length === 1) {\n              this.handleRotate(event)\n            } else if (event.touches.length === 2) {\n            // 支持单指变双指，兼容双指操作但是两根手指触屏时间不一致的情况\n              this.scene.event.remove('touchmove', this.handleTouchMove)\n              this.scene.event.remove('touchend', this.handleTouchEnd)\n              this.handleTouchStart(event)\n            }\n            break\n          case STATE.ZOOM_OR_PAN:\n            if (event.touches.length === 1) {\n            // 感觉双指松掉一指的行为还是不要自动切换成旋转了，实际操作有点奇怪\n            } else if (event.touches.length === 2) {\n              this.handleZoomOrPan(event)\n            }\n            break\n          default:\n            break\n        }\n      }\n\n      this.handleTouchEnd = (event) => {\n        this.mouseInfo.isDown = false\n        this.mouseInfo.state = STATE.NONE\n\n        this.scene.event.remove('touchmove', this.handleTouchMove)\n        this.scene.event.addOnce('touchstart', this.handleTouchStart)\n      }\n\n      this.handleRotate = (event) => {\n        const x = event.touches[0].pageX\n        const y = event.touches[0].pageY\n\n        const { startX, startY } = this.mouseInfo\n\n        const theta = (x - startX) / this.radius * -this.rotateSpeed\n        const phi = (y - startY) / this.radius * -this.rotateSpeed\n        if (Math.abs(theta) < 0.01 && Math.abs(phi) < 0.01) {\n          return\n        }\n        this.gltfItemTRS.rotation.x -= phi\n        this.gltfItemSubTRS.rotation.y -= theta\n        this.mouseInfo.startX = x\n        this.mouseInfo.startY = y\n      }\n\n      this.handleZoomOrPan = (event) => {\n        const touch0 = event.touches[0]\n        const touch1 = event.touches[1]\n\n        const dx = (touch0.pageX - touch1.pageX)\n        const dy = (touch0.pageY - touch1.pageY)\n        const distance = Math.sqrt(dx * dx + dy * dy)\n\n        let deltaScale = distance - this.mouseInfo.startPointerDistance\n        this.mouseInfo.startPointerDistance = distance\n        this.mouseInfo.startX = (touch0.pageX + touch1.pageX) / 2\n        this.mouseInfo.startY = (touch0.pageY + touch1.pageY) / 2\n        if (deltaScale < -2) {\n          deltaScale = -2\n        } else if (deltaScale > 2) {\n          deltaScale = 2\n        }\n\n        const s = deltaScale * 0.02 + 1\n        // 缩小\n        this.gltfItemTRS.scale.x *= s\n        this.gltfItemTRS.scale.y *= s\n        this.gltfItemTRS.scale.z *= s\n      }\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      // this.setData({loaded: true});\n      this.placedFlag = false\n      this.scene.event.addOnce('touchstart', this.placeNode.bind(this))\n    },\n    handleARReady({ detail }) {\n      console.log('arReady', this.scene.ar.arVersion)\n    },\n    placeNode(event) {\n      if (this.placedFlag) {\n        return\n      }\n      const xrFrameSystem = wx.getXrFrameSystem()\n      this.placedFlag = true\n      this.scene.ar.placeHere('setitem', true)\n      const anchorTRS = this.scene.getElementById('anchor').getComponent(xrFrameSystem.Transform)\n      anchorTRS.setData({ visible: false })\n      anchorTRS.scale.x = 0\n      anchorTRS.scale.y = 0\n      anchorTRS.scale.z = 0\n      wx.setKeepScreenOn({ keepScreenOn: true })\n\n      // 获取改动元素\n      this.gltfItemTRS = this.scene.getElementById('preview-model').getComponent(xrFrameSystem.Transform)\n      this.gltfItemSubTRS = this.scene.getElementById('preview-model-sub').getComponent(xrFrameSystem.Transform)\n\n      // 开启旋转缩放逻辑\n      this.scene.event.addOnce('touchstart', this.handleTouchStart)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arPreview/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arPreview/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Plane\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-item\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/just_a_girl/index.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"anchor\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/ar-plane-marker.glb\" />\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-node>\n    <xr-ar-tracker mode=\"Plane\">\n      <xr-gltf id=\"anchor\" model=\"anchor\"></xr-gltf>\n    </xr-ar-tracker>\n    <xr-node node-id=\"setitem\" visible=\"false\">\n      <xr-node id=\"preview-model\">\n        <xr-node id=\"preview-model-sub\" scale=\"0.005 0.005 0.005\">\n          <xr-gltf id=\"setitem-gltf\" model=\"gltf-item\" never-cull/>\n        </xr-node>\n      </xr-node>\n    </xr-node>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arPreview/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arui/index.js",
    "content": "const STATE = {\n  NONE: -1,\n  MOVE: 0,\n  ZOOM_OR_PAN: 1\n}\n\nComponent({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      // this.setData({loaded: true});\n      this.placedFlag = false\n      this.scene.event.addOnce('touchstart', this.placeNode.bind(this))\n    },\n    handleARReady({ detail }) {\n      console.log('arReady', this.scene.ar.arVersion)\n    },\n    placeNode(event) {\n      if (this.placedFlag) {\n        return\n      }\n      const xrFrameSystem = wx.getXrFrameSystem()\n      this.placedFlag = true\n      this.scene.ar.placeHere('setitem', true)\n      const anchorTRS = this.scene.getElementById('anchor').getComponent(xrFrameSystem.Transform)\n      anchorTRS.setData({ visible: false })\n      anchorTRS.scale.x = 0\n      anchorTRS.scale.y = 0\n      anchorTRS.scale.z = 0\n      wx.setKeepScreenOn({ keepScreenOn: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arui/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arui/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Plane\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"anchor\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/ar-plane-marker.glb\" />\n    <xr-asset-load type=\"texture\" asset-id=\"bg\" src=\"https://holodata.s3.cn-northwest-1.amazonaws.com.cn/nameCardData/mingpiantu.png\" />\n    <xr-asset-material asset-id=\"simple-mat\" effect=\"simple\" />\n    <xr-asset-material asset-id=\"text-mat\" effect=\"simple\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"center\" position=\"0 0 0\"></xr-node>\n    <xr-ar-tracker mode=\"Plane\">\n      <xr-gltf id=\"anchor\" model=\"anchor\"></xr-gltf>\n    </xr-ar-tracker>\n    \n    <xr-node node-id=\"setitem\" visible=\"false\">\n      <xr-node node-id=\"ui-block\" scale=\"0.1 0.1 0.1\">\n        <xr-mesh node-id=\"mesh-sphere\" position=\"0 0 -2.1\" scale=\"2 2 2\" geometry=\"sphere\" uniforms=\"u_baseColorFactor:0.937 0.176 0.368 1\"></xr-mesh>\n        <xr-mesh\n          position=\"0 0 -0.01\" scale=\"10 1 5\" rotation=\"90 0 0\" geometry=\"plane\" material=\"simple-mat\"\n          uniforms=\"u_baseColorMap: bg\" states=\"cullOn: false, alphaMode: BLEND,renderQueue: 2500\"\n        ></xr-mesh>\n        <xr-node node-id=\"text-wrap\" position=\"-4 1.4 0\">\n          <xr-text\n            material=\"text-mat\" value=\"李逍遥\"\n            position=\"0 0 0\" never-cull\n            size=\"0.6\" anchor=\"0 1\" uniforms=\"u_baseColorFactor:1.0 1.0 1.0 1\"\n          ></xr-text>\n          <xr-text\n            material=\"text-mat\" value=\"原是一乡下客栈店小二，天资聪颖，因一壶酒被酒剑仙传授了蜀山仙剑派剑术，在仙灵岛与赵灵儿相遇，自此经历重重磨难成长为一代旷世奇侠\"\n            position=\"0 -0.8 0\" never-cull\n            width=\"8\"\n            size=\"0.4\" anchor=\"0 1\" uniforms=\"u_baseColorFactor:1.0 1.0 1.0 1\"\n          ></xr-text>\n          <xr-text\n            material=\"text-mat\" value=\"仙剑奇侠传\"\n            position=\"8 -2.7 0\" never-cull\n            size=\"0.4\" anchor=\"1 0\" uniforms=\"u_baseColorFactor:1.0 1.0 1.0 1\"\n          ></xr-text>\n        </xr-node>\n      </xr-node>\n    </xr-node>\n    \n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-arui/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-blendDouble/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setBlend()\n    },\n    setBlend() {\n      const scene = this.scene\n      const xrSystem = wx.getXrFrameSystem()\n\n      // 替换状态\n      const blendElm = this.scene.getElementById('blend')\n      const blendGLTF = blendElm.getComponent(xrSystem.GLTF)\n      // 延时保证glTF解析完毕\n      setTimeout(() => {\n        const frontMesh = blendGLTF.getPrimitivesByMeshName('柱体')[0].primitives[0]\n        const frontMat = frontMesh.material\n        // 正面\n        // 改变 RenderQueue 先绘制\n        frontMat.setRenderState('renderQueue', 2500)\n        // 开启剔除，去掉背面\n        frontMat.setRenderState('cullOn', true)\n        frontMat.setRenderState('cullFace', xrSystem.ECullMode.BACK)\n\n        const backMesh = blendGLTF.getPrimitivesByMeshName('柱体.001')[0].primitives[0]\n        const backMat = backMesh.material\n        // 背面\n        // 改变 RenderQueue 后绘制\n        backMat.setRenderState('renderQueue', 2501)\n        // 开启剔除，去掉正面\n        backMat.setRenderState('cullOn', true)\n        backMat.setRenderState('cullFace', xrSystem.ECullMode.FRONT)\n      }, 200)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-blendDouble/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-blendDouble/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-blend\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/blend.glb\" /> \n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day2\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-gltf id=\"blend\" position=\"0 -0.6 0\" rotation=\"0 0 0\" scale=\"1.2 1.2 1.2\" model=\"gltf-blend\"></xr-gltf>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"2 2 4\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"camera-target\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.6\" />\n    <xr-light type=\"directional\" rotation=\"20 120 0\" color=\"1 1 1\" intensity=\"2\"/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-blendDouble/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-control/index.js",
    "content": "let camera\nlet player\nlet xrFrameSystem\n// 位移速度\nconst speed = 5\n// 视角旋转的速度\nconst smoothSpeed = 8\n\n// 世界坐标系下的标准方位\nlet up\nlet left\n\n// player相关\nlet position\nlet quaternionP // player的四元数\nlet quaternionPIni // player每次转动开始时的角度\nlet quaternionPRes // player每次需要转动到的角度\nlet quaternionPTemp // 旋转四元数的临时变量\n\n// camera相关\nlet quaternionC // camera的四元数\nlet quaternionCIni // camera每次转动开始时的角度\nlet quaternionCRes // camera每次需要转动到的角度\n\n// 初始化是否完成的标记\nlet initFinish = false\n\nComponent({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    width: Number,\n    height: Number,\n    transferData: {\n      type: Object,\n      observer(newVal, oldVal) {\n        if (newVal.biasRotX != undefined) {\n          this.biasRotX = newVal.biasRotX\n          this.biasRotY = newVal.biasRotY\n        }\n\n        if (newVal.initRotX != undefined) {\n          this.initRotX = newVal.initRotX\n          this.initRotY = newVal.initRotY\n        }\n\n        if (newVal.biasX != undefined) {\n          this.biasX = newVal.biasX\n          this.biasY = newVal.biasY\n        }\n      },\n    },\n    reset: {\n      type: Number,\n      observer(newVal, oldVal) {\n        // 监听发生变化的reset后，执行重置逻辑\n        position.set(xrFrameSystem.Vector3.createFromNumber(0, 1.6, 1))\n        quaternionC.setFromYawRollPitch(0, 0, 0)\n        quaternionP.setFromYawRollPitch(Math.PI, 0, 0)\n      }\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({\n      detail\n    }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n\n      xrFrameSystem = wx.getXrFrameSystem()\n      camera = xrScene.getElementById('camera')\n      player = xrScene.getElementById('player')\n\n      up = xrFrameSystem.Vector3.createFromNumber(0, 1, 0)\n      left = xrFrameSystem.Vector3.createFromNumber(1, 0, 0)\n\n      quaternionC = camera.getComponent(xrFrameSystem.Transform).quaternion\n      quaternionP = player.getComponent(xrFrameSystem.Transform).quaternion\n      position = player.getComponent(xrFrameSystem.Transform).position\n\n      quaternionPIni = new xrFrameSystem.Quaternion()\n      quaternionPIni.set(quaternionP)\n      quaternionPRes = new xrFrameSystem.Quaternion()\n      quaternionPRes.set(quaternionP)\n      quaternionPTemp = new xrFrameSystem.Quaternion()\n      quaternionPTemp.setFromYawRollPitch(0, 0, 0)\n\n      quaternionCIni = new xrFrameSystem.Quaternion()\n      quaternionCIni.set(quaternionC)\n      quaternionCRes = new xrFrameSystem.Quaternion()\n      quaternionCRes.set(quaternionC)\n\n      this.biasRotX = 0\n      this.biasRotY = 0\n      this.initRotX = 0\n      this.initRotY = 0\n      this.biasX = 0\n      this.biasY = 0\n\n      initFinish = true\n    },\n    handleAssetsProgress({\n      detail\n    }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({\n      detail\n    }) {\n      console.log('assets loaded', detail.value)\n\n      this.setData({\n        loaded: true\n      })\n    },\n    handleTick(dt) {\n      // 确保handleReady时期的初始化完成\n      if (!initFinish) return\n\n      const deltaTime = dt.detail.value / 1000\n\n      // ------摄像头旋转逻辑------//\n      const rotX = (this.biasRotX - this.initRotX) / this.data.width * Math.PI\n      const rotY = (this.biasRotY - this.initRotY) / this.data.height * Math.PI\n\n      // 水平方向旋转player node\n      if (this.biasRotX == 0) {\n        quaternionPIni.set(quaternionPTemp)\n        quaternionPRes.set(quaternionPTemp)\n      } else {\n        quaternionPIni.multiply(xrFrameSystem.Quaternion.createFromAxisAngle(up, -rotX), quaternionPRes)\n      }\n\n      // 垂直方向旋转camera node\n      if (this.biasRotY == 0) {\n        quaternionCIni.set(quaternionCRes)\n        quaternionCRes.set(quaternionCRes)\n      } else {\n        quaternionCIni.multiply(xrFrameSystem.Quaternion.createFromAxisAngle(left, rotY), quaternionCRes)\n      }\n\n      quaternionPTemp.slerp(quaternionPRes, smoothSpeed * deltaTime, quaternionPTemp)\n      quaternionC.slerp(quaternionPTemp.multiply(quaternionCRes), smoothSpeed * deltaTime, quaternionC)\n\n      // ------摄像头位移逻辑------//\n      const x = this.biasX\n      const y = this.biasY\n\n      if (x || y) {\n        const z = Math.sqrt(x * x + y * y)\n        let ratio = z / 50 // 此处除以50，因为摇杆盘半径为50\n        ratio = ratio > 1 ? 1 : ratio < 0 ? 0 : ratio\n        let temp = xrFrameSystem.Vector3.createFromNumber(-x / z, 0, -y / z)\n        temp = temp.scale(ratio * speed * deltaTime)\n        // 位移需要根据旋转角度做转化, 这里需要取得camera的世界旋转矩阵\n        temp.applyQuaternion(camera.getComponent(xrFrameSystem.Transform).worldQuaternion)\n        position.set(position.add(temp))\n      }\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-control/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-control/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\" bind:tick=\"handleTick\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\"/>\n  \n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -0.02 -4\" rotation=\"0 0 0\" scale=\"5 1 5\" geometry=\"plane\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\" receive-shadow></xr-mesh>\n    <xr-mesh id=\"cube\" node-id=\"mesh-cube\" position=\"-1 0.5 -3.5\" scale=\"1 1 1\" rotation=\"0 45 0\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.298 0.764 0.85 1\" cast-shadow></xr-mesh>\n    <xr-mesh node-id=\"mesh-cylinder\" position=\"1 0.7 -3.5\" scale=\"1 0.7 1\" geometry=\"cylinder\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:1 0.776 0.364 1\" cast-shadow></xr-mesh>\n    <xr-mesh node-id=\"mesh-sphere\" position=\"0 1.25 -5\" scale=\"1.25 1.25 1.25\" geometry=\"sphere\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.937 0.176 0.368 1\" cast-shadow></xr-mesh>\n\n    <xr-node id=\"player\" node-id=\"player\" position=\"0 1.6 1\" rotation=\"0 180 0\">\n      <xr-camera\n        id=\"camera\" node-id=\"camera\"\n        position=\"0 0 0\" rotation=\"0 0 0\"\n        clear-color=\"0.925 0.925 0.925 1\"\n        background=\"skybox\"\n      ></xr-camera>\n    </xr-node>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-control/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-dissolve/index.js",
    "content": "// 着色器\nimport dissolveVert from './shaders/dissolveVert'\nimport dissolveFrag from './shaders/dissolveFrag'\n\nconst xrFrameSystem = wx.getXrFrameSystem()\n\nComponent({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    width: {\n      type: Number\n    },\n    height: {\n      type: Number\n    },\n    thresHold: {\n      type: Number,\n      value: 0,\n    },\n    autoPlay: {\n      type: Boolean,\n      value: false,\n    },\n  },\n  data: {\n    loaded: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    },\n    detached() {\n    }\n  },\n  pageLifetimes: {\n    hide() {\n    },\n    show() {\n    }\n  },\n  methods: {\n    handleReady({\n      detail\n    }) {\n      console.log('scene progress', detail.value)\n      this.scene = detail.value\n      this.camera = this.scene.getElementById('camera')\n      this.root = this.scene.getElementById('root')\n      this.offset = -0.005\n    },\n\n    handleTick(delta) {\n      if (this.data.autoPlay) {\n        if (this.dissolveMaterial.getFloat('u_threshold') < 0) {\n          this.dissolveMaterial.setFloat('u_threshold', 0)\n          this.offset = 0.005\n        }\n        if (this.dissolveMaterial.getFloat('u_threshold') > 1) {\n          this.dissolveMaterial.setFloat('u_threshold', 1)\n          this.offset = -0.005\n        }\n        this.dissolveMaterial.setFloat('u_threshold', this.dissolveMaterial.getFloat('u_threshold') + this.offset)\n      } else {\n        this.dissolveMaterial.setFloat('u_threshold', this.data.thresHold)\n      }\n    },\n\n    handleAssetsProgress({\n      detail\n    }) {\n      console.log('assets progress', detail.value)\n    },\n\n    handleAssetsLoaded({\n      detail\n    }) {\n      console.log('assets loaded', detail.value)\n      this.setData({\n        loaded: true\n      })\n\n      this.dissolveMaterial = this.scene.createMaterial(this.createDissolveEffect(), {\n        u_mainTexture: this.scene.assets.getAsset('texture', 'surface_texture1'),\n        u_mainTexture2: this.scene.assets.getAsset('texture', 'surface_texture2'),\n        u_noiseTexture: this.scene.assets.getAsset('texture', 'noise_texture'),\n      })\n\n      const geometryPlane = this.scene.assets.getAsset('geometry', 'plane')\n      const planeElem = this.scene.createElement(xrFrameSystem.XRNode, {\n        position: '0 0 0',\n        scale: '3 3 3',\n      })\n\n      //   this.dissolveMaterial.setVector('u_firstColor', xrFrameSystem.Vector4.createFromNumber(1.0, 0.0, 0.0, 1.0));\n      //   this.dissolveMaterial.setVector('u_secondColor', xrFrameSystem.Vector4.createFromNumber(0.0, 1.0, 0.0, 1.0));\n      planeElem.addComponent(xrFrameSystem.Mesh, {\n        geometry: geometryPlane,\n        material: this.dissolveMaterial,\n      })\n      // 加到场上\n      this.root.addChild(planeElem)\n\n      // 绑定tick事件\n      this.scene.event.add('tick', this.handleTick.bind(this))\n    },\n\n    createDissolveEffect() {\n      const effect = this.scene.createEffect({\n        name: 'dissolveEffect',\n        properties: [\n          { key: 'u_firstColor', type: xrFrameSystem.EUniformType.FLOAT4, default: [1, 0, 0, 1] },\n          { key: 'u_secondColor', type: xrFrameSystem.EUniformType.FLOAT4, default: [0, 1, 0, 1] },\n          { key: 'u_threshold', type: xrFrameSystem.EUniformType.FLOAT, default: [0.5] },\n          { key: 'u_edgeWidth', type: xrFrameSystem.EUniformType.FLOAT, default: [0.1] },\n        ],\n        images: [\n          {\n            key: 'u_mainTexture',\n            default: 'white',\n            macro: 'WX_USE_BASECOLORMAP'\n          },\n          {\n            key: 'u_mainTexture2',\n            default: 'white',\n            macro: 'WX_USE_BASECOLORMAP'\n          },\n          {\n            key: 'u_noiseTexture',\n            default: 'white',\n            macro: 'WX_USE_BASECOLORMAP'\n          }\n        ],\n        defaultRenderQueue: 2000,\n        passes: [\n          {\n            renderStates: {\n              cullOn: false,\n              blendOn: false,\n              depthWrite: true,\n              depthTestOn: true,\n              cullFace: xrFrameSystem.ECullMode.BACK,\n            },\n            lightMode: 'ForwardBase',\n            useMaterialRenderStates: false,\n            shaders: [0, 1]\n          }],\n        shaders: [\n          dissolveVert,\n          dissolveFrag,\n        ],\n      })\n      return effect\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-dissolve/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\",\n  \"disableScroll\": true\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-dissolve/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"texture\" asset-id=\"surface_texture1\" src=\"https://holodata.s3.cn-northwest-1.amazonaws.com.cn/nameCardData/mingpiantu.png\" />\n    <xr-asset-load type=\"texture\" asset-id=\"surface_texture2\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/waifu.png\" />\n    <xr-asset-load type=\"texture\" asset-id=\"noise_texture\" src=\"http://dldir1.qq.com/weixin/checkresupdate/noise_bf2307bb2d5c42e8ad946134c7b071bd.png\"/>\n  </xr-assets>\n  <xr-node>\n    <xr-shadow id=\"root\"></xr-shadow>\n    <xr-node id=\"camera-target\" node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-camera id=\"camera\" node-id=\"camera\" position=\"2 3 -5\" clear-color=\"0.96 0.96 0.96 1\" target=\"camera-target\" near=\"0.1\" far=\"2000\" camera-orbit-control=\"\" background=\"skybox\"></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1.2\" />\n    <xr-light type=\"directional\" rotation=\"40 0 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-dissolve/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-dissolve/shaders/dissolveFrag.js",
    "content": "export default `#version 100\nprecision mediump float;\nprecision highp int;\nvarying highp vec2 v_UV;\n\nuniform float u_threshold;\nuniform float u_edgeWidth; // 边缘宽度\nuniform vec4 u_firstColor;\nuniform vec4 u_secondColor;\n\nuniform sampler2D u_mainTexture;\nuniform sampler2D u_mainTexture2;\nuniform sampler2D u_noiseTexture;\n\nvoid main()\n{\n  float cutout = texture2D(u_noiseTexture, v_UV).r;\n  vec4 mainColor;\n  vec4 color;\n  if (cutout < u_threshold)\n  {\n    mainColor = texture2D(u_mainTexture2, v_UV);\n    color = mainColor;\n  }\n  else\n  {\n    mainColor = texture2D(u_mainTexture, v_UV);\n    float factor = clamp((cutout - u_threshold) / u_edgeWidth, 0.0, 1.0);\n    vec4 edgeColor = mix(u_firstColor, u_secondColor, factor);\n    color = mix(edgeColor, mainColor, factor);\n  }\n  gl_FragColor = vec4(color.rgb, 1.0);\n} \n\n    `\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-dissolve/shaders/dissolveVert.js",
    "content": "export default `#version 100\nuniform highp mat4 u_view;\nuniform highp mat4 u_projection;\nuniform highp mat4 u_world;\n\nattribute vec3 a_position;\nattribute highp vec2 a_texCoord;\n\nvarying highp vec2 v_UV;\n\nvoid main(){\n  v_UV = a_texCoord;\n  gl_Position = u_projection * u_view * u_world * vec4(a_position, 1.0);\n}\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-featherVideo/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    loading: false,\n    gltfLoaded: false,\n    videoLoaded: false,\n    gltfIdList: [],\n    videoIdList: [],\n  },\n  properties: {\n    gltfListRaw: {\n      type: Array,\n      value: [],\n    },\n    videoListRaw: {\n      type: Array,\n      value: [],\n    },\n  },\n  observers: {\n    gltfListRaw(newVal) {\n      this.releaseGLTF()\n      this.loadGLTF(newVal)\n    },\n    videoListRaw(newVal) {\n      this.releaseVideo()\n      this.loadVideo(newVal)\n    },\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      // 绑定tick事件\n      xrScene.event.add('tick', this.handleTick.bind(this))\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleTick() {\n    },\n    releaseGLTF() {\n      if (this.data.gltfIdList && this.data.gltfIdList.length > 0) {\n        const scene = this.scene\n\n        this.data.gltfIdList.map((id) => {\n          // 释放加载过的资源\n          scene.assets.releaseAsset('gltf', `gltf-${id}`)\n        })\n      }\n    },\n    async loadGLTF(gltfList) {\n      const scene = this.scene\n\n      if (gltfList.length > 0) {\n        const gltfIdList = []\n        const gltfModel = await Promise.all(gltfList.map((gltfItem) => {\n          gltfIdList.push(gltfItem.id)\n          const gtltfPromise = scene.assets.loadAsset({\n            type: 'gltf',\n            assetId: `gltf-${gltfItem.id}`,\n            src: gltfItem.src,\n          })\n          return gtltfPromise\n        }))\n\n        console.log('glTF asset loaded')\n        this.setData({\n          gltfIdList,\n          gltfLoaded: true\n        })\n      } else {\n        this.setData({\n          gltfIdList: [],\n          gltfLoaded: false,\n        })\n      }\n    },\n    releaseVideo() {\n      if (this.data.videoIdList && this.data.videoIdList.length > 0) {\n        const scene = this.scene\n\n        this.data.videoIdList.map((id) => {\n          // 释放加载过的资源\n          scene.assets.releaseAsset('video-texture', `video-${id}`)\n          scene.assets.releaseAsset('material', `video-mat-${id}`)\n        })\n      }\n    },\n    async loadVideo(videoList) {\n      const scene = this.scene\n      if (videoList.length > 0) {\n        const videoIdList = []\n        const videos = await Promise.all(videoList.map((videoItem) => {\n          videoIdList.push(videoItem.id)\n          return scene.assets.loadAsset({\n            type: 'video-texture',\n            assetId: `video-${videoItem.id}`,\n            src: videoItem.src,\n            options: { autoPlay: true, loop: true },\n          })\n        }))\n\n        videos.map((videoTexture, index) => {\n          const videoMat = scene.createMaterial(\n            scene.assets.getAsset('effect', 'standard'),\n            { u_baseColorMap: videoTexture.value.texture }\n          )\n          scene.assets.addAsset('material', `video-mat-${videoList[index].id}`, videoMat)\n        })\n        console.log('video asset loaded')\n        this.setData({\n          videoIdList,\n          videoLoaded: true\n        })\n      } else {\n        this.setData({\n          videoIdList: [],\n          videoLoaded: false\n        })\n      }\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-featherVideo/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-featherVideo/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-mesh node-id=\"floor-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"10 1 10\" geometry=\"plane\"\n      uniforms=\"u_baseColorFactor:1 1 1 1\" receive-shadow\n    ></xr-mesh>\n    <!-- glTF -->\n    <xr-node wx:if=\"{{gltfLoaded}}\">\n      <xr-node\n        wx:for=\"{{gltfIdList}}\" wx:for-item=\"gltfId\"\n        wx:key=\"gltfId\"\n      >\n        <xr-gltf\n          wx:if=\"{{gltfId == 0}}\"\n          position=\"-1 -0.46 -1\" rotation=\"0 0 0\"\n          scale=\"0.6 0.6 0.6\"\n          model=\"gltf-{{gltfId}}\"\n          cast-shadow\n        ></xr-gltf>\n        <xr-gltf\n          wx:if=\"{{gltfId == 1}}\"\n          position=\"1 -0.98 -1\" rotation=\"0 0 0\"\n          scale=\"0.015 0.015 0.015\"\n          model=\"gltf-{{gltfId}}\"\n          cast-shadow\n        ></xr-gltf>\n      </xr-node>\n    </xr-node>\n    <!-- Video -->\n    <xr-node wx:if=\"{{videoLoaded}}\">\n      <xr-node\n        wx:for=\"{{videoIdList}}\" wx:for-item=\"videoId\"\n        wx:key=\"videoId\"\n      >\n      <xr-mesh\n        wx:if=\"{{videoId == 0}}\"\n        node-id=\"mesh-cube\" position=\"-1 -0.5 1\" scale=\"0.8 1.4 0.8\"\n        geometry=\"cube\" material=\"video-mat-{{videoId}}\"\n        cast-shadow\n      />\n      </xr-node>\n    </xr-node>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 2 4\" clear-color=\"0.8 0.8 0.8 1\"\n      target=\"camera-target\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-featherVideo/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-frameEffect/index.js",
    "content": "Component({\n  properties: {\n  },\n  data: {\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const createFrameEffect = (scene) => {\n        const xrFrameSystem = wx.getXrFrameSystem()\n        return scene.createEffect({\n          name: 'frame-effect',\n          properties: [\n            {\n              key: 'columCount',\n              type: xrFrameSystem.EUniformType.FLOAT,\n              default: 1\n            },\n            {\n              key: 'rowCount',\n              type: xrFrameSystem.EUniformType.FLOAT,\n              default: 1\n            },\n            {\n              key: 'during',\n              type: xrFrameSystem.EUniformType.FLOAT,\n              default: 1\n            }\n          ],\n          images: [\n            {\n              key: 'u_baseColorMap',\n              default: 'white',\n              macro: 'WX_USE_BASECOLORMAP'\n            }\n          ],\n          // 透明物体需要大于`2500`！\n          defaultRenderQueue: 2501,\n          passes: [\n            {\n              renderStates: {\n                blendOn: false,\n                depthWrite: true,\n                cullOn: false,\n                // 基础库 v3.0.1 开始 默认的 plane 切为适配 cw 的顶点绕序\n              },\n              lightMode: 'ForwardBase',\n              useMaterialRenderStates: true,\n              shaders: [0, 1]\n            }\n          ],\n          shaders: [`#version 100\n\n          precision highp float;\n          precision highp int;\n    \n          attribute vec3 a_position;\n          attribute highp vec2 a_texCoord;\n      \n          uniform mat4 u_view;\n          uniform mat4 u_projection;\n          uniform mat4 u_world;\n          varying highp vec2 v_uv;\n          void main()\n          {\n            v_uv = a_texCoord;\n            gl_Position = u_projection * u_view * u_world * vec4(a_position, 1.0);\n          }`,\n          // float 使用 highp 保证精度\n          `#version 100\n            precision highp float;\n            precision highp int;\n\n            uniform sampler2D u_baseColorMap;\n            uniform highp float u_gameTime;\n            uniform highp float rowCount;\n            uniform highp float columCount;\n            uniform highp float during;\n            varying highp vec2 v_uv;\n            void main()\n            {\n              float loopTime = mod(u_gameTime, during);\n\n              float tickPerFrame = during / (columCount * rowCount);\n              \n              float columTick = mod(floor(loopTime / tickPerFrame), columCount);\n              float rowTick = floor(loopTime / tickPerFrame / columCount);\n\n              vec2 texCoord = vec2(v_uv.x / columCount + (1.0 / columCount) * columTick , v_uv.y / rowCount + (1.0 / rowCount) * rowTick);\n              vec4 color = texture2D(u_baseColorMap, texCoord);\n              gl_FragColor = color;\n            }`\n          ],\n        })\n      }\n      console.log('序列帧特效加载')\n      xrFrameSystem.registerEffect('frame-effect', createFrameEffect)\n      const xrScene = this.scene = detail.value\n      this.loadAsset()\n    },\n    async loadAsset() {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const xrScene = this.scene\n      // const shadowRoot = xrScene.getElementById(\"shadow-root\");\n\n      await xrScene.assets.loadAsset({ type: 'texture', assetId: 'frame', src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/sprite-frames.png' })\n\n      // 第一个参数是效果实例的引用，第二个参数是默认`uniforms`\n      const frameMaterial = xrScene.createMaterial(\n        // 使用定制的效果\n        xrScene.assets.getAsset('effect', 'frame-effect'),\n        { u_baseColorMap: xrScene.assets.getAsset('texture', 'frame') }\n      )\n\n      // 可以将其添加到资源系统中备用\n      xrScene.assets.addAsset('material', 'frame-effect', frameMaterial)\n\n      const meshElement = xrScene.getElementById('animation-mesh').getComponent(xrFrameSystem.Mesh)\n      frameMaterial.setFloat('columCount', 4)\n      frameMaterial.setFloat('rowCount', 32)\n      frameMaterial.setFloat('during', 2)\n      frameMaterial.alphaMode = 'BLEND'\n      meshElement.material = frameMaterial\n\n      // 不同的序列帧需要使用不同的材质\n      const frameMaterial2 = xrScene.createMaterial(\n        // 使用定制的效果\n        xrScene.assets.getAsset('effect', 'frame-effect'),\n        { u_baseColorMap: xrScene.assets.getAsset('texture', 'frame') }\n      )\n\n      const meshElement2 = xrScene.getElementById('animation-mesh2').getComponent(xrFrameSystem.Mesh)\n      frameMaterial2.setFloat('columCount', 4)\n      frameMaterial2.setFloat('rowCount', 32)\n      frameMaterial2.setFloat('during', 2)\n      frameMaterial2.alphaMode = 'BLEND'\n      meshElement2.material = frameMaterial2\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-frameEffect/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-frameEffect/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets>\n  </xr-assets>\n  <xr-node>\n    <xr-shadow id=\"shadow-root\"></xr-shadow>\n    <xr-node node-id=\"center\"></xr-node>\n    <!-- <xr-mesh position=\"0 -0.06 0\" scale=\"1.4 0.1 1.4\" uniforms=\"u_baseColorFactor:0.3 0.4 0.6 1\" geometry=\"cube\"></xr-mesh> -->\n    <xr-mesh id=\"animation-mesh\" node-id=\"animation-mesh\" position=\"0 0 -0.5\" scale=\"1 1 1\" geometry=\"plane\"></xr-mesh>\n    <xr-mesh id=\"animation-mesh2\" node-id=\"animation-mesh2\" position=\"0 0 0.5\" scale=\"1 1 1\" geometry=\"plane\"></xr-mesh>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 3 0.5\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"center\"\n      camera-orbit-control=\"true\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\"/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-frameEffect/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-geometry/index.js",
    "content": "function getVertexBuffer(vertexData) {\n  const vertexCount = vertexData.length / 12\n  const noise = 0.03\n  for (let i = 0; i < vertexCount; i++) {\n    const vertexIndex = i * 12\n    // x\n    vertexData[vertexIndex] = vertexData[vertexIndex] + Math.random() * noise - noise / 2\n    // y\n    vertexData[vertexIndex + 1] = vertexData[vertexIndex + 1] + Math.random() * noise - noise / 2\n    // z\n    vertexData[vertexIndex + 2] = vertexData[vertexIndex + 2] + Math.random() * noise - noise / 2\n    // normal x\n    // vertexData[vertexIndex + 3]\n    // normal y\n    // vertexData[vertexIndex + 4]\n    // normal z\n    // vertexData[vertexIndex + 5]\n    // u\n    // vertexData[vertexIndex + 6]\n    // v\n    // vertexData[vertexIndex + 7]\n    // r\n    vertexData[vertexIndex + 8] = i / vertexCount\n    // g\n    vertexData[vertexIndex + 9] = i / vertexCount\n    // b\n    vertexData[vertexIndex + 10] = i / vertexCount\n    // a\n    // vertexData[vertexIndex + 11]\n  }\n  return new Float32Array(vertexData)\n}\n\nfunction buildSphere(\n  vertexs,\n  indices,\n  radius = 1,\n  widthSegments = 32,\n  heightSegments = 16,\n  phiStart = Math.PI / 2,\n  phiLength = Math.PI * 2,\n  thetaStart = Math.PI,\n  thetaLength = Math.PI\n) {\n  widthSegments = Math.max(3, Math.floor(widthSegments))\n  heightSegments = Math.max(2, Math.floor(heightSegments))\n\n  const thetaEnd = Math.min(thetaStart + thetaLength, Math.PI)\n\n  let index = 0\n  const grid = []\n\n  // generate vertices, normals and uvs\n  for (let iy = 0; iy <= heightSegments; iy++) {\n    const verticesRow = []\n    const v = iy / heightSegments\n    // special case for the poles\n    let uOffset = 0\n    if (iy == 0 && thetaStart == 0) {\n      uOffset = 0.5 / widthSegments\n    } else if (iy == heightSegments && thetaEnd == Math.PI) {\n      uOffset = -0.5 / widthSegments\n    }\n    for (let ix = 0; ix <= widthSegments; ix++) {\n      const u = ix / widthSegments\n      // vertex\n      const vertexX = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength)\n      const vertexY = radius * Math.cos(thetaStart + v * thetaLength)\n      const vertexZ = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength)\n      vertexs.push(vertexX, vertexY, vertexZ)\n      // normal\n      vertexs.push(vertexX / 3, vertexY / 3, vertexZ / 3)\n      // uv\n      vertexs.push(u + uOffset, 1 - v)\n      // color\n      vertexs.push(0, 0, 0, 1)\n\n      verticesRow.push(index++)\n    }\n    grid.push(verticesRow)\n  }\n  // indices\n  for (let iy = 0; iy < heightSegments; iy++) {\n    for (let ix = 0; ix < widthSegments; ix++) {\n      const a = grid[iy][ix + 1]\n      const b = grid[iy][ix]\n      const c = grid[iy + 1][ix]\n      const d = grid[iy + 1][ix + 1]\n\n      if (iy !== 0 || thetaStart > 0) indices.push(a, d, b)\n      if (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, d, c)\n    }\n  }\n}\n\nComponent({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      this.geometryRoot = this.scene.getElementById('geometryRoot')\n\n      const geoRadius = 1\n\n      this.vertexData = []\n      this.indexData = []\n      // 构造圆形的 顶点信息，可以通过增加切分区域增加顶点数量\n      // 一般复杂人物 vertex 长度 77030 index 88266\n      buildSphere(this.vertexData, this.indexData, geoRadius, 64, 64)\n\n      console.log('vertexDataCount', this.vertexData.length)\n      console.log('indexDataCount', this.indexData.length)\n\n      // 注册 Geometry 信息\n      xrFrameSystem.registerGeometry('man', scene => {\n        const vl = scene.createVertexLayout({\n          attributes: [\n            {\n              name: 'a_position',\n              format: xrFrameSystem.EVertexFormat.FLOAT3,\n              offset: 0,\n            },\n            {\n              name: 'a_normal',\n              format: xrFrameSystem.EVertexFormat.FLOAT3,\n              offset: 12,\n            },\n            {\n              name: 'a_texCoord',\n              format: xrFrameSystem.EVertexFormat.FLOAT2,\n              offset: 24,\n            },\n            {\n              name: 'a_color',\n              format: xrFrameSystem.EVertexFormat.FLOAT4,\n              offset: 32,\n            }\n          ],\n          stride: 48\n        })\n\n        // VertexBuffer IndexBuffer 不能动态更改长度，需要一开始设定较大的长度。\n        const vb = new Float32Array(this.vertexData.length)\n        const ib = new Uint16Array(this.indexData)\n\n        const geo = scene.createGeometry(vl, vb, ib)\n\n        geo.setBoundBall(new xrFrameSystem.Vector3(), 1)\n        geo.addSubMesh(ib.length, 0, 0)\n\n        return geo\n      })\n\n      this.geoElem = xrScene.createElement(xrFrameSystem.XRMesh, {\n        geometry: 'man',\n        material: 'simple-mat',\n        position: '0 0 0'\n      })\n      this.geometryRoot.addChild(this.geoElem)\n\n      // 延时保证挂载与初始化完毕\n      setTimeout(() => {\n        this.meshGeo = this.geoElem.getComponent(xrFrameSystem.Mesh)\n        this.geometryGeo = this.meshGeo.geometry\n\n        this.matGeo = this.meshGeo.material\n        // 使用顶点色\n        this.matGeo.setMacro('WX_USE_COLOR_0', true)\n        // 设定 绘制双面\n        this.matGeo.setRenderState('cullOn', false)\n\n        xrScene.event.add('tick', this.handleTick.bind(this))\n      }, 100)\n    },\n\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n    },\n    handleTick(delta) {\n      const vb = getVertexBuffer(this.vertexData)\n      const ib = new Uint16Array(this.indexData)\n\n      this.geometryGeo.uploadVertexBuffer(0, vb)\n      this.geometryGeo.uploadIndexBuffer(0, ib)\n    },\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-geometry/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-geometry/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n      <xr-asset-material asset-id=\"simple-mat\" effect=\"simple\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n\n    <xr-shadow id=\"geometryRoot\" node-id=\"geometryRoot\"></xr-shadow>\n\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"2 2 4\" clear-color=\"0.4 0.4 0.4 1\"\n      target=\"camera-target\" near=\"0.1\" far=\"2000\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1.2\" />\n    <xr-light type=\"directional\" rotation=\"120 20 0\" color=\"1 1 1\" intensity=\"2\" />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-geometry/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfAnimation/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n\n    handleGLTFLoaded({ detail }) {\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      const wrapElement = this.scene.getElementById('wrap')\n      this.wrapTRS = wrapElement.getComponent(xrFrameSystem.Transform)\n      const gltfElement = this.scene.getElementById('gltf')\n      this.gltfTRS = gltfElement.getComponent(xrFrameSystem.Transform)\n      this.editGLTF = gltfElement.getComponent(xrFrameSystem.GLTF)\n\n      console.log(this.wrapTRS, this.gltfTRS)\n\n      // Birds\n      const brid = this.editGLTF.getInternalNodeByName('Birds')\n      this.bridTRS = brid.getComponent(xrFrameSystem.Transform)\n\n      // TurtleAndCastle\n      const turtle = this.editGLTF.getInternalNodeByName('TurtleAndCastle')\n      this.turtleTRS = turtle.getComponent(xrFrameSystem.Transform)\n\n      // 都用四元数\n      this.rotation = this.turtleTRS.quaternion.toEulerAngles()\n\n      this.scene.event.add('tick', this.handleTick.bind(this))\n    },\n\n    handleTick(time) {\n      const xrSystem = wx.getXrFrameSystem()\n\n      this.wrapTRS.position.x -= 0.002\n      // this.wrapTRS.rotation.y += Math.PI * 0.0001;\n\n      // 比例尺不一样，需要放大改变数值\n      this.bridTRS.position.x += 1\n      this.bridTRS.position.y += Math.random() * 4 - 2\n\n      // 欧拉角直接设置有误 v2.31.0\n      // this.turtleTRS.rotation.y += Math.PI * 0.0004;\n\n      // 目前使用四元数兼容\n      this.rotation.y += Math.PI * 0.0004\n      xrSystem.Quaternion.fromEulerAngles(this.rotation, this.turtleTRS.quaternion)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfAnimation/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfAnimation/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-floating_castle\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/floating_castle.glb\" /> \n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day2\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n\n    <xr-node id=\"wrap\">\n      <xr-gltf id=\"gltf\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"6 6 6\" model=\"gltf-floating_castle\" bind:gltf-loaded=\"handleGLTFLoaded\"></xr-gltf>\n    </xr-node>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"2 3 -5\" clear-color=\"0.2 0.2 0.2 1\"\n      target=\"camera-target\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.6\" />\n    <xr-light type=\"directional\" rotation=\"20 120 0\" color=\"1 1 1\" intensity=\"2\"/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfAnimation/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfEdit/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n      this.setBallon()\n    },\n    async setBallon() {\n      const scene = this.scene\n      const xrSystem = wx.getXrFrameSystem()\n\n      // 替换贴图\n      const ballonElm = this.scene.getElementById('ballon')\n      const ballonGLTF = ballonElm.getComponent(xrSystem.GLTF)\n      const textureAsset = await scene.assets.loadAsset({\n        type: 'texture',\n        assetId: 'texture-1',\n        src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/waifu.png',\n      })\n      for (const mesh of ballonGLTF.meshes) {\n        console.log('textureAsset', textureAsset.value)\n        mesh.material.setTexture('u_baseColorMap', textureAsset.value)\n      }\n\n      // 替换状态\n      const ballonBlendElm = this.scene.getElementById('ballonBlend')\n      const ballonBlendGLTF = ballonBlendElm.getComponent(xrSystem.GLTF)\n      for (const mesh of ballonBlendGLTF.meshes) {\n        // 清理模型金属度\n        mesh.material.setVector('u_specularFactor', xrSystem.Vector3.createFromNumber(0, 0, 0))\n\n        // 通过alphaMode 的 Setter 设置，或者写入renderState，但需要手动控制宏\n        mesh.material.alphaMode = 'BLEND'\n        mesh.material.setVector('u_baseColorFactor', xrSystem.Vector4.createFromNumber(0, 0.5, 0, 0.5))\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfEdit/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfEdit/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-ballon-origin\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/index.gltf\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-ballon\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/index.gltf\" /> \n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-ballon-blend\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/index.gltf\" /> \n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day2\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n\n    <xr-gltf position=\"-0.8 0 0\" rotation=\"0 0 0\" scale=\"0.6 0.6 0.6\" model=\"gltf-ballon-origin\"></xr-gltf>\n    <xr-gltf id=\"ballon\" node-id=\"gltf-ballon\" position=\"0.8 0 0\" rotation=\"0 0 0\" scale=\"0.6 0.6 0.6\" model=\"gltf-ballon\"></xr-gltf>\n    <xr-gltf id=\"ballonBlend\" node-id=\"gltf-ballon-blend\" position=\"0 0 -0.8\" rotation=\"0 0 0\" scale=\"0.6 0.6 0.6\" model=\"gltf-ballon-blend\"></xr-gltf>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"2 2 4\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"camera-target\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.6\" />\n    <xr-light type=\"directional\" rotation=\"20 120 0\" color=\"1 1 1\" intensity=\"2\"/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfEdit/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfOcclusion/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfOcclusion/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfOcclusion/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-door\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/door.glb\" /> \n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-twa\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/twa.glb\" /> \n\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day2\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n\n    <!-- 设置为遮挡的模型，需设置模版剔除状态 -->\n    <!-- 参数逻辑：\n      1. 该实现流程核心为 模版测试，首先 stencilTestOn 开启模版测试\n      2. stencilComp 设为 7(NEVER)，相当于永远不通过模板测试，会丢弃这个模型的渲染片段。\n      3. stencilPass 设为 1(KEEP)，stencilFail 设为 2(REPLACE)，由于 stencilComp 为 NEVER，一定会走到失败，执行 stencilFail 的行为，将 stencilRef (案例设定为 1) 写入深度缓冲。\n      4. 设置 renderQueue 为 1，保证遮挡物体优先渲染，保证遮挡所需 ref ，在后续模型渲染前，已经写入模版缓存。\n    -->\n    <xr-gltf id=\"occlusion\" node-id=\"occlusion\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"0.01 0.01 0.01\" model=\"gltf-door\"\n      states=\"renderQueue: 1, stencilTestOn: true, stencilComp: 7, stencilRef: 1, stencilReadMask: 1, stencilWriteMask: 1, stencilPass: 1, stencilFail: 2\"\n    ></xr-gltf>\n\n    <!-- 需要被遮挡显示的模型，需保证渲染状态设置为合理，进行模版测试被剔除 -->\n    <!-- 参数逻辑：\n      1. 该实现流程核心为 模版测试，首先 stencilTestOn 开启模版测试\n      2. stencilComp 设为 6(NOTEQUAL)，相当于只有模版缓冲的 Ref 匹配时，才保留实际的渲染片段。\n      3. stencilRef 设为 1，保证与遮挡物体写入的 ref 值一致；stencilReadMask 为读取 ref 值的数字掩码，一般存在多个 ref 的情况会使用这个掩码。\n      4. 设置 renderQueue 为 10 (相同数字会通过远近确定顺序)，保证被遮挡物体后于遮挡物体渲染，保证已有模版缓存值。\n    -->\n    <xr-gltf node-id=\"renderItem\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"1.6 1.6 1.6\" model=\"gltf-twa\"\n      states=\"renderQueue: 10, stencilTestOn: true, stencilComp: 6, stencilRef: 1, stencilReadMask: 1\"\n    ></xr-gltf>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"6 0 0\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"camera-target\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.6\" />\n    <xr-light type=\"directional\" rotation=\"20 120 0\" color=\"1 1 1\" intensity=\"2\"/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfOcclusion/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfUVAnimation/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n      // 做个简单的延时，保证glTF构建完成\n      setTimeout(() => {\n        this.setUVAnimation()\n      }, 200)\n    },\n    setUVAnimation() {\n      const scene = this.scene\n      const xrSystem = wx.getXrFrameSystem()\n\n      // 获取元素\n      const twaElm = this.scene.getElementById('twa')\n      const twaGLTF = twaElm.getComponent(xrSystem.GLTF)\n\n      // console.log(twaGLTF);\n\n      const changeMesh = twaGLTF.getPrimitivesByNodeName('Cube_0')[0]\n      const changeMaterial = changeMesh.material\n\n      let offsetX = 0\n      let offsetY = 0\n      const scaleX = 1\n      const scaleY = 1\n      const rotation = 0\n\n      // 这里采用一个固定计时器方便编写，建议使用tick\n      setInterval(() => {\n        // 这里做一个 1% 每帧的偏移。\n        offsetX = offsetX > 1 ? 0 : offsetX + 0.01\n        offsetY = offsetY > 1 ? 0 : offsetY + 0.01\n        // 这里做一个每帧的缩放\n        // scaleX = scaleX > 2 ? 1 : scaleX + 0.01;\n        // scaleY = scaleY > 2 ? 1 : scaleY + 0.01;\n        // 这里做一个每帧的旋转。\n        // rotation = rotation > Math.PI ? 0 : rotation + Math.PI / 360;\n        const uvMatrix = xrSystem.Matrix4.createFromArray(this.getUvTransform(offsetX, offsetY, scaleX, scaleY, rotation))\n        // 设置uv矩阵\n        changeMaterial.setMatrix('u_uvTransform', uvMatrix)\n      }, 40)\n\n      const uvMatrix = xrSystem.Matrix4.createFromArray(this.getUvTransform(offsetX, offsetY, scaleX, scaleY, rotation))\n      // 设置uv矩阵\n      changeMaterial.setMatrix('u_uvTransform', uvMatrix)\n      // 开启使用uv矩阵的宏\n      changeMaterial.setMacro('WX_USE_UVTRANSFORM', true)\n      changeMaterial.setMacro('WX_USE_UVTRANSFORM_BASECOLOR', true)\n    },\n    /**\n     * 获取UV变化矩阵，列主序\n     *\n     * @param {number} tx x轴偏移\n     * @param {number} ty y轴偏移\n     * @param {number} sx x轴缩放\n     * @param {number} sy y轴缩放\n     * @param {number} rotation 旋转\n     * @return {Array} uvMatrixArray\n     */\n    getUvTransform(tx, ty, sx, sy, rotation) {\n      const c = Math.cos(rotation)\n      const s = Math.sin(rotation)\n\n      return [\n        sx * c, -sx * s, 0, 0,\n        sy * s, sy * c, 0, 0,\n        0, 0, 1, 0,\n        tx, ty, 0, 1,\n      ]\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfUVAnimation/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfUVAnimation/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-twa\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/twa.glb\" /> \n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day2\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n\n    <xr-gltf id=\"twa\" node-id=\"renderItem\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"1.6 1.6 1.6\" model=\"gltf-twa\"></xr-gltf>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"6 0 0\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"camera-target\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.6\" />\n    <xr-light type=\"directional\" rotation=\"20 120 0\" color=\"1 1 1\" intensity=\"2\"/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-gltfUVAnimation/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-loading/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    loading: false,\n    gltfLoaded: false,\n    videoLoaded: false,\n    imageLoaded: false,\n    gltfIdList: [],\n    videoIdList: [],\n    imageIdList: [],\n  },\n  properties: {\n    gltfListRaw: {\n      type: Array,\n      value: [],\n    },\n    videoListRaw: {\n      type: Array,\n      value: [],\n    },\n    imageListRaw: {\n      type: Array,\n      value: [],\n    },\n  },\n  observers: {\n    gltfListRaw(newVal) {\n      this.releaseGLTF()\n      this.loadGLTF(newVal)\n    },\n    videoListRaw(newVal) {\n      this.releaseVideo()\n      this.loadVideo(newVal)\n    },\n    imageListRaw(newVal) {\n      this.releaseImage()\n      this.loadImage(newVal)\n    },\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      // 绑定tick事件\n      xrScene.event.add('tick', this.handleTick.bind(this))\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleTick() {\n    },\n    releaseGLTF() {\n      if (this.data.gltfIdList && this.data.gltfIdList.length > 0) {\n        const scene = this.scene\n\n        // 声明使 gltf Mesh 移除\n        this.setData({\n          gltfLoaded: false\n        })\n\n        this.data.gltfIdList.map((id) => {\n          // 释放加载过的资源\n          scene.assets.releaseAsset('gltf', `gltf-${id}`)\n        })\n      }\n    },\n    async loadGLTF(gltfList) {\n      const scene = this.scene\n\n      if (gltfList.length > 0) {\n        const gltfIdList = []\n        const gltfModel = await Promise.all(gltfList.map((gltfItem) => {\n          gltfIdList.push(gltfItem.id)\n          const gtltfPromise = scene.assets.loadAsset({\n            type: 'gltf',\n            assetId: `gltf-${gltfItem.id}`,\n            src: gltfItem.src,\n          })\n          return gtltfPromise\n        }))\n\n        console.log('glTF asset loaded')\n        this.setData({\n          gltfIdList,\n          gltfLoaded: true\n        })\n      } else {\n        this.setData({\n          gltfIdList: [],\n          gltfLoaded: false,\n        })\n      }\n    },\n    releaseVideo() {\n      if (this.data.videoIdList && this.data.videoIdList.length > 0) {\n        const scene = this.scene\n\n        // 声明使视频 Mesh 移除\n        this.setData({\n          videoLoaded: false\n        })\n\n        this.data.videoIdList.map((id) => {\n          // 释放加载过的资源\n          scene.assets.releaseAsset('video-texture', `video-${id}`)\n          scene.assets.releaseAsset('material', `video-mat-${id}`)\n        })\n      }\n    },\n    async loadVideo(videoList) {\n      const scene = this.scene\n      if (videoList.length > 0) {\n        const videoIdList = []\n        const videos = await Promise.all(videoList.map((videoItem) => {\n          videoIdList.push(videoItem.id)\n          return scene.assets.loadAsset({\n            type: 'video-texture',\n            assetId: `video-${videoItem.id}`,\n            src: videoItem.src,\n            options: { autoPlay: true, loop: true, abortAudio: false },\n          })\n        }))\n        videos.map((videoTexture, index) => {\n          const videoMat = scene.createMaterial(\n            scene.assets.getAsset('effect', 'simple'),\n            { u_baseColorMap: videoTexture.value.texture }\n          )\n          scene.assets.addAsset('material', `video-mat-${videoList[index].id}`, videoMat)\n        })\n        console.log('video asset loaded')\n        this.setData({\n          videoIdList,\n          videoLoaded: true\n        })\n      } else {\n        this.setData({\n          videoIdList: [],\n          videoLoaded: false\n        })\n      }\n    },\n    releaseImage() {\n      if (this.data.imageIdList && this.data.imageIdList.length > 0) {\n        const scene = this.scene\n\n        // 声明使视频 Mesh 移除\n        this.setData({\n          imageLoaded: false\n        })\n\n        this.data.imageIdList.map((id) => {\n          // 释放加载过的资源\n          scene.assets.releaseAsset('texture', `texture-${id}`)\n          scene.assets.releaseAsset('material', `texture-mat-${id}`)\n        })\n      }\n    },\n    async loadImage(imageList) {\n      const scene = this.scene\n      if (imageList.length > 0) {\n        const xrFrameSystem = wx.getXrFrameSystem()\n\n        const imageIdList = []\n        const images = await Promise.all(imageList.map((imageItem) => {\n          const id = imageItem.id\n          console.log(imageItem, id)\n          imageIdList.push(id)\n          if (id === 2) {\n            // 走 asset 直接加载方式\n            return scene.assets.loadAsset({\n              type: 'texture',\n              assetId: `texture-${imageItem.id}`,\n              src: imageItem.src,\n            })\n          } else if (id === 3) {\n            // 走 createImage 方式\n            return new Promise(resolve => {\n              const image = scene.createImage()\n              image.src = imageItem.src\n              image.onload = () => {\n                resolve({\n                  value: scene.createTexture({\n                    source: [image],\n                    width: image.width,\n                    height: image.height,\n                    // 按需加后面的\n                    magFilter: xrFrameSystem.EFilterMode.LINEAR_MIPMAP_LINEAR,\n                    minFilter: xrFrameSystem.EFilterMode.LINEAR_MIPMAP_LINEAR,\n                    wrapU: xrFrameSystem.EWrapMode.CLAMP_TO_EDGE,\n                    wrapV: xrFrameSystem.EWrapMode.CLAMP_TO_EDGE,\n                    anisoLevel: 1\n                  })\n                })\n              }\n              image.onerror = error => {}\n            })\n          }\n        }))\n\n        console.log(images)\n\n        images.map((texture, index) => {\n          const textureMat = scene.createMaterial(\n            scene.assets.getAsset('effect', 'simple'),\n            { u_baseColorMap: texture.value }\n          )\n          scene.assets.addAsset('material', `texture-mat-${imageList[index].id}`, textureMat)\n        })\n\n        this.setData({\n          imageIdList,\n          imageLoaded: true\n        })\n      } else {\n        this.setData({\n          imageIdList: [],\n          imageLoaded: false\n        })\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-loading/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-loading/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-mesh node-id=\"floor-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"10 1 10\" geometry=\"plane\"\n      uniforms=\"u_baseColorFactor:1 1 1 1\" receive-shadow\n    ></xr-mesh>\n    <!-- glTF -->\n    <xr-node wx:if=\"{{gltfLoaded}}\">\n      <xr-node\n        wx:for=\"{{gltfIdList}}\" wx:for-item=\"gltfId\"\n        wx:key=\"gltfId\"\n      >\n        <xr-gltf\n          wx:if=\"{{gltfId == 0}}\"\n          position=\"-1 -0.46 -1\" rotation=\"0 0 0\"\n          scale=\"0.6 0.6 0.6\"\n          model=\"gltf-{{gltfId}}\"\n          cast-shadow\n        ></xr-gltf>\n        <xr-gltf\n          wx:if=\"{{gltfId == 1}}\"\n          position=\"1 -0.98 -1\" rotation=\"0 0 0\"\n          scale=\"0.015 0.015 0.015\"\n          model=\"gltf-{{gltfId}}\"\n          cast-shadow\n        ></xr-gltf>\n      </xr-node>\n    </xr-node>\n    <!-- Image -->\n    <xr-node wx:if=\"{{imageLoaded}}\">\n      <xr-node\n        wx:for=\"{{imageIdList}}\" wx:for-item=\"imageId\"\n        wx:key=\"imageId\"\n      >\n        <xr-mesh\n          wx:if=\"{{imageId === 2}}\"\n          position=\"1 1 0\" scale=\"1 1 0.2\"\n          geometry=\"cube\"  material=\"texture-mat-{{imageId}}\"\n          cast-shadow\n        />\n        <xr-mesh\n          wx:if=\"{{imageId === 3}}\"\n          position=\"-1 1 0\" scale=\"1 1 0.2\"\n          geometry=\"cube\" material=\"texture-mat-{{imageId}}\"\n          cast-shadow\n        />\n      </xr-node>\n    </xr-node>\n    <!-- Video -->\n    <xr-node wx:if=\"{{videoLoaded}}\">\n      <xr-node\n        wx:for=\"{{videoIdList}}\" wx:for-item=\"videoId\"\n        wx:key=\"videoId\"\n      >\n      <xr-mesh\n        wx:if=\"{{videoId === 4}}\"\n        node-id=\"mesh-cube\" position=\"0 -0.5 1\" scale=\"0.8 1.4 0.8\"\n        geometry=\"cube\" material=\"video-mat-{{videoId}}\"\n        cast-shadow\n      />\n      <xr-mesh\n        wx:if=\"{{videoId === 5}}\"\n        node-id=\"mesh-cube\" position=\"-1.5 -0.6 1\" scale=\"1.2 0.8 0.8\"\n        geometry=\"cube\" material=\"video-mat-{{videoId}}\"\n        cast-shadow\n      />\n      <xr-mesh\n        wx:if=\"{{videoId === 6}}\"\n        node-id=\"mesh-cube\" position=\"1.5 -0.6 1\" scale=\"1.2 0.8 0.8\"\n        geometry=\"cube\" material=\"video-mat-{{videoId}}\"\n        cast-shadow\n      />\n      </xr-node>\n    </xr-node>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 3 5\" clear-color=\"0.8 0.8 0.8 1\"\n      target=\"camera-target\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-loading/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-lookat/index.js",
    "content": "const STATE = {\n  NONE: -1,\n  MOVE: 0,\n  ZOOM_OR_PAN: 1\n}\n\nComponent({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      const xrSystem = wx.getXrFrameSystem()\n\n      this.mat = new (xrSystem.Matrix4)()\n      console.log('xr-scene', xrScene)\n      const { width, height } = this.scene\n\n      this.cameraTrs = this.scene.getElementById('camera').getComponent(xrSystem.Transform)\n\n      this.leftTRS = this.scene.getElementById('l').getComponent(xrSystem.Transform)\n      this.rightTRS = this.scene.getElementById('r').getComponent(xrSystem.Transform)\n      this.frontTRS = this.scene.getElementById('f').getComponent(xrSystem.Transform)\n      this.backTRS = this.scene.getElementById('b').getComponent(xrSystem.Transform)\n\n      this.FACING = xrSystem.Vector3.createFromNumber(0, 0, 0)\n      this.UP = xrSystem.Vector3.createFromNumber(0, 1, 0)\n\n      xrScene.event.add('tick', this.handleTick.bind(this))\n    },\n    handleTick() {\n      const xrSystem = wx.getXrFrameSystem()\n\n      if (this.leftTRS) {\n        console.log()\n        const quaternion = this.leftTRS.quaternion\n        // 算出从物体到相机的向量\n        this.FACING.set(this.cameraTrs.position).sub(this.leftTRS.position, this.FACING)\n        xrSystem.Quaternion.lookRotation(this.FACING, this.UP, quaternion)\n      }\n      if (this.rightTRS) {\n        const quaternion = this.rightTRS.quaternion\n        // 算出从物体到相机的向量\n        this.FACING.set(this.cameraTrs.position).sub(this.rightTRS.position, this.FACING)\n        xrSystem.Quaternion.lookRotation(this.FACING, this.UP, quaternion)\n      }\n      if (this.frontTRS) {\n        const quaternion = this.frontTRS.quaternion\n        // // 算出从物体到相机的向量\n        this.FACING.set(this.cameraTrs.position).sub(this.frontTRS.position, this.FACING)\n        xrSystem.Quaternion.lookRotation(this.FACING, this.UP, quaternion)\n      }\n      if (this.backTRS) {\n        const quaternion = this.backTRS.quaternion\n        // 算出从物体到相机的向量\n        this.FACING.set(this.cameraTrs.position).sub(this.backTRS.position, this.FACING)\n        xrSystem.Quaternion.lookRotation(this.FACING, this.UP, quaternion)\n      }\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-lookat/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-lookat/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Plane\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"anchor\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/ar-plane-marker.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"door\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/door.glb\" /> \n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-node>\n    <xr-ar-tracker mode=\"Plane\">\n      <xr-gltf id=\"anchor\" model=\"anchor\"></xr-gltf>\n    </xr-ar-tracker>\n    <xr-node id=\"f\" position=\"0 0 3.0\">\n      <xr-mesh rotation=\"90 0 0\" geometry=\"plane\" uniforms=\"u_baseColorFactor:0.4 0.2 0.2 1, u_metallicRoughnessValues: 0 0.6\" states=\"cullOn: false\"></xr-mesh>\n    </xr-node>\n    <!-- <xr-node id=\"b\" position=\"0 0 -3.0\">\n      <xr-mesh rotation=\"90 0 0\" geometry=\"plane\" uniforms=\"u_baseColorFactor:0.2 0.4 0.2 1, u_metallicRoughnessValues: 0 0.6\" states=\"cullOn: false\"></xr-mesh>\n    </xr-node> -->\n    <xr-node id=\"b\" position=\"0 0 -3.0\">\n      <xr-gltf rotation=\"0 -90 0\" scale=\"0.01 0.01 0.01\" model=\"door\"></xr-gltf>\n    </xr-node>\n    <xr-node id=\"l\" position=\"-3.0 0 0.0\">\n      <xr-mesh rotation=\"90 0 0\" geometry=\"plane\" uniforms=\"u_baseColorFactor:0.2 0.2 0.4 1, u_metallicRoughnessValues: 0 0.6\" states=\"cullOn: false\"></xr-mesh>\n    </xr-node>\n    <xr-node id=\"r\" position=\"3.0 0 0.0\">\n      <xr-mesh rotation=\"90 0 0\" geometry=\"plane\" uniforms=\"u_baseColorFactor:0.4 0.2 0.6 1, u_metallicRoughnessValues: 0 0.6\" states=\"cullOn: false\"></xr-mesh>\n    </xr-node>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-lookat/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-markerCenter/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n    markerMatch: false\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      this.mat = new (wx.getXrFrameSystem().Matrix4)()\n      console.log('xr-scene', xrScene)\n    },\n\n    async handleARReady({ detail }) {\n      console.log('arReady', this.scene.ar.arVersion)\n      const xr = wx.getXrFrameSystem()\n\n      // shadow root\n      this.root = this.scene.getElementById('root')\n\n      // 动态创建添加tracker\n      const lockTrackerEl = this.scene.createElement(xr.XRNode)\n      const lockTracker = lockTrackerEl.addComponent(xr.ARTracker, {\n        mode: 'Marker',\n        src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/2dmarker-test.jpg',\n      })\n\n      this.root.addChild(lockTrackerEl)\n\n      let waiting = false\n\n      lockTrackerEl.event.add('ar-tracker-state', tracker => {\n        // 获取当前状态和错误信息\n        const { state, errorMessage } = tracker\n\n        if (state === 2 && !waiting) {\n          console.log('match')\n          waiting = true\n          // 识别成功后切换到世界坐标\n\n          // 延时保证坐标已经设置\n          setTimeout(() => {\n            this.setData({\n              markerMatch: true\n            })\n\n            // 去除tracker监听\n            this.root.removeChild(lockTrackerEl)\n          }, 30)\n        }\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-markerCenter/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-markerCenter/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Marker;\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets>\n      <xr-asset-load\n        type=\"env-data\" asset-id=\"env1\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-test.bin\"\n      />\n      <xr-asset-load type=\"gltf\" asset-id=\"gltf-damageHelmet\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/index.gltf\" />\n  </xr-assets>\n  <xr-node>\n  <xr-env env-data=\"env1\" />\n\n    <!-- marker -->\n    <!-- <xr-ar-tracker id=\"lockTracker\" mode=\"Marker\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/2dmarker-test.jpg\">\n      <xr-node id=\"lockItem\">\n        <xr-gltf model=\"butterfly\" anim-autoplay position=\"0.2 0 -0.2\" scale=\"0.6 0.6 0.6\" rotation=\"0 -50 0\" />\n        <xr-gltf model=\"butterfly\" anim-autoplay position=\"0.4 0 0.3\" scale=\"0.5 0.5 0.5\" rotation=\"0 -50 0\" />\n        <xr-gltf model=\"butterfly\" anim-autoplay position=\"-0.3 0 0.3\" scale=\"0.4 0.4 0.4\" rotation=\"0 -50 0\" />\n      </xr-node>\n    </xr-ar-tracker> -->\n\n    <!-- marker 会动态创建并放在root下 -->\n    <xr-shadow id=\"root\"></xr-shadow>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    >\n      <!-- 将模型放在相机内部，相当于是放在视图空间里面，只需要z轴正方向移动，就是远离相机 -->\n      <!-- 放ar相机内部，这个流程有bug，感觉是vk返回的矩阵里面有负数，准备排查 -->\n      <xr-gltf\n        wx:if=\"{{markerMatch}}\"\n        node-id=\"gltf-damageHelmet\" position=\"0 0 6\" rotation=\"0 0 0\" scale=\"1 1 -1\" model=\"gltf-damageHelmet\"\n      ></xr-gltf>\n    </xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.5\" />\n    <xr-light type=\"directional\" rotation=\"20 120 0\" color=\"1 1 1\" intensity=\"2\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-markerCenter/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-markerLock/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      this.mat = new (wx.getXrFrameSystem().Matrix4)()\n      console.log('xr-scene', xrScene)\n    },\n\n    async handleARReady({ detail }) {\n      console.log('arReady', this.scene.ar.arVersion)\n      const xr = wx.getXrFrameSystem()\n\n      // shadow root\n      this.root = this.scene.getElementById('root')\n\n      // 动态创建添加tracker\n      const lockTrackerEl = this.scene.createElement(xr.XRNode)\n      const lockTracker = lockTrackerEl.addComponent(xr.ARTracker, {\n        mode: 'Marker',\n        src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/2dmarker-test.jpg',\n      })\n\n      this.root.addChild(lockTrackerEl)\n\n      // 动态改动模型根节点\n      const lockItemEle = this.scene.createElement(xr.XRNode, {\n        position: '10000 0 0',\n      })\n\n      const { value: model } = await this.scene.assets.loadAsset({ type: 'gltf', assetId: 'butterfly', src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/butterfly/index.glb' })\n\n      // 添加蝴蝶\n      const gltf1 = this.scene.createElement(xr.XRGLTF, {\n        position: '0.2 0 -0.2',\n        scale: '0.6 0.6 0.6',\n        rotation: '0 -50 0',\n        'anim-autoplay': '',\n      })\n      lockItemEle.addChild(gltf1)\n      gltf1.getComponent(xr.GLTF).setData({\n        model,\n      })\n      const gltf2 = this.scene.createElement(xr.XRGLTF, {\n        position: '0.4 0 0.3',\n        scale: '0.5 0.5 0.5',\n        rotation: '0 -50 0',\n        'anim-autoplay': '',\n      })\n      lockItemEle.addChild(gltf2)\n      gltf2.getComponent(xr.GLTF).setData({\n        model,\n      })\n      const gltf3 = this.scene.createElement(xr.XRGLTF, {\n        position: '-0.3 0 0.3',\n        scale: '0.4 0.4 0.4',\n        rotation: '0 -50 0',\n        'anim-autoplay': '',\n      })\n      lockItemEle.addChild(gltf3)\n      gltf3.getComponent(xr.GLTF).setData({\n        model,\n      })\n      // 先挂到场上，但是可以放在离屏\n      this.root.addChild(lockItemEle)\n\n      let waiting = false\n\n      lockTrackerEl.event.add('ar-tracker-state', tracker => {\n        // 获取当前状态和错误信息\n        const { state, errorMessage } = tracker\n\n        if (state === 2 && !waiting) {\n          console.log('match')\n          waiting = true\n          // 识别成功后切换到世界坐标\n\n          // 延时保证坐标已经设置\n          setTimeout(() => {\n            // 将 lockTrackerEl 的世界矩阵信息同步到 lockItemEle\n            const lockTrackerTrs = lockTrackerEl.getComponent(xr.Transform)\n            const lockItemTrs = lockItemEle.getComponent(xr.Transform)\n            lockItemTrs.setLocalMatrix(lockTrackerTrs.worldMatrix)\n\n            // 去除tracker监听\n            this.root.removeChild(lockTrackerEl)\n          }, 30)\n        }\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-markerLock/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-markerLock/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Plane Marker; planeMode: 1\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <!-- vio + marker 模式下 planeMode 需设置为 1 (只允许水平面识别) -->\n  <xr-assets>\n    <xr-asset-load type=\"gltf\" asset-id=\"anchor\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/ar-plane-marker.glb\" />\n  </xr-assets>\n  <xr-node>\n\n    <!-- plane -->\n    <xr-ar-tracker mode=\"Plane\">\n      <xr-gltf model=\"anchor\"></xr-gltf>\n    </xr-ar-tracker>\n\n    <!-- marker -->\n    <!-- <xr-ar-tracker id=\"lockTracker\" mode=\"Marker\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/2dmarker-test.jpg\">\n      <xr-node id=\"lockItem\">\n        <xr-gltf model=\"butterfly\" anim-autoplay position=\"0.2 0 -0.2\" scale=\"0.6 0.6 0.6\" rotation=\"0 -50 0\" />\n        <xr-gltf model=\"butterfly\" anim-autoplay position=\"0.4 0 0.3\" scale=\"0.5 0.5 0.5\" rotation=\"0 -50 0\" />\n        <xr-gltf model=\"butterfly\" anim-autoplay position=\"-0.3 0 0.3\" scale=\"0.4 0.4 0.4\" rotation=\"0 -50 0\" />\n      </xr-node>\n    </xr-ar-tracker> -->\n\n    <!-- 识别成功后放置的世界位置 -->\n    <!-- marker 会动态创建并放在root下 -->\n    <xr-shadow id=\"root\"></xr-shadow>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-markerLock/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-message/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n    messageData: {\n      type: Object,\n      value: {\n        moveX: 0,\n        moveZ: 0,\n      },\n      observer(newVal, oldVal) {\n        this.speedX = Math.sign(this.speedX) !== 0 ? Math.sign(this.speedX) * Math.abs(newVal.moveX) * 0.01 : newVal.moveX * 0.01\n        this.speedZ = Math.sign(this.speedZ) !== 0 ? Math.sign(this.speedZ) * Math.abs(newVal.moveZ) * 0.01 : newVal.moveZ * 0.01\n      }\n    }\n  },\n  data: {\n    loaded: false,\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      const xrSystem = wx.getXrFrameSystem()\n\n      // 绑定运动目标\n      this.moveSphereTRS = this.scene.getElementById('move-sphere').getComponent(xrSystem.Transform)\n      // 绑定内置变量\n      this.speedX = 0\n      this.speedZ = 0\n      this.planeWidth = 5\n      // 绑定tick事件\n      xrScene.event.add('tick', this.handleTick.bind(this))\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleTick() {\n      if (this.moveSphereTRS) {\n        const nowPos = this.moveSphereTRS.position\n        if (nowPos.x > this.planeWidth) {\n          this.speedX = -this.speedX\n        } else if (nowPos.x < -this.planeWidth) {\n          this.speedX = -this.speedX\n        }\n        if (nowPos.z > this.planeWidth) {\n          this.speedZ = -this.speedZ\n        } else if (nowPos.z < -this.planeWidth) {\n          this.speedZ = -this.speedZ\n        }\n        nowPos.x += this.speedX\n        nowPos.z += this.speedZ\n\n        this.triggerEvent('infoListener', {\n          speedX: this.speedX,\n          speedZ: this.speedZ,\n          posX: nowPos.x.toFixed(2),\n          posZ: nowPos.z.toFixed(2),\n        })\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-message/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-message/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n  </xr-assets>\n  <xr-node>\n    <xr-mesh node-id=\"floor-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"10 1 10\" geometry=\"plane\"\n      uniforms=\"u_baseColorFactor:1 1 1 1\" receive-shadow\n    ></xr-mesh>\n    <xr-mesh id=\"move-sphere\" node-id=\"move-sphere\"\n      position=\"0 0 0\" scale=\"1 1 1\" geometry=\"sphere\"\n      uniforms=\"u_metallicRoughnessValues: 0 1\"\n      cast-shadow\n    ></xr-mesh>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 5 10\" clear-color=\"0.8 0.8 0.8 1\"\n      target=\"move-sphere\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-message/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-pbr/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-saaacene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n\n      // 延时保证 glTF 解析完毕\n      setTimeout(() => {\n        this.setToon()\n      }, 200)\n    },\n    setToon() {\n      const scene = this.scene\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      const gltfElement = scene.getElementById('gltf')\n      const gltf = gltfElement.getComponent(xrFrameSystem.GLTF)\n\n      console.log('custom-pbr gltf', gltf)\n\n      for (const mesh of gltf.meshes) {\n        console.log('custom-pbr mesh material', mesh.material)\n\n        console.log('custom-pbr effect', scene.assets.getAsset('effect', 'custom-pbr'))\n\n        const pbrMaterial = scene.createMaterial(\n          // 使用定制的效果\n          scene.assets.getAsset('effect', 'custom-pbr'),\n          {\n            u_brdfLUT: mesh.material.getTexture('u_brdfLUT'),\n            u_baseColorMap: mesh.material.getTexture('u_baseColorMap'),\n            u_metallicRoughnessMap: mesh.material.getTexture('u_metallicRoughnessMap'),\n            u_normalMap: mesh.material.getTexture('u_normalMap'),\n            u_emissiveMap: mesh.material.getTexture('u_emissiveMap'),\n            u_emissiveFactor: mesh.material.getTexture('u_emissiveFactor'),\n            u_occlusionMap: mesh.material.getTexture('u_occlusionMap'),\n            u_clearcoatMap: mesh.material.getTexture('u_clearcoatMap'),\n            u_specularGlossinessMap: mesh.material.getTexture('u_specularGlossinessMap'),\n            u_transmissionMap: mesh.material.getTexture('u_transmissionMap'),\n            u_sheenColorMap: mesh.material.getTexture('u_sheenColorMap'),\n            u_metallicMap: mesh.material.getTexture('u_metallicMap'),\n            u_roughnessMap: mesh.material.getTexture('u_roughnessMap'),\n            u_clearcoatRoughnessMap: mesh.material.getTexture('u_clearcoatRoughnessMap'),\n            u_clearcoatNormalMap: mesh.material.getTexture('u_clearcoatNormalMap'),\n            u_sheenRoughnessMap: mesh.material.getTexture('u_sheenRoughnessMap'),\n            u_specularEnvMapMat: mesh.material.getTexture('u_specularEnvMapMat'),\n          }\n        )\n\n        console.log('custom-pbr material', pbrMaterial)\n        mesh.material = pbrMaterial\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-pbr/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-pbr/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-toon\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/index.gltf\" />\n    <xr-asset-load\n        type=\"env-data\" asset-id=\"env1\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-test.bin\"\n      />\n      <xr-asset-material asset-id=\"pbr\" effect=\"custom-pbr\" />  \n  </xr-assets>\n  <xr-node>\n    <xr-env env-data=\"env1\" />\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-mesh node-id=\"floor-plane\" position=\"0 -2 0\" rotation=\"0 0 0\" scale=\"10 1 10\" geometry=\"plane\"\n      uniforms=\"u_baseColorFactor:1 1 1 1\" receive-shadow\n    ></xr-mesh>\n    <xr-gltf id=\"gltf\" position=\"0 0 0\" scale=\"2 2 2\" model=\"gltf-toon\" material=\"pbr\" cast-shadow></xr-gltf>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"2 2 4\" clear-color=\"0.96 0.96 0.96 1\"\n      target=\"camera-target\" near=\"0.1\" far=\"2000\"\n      camera-orbit-control=\"\" background=\"skybox\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1.2\" />\n    <xr-light type=\"directional\" rotation=\"120 20 0\" color=\"1 1 1\" intensity=\"2\" cast-shadow />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-pbr/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-planeShadow/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-planeShadow/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-planeShadow/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-mech_drone\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/mech_drone/scene.gltf\" />\n    <xr-asset-material asset-id=\"plane-shadow-mat\" effect=\"plane-shadow\" />\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day2\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n\n    <xr-gltf node-id=\"gltf-mech_drone\" position=\"0 -2 0\" rotation=\"0 0 0\" scale=\"7 7 7\" model=\"gltf-mech_drone\" anim-autoplay cast-shadow></xr-gltf>\n    <xr-mesh position=\"0 -2 0\" scale=\"10 1 10\" geometry=\"plane\"  material=\"plane-shadow-mat\" receive-shadow></xr-mesh>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"2 3 -5\" clear-color=\"0.96 0.96 0.96 1\"\n      target=\"camera-target\" near=\"0.1\" far=\"2000\"\n      camera-orbit-control=\"\" background=\"skybox\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1.2\" />\n    <xr-light type=\"directional\" rotation=\"40 0 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-planeShadow/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-removeBlack/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-removeBlack/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-removeBlack/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load\n      type=\"video-texture\" asset-id=\"test2\"\n      src=\"https://h5-project.oss-cn-shenzhen.aliyuncs.com/XR/test2.mp4\" options=\"autoPlay:true,loop:true\"\n    />\n    <xr-asset-material asset-id=\"removeBlack-mat\" effect=\"removeBlack\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-node wx:if=\"{{loaded}}\">\n      <xr-mesh node-id=\"floor-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"10 1 10\" geometry=\"plane\"\n        uniforms=\"u_baseColorFactor:1 1 1 1\"\n      ></xr-mesh>\n      <xr-mesh node-id=\"video-item\" position=\"0 0 0\" rotation=\"90 0 0\" scale=\"2 2 2\" geometry=\"plane\"\n        material=\"removeBlack-mat\"\n        uniforms=\"u_videoMap: video-test2\"\n        states=\"renderQueue:2500\"\n      ></xr-mesh>\n    </xr-node>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"2 2 4\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"camera-target\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-removeBlack/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-select/index.js",
    "content": "let touch = false\nComponent({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    itemIndex: {\n      type: Number,\n      observer(newVal, oldVal) {\n        if (newVal != undefined) {\n          switch (newVal) {\n            case 0:\n              this.pause()\n              break\n            case 1:\n              this.resume()\n              break\n            default:\n              // 前两位给了暂停、继续状态, 这里需要-2\n              this.play(newVal - 2)\n              this.itemIndex = newVal - 2\n              break\n          }\n        }\n      },\n    },\n  },\n  data: {\n    loaded: false,\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({\n      detail\n    }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({\n      detail\n    }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({\n      detail\n    }) {\n      console.log('assets loaded', detail.value)\n      this.setData({\n        loaded: true\n      })\n    },\n    handleTouchModel(e) {\n      touch = true\n      const xrScene = this.scene\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const myModel = xrScene.getElementById('myModel')\n      this.myModelAnimator = myModel.getComponent(xrFrameSystem.Animator)\n      const clips = this.myModelAnimator._clips\n      this.clipName = []\n\n      clips.forEach((v, key) => {\n        if (key.indexOf('pose') == -1) {\n          this.clipName.push(key)\n        }\n      })\n\n      this.triggerEvent('infoListener', {\n        clipName: this.clipName,\n      })\n    },\n\n    handleTick(dt) {\n      if (touch) {\n        const xrFrameSystem = wx.getXrFrameSystem()\n        const camera = this.scene.getElementById('camera').getComponent(xrFrameSystem.Camera)\n        const myModel = this.scene.getElementById('myModel')\n        const modelTRS = myModel.getComponent(xrFrameSystem.Transform)\n        const trackerPos = camera.convertWorldPositionToClip(modelTRS.worldPosition.add(xrFrameSystem.Vector3.createFromNumber(0, 2, 0)))\n\n        const dirX = camera.convertWorldPositionToClip(xrFrameSystem.Vector3.createFromNumber(1, 0, 0))\n        const dirO = camera.convertWorldPositionToClip(xrFrameSystem.Vector3.createFromNumber(0, 0, 0))\n        const dirZ = camera.convertWorldPositionToClip(xrFrameSystem.Vector3.createFromNumber(0, 0, 1))\n        const len1 = dirX.sub(dirO).length()\n        const len2 = dirZ.sub(dirO).length()\n        let lenRes = len1 > len2 ? len1 : len2\n        lenRes = lenRes < 0 ? 0 : lenRes > 1 ? 1 : lenRes\n\n        this.triggerEvent('infoListener', {\n          position: {\n            x: trackerPos.x,\n            y: trackerPos.y,\n          },\n          len: 0.5 + lenRes\n        })\n      }\n    },\n\n    async handleGltfLoaded() {\n      const xrScene = this.scene\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const myModel = xrScene.getElementById('myModel')\n      const shadowNode = myModel.getComponent('gltf').getInternalNodeByName('mixamorig:RightHandIndex1')\n      const el = this.scene.createElement(xrFrameSystem.XRMesh, {\n        geometry: 'cube',\n        scale: '20 20 20',\n        uniforms: 'u_baseColorFactor:1 0 0 1',\n        position: '0 0 0',\n        rotation: '0 0 0'\n      })\n\n      shadowNode.addChild(el)\n    },\n    play(index) {\n      console.log('play:', this.clipName[index])\n      if (this.clipName.length != 0) {\n        this.myModelAnimator.play(this.clipName[index], {\n          loop: 10,\n        })\n      }\n    },\n    pause() {\n      console.log('pause:', this.clipName[this.itemIndex])\n      //   this.myModelAnimator.pause(this.clipName[this.itemIndex])\n      this.myModelAnimator.pause()\n    },\n    resume() {\n      console.log('resume:', this.clipName[this.itemIndex])\n      //   this.myModelAnimator.resume(this.clipName[this.itemIndex])\n      this.myModelAnimator.resume()\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-select/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-select/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\" bind:tick=\"handleTick\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-door\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/door.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-myModel\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/Xbot.glb\" />\n  </xr-assets>\n<xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n\n    <!-- <xr-gltf id=\"door\" node-id=\"door\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"0.01 0.01 0.01\" model=\"gltf-door\"\n      cube-shape=\"autoFit:true\" shape-gizmo \n      bind:gltf-loaded=\"handleGltfLoaded\"\n      sphere-shape=\"radius: 1.5\"\n      bind:anim-stop=\"handleAnimationStop\"\n    ></xr-gltf> -->\n\n    <xr-gltf id=\"myModel\" node-id=\"myModel\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"1 1 1\" model=\"gltf-myModel\" cube-shape=\"size: 0.5 2 0.5; center: 0 0.8 0\" shape-gizmo bind:gltf-loaded=\"handleGltfLoaded\" bind:touch-shape=\"handleTouchModel\"></xr-gltf>\n\n    <xr-camera id=\"camera\" node-id=\"camera\" position=\"0 3 4\" clear-color=\"0.1 0.1 0.1 1\" target=\"camera-target\" camera-orbit-control=\"\"></xr-camera>\n</xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-select/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-share/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      this.scene.event.add('touchstart', this.handleShare.bind(this))\n    },\n    handleShare(event) {\n      const { clientX, clientY } = event.touches[0]\n      const { frameWidth: width, frameHeight: height } = this.scene\n\n      if (clientY / height > 0.7 && clientX / width > 0.7) {\n        this.scene.share.captureToFriends()\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-share/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-share/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -0.02 -4\" rotation=\"0 0 0\" scale=\"5 1 5\" geometry=\"plane\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\" receive-shadow></xr-mesh>\n    <xr-mesh id=\"cube\" node-id=\"mesh-cube\" position=\"-1 0.5 -3.5\" scale=\"1 1 1\" rotation=\"0 45 0\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.298 0.764 0.85 1\" cast-shadow></xr-mesh>\n    <xr-mesh node-id=\"mesh-cylinder\" position=\"1 0.7 -3.5\" scale=\"1 0.7 1\" geometry=\"cylinder\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:1 0.776 0.364 1\" cast-shadow></xr-mesh>\n    <xr-mesh node-id=\"mesh-sphere\" position=\"0 1.25 -5\" scale=\"1.25 1.25 1.25\" geometry=\"sphere\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.937 0.176 0.368 1\" cast-shadow></xr-mesh>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 1.6 0\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"mesh-sphere\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-share/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-textEdit/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    words: '文本内容',\n    fontColor: '1.0 1.0 1.0',\n    fontSize: 1,\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n\n      let number = 0\n      let fontSize = 1\n      setInterval(() => {\n        this.setData({\n          words: number,\n          fontSize,\n          fontColor: `${Math.random()} ${Math.random()} ${Math.random()}`\n        })\n        number++\n        if (fontSize > 2) {\n          fontSize = 1\n        } else {\n          fontSize += 0.1\n        }\n      }, 200)\n    }\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-textEdit/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-textEdit/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"center\" position=\"0 2 0\" test></xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"20 1 20\" geometry=\"plane\" uniforms=\"u_baseColorFactor:0 0 0 1\"></xr-mesh>\n    <!-- 用于默认缩放的容器 -->\n    <xr-node scale=\"0.1 0.1 0.1\"  position=\"0 2 0\">\n      <!-- 示例1 对齐 -->\n      <xr-node position=\"-10 11 0\">\n        <xr-mesh position=\"0 0 -0.01\" rotation=\"90 0 0\" scale=\"8 1 8\" geometry=\"plane\" states=\"renderQueue: 2009, alphaMode: BLEND, cullOn: false\" uniforms=\"u_baseColorFactor:0.2 0.6 0.2 0.8\"></xr-mesh>\n        <xr-text\n          value=\"居中\"\n          position=\"0 0 0\" never-cull\n          size=\"2\" anchor=\"0.5 0.5\" uniforms=\"u_baseColorFactor:1.0 1.0 1.0 1\"\n        ></xr-text>\n      </xr-node>\n      <xr-node position=\"0 11 0\">\n        <xr-mesh position=\"0 0 -0.01\" rotation=\"90 0 0\" scale=\"8 1 8\" geometry=\"plane\" states=\"renderQueue: 2009, alphaMode: BLEND, cullOn: false\" uniforms=\"u_baseColorFactor:0.2 0.6 0.2 0.8\"></xr-mesh>\n        <xr-text\n          value=\"居左上\"\n          position=\"-4 4 0\" never-cull\n          size=\"2\" anchor=\"0 1\" uniforms=\"u_baseColorFactor:1.0 1.0 1.0 1\"\n        ></xr-text>\n      </xr-node>\n      <xr-node position=\"10 11 0\">\n        <xr-mesh position=\"0 0 -0.01\" rotation=\"90 0 0\" scale=\"8 1 8\" geometry=\"plane\" states=\"renderQueue: 2009, alphaMode: BLEND, cullOn: false\" uniforms=\"u_baseColorFactor:0.2 0.6 0.2 0.8\"></xr-mesh>\n        <xr-text\n          value=\"居右下\"\n          position=\"4 -4 0\" never-cull\n          size=\"2\" anchor=\"1 0\" uniforms=\"u_baseColorFactor:1.0 1.0 1.0 1\"\n        ></xr-text>\n      </xr-node>\n      <!-- 示例2 多行 -->\n      <xr-node position=\"-10 0 0\">\n        <xr-mesh position=\"0 0 -0.01\" rotation=\"90 0 0\" scale=\"8 1 8\" geometry=\"plane\" states=\"renderQueue: 2009, alphaMode: BLEND, cullOn: false\" uniforms=\"u_baseColorFactor:0.2 0.2 0.6 0.8\"></xr-mesh>\n        <xr-text\n          value=\"多行文本，基于宽度进行自动换行\"\n          position=\"-4 4 0\" never-cull\n          width=\"8\" line-height=\"1.4\"\n          size=\"1.5\" anchor=\"0 1\" uniforms=\"u_baseColorFactor:1.0 1.0 1.0 1\"\n        ></xr-text>\n      </xr-node>\n      <xr-node position=\"-1.5 0 0\">\n        <xr-mesh position=\"0 0 -0.01\" rotation=\"90 0 0\" scale=\"8 1 8\" geometry=\"plane\" states=\"renderQueue: 2009, alphaMode: BLEND, cullOn: false\" uniforms=\"u_baseColorFactor:0.2 0.2 0.6 0.8\"></xr-mesh>\n        <xr-text\n          value=\"右下文本，基于宽度自动换行\"\n          position=\"-4 4 0\" never-cull\n          horz-align=\"right\" vert-align=\"bottom\"\n          width=\"8\" height=\"8\"\n          size=\"1.5\" anchor=\"0 1\" uniforms=\"u_baseColorFactor:1.0 1.0 1.0 1\"\n        ></xr-text>\n      </xr-node>\n      <xr-node position=\"4 0 0\">\n        <xr-mesh position=\"0 0 -0.01\" rotation=\"90 0 0\" scale=\"2 1 8\" geometry=\"plane\" states=\"renderQueue: 2009, alphaMode: BLEND, cullOn: false\" uniforms=\"u_baseColorFactor:0.2 0.2 0.6 0.8\"></xr-mesh>\n        <xr-text\n          value=\"实现竖排\"\n          position=\"-1 4 0\" never-cull\n          width=\"2\"\n          size=\"2\" anchor=\"0 1\" uniforms=\"u_baseColorFactor:1.0 1.0 1.0 1\"\n        ></xr-text>\n      </xr-node>\n       <xr-node position=\"10 0 0\">\n        <xr-mesh position=\"0 0 -0.01\" rotation=\"90 0 0\" scale=\"8 1 8\" geometry=\"plane\" states=\"renderQueue: 2009, alphaMode: BLEND, cullOn: false\" uniforms=\"u_baseColorFactor:0.2 0.2 0.6 0.8\"></xr-mesh>\n        <xr-text\n          value=\"换行符\\n行二\\n行三\\n\"\n          position=\"-4 4 0\" never-cull\n          size=\"2\" anchor=\"0 1\" uniforms=\"u_baseColorFactor:1.0 1.0 1.0 1\"\n        ></xr-text>\n      </xr-node>\n      <!-- 示例3 变化 -->\n      <xr-node position=\"-10 -11 0\">\n        <xr-mesh position=\"0 0 -0.01\" rotation=\"90 0 0\" scale=\"8 1 8\" geometry=\"plane\" states=\"renderQueue: 2009, alphaMode: BLEND, cullOn: false\" uniforms=\"u_baseColorFactor:0.6 0.2 0.2 0.8\"></xr-mesh>\n        <xr-text\n          id=\"changeNumber\"\n          value=\"变化数字: {{words}}\"\n          position=\"0 0 0\" never-cull\n          horz-align=\"center\"\n          width=\"8\"\n          size=\"1\" anchor=\"0.5 0.5\" uniforms=\"u_baseColorFactor:1.0 1.0 1.0 1\"\n        ></xr-text>\n      </xr-node>\n      <xr-node position=\"0 -11 0\">\n        <xr-mesh position=\"0 0 -0.01\" rotation=\"90 0 0\" scale=\"8 1 8\" geometry=\"plane\" states=\"renderQueue: 2009, alphaMode: BLEND, cullOn: false\" uniforms=\"u_baseColorFactor:0.6 0.2 0.2 0.8\"></xr-mesh>\n        <xr-text\n          id=\"changeColor\"\n          value=\"变色文本\"\n          position=\"0 0 0\" never-cull\n          horz-align=\"center\"\n          size=\"1\" anchor=\"0.5 0.5\" uniforms=\"u_baseColorFactor:{{fontColor}} 1\"\n        ></xr-text>\n      </xr-node>\n      <xr-node position=\"10 -11 0\">\n        <xr-mesh position=\"0 0 -0.01\" rotation=\"90 0 0\" scale=\"8 1 8\" geometry=\"plane\" states=\"renderQueue: 2009, alphaMode: BLEND, cullOn: false\" uniforms=\"u_baseColorFactor:0.6 0.2 0.2 0.8\"></xr-mesh>\n        <xr-text\n          id=\"changeSize\"\n          value=\"变化大小\"\n          position=\"0 0 0\" never-cull\n          horz-align=\"center\"\n          size=\"{{fontSize}}\" anchor=\"0.5 0.5\" uniforms=\"u_baseColorFactor:1.0 1.0 1.0 1\"\n        ></xr-text>\n      </xr-node>\n    </xr-node>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 2 4\" clear-color=\"0.8 0.8 0.8 1\"\n      target=\"center\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\"/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-textEdit/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-toon/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n\n      // 延时保证 glTF 解析完毕\n      setTimeout(() => {\n        this.setToon()\n      }, 200)\n    },\n    setToon() {\n      const scene = this.scene\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      const gltfElement = scene.getElementById('gltf')\n      const gltf = gltfElement.getComponent(xrFrameSystem.GLTF)\n\n      console.log('toon gltf', gltf)\n\n      for (const mesh of gltf.meshes) {\n        // console.log('toon mesh', mesh)\n        console.log('toon mesh material', mesh.material)\n\n        console.log('toon effect', scene.assets.getAsset('effect', 'toon-user'))\n\n        const toonMaterial = scene.createMaterial(\n          // 使用定制的效果\n          scene.assets.getAsset('effect', 'toon-user'),\n          {\n            u_baseColorMap: mesh.material.getTexture('u_baseColorMap')\n          }\n        )\n\n        console.log('toon toonMaterial', toonMaterial)\n\n        // 接管渲染状态\n        // toonMaterial.setRenderState('cullFace', xrFrameSystem.ECullMode.BACK);\n        toonMaterial.setRenderState('cullOn', false)\n\n        mesh.material = toonMaterial\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-toon/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-toon/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-toon\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/index.gltf\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-mesh node-id=\"floor-plane\" position=\"0 -2 0\" rotation=\"0 0 0\" scale=\"10 1 10\" geometry=\"plane\"\n      uniforms=\"u_baseColorFactor:1 1 1 1\" receive-shadow\n    ></xr-mesh>\n    <xr-gltf id=\"gltf\" position=\"0 0 0\" scale=\"2 2 2\" model=\"gltf-toon\" cast-shadow></xr-gltf>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"2 2 4\" clear-color=\"0.96 0.96 0.96 1\"\n      target=\"camera-target\" near=\"0.1\" far=\"2000\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1.2\" />\n    <xr-light type=\"directional\" rotation=\"120 20 0\" color=\"1 1 1\" intensity=\"2\" cast-shadow />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-toon/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-tracker/index.js",
    "content": "Component({\n  behaviors: [require('../../common/share-behavior').default],\n  innerInterval: 0,\n  videoId: -1,\n  properties: {\n    markerListRaw: {\n      type: Array,\n      value: []\n    },\n  },\n  data: {\n    loaded: true,\n    arReady: false,\n    gltfLoaded: false,\n    videoLoaded: false,\n    videoRatioLoaded: false,\n    markerWidth: 1,\n    markerHeight: 1,\n  },\n  observers: {\n    markerListRaw(newVal) {\n      this.setData({\n        markerList: newVal,\n      })\n    },\n  },\n  lifetimes: {\n    detached() {\n      // 关闭时候去除计时器\n      clearInterval(this.innerInterval)\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n\n      // 加载场景资源\n      const gltfResList = []\n      const videoResList = []\n\n      const markerList = this.data.markerList\n      for (let i = 0; i < markerList.length; i++) {\n        const marker = markerList[i]\n        switch (marker.renderType) {\n          case 'gltf':\n            gltfResList.push(marker)\n            break\n          case 'video':\n            videoResList.push(marker)\n            break\n        }\n      }\n\n      try {\n        this.loadGLTF(gltfResList)\n      } catch (err) {\n        console.log('[gltf load] error: ', err)\n      }\n    },\n    handleARReady() {\n      console.log('arReady')\n      this.setData({ arReady: true })\n    },\n    async loadGLTF(gltfList) {\n      const scene = this.scene\n      const gltfModel = await Promise.all(gltfList.map(gltfItem => scene.assets.loadAsset({\n        type: 'gltf',\n        assetId: 'gltf-' + gltfItem.id,\n        src: gltfItem.src,\n      })))\n      console.log('glTF asset loaded')\n      this.setData({ gltfLoaded: true })\n    },\n    async loadVideoSingle(videoItem) {\n      const scene = this.scene\n      const videoTexture = await scene.assets.loadAsset({\n        type: 'video-texture',\n        assetId: 'video-' + videoItem.id,\n        src: videoItem.src,\n        options: { loop: true, autoPlay: true },\n      })\n      // console.log('videoTexture', videoTexture);\n      const videoMat = scene.createMaterial(\n        scene.assets.getAsset('effect', 'simple'),\n        { u_baseColorMap: videoTexture.value.texture }\n      )\n      scene.assets.addAsset('material', `video-mat-${videoItem.id}`, videoMat)\n\n      console.log('video asset loaded')\n      this.setData({\n        videoLoaded: true,\n      })\n    },\n    releaseVideo(id) {\n      if (id !== -1) {\n        // 存在纹理才进行释放\n        const scene = this.scene\n        // 释放加载过的资源\n        scene.assets.releaseAsset('video-texture', `video-${id}`)\n        scene.assets.releaseAsset('material', `video-mat-${id}`)\n      }\n    },\n    handleTrackerSwitch({ detail }) {\n      console.log('tracked match')\n      if (this.data.loaded) {\n        const element = detail.el\n        const active = detail.value\n        const data = this.data\n        const markerList = data.markerList\n        for (let i = 0; i < markerList.length; i++) {\n          const markerInfo = markerList[i]\n          const markerTracker = this.scene.getElementById(`marker-${markerInfo.id}`)\n          if (element === markerTracker) {\n            // 处理视频纹理\n            this.releaseVideo(this.videoId)\n            this.videoId = -1\n            // 匹配 tracker\n            switch (markerInfo.renderType) {\n              case 'scan': // scan\n                this.scanHandler(markerTracker, markerInfo, active)\n                break\n              case 'video': // video\n                if (active) {\n                  this.videoHanler(markerInfo)\n                }\n                break\n              case 'gltf': // gltf\n                break\n            }\n            this.triggerEvent('trackerchange', {\n              name: markerInfo.name,\n              active,\n              type: markerInfo.renderType,\n            })\n          }\n        }\n      }\n    },\n    scanHandler(markerTracker, markerInfo, active) {\n      const renderType = markerInfo.renderType\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const camera = this.scene.getElementById('camera').getComponent(xrFrameSystem.Camera)\n      const trackerTRS = markerTracker.getComponent(xrFrameSystem.Transform)\n      const rightTRS = this.scene.getElementById(`normal-right-${markerInfo.id}`).getComponent(xrFrameSystem.Transform)\n      const trackerPos = camera.convertWorldPositionToClip(trackerTRS.worldPosition)\n      const rightPos = camera.convertWorldPositionToClip(rightTRS.worldPosition)\n      const posX = ((trackerPos.x + 1) / 2)\n      const posY = (1 - (trackerPos.y + 1) / 2)\n      const rightPosX = ((rightPos.x + 1) / 2)\n\n      // 获取识别图，图片比例\n      let widthDivideHeight = 1\n      wx.getImageInfo({\n        src: markerInfo.markerImage,\n        success: res => {\n          const {\n            width,\n            height\n          } = res\n          widthDivideHeight = width / height\n        },\n        fail: res => {\n          console.error(res)\n        }\n      })\n      // 通知上层\n      this.triggerEvent('trackerchange', {\n        name: markerInfo.name,\n        active,\n        type: renderType,\n        trackerInfo: {\n          x: posX,\n          y: posY,\n          halfWidth: rightPosX - posX,\n          widthDivideHeight\n        }\n      })\n      if (active) {\n        // 激活态开启tracker位置同步\n        let preX = posX\n        let preY = posY\n        let preR = rightPosX\n        this.innerInterval = setInterval(() => {\n          const tPos = camera.convertWorldPositionToClip(trackerTRS.worldPosition)\n          const rPos = camera.convertWorldPositionToClip(rightTRS.worldPosition)\n          const pX = ((tPos.x + 1) / 2)\n          const pY = (1 - (tPos.y + 1) / 2)\n          const rX = ((rPos.x + 1) / 2)\n\n          const dX = Math.abs(pX - preX)\n          const dY = Math.abs(pY - preY)\n          const dR = Math.abs(rX - preR)\n\n          if (dX > 0.005 || dY > 0.005 || dR > 0.005) {\n            preX = pX\n            preY = pY\n            preR = rX\n            this.triggerEvent('trackermove', {\n              active: true,\n              type: 'scan',\n              trackerInfo: {\n                x: pX,\n                y: pY,\n                halfWidth: rX - pX,\n                widthDivideHeight\n              }\n            })\n          }\n        }, 40)\n      } else {\n        // 取消态去除tracker位置同步\n        clearInterval(this.innerInterval)\n        this.triggerEvent('trackermove', {\n          active: false,\n          type: 'scan',\n          trackerInfo: {\n            x: 0,\n            y: 0,\n            halfWidth: 0\n          }\n        })\n      }\n    },\n    videoHanler(markerInfo) {\n      this.setData({\n        videoLoaded: false,\n        videoRatioLoaded: false,\n      })\n\n      // 获取识别图，图片比例\n      wx.getImageInfo({\n        src: markerInfo.markerImage,\n        success: res => {\n          const {\n            width,\n            height\n          } = res\n          const widthDivideHeight = width / height\n\n          this.setData({\n            markerWidth: 1,\n            markerHeight: (1 / widthDivideHeight).toFixed(2),\n            videoRatioLoaded: true,\n          })\n        },\n        fail: res => {\n          console.error(res)\n        }\n      })\n\n      try {\n        this.loadVideoSingle(markerInfo)\n      } catch (err) {\n        console.log('[video load] error: ', err)\n      }\n\n      this.videoId = markerInfo.id\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-tracker/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-tracker/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" ar-system=\"modes:Marker\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets >\n    <xr-asset-material asset-id=\"video-bg-mat\" effect=\"simple\" uniforms=\"u_baseColorFactor: 0.0 0.0 0.0 1\" />\n    <xr-asset-material asset-id=\"loading-mat\" effect=\"simple\" uniforms=\"u_baseColorFactor: 1.0 1.0 1.0 0.8\" />\n  </xr-assets>\n  <xr-node wx:if=\"{{arReady}}\">\n    <xr-ar-tracker\n      mode=\"Marker\"\n      wx:for=\"{{markerList}}\" wx:for-item=\"markerItem\"\n      id=\"marker-{{markerItem.id}}\"\n      src=\"{{markerItem.markerImage}}\" bind:ar-tracker-switch=\"handleTrackerSwitch\"\n    >\n      <!-- 扫描情况 --> \n      <xr-node position=\"0.5 0 0\" id=\"normal-right-{{markerItem.id}}\" wx:if=\"{{markerItem.renderType === 'scan'}}\"></xr-node>\n      <!-- gltf情况 -->\n      <xr-node wx:if=\"{{markerItem.renderType === 'gltf' && gltfLoaded}}\">\n        <xr-gltf node-id=\"mesh-gltf-fiesta_tea\" position=\"0 -1.6 1\" rotation=\"-90 0 0\" scale=\"0.6 0.6 0.6\" model=\"gltf-{{markerItem.id}}\"\n          states=\"stencilTestOn: true, stencilComp: 3, stencilRef: 1, stencilReadMask: 1\"\n        ></xr-gltf>\n        <xr-mesh node-id=\"plane-cull\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"1 0.1 0.9\" geometry=\"plane\"\n          states=\"renderQueue: 1, stencilTestOn: true, stencilComp: 7, stencilRef: 1, stencilReadMask: 1, stencilWriteMask: 1, stencilPass: 1, stencilFail: 2, stencilZFail: 2\"\n        ></xr-mesh>\n      </xr-node>\n      <!-- 视频情况 -->\n      <xr-node wx:if=\"{{markerItem.renderType === 'video'}}\">\n        <xr-node wx:if=\"{{videoLoaded}}\">\n          <xr-mesh wx:if=\"{{videoRatioLoaded}}\" scale=\"{{markerWidth}} 1 {{markerHeight}}\" geometry=\"plane\" material=\"video-bg-mat\"\n            states=\"cullOn: false\"\n          />\n          <xr-mesh position=\"0 0.01 0\" scale=\"{{markerWidth}} 1 {{markerHeight}}\" geometry=\"plane\" material=\"video-mat-{{markerItem.id}}\" />\n        </xr-node>\n        <xr-node wx:else>\n          <xr-mesh wx:if=\"{{videoRatioLoaded}}\" scale=\"{{markerWidth}} 1 {{markerHeight}}\" geometry=\"plane\" material=\"loading-mat\"\n            states=\"cullOn: false, alphaMode: BLEND,renderQueue: 2501\"\n          />\n        </xr-node>\n      </xr-node>\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 0 4\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\"\n      near=\"0.1\"\n      far=\"2000\"\n      is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-tracker/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-volumeVideo/index.js",
    "content": "import {\n  mesh4DPlayer\n} from './mesh4DPlayer'\n\n// const ROOTURL = 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com'\nconst DIRROOT = '/xr-frame/demo/'\n\nComponent({\n  behaviors: [require('../../common/share-behavior').default],\n  properties: {\n    markerImg: {\n      type: String\n    },\n    isShowRecord: {\n      type: Boolean\n    },\n    isFocusTips: {\n      type: Boolean\n    },\n\n    width: {\n      type: Number\n    },\n    height: {\n      type: Number\n    }\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n    firstPlay: true,\n    markerList: [\n      {\n        name: 'videoData',\n        type: 'gltf',\n      },\n    ]\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n      wx.setKeepScreenOn({\n        keepScreenOn: true\n      })\n    },\n    detached() {\n      this.releaseAll()\n    }\n  },\n  pageLifetimes: {\n    hide() {\n      this.pause()\n    },\n    show() {\n      this.play()\n    }\n  },\n  methods: {\n    releaseAll() {\n      // 释放资源\n      for (let i = 0, len = markerList.length; i < len; i++) {\n        const markerInfo = markerList[i]\n        const meshPlayer = this.meshPlayObj[markerInfo.name].meshPlayer\n        meshPlayer && meshPlayer.release('all')\n      }\n    },\n\n    handleArError(e) {\n      console.log(e.detail)\n      let errormsg = '当前设备不支持AR'\n      if (String(e.detail.value).indexOf('2003002') > -1) {\n        errormsg = '未开启小程序相机权限，打开右上角“设置”选项，开启小程序相机权限'\n      }\n      wx.showModal({\n        title: '提示',\n        content: errormsg,\n        showCancel: false\n      })\n    },\n\n    handleReady({\n      detail\n    }) {\n      this.scene = detail.value\n      this.camera = this.scene.getElementById('camera')\n\n      // 绑定tick事件\n      this.scene.event.add('tick', this.handleTick.bind(this))\n\n      this.meshPlayObj = {}\n      for (let i = 0, len = this.data.markerList.length; i < len; i++) {\n        const markerInfo = this.data.markerList[i]\n        this.meshPlayObj[markerInfo.name] = {\n          meshPlayer: new mesh4DPlayer({\n            scene: this.scene,\n            urlRoot: ROOTURL + DIRROOT + markerInfo.name,\n            name: markerInfo.name,\n            preStart: true,\n            loop: true,\n            mountedComplete: () => {\n              this.camera.addChild(this.meshPlayer.manElem)\n            }\n          })\n        }\n      }\n\n      this.meshPlayer = this.meshPlayObj[this.data.markerList[0].name].meshPlayer\n\n      setTimeout(() => {\n        this.play()\n      }, 2000)\n    },\n\n    play() {\n      if (this.meshPlayer) {\n        this.meshPlayer.play()\n      }\n    },\n\n    resume() {\n      if (this.meshPlayer) {\n        this.meshPlayer.resume()\n      }\n    },\n\n    pause() {\n      if (this.meshPlayer) {\n        this.meshPlayer.pause()\n      }\n    },\n\n    handleTick(delta) {\n      // 更新体积视频\n      if (this.meshPlayer) {\n        this.meshPlayer.update()\n      }\n    },\n\n    handleAssetsProgress({\n      detail\n    }) {\n      console.log('assets progress', detail.value)\n    },\n\n    handleAssetsLoaded({\n      detail\n    }) {\n      console.log('assets loaded', detail.value)\n      this.setData({\n        loaded: true\n      })\n    },\n\n    handleARReady({\n      detail\n    }) {\n      console.log('arReady')\n      this.setData({\n        arReady: true\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-volumeVideo/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-volumeVideo/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"plane-shadow-mat\" effect=\"plane-shadow\" />\n  </xr-assets>\n\n  <xr-mesh position=\"0 0 0\" scale=\"10 1 10\" geometry=\"plane\" material=\"plane-shadow-mat\" receive-shadow></xr-mesh>\n\n  <xr-env env-data=\"xr-frame-team-workspace-day2\" />\n  <xr-node>\n    <xr-node cast-shadow id=\"preview-model-videoData\">\n      <xr-node cast-shadow id=\"preview-model-sub-videoData\" scale=\"1 1 1\">\n        <xr-shadow cast-shadow id=\"geometryRoot-videoData\" node-id=\"geometryRoot-videoData\"></xr-shadow>\n      </xr-node>\n    </xr-node>\n\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n\n    <xr-camera id=\"camera\" node-id=\"camera\" position=\"2 3 -5\" clear-color=\"0.96 0.96 0.96 1\" target=\"camera-target\" near=\"0.1\" far=\"2000\" camera-orbit-control=\"\" background=\"skybox\"></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1.2\" />\n    <xr-light type=\"directional\" rotation=\"40 0 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-volumeVideo/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-volumeVideo/mesh4DPlayer.js",
    "content": "// 着色器\nimport videoVert from './shaders/videoVert'\nimport videoFrag from './shaders/videoFrag'\nimport shadowVert from './shaders/shadowVert'\nimport shadowFrag from './shaders/shadowFrag'\n\nconst xrFrameSystem = wx.getXrFrameSystem()\nconst maxVB = 800000\nconst maxIB = 800000\nconst max_bones = 60\n// VertexBuffer IndexBuffer 不能动态更改长度，需要一开始设定较大的长度。\nconst vb0 = new Float32Array(new Array(maxVB)) // 人物 vertex 长度 77030\nconst ib0 = new Uint16Array(new Array(maxIB)) // 人物 index 88266 88266\nconst vb0Clear = new Float32Array(new Array(maxVB)) // 人物 vertex 长度 77030\nconst ib0Clear = new Uint16Array(new Array(maxIB)) // 人物 index 88266 88266\n\nconst getFrame_ = 5\nconst xrTimeOut_ = 5\n\n// 文件管理器\nlet fs\n\nclass mesh4DPlayer {\n  constructor(options) {\n    this.name = options.name || 'demo'\n    this.rootName = 'geometryRoot-' + options.name\n    this.urlRoot = options.urlRoot\n    // XRFrame的scene\n    this.scene = options.scene\n    this.startTime = options.startTime || 0\n    this.startFrameIndex = this.startTime * 22\n    this.index = options.index || 0\n    this.nextRenderFrameCount = 20\n\n    this.loop = options.loop\n    this.autoPlay = options.autoPlay\n    this.initComplete = options.initComplete\n    this.mountedComplete = options.mountedComplete\n\n    this.pendingBufferDownload = false\n    this.nextBufferLoadIndex = 0\n    this.playing = false\n    this.arrayBuffers = []\n    this.decoder = false\n    this.decoderStart = false\n    this.preStart = options.preStart\n    if (options.urlRoot) {\n      this.load(options.urlRoot)\n    }\n  }\n\n  createVideoTexture(scene, data, width, height, pixelFormat) {\n    return scene.createTexture({\n      source: [data],\n      pixelFormat,\n      width,\n      height,\n      magFilter: xrFrameSystem.EFilterMode.NEAREST,\n      minFilter: xrFrameSystem.EFilterMode.NEAREST,\n      wrapU: xrFrameSystem.EWrapMode.CLAMP_TO_EDGE,\n      wrapV: xrFrameSystem.EWrapMode.CLAMP_TO_EDGE,\n      anisoLevel: 1\n    })\n  }\n\n  createSimpleEffect() {\n    const effect = this.scene.createEffect({\n      name: 'frame-effect' + this.name,\n      properties: [\n        { key: 'u_baseColorFactor', type: xrFrameSystem.EUniformType.FLOAT4, default: [1, 1, 1, 1] },\n        // { key: 'u_farthestDistance', type: xrFrameSystem.EUniformType.FLOAT, default: [100]},\n        // { key: 'u_nearestDistance', type: xrFrameSystem.EUniformType.FLOAT, default: [0.5]},\n        // { key: 'u_offsetZ', type: xrFrameSystem.EUniformType.FLOAT, default: [2.0]}\n      ],\n      images: [\n        {\n          key: 'u_baseColorMap',\n          default: 'white',\n          macro: 'WX_USE_BASECOLORMAP'\n        },\n\n        {\n          key: 'texture2',\n          default: 'white',\n          macro: 'WX_USE_BASECOLORMAP'\n        }\n      ],\n      defaultRenderQueue: 2000,\n      passes: [\n        {\n          renderStates: {\n            cullOn: true,\n            blendOn: false,\n            depthWrite: true,\n            cullFace: xrFrameSystem.ECullMode.FRONT,\n          },\n          lightMode: 'ShadowCaster',\n          useMaterialRenderStates: false,\n          shaders: [2, 3],\n        },\n        {\n          renderStates: {\n            cullOn: false,\n            blendOn: false,\n            depthWrite: true,\n            depthTestOn: true,\n            cullFace: xrFrameSystem.ECullMode.BACK,\n          },\n          lightMode: 'ForwardBase',\n          useMaterialRenderStates: false,\n          shaders: [0, 1]\n        }],\n      shaders: [\n        videoVert,\n        videoFrag,\n        shadowVert,\n        shadowFrag,\n      ],\n    })\n    this.scene.assets.addAsset('effect', 'frame-effect' + this.name, effect)\n    return effect\n  }\n\n  calcFrameIndex(data) {\n    this.pixelBuffer = new Uint8Array(data)\n    this.frameIndex = 0 // 帧索引初始化为 0\n    for (let a = 0; a < 16; ++a) {\n      // 遍历 16 个像素\n      if (this.pixelBuffer[4 * a] > 128 || this.pixelBuffer[4 * a + 1] > 128) {\n        // 如果像素值大于 128\n        this.frameIndex += 1 << a // 更新帧索引\n      }\n    }\n  }\n\n  updateRender(data) {\n    this.calcFrameIndex(data)\n    let current_frame = this.frames[this.frameIndex]\n    if (!current_frame) return\n    const {\n      isFirstFrame,\n      deformation,\n      f,\n      vbo,\n      pos,\n      tc,\n      weights,\n      indices\n    } = current_frame\n    const arrayBufferIndex = this.buffers[this.frames[this.frameIndex].binFileIdx].arrayBufferIndex\n    let mesh_buffers = this.arrayBuffers[arrayBufferIndex]\n    if (isFirstFrame != 'true') {\n      const idx = this.seekNearestFirstFrame(this.frameIndex, this.firstFrames)\n      if (idx != this.lastFirstFrameIdx) {\n        this.reloadFirstFrame = true\n        this.lastFirstFrameIdx = idx\n      } else {\n        this.reloadFirstFrame = false\n      }\n    } else {\n      this.lastFirstFrameIdx = this.frameIndex\n    }\n    // 清理内存\n    current_frame = false\n    // 获取当前基础数据\n    if (isFirstFrame == 'true' || this.reloadFirstFrame) {\n      this.index = new Uint16Array(mesh_buffers, this.boxs[f].start_byte, this.boxs[f].count * 3)\n      if (vbo) {\n        this.vbo = new Float32Array(mesh_buffers, this.boxs[vbo].start_byte, this.boxs[vbo].count * 13)\n      } else {\n        this.pos = new Float32Array(mesh_buffers, this.boxs[pos].start_byte, this.boxs[pos].count * 3)\n        this.uv = new Float32Array(mesh_buffers, this.boxs[tc].start_byte, this.boxs[tc].count * 2)\n        this.weights = new Float32Array(mesh_buffers, this.boxs[weights].start_byte, this.boxs[weights].count * 4)\n        this.indices = new Float32Array(mesh_buffers, this.boxs[indices].start_byte, this.boxs[indices].count * 4)\n      }\n    }\n    const {\n      count,\n      start_byte\n    } = this.boxs[deformation]\n    let deform = new Float32Array(mesh_buffers, start_byte, count * 12)\n    // 清理内存\n    mesh_buffers = false\n    if (!this.pixelData) {\n      this.pixelData = new Float32Array(max_bones * 16)\n      this.pixelDataClear = new Float32Array(max_bones * 16)\n    }\n    this.pixelData.set(this.pixelDataClear)\n\n    for (let i = 0; i < count; i++) {\n      const start_idx = i * 16\n      this.pixelData[start_idx + 0] = deform[12 * i + 0]\n      this.pixelData[start_idx + 1] = deform[12 * i + 3]\n      this.pixelData[start_idx + 2] = deform[12 * i + 6]\n      this.pixelData[start_idx + 3] = 0\n      this.pixelData[start_idx + 4] = deform[12 * i + 1]\n      this.pixelData[start_idx + 5] = deform[12 * i + 4]\n      this.pixelData[start_idx + 6] = deform[12 * i + 7]\n      this.pixelData[start_idx + 7] = 0\n      this.pixelData[start_idx + 8] = deform[12 * i + 2]\n      this.pixelData[start_idx + 9] = deform[12 * i + 5]\n      this.pixelData[start_idx + 10] = deform[12 * i + 8]\n      this.pixelData[start_idx + 11] = 0\n      this.pixelData[start_idx + 12] = deform[12 * i + 9]\n      this.pixelData[start_idx + 13] = deform[12 * i + 10]\n      this.pixelData[start_idx + 14] = deform[12 * i + 11]\n      this.pixelData[start_idx + 15] = 1\n    }\n    // 清理内存\n    deform = false\n    if (this.geometryMan) {\n      this.updateData(isFirstFrame, 'updateRender(data)')\n      if (!this.decoderStart) {\n        this.ended_ = false\n        this.decoderStart = true\n      }\n    } else {\n      // 挂载dom\n      this.initXRMesh(isFirstFrame)\n    }\n  }\n\n  initXRMesh(isFirstFrame) {\n    this.decoderStart_ = -1\n    this.geometryRoot = this.scene.getElementById(this.rootName)\n    const vl = this.scene.createVertexLayout({\n      attributes: [{\n        name: 'a_position',\n        format: xrFrameSystem.EVertexFormat.FLOAT3,\n        offset: 0,\n        usage: xrFrameSystem.EVertexLayoutUsage.POSITION\n      },\n      {\n        name: 'a_texCoord',\n        format: xrFrameSystem.EVertexFormat.FLOAT2,\n        offset: 12,\n        usage: xrFrameSystem.EVertexLayoutUsage.UV0\n      },\n      {\n        name: 'a_boneIndices',\n        format: xrFrameSystem.EVertexFormat.FLOAT4,\n        offset: 20,\n      },\n      {\n        name: 'a_weights',\n        format: xrFrameSystem.EVertexFormat.FLOAT4,\n        offset: 36,\n      },\n      ],\n    })\n    const geometry = this.scene.createGeometry(vl, vb0, ib0)\n    geometry.setBoundBall(new xrFrameSystem.Vector3(), 1)\n    geometry.addSubMesh(ib0.length, 0, 0)\n    this.scene.assets.addAsset('geometry', 'geometry-' + this.name, geometry)\n    const Format1 = xrFrameSystem.ETextureFormat.RGBA8\n    const Format2 = xrFrameSystem.ETextureFormat.RGBA32F\n    // Uint8Array\n    this.texture_ = this.createVideoTexture(this.scene, this.pixelBuffer, 1024, 1024, Format1)\n    this.scene.assets.addAsset('texture', 'texture1-' + this.name, this.texture_)\n    // Float32Array\n    this.texture_2 = this.createVideoTexture(this.scene, this.pixelData, 4, 60, Format2)\n    this.scene.assets.addAsset('texture', 'texture2-' + this.name, this.texture_2)\n    this.simple2 = this.createSimpleEffect()\n\n    const toonMaterial = this.scene.createMaterial(this.simple2, {\n      texture2: this.texture_2,\n      u_baseColorMap: this.texture_\n    })\n    this.scene.assets.addAsset('material', 'material-' + this.name, toonMaterial)\n    this.manElem = this.scene.createElement(xrFrameSystem.XRMesh, {\n      geometry: 'geometry-' + this.name,\n      material: 'material-' + this.name,\n      position: '0 0 0',\n      name: this.name,\n      'cast-shadow': true,\n    })\n    console.log(this.manElem, 'manele---------')\n    this.geometryRoot.addChild(this.manElem)\n    // 延时保证挂载与初始化完毕\n    this.xrTimeOut = setTimeout(() => {\n      vb0.set(vb0Clear)\n      ib0.set(ib0Clear)\n      this.manTRS = this.manElem.getComponent(xrFrameSystem.Transform)\n      this.meshMan = this.manElem.getComponent(xrFrameSystem.Mesh)\n      this.geometryMan = this.meshMan.geometry\n      this.matGeo = this.meshMan.material\n      this.matGeo.setRenderState('cullOn', false)\n      this.updateData(isFirstFrame, 'initXRMesh')\n      this.decoderStart = true\n      // x轴左移\n      this.manTRS.position.setValue(0, 0, 0)\n      this.manTRS.scale.setValue(2, 2, 2)\n      this.manTRS.rotation.setValue(0, (45 * Math.PI / 180), 0)\n      if (this.playStartEvent) this.playStartEvent()\n      this.decoderStart_ = 1\n\n      this.mountedComplete && this.mountedComplete()\n    }, xrTimeOut_)\n  }\n\n  updateData(isFirstFrame, type) {\n    this.showHidden(true, 'updateData', type)\n    if (isFirstFrame == 'true' || this.reloadFirstFrame) {\n      vb0.set(vb0Clear)\n      if (this.vbo) {\n        vb0.set(this.vbo)\n      } else {\n        this.updateVertexBuffer(this.pos, this.uv, this.indices, this.weights)\n      }\n      ib0.set(ib0Clear)\n      ib0.set(this.index)\n      this.geometryMan.uploadVertexBuffer(0, vb0)\n      this.geometryMan.uploadIndexBuffer(0, ib0)\n    }\n    this.texture_2.update(this.pixelData, 0, 0, 4, 60)\n    this.texture_.update(this.pixelBuffer, 0, 0, 1024, 1024)\n  }\n\n  load() {\n    const info_fn = this.urlRoot + '/mesh.json'\n    console.log(info_fn)\n    this.requestTask0 = wx.request({\n      url: info_fn,\n      method: 'GET',\n      success: (res) => {\n        this.loadData(res.data)\n      }\n    })\n  }\n\n  async loadData(json) {\n    this.boxs = json.boxs\n    this.frames = json.frames\n    this.firstFrames = json.firstFrames\n    this.buffers = json.buffers\n    this.bufferIndexMaxL = json.buffers.length\n    this.framesLength = json.frames.length\n    this.videoUrl = this.urlRoot + '/' + json.mp4Url\n\n    this.cacheBuffers()\n\n    if (this.preStart) {\n      // 缓存视频，下一次解码时用本地路径的视频解码\n      this.cacheVideo(this.videoUrl)\n      await this.preStartDecoder()\n    }\n  }\n\n  cacheVideo(url) {\n    const storageKey = this.name + 'Video'\n    const videoDownload = () => {\n      wx.downloadFile({\n        url,\n        success: (res) => {\n          if (res.statusCode === 200) {\n            this.cacheVideoUrl = res.tempFilePath\n            wx.setStorageSync(storageKey, res.tempFilePath)\n          }\n        }\n      })\n    }\n\n    const localVideoPath = wx.getStorageSync(storageKey)\n    if (localVideoPath) {\n      try {\n        this.getFS().accessSync(localVideoPath)\n        this.cacheVideoUrl = localVideoPath\n      } catch (e) {\n        console.error(e)\n        videoDownload()\n      }\n    } else {\n      videoDownload()\n    }\n  }\n\n  cacheBuffers() {\n    const storageKey = this.name + 'Buffers'\n    const localBuffersPathArr = wx.getStorageSync(storageKey)\n    if (localBuffersPathArr) {\n      try {\n        this.buffers = localBuffersPathArr\n        for (let i = 0; i < this.bufferIndexMaxL; i++) {\n          const keybin = wx.getStorageSync(this.name + localBuffersPathArr[i].url)\n          console.log(localBuffersPathArr[i], 'keybin')\n          if (!keybin) {\n            throw 'no data'\n          }\n          this.arrayBuffers[i] = this.getFS().readFileSync(keybin)\n        }\n        this.executePlay()\n      } catch (e) {\n        console.error(e)\n        this.loadNextBuffer()\n      }\n    } else {\n      this.loadNextBuffer()\n    }\n  }\n\n  getFS() {\n    if (!fs) {\n      fs = wx.getFileSystemManager()\n    }\n    return fs\n  }\n\n  getUserDataFileList() {\n    return this.getFS().statSync(`${wx.env.USER_DATA_PATH}`, true)\n  }\n\n  clearUserDataFileList(list) {\n    for (let i = 0, len = list.length; i < len; i++) {\n      const element = list[i]\n      if (element.path.toLowerCase().indexOf('.bin') > -1 || element.path.toLowerCase().indexOf('.mp4') > -1) {\n        this.getFS().unlinkSync(`${wx.env.USER_DATA_PATH}/${element.path}`)\n      }\n    }\n  }\n\n  checkBufferData() {\n    const frameIndex = this.frameIndex + this.nextRenderFrameCount\n    if (frameIndex >= this.framesLength) return true\n    const binFileIdx = this.frames[frameIndex].binFileIdx\n    const arrayBufferIndex = this.buffers[binFileIdx].arrayBufferIndex\n    if (arrayBufferIndex == undefined) return false\n    if (arrayBufferIndex < this.arrayBuffers.length) {\n      return true\n    }\n    return false\n  }\n\n  loadNextBuffer() {\n    if (this.pendingBufferDownload || this.nextBufferLoadIndex >= this.bufferIndexMaxL) {\n      return\n    }\n\n    const cbFn = (res, urlkey) => {\n      if (this.arrayBuffers == null) this.arrayBuffers = []\n      if (res) {\n        const arrayBuffer = res.data\n        this.arrayBuffers[bufferIndex] = arrayBuffer\n        try {\n          const filePath = `${wx.env.USER_DATA_PATH}/${urlkey}`\n          fs.writeFileSync(\n            filePath,\n            arrayBuffer,\n          )\n          console.log(filePath, 'filepth')\n          wx.setStorageSync(urlkey, filePath)\n        } catch (error) {\n          // 当空间不足时，清空用户本地文件夹\n          this.clearUserDataFileList(this.getUserDataFileList())\n          console.log(error, 'error')\n        }\n      }\n      this.nextBufferLoadIndex += 1\n      this.pendingBufferDownload = false\n      buffer.arrayBufferIndex = bufferIndex\n      if (this.nextBufferLoadIndex < this.bufferIndexMaxL) {\n        this.loadNextBuffer()\n        // 判断的加载到一半数据时允许播放，如果想加载完成才播放写在else里面\n        if (this.nextBufferLoadIndex == Math.max(Math.floor(this.bufferIndexMaxL / 2), 1)) {\n          this.executePlay()\n        }\n      } else {\n        // 加载完成就释放\n        this.releaseNetwork()\n        wx.setStorageSync(this.name + 'Buffers', this.buffers)\n        console.log(this.buffers, 'this.buffers')\n      }\n    }\n    const bufferIndex = this.nextBufferLoadIndex\n    const buffer = this.buffers[bufferIndex]\n    const bufferURL = this.urlRoot + '/' + buffer.url\n    this.pendingBufferDownload = true\n    this.requestTask1 = wx.request({\n      url: bufferURL,\n      method: 'GET',\n      responseType: 'arraybuffer',\n      success: (res) => {\n        cbFn(res, this.name + buffer.url)\n        // console.log('加载：', bufferURL)\n      }\n    })\n  }\n\n  executePlay() {\n    console.log('可播放')\n    this.frameIndex = 0\n    this.autoPlay && this.play()\n    this.initComplete && this.initComplete()\n  }\n\n  seekNearestFirstFrame(idx, arrays) {\n    const length = arrays.length\n    for (let i = 0; i < length - 1; ++i) {\n      if (arrays[i] <= idx && arrays[i + 1] > idx) {\n        return arrays[i]\n      }\n    }\n    if (idx >= arrays[length - 1]) {\n      return arrays[length - 1]\n    }\n  }\n\n  update() {\n    if (this.decoderStart) {\n      this.updateVideo()\n    }\n  }\n\n  async updateVideo() {\n    if (this.ended_) return\n    if (!this.frames) return false\n    if (!this.checkBufferData()) {\n      if (!this.decoder) return\n      if (!this.paused) {\n        console.log('下一个 mesh 没有准备好')\n        this.paused = true\n        await this.decoder.wait(true) // 暂停视频播放\n      }\n    } else if (this.paused) {\n      console.log('下一个 mesh 准备好了')\n      await this.decoder.wait(false)\n      this.paused = false\n    }\n    if (this.decoder) {\n      let frameData_0 = this.decoder.getFrameData()\n      if (frameData_0) {\n        const {\n          data\n        } = frameData_0\n        this.updateRender(data)\n      }\n      frameData_0 = null\n    }\n  }\n\n  decoderEndEvent() {\n    const bindEndFn = async () => {\n      this.ended_ = true\n      this.decoderStart = false\n      this.playing = false\n\n      if (this.decoder) {\n        await this.decoder.stop()\n        this.preStartDecoderEnd = true\n      }\n\n      console.log('进来再次播放')\n\n      // 延迟20ms之后再开始预先解码\n      setTimeout(async () => {\n        console.log('再次播放')\n        await this.preStartDecoder()\n        this.loop && this.play()\n      }, 20)\n    }\n    if (this.decoder) {\n      console.log('执行注册')\n      this.decoder.off('ended', bindEndFn)\n      this.decoder.on('ended', bindEndFn)\n    }\n  }\n\n  async preStartDecoder(pos = 0) {\n    if (!this.decoder) {\n      this.decoder = wx.createVideoDecoder({\n        type: 'wemedia'\n      })\n      // 新建解码器的时候就注册ended事件\n      this.decoderEndEvent()\n    }\n\n    const start_0 = Date.now()\n    try {\n      await this.decoder.start({\n        mode: 0,\n        source: this.cacheVideoUrl || this.videoUrl\n      })\n      console.log('this.cacheVideoUrl', this.cacheVideoUrl)\n    } catch (error) {\n      console.error('async preStartDecoder(pos = 0)我是解码器报错this.decoder.start,重新执行start', error)\n      wx.showToast({\n        title: '网络错误,视频加载失败',\n      })\n      return\n    }\n\n    const timeDiff_0 = Date.now() - start_0\n    console.log('this.decoder.start的时长', timeDiff_0)\n    await this.decoder.wait(false)\n    this.decoder.seek(pos)\n    await this.decoder.wait(true)\n    this.preStartDecoderEnd = true\n  }\n\n  async play() {\n    // 无缓存时播放\n    let frameData_0; let\n      data\n    const start_1 = Date.now()\n    console.log(this.decoder, 'this.decoder')\n    console.log(this.preStartDecoderEnd, 'this.preStartDecoderEnd')\n    if (this.preStartDecoderEnd) {\n      await this.decoder.wait(false)\n      console.log('wait over')\n    }\n    await new Promise(resolve => {\n      this.frameDataflag = setInterval(() => {\n        if (this.decoder) frameData_0 = this.decoder.getFrameData()\n        if (frameData_0) {\n          data = frameData_0.data\n          clearInterval(this.frameDataflag)\n          this.frameDataflag = null\n          resolve()\n        }\n      }, getFrame_)\n    })\n    const timeDiff_1 = Date.now() - start_1\n    console.log('setInterval解码后直到显示时的时长', timeDiff_1)\n    this.playing = true\n    this.startTime_ = Date.now()\n    this.updateRender(data)\n    frameData_0 = null\n    data = null\n  }\n\n  async pause() {\n    if (this.decoder) {\n      this.pauseExecute = true\n      this.playing = false\n      this.decoderStart = false\n      await this.decoder.wait(true)\n    }\n  }\n\n  async resume(start = true) {\n    if (this.decoder && this.pauseExecute) {\n      this.playing = true\n      this.pauseExecute = false\n      // this.decoder.seek(0);\n      await this.decoder.wait(false)\n      if (start) {\n        this.decoderStart = true\n      }\n    }\n  }\n\n  stop(type) {\n    if (this.decoder) {\n      this.decoder.stop()\n    }\n  }\n\n  showHidden(visible, type, type2) {\n    if (visible == this.visible) return\n    if (this.manTRS) {\n      if (this.manTRS.el) {\n        this.visible = visible\n        this.manTRS.setData({\n          visible\n        })\n      } else {\n        console.error('showHidden报错', type, type2, this.manTRS, visible, this.visible)\n      }\n    }\n  }\n\n  releaseAsset() {\n    this.scene.assets.releaseAsset('geometry', 'geometry-' + this.name)\n    this.scene.assets.releaseAsset('effect', 'frame-effect' + this.name)\n    this.scene.assets.releaseAsset('texture', 'texture1-' + this.name)\n    this.scene.assets.releaseAsset('texture', 'texture2-' + this.name)\n    this.scene.assets.releaseAsset('material', 'material-' + this.name)\n  }\n\n  releaseDecoder() {\n    if (this.decoder) {\n      this.decoder.on('ended', () => {})\n      this.decoder.stop()\n      this.decoder.remove()\n      this.decoder = null\n    }\n  }\n\n  releaseNetwork() {\n    if (this.requestTask1) this.requestTask1.abort()\n    this.requestTask1 = null\n  }\n\n  releaseBuffer() {\n    this.arrayBuffers = null\n    this.buffers = null\n    this.frames = null\n    this.firstFrames = null\n    this.boxs = null\n\n    this.index = null\n    this.pixelData = null\n    this.pixelDataClear = null\n  }\n\n  releaseEvent() {\n    if (this.frameDataflag) {\n      clearInterval(this.frameDataflag)\n      this.frameDataflag = null\n    }\n    if (this.xrTimeOut) {\n      clearTimeout(this.xrTimeOut)\n      this.xrTimeOut = null\n    }\n    this.playStartEvent = null\n  }\n\n  release(type = true) {\n    this.releaseDecoder()\n    this.releaseNetwork()\n    if (type == 'all' || !type) {\n      this.texture_ = null\n      this.texture_2 = null\n      this.matGeo = null\n      this.geometryMan = null\n      this.meshMan = null\n      this.manTRS = null\n      this.manElem = null\n    }\n    if (type) {\n      this.showHidden(false, 'replease')\n      this.nextBufferLoadIndex = 1\n      if (this.arrayBuffers && this.arrayBuffers.length) this.arrayBuffers.length = type ? 1 : 0\n      if (type == 'all') {\n        this.releaseBuffer()\n        if (this.manElem) this.geometryRoot.removeChild(this.manElem)\n        this.geometryRoot = null\n      }\n    } else {\n      this.releaseBuffer()\n    }\n    this.releaseEvent()\n    this.startTime = null\n    this.pendingBufferDownload = false\n  }\n\n  close() {\n    if (this.decoder) {\n      this.decoder.stop()\n      this.decoder.remove()\n    }\n  }\n\n  updateVertexBuffer(positionData, uvDataArray, indices, weights) {\n    const vertexCount = positionData.length / 3\n    let vbIndex = 0\n    for (let i = 0; i < vertexCount; i++) {\n      const vertexIndex = i * 3\n      const uvIndex = i * 2\n      const weightIndex = i * 4\n      // 0 xyz\n      vb0[vbIndex] = positionData[vertexIndex]\n      vb0[vbIndex + 1] = positionData[vertexIndex + 1]\n      vb0[vbIndex + 2] = positionData[vertexIndex + 2]\n      // 2 uv\n      vb0[vbIndex + 3] = uvDataArray[uvIndex]\n      vb0[vbIndex + 4] = uvDataArray[uvIndex + 1]\n      // 4 indices\n      vb0[vbIndex + 5] = indices[weightIndex]\n      vb0[vbIndex + 6] = indices[weightIndex + 1]\n      vb0[vbIndex + 7] = indices[weightIndex + 2]\n      vb0[vbIndex + 8] = indices[weightIndex + 3]\n      // 8 weights\n      vb0[vbIndex + 9] = weights[weightIndex]\n      vb0[vbIndex + 10] = weights[weightIndex + 1]\n      vb0[vbIndex + 11] = weights[weightIndex + 2]\n      vb0[vbIndex + 12] = weights[weightIndex + 3]\n      // total 13\n      vbIndex += 13\n    }\n\n    return vb0\n  }\n}\n\nexport {\n  mesh4DPlayer\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-volumeVideo/shaders/common.js",
    "content": "export default\n/* glsl */\n`\n#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#define EPSILON_ATAN 1e-2\n\n#define WX_MANUAL_SRGB true\n#define WX_SRGB_FAST_APPROXIMATION true\n\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\n\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n\tvec3 clearcoatNormal;\n};\n\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\n\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n\nuniform vec4 u_ambientLightColorIns;\nuniform vec3 u_mainLightDir;\nuniform vec4 u_mainLightColorIns;\n\nuniform vec3 u_addLightsPos[4];\nuniform vec3 u_addLightsDir[4];\nuniform vec4 u_addLightsColorIns[4];\nuniform vec4 u_addLightsInfo[4];\n\n\nvec4 SRGBtoLINEAR(vec4 srgbIn)\n{\n#ifdef WX_MANUAL_SRGB\n\n    #ifdef WX_SRGB_FAST_APPROXIMATION\n        vec3 linOut = pow(srgbIn.xyz,vec3(2.2));\n    #else //SRGB_FAST_APPROXIMATION\n        vec3 bLess = step(vec3(0.04045),srgbIn.xyz);\n        vec3 linOut = mix( srgbIn.xyz/vec3(12.92), pow((srgbIn.xyz+vec3(0.055))/vec3(1.055),vec3(2.4)), bLess );\n    #endif //SRGB_FAST_APPROXIMATION\n\n    return vec4(linOut, srgbIn.w);;\n\n#else //MANUAL_SRGB\n    \n    return srgbIn;\n\n#endif //MANUAL_SRGB\n}\n\nvec3 gammaCorrection(vec3 color) {\n  return pow(color, vec3(1.0 / 2.2));\n}\n\nvec3 removeGammaCorrection(vec3 color) {\n  return pow(color, vec3(2.2));\n}\n\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Vendor/EXT_lights_image_based/README.md#rgbd\nvec3 decodeRGBD(in vec4 color){\n\t\treturn color.rgb / color.a;\n}\n\nfloat getFace( vec3 direction ) {\n\tvec3 absDirection = abs( direction );\n\tfloat face = - 1.0;\n\tif ( absDirection.x > absDirection.z ) {\n\t\tif ( absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t} else {\n\t\tif ( absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t}\n\treturn face;\n}\nvec2 getUV( vec3 direction, float face ) {\n\tvec2 uv;\n\tif ( face == 0.0 ) {\n\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x ); // pos x\n\t} else if ( face == 1.0 ) {\n\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y ); // pos y\n\t} else if ( face == 2.0 ) {\n\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z ); // pos z\n\t} else if ( face == 3.0 ) {\n\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x ); // neg x\n\t} else if ( face == 4.0 ) {\n\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y ); // neg y\n\t} else {\n\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z ); // neg z\n\t}\n\treturn 0.5 * ( uv + 1.0 );\n}\n\n\nvec4 textureEnvMap(sampler2D texture, vec3 position){\n\treturn texture2D(texture, vec2(atan(position.x, position.z) * RECIPROCAL_PI * 0.5+0.5,  acos(position.y) * RECIPROCAL_PI));\n}\n\nvec4 textureEnvMapIncludeMipmapsLod(sampler2D texture, vec3 position, float lod){\n\tlod = floor(lod);\n\tif (lod > 7.0) {\n\t\tlod = 7.0;\n\t}\n\tfloat posZ = abs(position.z) < EPSILON_ATAN ? EPSILON_ATAN : position.z;\n\tvec2 uv = vec2(atan(position.x, posZ) * RECIPROCAL_PI * 0.5 + 0.5, acos(position.y) * RECIPROCAL_PI);\n\tfloat scale = pow(2.0, lod);\n\treturn texture2D(texture, vec2(uv.x / scale, (uv.y / scale / 2.0) + 1.0 - 1.0/pow(2.0, lod)));\n\treturn vec4( position, 0.0);\n}\n\nvec4 textureBilinearEnvMap(sampler2D texture, vec3 direction, float roughness){\n\n\tfloat uvX = (atan(direction.x, direction.z) ) * RECIPROCAL_PI * 0.5 + 0.5;\n\tfloat uvY = acos(direction.y) * RECIPROCAL_PI;\n\tvec2 uv = vec2(uvX, uvY);\n\tvec4 envmap = texture2D(texture, uv);\n\treturn envmap;\n\n}\n\n\nvec3 computeDiffuseSHLight(vec3 normal, in vec3 sh[9]) {\n\treturn sh[0] +\n\t\tsh[1] * (normal.y) +\n\t\tsh[2] * (normal.z) +\n\t\tsh[3] * (normal.x) +\n\t\tsh[4] * (normal.y * normal.x) +\n\t\tsh[5] * (normal.y * normal.z) +\n\t\tsh[6] * ((3.0 * normal.z * normal.z) - 1.0) +\n\t\tsh[7] * (normal.z * normal.x) +\n\t\tsh[8] * (normal.x * normal.x - (normal.y * normal.y));\n}\n\n\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\t// dir can be either a direction vector or a normal vector\n\t// upper-left 3x3 of matrix is assumed to be orthogonal\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\n\n\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-volumeVideo/shaders/shadowFrag.js",
    "content": "export default `#version 100\nprecision mediump float;\nprecision highp int;\nvarying highp float v_shadowDepth;\n\nvec4 packDepth(float depth)\n{\n  vec4 bitShift = vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);\n  vec4 bitMask = vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);\n  vec4 res = mod(\n    depth * bitShift * vec4(255.0, 255.0, 255.0, 255.0),\n    vec4(256.0, 256.0, 256.0, 256.0)) / vec4(255.0, 255.0, 255.0, 255.0);\n  res -= res.xxyz * bitMask;\n  return res;\n}\n\nvoid main()\n{\n    gl_FragData[0] = packDepth(v_shadowDepth * 0.5 + 0.5);\n} \n    `\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-volumeVideo/shaders/shadowVert.js",
    "content": "export default `#version 100\nuniform highp mat4 u_view;\nuniform highp mat4 u_projection;\nuniform highp mat4 u_world;\nuniform mat4 u_lightSpaceMatrix;\n\nattribute vec3 a_position;\nattribute highp vec2 a_texCoord;\nattribute highp vec4 a_boneIndices;\nattribute highp vec4 a_weights;\n\nuniform sampler2D texture2;\n\nvarying highp vec2 v_UV;\nvarying highp float v_shadowDepth;\n\nhighp float width = 4.0;\nhighp float height = 60.0;\nvec4 texelFetch1(int x, int y) {\n      return texture2D(texture2, vec2((float(x) + 0.5) / width, (float(y) + 0.5) / height));\n}\nmat4 getBoneMatrix(int boneNdx) {\n  return mat4(\n    texelFetch1(0, boneNdx),\n    texelFetch1(1, boneNdx),\n    texelFetch1(2, boneNdx),\n    texelFetch1(3, boneNdx));\n}\nvoid main(){\n  v_UV = a_texCoord;\n  vec4 totalPosition = vec4(0.0);\n\n // vec4 worldPosition = u_world * vec4(a_position, 1.0);\n\n  for(int i = 0; i < 4; i++) {\n    int boneId = int(a_boneIndices[i]);\n    vec4 localPosition = getBoneMatrix(boneId) * vec4(a_position.xyz, 1.0);\n    totalPosition += localPosition * a_weights[i];\n  }\n\n  vec4 worldPosition = u_world * vec4(totalPosition.xyz, 1.0);\n  vec4 lightPos = u_lightSpaceMatrix * worldPosition;\n  v_shadowDepth =  lightPos.z / lightPos.w;\n\n  gl_Position = lightPos;\n\n\n}\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-volumeVideo/shaders/videoFrag.js",
    "content": "export default `#version 100\nprecision mediump float;\nprecision highp int;\nvarying highp vec2 v_UV;\n\nuniform sampler2D u_baseColorMap;\nvoid main()\n{\n  vec4 color = texture2D(u_baseColorMap, v_UV);\n\n  // gl_FragColor = vec4(1.0,1.0,1.0,1.0);\n  gl_FragColor = vec4(color.rgb, 1.0);\n} \n    `\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/template/xr-template-volumeVideo/shaders/videoVert.js",
    "content": "export default `#version 100\nuniform highp mat4 u_view;\nuniform highp mat4 u_projection;\nuniform highp mat4 u_world;\nattribute vec3 a_position;\nattribute highp vec2 a_texCoord;\nattribute highp vec4 a_boneIndices;\nattribute highp vec4 a_weights;\n\nuniform sampler2D texture2;\n\nvarying highp vec2 v_UV;\n\nhighp float width = 4.0;\nhighp float height = 60.0;\nvec4 texelFetch1(int x, int y) {\n      return texture2D(texture2, vec2((float(x) + 0.5) / width, (float(y) + 0.5) / height));\n}\nmat4 getBoneMatrix(int boneNdx) {\n  return mat4(\n    texelFetch1(0, boneNdx),\n    texelFetch1(1, boneNdx),\n    texelFetch1(2, boneNdx),\n    texelFetch1(3, boneNdx));\n}\nvoid main(){\n  v_UV = a_texCoord;\n  vec4 totalPosition = vec4(0.0);\n\n  for(int i = 0; i < 4; i++) {\n    int boneId = int(a_boneIndices[i]);\n    vec4 localPosition = getBoneMatrix(boneId) * vec4(a_position.xyz, 1.0);\n    totalPosition += localPosition * a_weights[i];\n  }\n\n  vec4 worldPosition = u_world * vec4(totalPosition.xyz, 1.0);\n\n  gl_Position = u_projection * u_view * worldPosition;\n}\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-2dmarker/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    markerImg: {\n      type: String\n    },\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({\n      detail\n    }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({\n      detail\n    }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({\n      detail\n    }) {\n      console.log('assets loaded', detail.value)\n      this.setData({\n        loaded: true\n      })\n    },\n    handleARReady({\n      detail\n    }) {\n      console.log('arReady')\n      this.setData({\n        arReady: true\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-2dmarker/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-2dmarker/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Marker\" id=\"xr-scene\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/butterfly/index.glb\" />\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\" />\n  <xr-node wx:if=\"{{arReady}}\">\n    <xr-ar-tracker mode=\"Marker\" src=\"{{markerImg}}\">\n      <xr-gltf model=\"gltf\" anim-autoplay position=\"0.2 0 -0.2\" scale=\"0.6 0.6 0.6\" rotation=\"0 -50 0\" />\n      <xr-gltf model=\"gltf\" anim-autoplay position=\"0.4 0 0.3\" scale=\"0.5 0.5 0.5\" rotation=\"0 -50 0\" />\n      <xr-gltf model=\"gltf\" anim-autoplay position=\"-0.3 0 0.3\" scale=\"0.4 0.4 0.4\" rotation=\"0 -50 0\" />\n      <!-- 坐标系提示，单位1 的坐标轴 -->\n      <xr-mesh node-id=\"mesh-x\" position=\"1 0 0\"  scale=\"2 0.02 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.7 0.3 0.3 1\" ></xr-mesh>\n      <xr-mesh node-id=\"mesh-y\" position=\"0 1 0\"  scale=\"0.02 2 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.7 0.3 1\"></xr-mesh>\n      <xr-mesh node-id=\"mesh-z\" position=\"0 0 1\"  scale=\"0.02 0.02 2\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.3 0.7 1\"></xr-mesh>\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0.8 2.2 -5\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-2dmarker/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-basic/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      this.mat = new (wx.getXrFrameSystem().Matrix4)()\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      // this.setData({loaded: true});\n      this.scene.event.addOnce('touchstart', this.placeNode.bind(this))\n    },\n    handleARReady({ detail }) {\n      console.log('arReady', this.scene.ar.arVersion)\n    },\n    placeNode(event) {\n      const { clientX, clientY } = event.touches[0]\n      const { frameWidth: width, frameHeight: height } = this.scene\n\n      if (clientY / height > 0.8 && clientX / width < 0.2) {\n        this.scene.getNodeById('setitem').visible = false\n        this.scene.ar.resetPlane()\n      } else {\n        this.scene.ar.placeHere('setitem', true)\n      }\n\n      this.scene.event.addOnce('touchstart', this.placeNode.bind(this))\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-basic/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-basic/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Plane;\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-item\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/just_a_girl/index.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"anchor\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/ar-plane-marker.glb\" />\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-node>\n    <xr-ar-tracker mode=\"Plane\">\n      <xr-gltf model=\"anchor\"></xr-gltf>\n    </xr-ar-tracker>\n    <xr-node node-id=\"setitem\" visible=\"false\">\n      <xr-gltf model=\"gltf-item\" scale=\"0.006 0.006 0.006\"></xr-gltf>\n    </xr-node>\n\n    <!-- 坐标系提示，单位1 的坐标轴 -->\n    <xr-mesh node-id=\"mesh-x\" position=\"1 0 0\"  scale=\"2 0.02 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.7 0.3 0.3 1\" ></xr-mesh>\n    <xr-mesh node-id=\"mesh-y\" position=\"0 1 0\"  scale=\"0.02 2 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.7 0.3 1\"></xr-mesh>\n    <xr-mesh node-id=\"mesh-z\" position=\"0 0 1\"  scale=\"0.02 0.02 2\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.3 0.7 1\"></xr-mesh>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-basic/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-body/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      xrScene.event.add('tick', this.handleTick.bind(this))\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleARReady({ detail }) {\n      console.log('arReady')\n      this.setData({ arReady: true })\n    },\n    handleTick() {\n      const xrSystem = wx.getXrFrameSystem()\n      const trackerEl = this.scene.getElementById('tracker')\n      if (!trackerEl) {\n        return\n      }\n\n      const tracker = trackerEl.getComponent(xrSystem.ARTracker)\n      if (!tracker.arActive) {\n        return\n      }\n\n      // 这里只是例子，实际上用的是`ARTracker`的`autoSync`属性。\n      // 但也是一个更高自由度的选项。\n      // 视情况需要自己同步`tracker`的`scale`和`rotation`特定节点。\n      // 第一个参数是特征点编好，第二个是可选的复用结果，第三个是可选的是否相对于`ARTracker`。\n      // 为`false`为世界空间的位置，需要配合`scale`自己使用\n      const position = tracker.getPosition(98, new xrSystem.Vector3(), false)\n      // 获取总体置信度\n      const score = tracker.score\n\n      this.triggerEvent('info', { score })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-body/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-body/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Body\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n  </xr-assets>\n  <xr-node wx:if=\"{{arReady}}\">\n    <xr-ar-tracker id='tracker' mode=\"Body\" auto-sync=\"-1 0 5 6 17 18 11 12 13 14 15 16\">\n      <xr-mesh name=\"body\" geometry=\"cube\" scale=\"0.6 1.7 0.1\" uniforms=\"u_baseColorFactor:1 1 1 0.5\" states=\"renderQueue:2500,alphaMode:BLEND\"/>\n      <xr-mesh name=\"head\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:1 0 0 1\" />\n\n      <xr-mesh name=\"shoulderL\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 0 1 1\" />\n      <xr-mesh name=\"shoulderR\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 0 1 1\" />\n\n      <xr-mesh name=\"HandL\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 0 1 1\" />\n      <xr-mesh name=\"HandR\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 0 1 1\" />\n\n      <xr-mesh name=\"crotchL\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 1 0 1\" />\n      <xr-mesh name=\"crotchR\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 1 0 1\" />\n\n      <xr-mesh name=\"kneeL\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 1 0 1\" />\n      <xr-mesh name=\"kneeR\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 1 0 1\" />\n\n      <xr-mesh name=\"footL\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 1 0 1\" />\n      <xr-mesh name=\"footR\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 1 0 1\" />\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera near=\"0.01\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-body/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-body-3d/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  data: {\n    loaded: false,\n    arReady: false,\n    trackerReady: false,\n    syncNumber: 0,\n    syncStr: '',\n    syncList: [],\n    syncBoxSize: 0.03\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      xrScene.event.add('tick', this.handleTick.bind(this))\n      console.log('xr-scene', xrScene)\n\n      // 同步点信息\n      const syncNumber = 24\n\n      let syncStr = ''\n      const syncList = []\n\n      for (let i = 0; i <= syncNumber; i++) {\n        const colorFloat = i / 16\n        const colorR = 1.0 - colorFloat\n        syncStr += ` ${i}`\n        syncList.push(`1.0 ${colorR} ${colorR} 1.0`)\n      }\n\n      this.setData({\n        trackerReady: true,\n        syncNumber,\n        syncStr,\n        syncList\n      })\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleARReady({ detail }) {\n      console.log('arReady')\n      this.setData({ arReady: true })\n    },\n    handleTick() {\n      const xrSystem = wx.getXrFrameSystem()\n      const trackerEl = this.scene.getElementById('tracker')\n      if (!trackerEl) {\n        return\n      }\n\n      const tracker = trackerEl.getComponent(xrSystem.ARTracker)\n      if (!tracker.arActive) {\n\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-body-3d/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-body-3d/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Body;pose3d: true;\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"simple-mat\" effect=\"simple\" />\n  </xr-assets>\n  <xr-node wx:if=\"{{arReady}}\">\n    <xr-ar-tracker wx:if=\"{{trackerReady}}\" id='tracker' mode=\"Body\" auto-sync=\"{{syncStr}}\">\n      <!-- 同步的点放前面-->\n      <xr-node wx:for=\"{{syncList}}\" wx:for-item=\"syncColor\">\n        <xr-mesh\n          geometry=\"sphere\" scale=\"{{syncBoxSize}} {{syncBoxSize}} {{syncBoxSize}}\"\n          material=\"simple-mat\"\n          uniforms=\"u_baseColorFactor: {{syncColor}} 1\"\n          />\n      </xr-node>\n      <!-- 不需要同步的绘制在后面 -->\n      <xr-node>\n        <xr-gltf wx:if=\"{{loaded}}\"\n          id=\"face\"\n          position=\"0 0 0\" rotation=\"0 0 0\" scale=\"1 1 1\" model=\"gltf-face\"\n        ></xr-gltf>\n      </xr-node>\n      <!-- 坐标系提示，单位1 的坐标轴 -->\n      <xr-mesh node-id=\"mesh-x\" position=\"1 0 0\"  scale=\"2 0.02 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.7 0.3 0.3 1\" ></xr-mesh>\n      <xr-mesh node-id=\"mesh-y\" position=\"0 1 0\"  scale=\"0.02 2 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.7 0.3 1\"></xr-mesh>\n      <xr-mesh node-id=\"mesh-z\" position=\"0 0 1\"  scale=\"0.02 0.02 2\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.3 0.7 1\"></xr-mesh>\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera near=\"0.01\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-body-3d/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-camera/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {\n    attached() {\n      console.log('data.a', this.data.a) // expected 123\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleARReady({ detail }) {\n      console.log('ar-ready', this.scene.ar.arModes, this.scene.ar.arVersion)\n    },\n    handleARError({ detail }) {\n      console.log('ar-error', detail)\n    },\n    handleLog({ detail }) {\n      const { el, value } = detail\n      console.log('log', detail.value)\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-camera/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-camera/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" ar-system bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\" bind:ar-error=\"handleARError\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-table\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/metal_table/scene.gltf\" />\n  </xr-assets>\n  <xr-env env-data=\"gz-haixinsha\"/>\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-node node-id=\"table-wrap\" position=\"0 0 0\">\n      <xr-gltf node-id=\"mesh-gltf-table\" position=\"0 -1 0\" rotation=\"0 45 0\" scale=\"0.5 0.5 0.5\" model=\"gltf-table\" />\n    </xr-node>\n    <xr-camera\n      position=\"2 1 2\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" target=\"camera-target\" camera-orbit-control=\"\"\n    />\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.2\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"2\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-camera/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-face/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      xrScene.event.add('tick', this.handleTick.bind(this))\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleARReady({ detail }) {\n      console.log('arReady')\n      this.setData({ arReady: true })\n    },\n    handleTick() {\n      const xrSystem = wx.getXrFrameSystem()\n      const trackerEl = this.scene.getElementById('tracker')\n      if (!trackerEl) {\n        return\n      }\n\n      const tracker = trackerEl.getComponent(xrSystem.ARTracker)\n      if (!tracker.arActive) {\n        return\n      }\n\n      // 这里只是例子，实际上用的是`ARTracker`的`autoSync`属性。\n      // 但也是一个更高自由度的选项。\n      // 视情况需要自己同步`tracker`的`scale`和`rotation`特定节点。\n      // 第一个参数是特征点编好，第二个是可选的复用结果，第三个是可选的是否相对于`ARTracker`。\n      // 为`false`为世界空间的位置，需要配合`scale`自己使用\n      const position = tracker.getPosition(98, new xrSystem.Vector3(), false)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-face/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-face/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Face;camera:Front\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n  </xr-assets>\n  <xr-node wx:if=\"{{arReady}}\">\n    <xr-ar-tracker id='tracker' mode=\"Face\" auto-sync=\"-1 105 104 45 98\">\n      <xr-mesh name=\"face\" geometry=\"cube\" scale=\"0.7 0.8 0.1\" uniforms=\"u_baseColorFactor:1 1 1 0.5\" states=\"renderQueue:2500,alphaMode:BLEND\"/>\n      <xr-mesh name=\"eyeL\" geometry=\"cube\" scale=\"0.1 0.1 0.1\" uniforms=\"u_baseColorFactor:0 1 0 1\" />\n      <xr-mesh name=\"eyeR\" geometry=\"cube\" scale=\"0.1 0.1 0.1\" uniforms=\"u_baseColorFactor:0 1 0 1\" />\n      <xr-mesh name=\"nose\" geometry=\"cube\" scale=\"0.1 0.1 0.1\" uniforms=\"u_baseColorFactor:0 0 1 1\" />\n      <xr-mesh name=\"mouth\" geometry=\"cube\" scale=\"0.1 0.1 0.1\" uniforms=\"u_baseColorFactor:1 0 0 1\" />\n      <!-- 坐标系提示，单位1 的坐标轴 -->\n      <xr-mesh node-id=\"mesh-x\" position=\"1 0 0\"  scale=\"2 0.02 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.7 0.3 0.3 1\" ></xr-mesh>\n      <xr-mesh node-id=\"mesh-y\" position=\"0 1 0\"  scale=\"0.02 2 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.7 0.3 1\"></xr-mesh>\n      <xr-mesh node-id=\"mesh-z\" position=\"0 0 1\"  scale=\"0.02 0.02 2\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.3 0.7 1\"></xr-mesh>\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera near=\"0.01\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-face/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-face-3d/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  data: {\n    loaded: false,\n    arReady: false,\n    trackerReady: false,\n    syncNumber: 0,\n    syncStr: '',\n    syncList: [],\n    syncBoxSize: 0.03\n  },\n  infoInited: false,\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      xrScene.event.add('tick', this.handleTick.bind(this))\n      console.log('xr-scene', xrScene)\n\n      // 同步点信息\n      const syncNumber = 106\n\n      let syncStr = ''\n      const syncList = []\n\n      for (let i = 0; i <= syncNumber; i++) {\n        const colorFloat = i / 106\n        const colorR = 1.0 - colorFloat\n        syncStr += ` ${i}`\n        syncList.push(`1.0 ${colorR} ${colorR} 1.0`)\n      }\n\n      this.setData({\n        trackerReady: true,\n        syncNumber,\n        syncStr,\n        syncList\n      })\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleARReady({ detail }) {\n      console.log('arReady')\n      this.setData({ arReady: true })\n    },\n    handleInfoInit() {\n      this.infoInited = true\n\n      console.log('handleInfoInit')\n\n      // 延时保证glTF加载完毕\n      setTimeout(() => {\n        const xrSystem = wx.getXrFrameSystem()\n        // 头模设为半透明\n        const faceElem = this.scene.getElementById('face')\n        const faceGLTF = faceElem.getComponent(xrSystem.GLTF)\n        console.log(faceGLTF, faceGLTF.meshes)\n        for (const mesh of faceGLTF.meshes) {\n          // 通过alphaMode 的 Setter 设置，或者写入renderState，但需要手动控制宏\n          mesh.material.alphaMode = 'BLEND'\n          mesh.material.renderQueue = 3000\n          mesh.material.setVector('u_baseColorFactor', xrSystem.Vector4.createFromNumber(1, 1, 1, 0.4))\n        }\n      }, 30)\n    },\n    handleTick() {\n      const xrSystem = wx.getXrFrameSystem()\n\n      if (this.data.arReady && this.data.loaded && this.data.trackerReady && !this.infoInited) {\n        this.handleInfoInit()\n      }\n\n      const trackerEl = this.scene.getElementById('tracker')\n      if (!trackerEl) {\n        return\n      }\n\n      const tracker = trackerEl.getComponent(xrSystem.ARTracker)\n      if (!tracker.arActive) {\n        return\n      }\n\n      // 这里只是例子，实际上用的是`ARTracker`的`autoSync`属性。\n      // 但也是一个更高自由度的选项。\n      // 视情况需要自己同步`tracker`的`scale`和`rotation`特定节点。\n      // 第一个参数是特征点编好，第二个是可选的复用结果，第三个是可选的是否相对于`ARTracker`。\n      // 为`false`为世界空间的位置，需要配合`scale`自己使用\n      const position = tracker.getPosition(98, new xrSystem.Vector3(), false)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-face-3d/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-face-3d/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Face;camera:Front;pose3d: true;\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <!-- 标准头模，外部可以直接使用，并且可以根据该模型大小，制作挂载模型 -->\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-face\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/face.glb\" />\n    <xr-asset-material asset-id=\"simple-mat\" effect=\"simple\" />\n  </xr-assets>\n  <xr-node wx:if=\"{{arReady}}\">\n    <xr-ar-tracker wx:if=\"{{trackerReady}}\" id='tracker' mode=\"Face\" auto-sync=\"{{syncStr}}\">\n      <!-- 同步的点放前面-->\n      <xr-node wx:for=\"{{syncList}}\" wx:for-item=\"syncColor\">\n        <xr-mesh\n          geometry=\"sphere\" scale=\"{{syncBoxSize}} {{syncBoxSize}} {{syncBoxSize}}\"\n          material=\"simple-mat\"\n          uniforms=\"u_baseColorFactor: {{syncColor}} 1\"\n          />\n      </xr-node>\n      <!-- 不需要同步的绘制在后面 -->\n      <xr-node>\n        <xr-gltf wx:if=\"{{loaded}}\"\n          id=\"face\"\n          position=\"0 0 0\" rotation=\"0 0 0\" scale=\"1 1 1\" model=\"gltf-face\"\n        ></xr-gltf>\n      </xr-node>\n      <!-- 坐标系提示，单位1 的坐标轴 -->\n      <xr-mesh node-id=\"mesh-x\" position=\"1 0 0\"  scale=\"2 0.02 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.7 0.3 0.3 1\" ></xr-mesh>\n      <xr-mesh node-id=\"mesh-y\" position=\"0 1 0\"  scale=\"0.02 2 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.7 0.3 1\"></xr-mesh>\n      <xr-mesh node-id=\"mesh-z\" position=\"0 0 1\"  scale=\"0.02 0.02 2\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.3 0.7 1\"></xr-mesh>\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera near=\"0.01\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-face-3d/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-hand/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      xrScene.event.add('tick', this.handleTick.bind(this))\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleARReady({ detail }) {\n      console.log('arReady')\n      this.setData({ arReady: true })\n    },\n    handleTick() {\n      const xrSystem = wx.getXrFrameSystem()\n      const trackerEl = this.scene.getElementById('tracker')\n      if (!trackerEl) {\n        return\n      }\n\n      const tracker = trackerEl.getComponent(xrSystem.ARTracker)\n      if (!tracker.arActive) {\n        return\n      }\n\n      // 这里只是例子，实际上用的是`ARTracker`的`autoSync`属性。\n      // 但也是一个更高自由度的选项。\n      // 视情况需要自己同步`tracker`的`scale`和`rotation`特定节点。\n      // 第一个参数是特征点编好，第二个是可选的复用结果，第三个是可选的是否相对于`ARTracker`。\n      // 为`false`为世界空间的位置，需要配合`scale`自己使用\n      const position = tracker.getPosition(98, new xrSystem.Vector3(), false)\n      // 获取手势姿态，详见官网\n      const gesture = tracker.gesture\n      // 获取总体置信度\n      const score = tracker.score\n\n      this.triggerEvent('info', { gesture, score })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-hand/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-hand/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Hand\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n  </xr-assets>\n  <xr-node wx:if=\"{{arReady}}\">\n    <xr-ar-tracker id='tracker' mode=\"Hand\" auto-sync=\"-1 0 9 4 8 12 16 20\">\n      <xr-mesh name=\"hand\" geometry=\"cube\" scale=\"0.7 0.8 0.1\" uniforms=\"u_baseColorFactor:1 1 1 0.5\" states=\"renderQueue:2500,alphaMode:BLEND\"/>\n      <xr-mesh name=\"wrist\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:1 0 0 1\" />\n      <xr-mesh name=\"joint\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 1 0 1\" />\n      <xr-mesh name=\"thumb\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 0 1 1\" />\n      <xr-mesh name=\"index\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 0 1 1\" />\n      <xr-mesh name=\"middle\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 0 1 1\" />\n      <xr-mesh name=\"ring\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 0 1 1\" />\n      <xr-mesh name=\"little\" geometry=\"sphere\" scale=\"0.05 0.05 0.05\" uniforms=\"u_baseColorFactor:0 0 1 1\" />\n\n      <!-- 坐标系提示，单位1 的坐标轴 -->\n      <xr-mesh node-id=\"mesh-x\" position=\"1 0 0\"  scale=\"2 0.02 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.7 0.3 0.3 1\" ></xr-mesh>\n      <xr-mesh node-id=\"mesh-y\" position=\"0 1 0\"  scale=\"0.02 2 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.7 0.3 1\"></xr-mesh>\n      <xr-mesh node-id=\"mesh-z\" position=\"0 0 1\"  scale=\"0.02 0.02 2\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.3 0.7 1\"></xr-mesh>\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera near=\"0.01\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-hand/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-hand-3d/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  data: {\n    loaded: false,\n    arReady: false,\n    trackerReady: false,\n    syncNumber: 0,\n    syncStr: '',\n    syncList: [],\n    syncBoxSize: 0.006\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      xrScene.event.add('tick', this.handleTick.bind(this))\n      console.log('xr-scene', xrScene)\n\n      // 同步点信息\n      const syncNumber = 16\n\n      let syncStr = ''\n      const syncList = []\n\n      for (let i = 0; i <= syncNumber; i++) {\n        const colorFloat = i / 16\n        const colorR = 1.0 - colorFloat\n        syncStr += ` ${i}`\n        syncList.push(`1.0 ${colorR} ${colorR} 1.0`)\n      }\n\n      this.setData({\n        trackerReady: true,\n        syncNumber,\n        syncStr,\n        syncList\n      })\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleARReady({ detail }) {\n      console.log('arReady')\n      this.setData({ arReady: true })\n    },\n    handleTick() {\n      const xrSystem = wx.getXrFrameSystem()\n      const trackerEl = this.scene.getElementById('tracker')\n      if (!trackerEl) {\n        return\n      }\n\n      const tracker = trackerEl.getComponent(xrSystem.ARTracker)\n      if (!tracker.arActive) {\n\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-hand-3d/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-hand-3d/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Hand;pose3d: true;\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"simple-mat\" effect=\"simple\" />\n  </xr-assets>\n  <xr-node wx:if=\"{{arReady}}\">\n     <xr-ar-tracker wx:if=\"{{trackerReady}}\" id='tracker' mode=\"Hand\" auto-sync=\"{{syncStr}}\">\n      <!-- 同步的点放前面-->\n      <xr-node wx:for=\"{{syncList}}\" wx:for-item=\"syncColor\">\n        <xr-mesh\n          geometry=\"sphere\" scale=\"{{syncBoxSize}} {{syncBoxSize}} {{syncBoxSize}}\"\n          material=\"simple-mat\"\n          uniforms=\"u_baseColorFactor: {{syncColor}} 1\"\n          />\n      </xr-node>\n      <!-- 不需要同步的绘制在后面 -->\n      <xr-node>\n        <xr-gltf wx:if=\"{{loaded}}\"\n          id=\"face\"\n          position=\"0 0 0\" rotation=\"0 0 0\" scale=\"1 1 1\" model=\"gltf-face\"\n        ></xr-gltf>\n      </xr-node>\n      <!-- 坐标系提示，单位1 的坐标轴 -->\n      <xr-mesh node-id=\"mesh-x\" position=\"1 0 0\"  scale=\"2 0.02 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.7 0.3 0.3 1\" ></xr-mesh>\n      <xr-mesh node-id=\"mesh-y\" position=\"0 1 0\"  scale=\"0.02 2 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.7 0.3 1\"></xr-mesh>\n      <xr-mesh node-id=\"mesh-z\" position=\"0 0 1\"  scale=\"0.02 0.02 2\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.3 0.7 1\"></xr-mesh>\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera near=\"0.01\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-hand-3d/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-osdmarker/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    markerImg: {\n      type: String\n    },\n  },\n  data: {\n    loaded: false,\n    arReady: false\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({\n      detail\n    }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({\n      detail\n    }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({\n      detail\n    }) {\n      console.log('assets loaded', detail.value)\n      this.setData({\n        loaded: true\n      })\n    },\n    handleARReady({\n      detail\n    }) {\n      console.log('arReady')\n      this.setData({\n        arReady: true\n      })\n    },\n    handleLog({\n      detail\n    }) {\n      console.log('log', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-osdmarker/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-osdmarker/index.wxml",
    "content": "<xr-scene ar-system=\"modes:OSD\" id=\"xr-scene\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\" bind:log=\"handleLog\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-burger\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/index.glb\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"id2\" scale=\"2 2 2\" position=\"0 0 0\"></xr-node>\n    <xr-ar-tracker mode=\"OSD\" src=\"{{markerImg}}\">\n      <xr-mesh geometry=\"plane\" rotation=\"-90 0 0\" scale=\"1 1 1\" uniforms=\"u_baseColorFactor:0 1 0 0.5\" states=\"alphaMode:BLEND\" />\n      <!-- 坐标系提示，单位1 的坐标轴 -->\n      <xr-mesh node-id=\"mesh-x\" position=\"1 0 0\"  scale=\"2 0.02 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.7 0.3 0.3 1\" ></xr-mesh>\n      <xr-mesh node-id=\"mesh-y\" position=\"0 1 0\"  scale=\"0.02 2 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.7 0.3 1\"></xr-mesh>\n      <xr-mesh node-id=\"mesh-z\" position=\"0 0 1\"  scale=\"0.02 0.02 2\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.3 0.7 1\"></xr-mesh>\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-osdmarker/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-shoe/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  data: {\n    loaded: false,\n    arReady: false,\n    trackerReady: false,\n    syncNumber: 0,\n    syncStr: '',\n    syncList: [],\n    syncBoxSize: 0.2\n  },\n  infoInited: false,\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      xrScene.event.add('tick', this.handleTick.bind(this))\n      console.log('xr-scene', xrScene)\n\n      // 同步点信息\n      const syncNumber = 8\n\n      let syncStr = ''\n      const syncList = []\n\n      for (let i = 0; i < syncNumber; i++) {\n        const colorFloat = i / 8\n        const colorR = 1.0 - colorFloat\n        syncStr += ` ${i}`\n        syncList.push(`1.0 ${colorR} ${colorR} 1.0`)\n      }\n\n      this.setData({\n        trackerReady: true,\n        syncNumber,\n        syncStr,\n        syncList\n      })\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleARReady({ detail }) {\n      console.log('arReady')\n      this.setData({ arReady: true })\n    },\n    handleInfoInit() {\n      this.infoInited = true\n\n      console.log('handleInfoInit')\n    },\n    handleTick() {\n      const xrSystem = wx.getXrFrameSystem()\n\n      if (this.data.arReady && this.data.loaded && this.data.trackerReady && !this.infoInited) {\n        this.handleInfoInit()\n      }\n\n      const trackerEl = this.scene.getElementById('tracker-1')\n      if (!trackerEl) {\n        return\n      }\n\n      const tracker = trackerEl.getComponent(xrSystem.ARTracker)\n      if (!tracker.arActive) {\n        return\n      }\n\n      // 这里只是例子，实际上用的是`ARTracker`的`autoSync`属性。\n      // 但也是一个更高自由度的选项。\n      // 视情况需要自己同步`tracker`的`scale`和`rotation`特定节点。\n      // 第一个参数是特征点编好，第二个是可选的复用结果，第三个是可选的是否相对于`ARTracker`。\n      // 为`false`为世界空间的位置，需要配合`scale`自己使用\n      const position = tracker.getPosition(98, new xrSystem.Vector3(), false)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-shoe/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-shoe/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Shoe\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"simple-mat\" effect=\"simple\" />\n  </xr-assets>\n  <xr-node wx:if=\"{{arReady}}\">\n    <xr-ar-tracker wx:if=\"{{trackerReady}}\" id='tracker-1' mode=\"Shoe\"  auto-sync=\"{{syncStr}}\">\n      <!-- 同步的点放前面-->\n      <xr-node wx:for=\"{{syncList}}\" wx:for-item=\"syncColor\">\n        <xr-mesh\n          geometry=\"sphere\" scale=\"{{syncBoxSize}} {{syncBoxSize}} {{syncBoxSize}}\"\n          material=\"simple-mat\"\n          uniforms=\"u_baseColorFactor: {{syncColor}} 1\"\n          />\n      </xr-node>\n      <!-- 不需要同步的绘制在后面 -->\n      <!-- 坐标系提示，单位1 的坐标轴 -->\n      <xr-node scale=\"4 4 4\">\n        <xr-mesh node-id=\"mesh-x\" position=\"1 0 0\"  scale=\"2 0.02 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.7 0.3 0.3 1\" ></xr-mesh>\n        <xr-mesh node-id=\"mesh-y\" position=\"0 1 0\"  scale=\"0.02 2 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.7 0.3 1\"></xr-mesh>\n        <xr-mesh node-id=\"mesh-z\" position=\"0 0 1\"  scale=\"0.02 0.02 2\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.3 0.7 1\"></xr-mesh>\n      </xr-node>\n    </xr-ar-tracker>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera near=\"0.01\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-shoe/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-threeDof/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleARReady({ detail }) {\n      console.log('arReady', this.scene.ar.arVersion)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-threeDof/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-threeDof/index.wxml",
    "content": "<xr-scene ar-system=\"modes:threeDof\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-item\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/just_a_girl/index.glb\" />\n  </xr-assets>\n  <xr-node>\n    <xr-gltf model=\"gltf-item\" position=\"1 0 1\" scale=\"0.006 0.006 0.006\"></xr-gltf>\n    <xr-gltf model=\"gltf-item\" position=\"1 0 -1\" scale=\"0.006 0.006 0.006\"></xr-gltf>\n    <xr-gltf model=\"gltf-item\" position=\"-1 0 1\" scale=\"0.006 0.006 0.006\"></xr-gltf>\n    <xr-gltf model=\"gltf-item\" position=\"-1 0 -1\" scale=\"0.006 0.006 0.006\"></xr-gltf>\n    <!-- 坐标系提示，单位1 的坐标轴 -->\n    <xr-mesh node-id=\"mesh-x\" position=\"1 0 0\"  scale=\"2 0.02 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.7 0.3 0.3 1\" ></xr-mesh>\n    <xr-mesh node-id=\"mesh-y\" position=\"0 1 0\"  scale=\"0.02 2 0.02\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.7 0.3 1\"></xr-mesh>\n    <xr-mesh node-id=\"mesh-z\" position=\"0 0 1\"  scale=\"0.02 0.02 2\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.3 0.3 0.7 1\"></xr-mesh>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-threeDof/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-vio-depth/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      this.mat = new (wx.getXrFrameSystem().Matrix4)()\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      // this.setData({loaded: true});\n      this.scene.event.addOnce('touchstart', this.placeNode.bind(this))\n    },\n    handleARReady({ detail }) {\n      console.log('arReady', this.scene.ar.arVersion)\n    },\n    placeNode(event) {\n      const { clientX, clientY } = event.touches[0]\n      const { frameWidth: width, frameHeight: height } = this.scene\n\n      if (clientY / height > 0.8 && clientX / width < 0.2) {\n        this.scene.getNodeById('setitem').visible = false\n        this.scene.ar.resetPlane()\n      } else {\n        this.scene.ar.placeHere('setitem', true)\n      }\n\n      this.scene.event.addOnce('touchstart', this.placeNode.bind(this))\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-vio-depth/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-vio-depth/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Plane; planeMode: 1; depthMask: true; depthNear: 0.1; depthFar: 100; depthDebug: true;\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <!-- depthMask: true; depthNear: 0.001; depthFar:1000; depthDebug: true; -->\n  <!-- Beta 版本 -->\n  <!-- vio + depth 模式下 planeMode 需设置为 1 (只允许水平面识别) -->\n  <!-- depthMask 在支持的情况下，是否开启实时深度遮挡。 -->\n  <!-- depthNear 开启实时深度遮挡时，遮挡的近处阈值。 -->\n  <!-- depthFar 开启实时深度遮挡时，遮挡的远处阈值。 -->\n  <!-- depthDebug 开启实时深度遮挡时，显示一个用于Debug的图层。 -->\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"anchor\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/ar-plane-marker.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-item\" src=\"https://dldir1.qq.com/weixin/miniprogram/RobotExpressive_aa2603d917384b68bb4a086f32dabe83.glb\" />\n  </xr-assets>\n  <xr-node>\n    <xr-ar-tracker mode=\"Plane\">\n      <xr-gltf model=\"anchor\"></xr-gltf>\n    </xr-ar-tracker>\n    <xr-node node-id=\"setitem\" visible=\"false\">\n      <xr-gltf model=\"gltf-item\" scale=\"0.1 0.1 0.1\" anim-autoplay=\"clip: Dance\"></xr-gltf>\n    </xr-node>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      near=\"0.1\"\n      far=\"100\"\n      background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-vio-depth/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-vio-marker/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      this.mat = new (wx.getXrFrameSystem().Matrix4)()\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      // this.setData({loaded: true});\n      this.scene.event.addOnce('touchstart', this.placeNode.bind(this))\n    },\n    handleARReady({ detail }) {\n      console.log('arReady', this.scene.ar.arVersion)\n    },\n    placeNode(event) {\n      const { clientX, clientY } = event.touches[0]\n      const { frameWidth: width, frameHeight: height } = this.scene\n\n      if (clientY / height > 0.8 && clientX / width < 0.2) {\n        this.scene.getNodeById('setitem').visible = false\n        this.scene.ar.resetPlane()\n      } else {\n        this.scene.ar.placeHere('setitem', true)\n      }\n\n      this.scene.event.addOnce('touchstart', this.placeNode.bind(this))\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-vio-marker/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-vio-marker/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Plane Marker; planeMode: 1\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <!-- vio + marker 模式下 planeMode 需设置为 1 (只允许水平面识别) -->\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"anchor\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/ar-plane-marker.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-item\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/just_a_girl/index.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"butterfly\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/butterfly/index.glb\" />\n  </xr-assets>\n  <xr-node>\n    <xr-ar-tracker mode=\"Marker\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/2dmarker-test.jpg\">\n      <xr-gltf model=\"butterfly\" anim-autoplay position=\"0.2 0 -0.2\" scale=\"0.6 0.6 0.6\" rotation=\"0 -50 0\" />\n      <xr-gltf model=\"butterfly\" anim-autoplay position=\"0.4 0 0.3\" scale=\"0.5 0.5 0.5\" rotation=\"0 -50 0\" />\n      <xr-gltf model=\"butterfly\" anim-autoplay position=\"-0.3 0 0.3\" scale=\"0.4 0.4 0.4\" rotation=\"0 -50 0\" />\n    </xr-ar-tracker>\n\n    <xr-ar-tracker mode=\"Plane\">\n      <xr-gltf model=\"anchor\"></xr-gltf>\n    </xr-ar-tracker>\n    <xr-node node-id=\"setitem\" visible=\"false\">\n      <xr-gltf model=\"gltf-item\" scale=\"0.006 0.006 0.006\"></xr-gltf>\n    </xr-node>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-ar-vio-marker/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -0.02 -4\" rotation=\"0 0 0\" scale=\"5 1 5\" geometry=\"plane\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\" receive-shadow></xr-mesh>\n    <xr-mesh id=\"cube\" node-id=\"mesh-cube\" position=\"-1 0.5 -3.5\" scale=\"1 1 1\" rotation=\"0 45 0\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.298 0.764 0.85 1\" cast-shadow></xr-mesh>\n    <xr-mesh node-id=\"mesh-cylinder\" position=\"1 0.7 -3.5\" scale=\"1 0.7 1\" geometry=\"cylinder\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:1 0.776 0.364 1\" cast-shadow></xr-mesh>\n    <xr-mesh node-id=\"mesh-sphere\" position=\"0 1.25 -5\" scale=\"1.25 1.25 1.25\" geometry=\"sphere\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.937 0.176 0.368 1\" cast-shadow></xr-mesh>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 1.6 0\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"mesh-sphere\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-alpha/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    cubeAlpha: {\n      type: Number,\n      value: 1\n    },\n    sphereAlpha: {\n      type: Number,\n      value: 1\n    },\n    clearColor: {\n      type: String,\n      value: '0 0 0 0'\n    }\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-alpha/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-alpha/index.wxml",
    "content": "<xr-scene render-system=\"alpha:true\" bind:ready=\"handleReady\">\n  <xr-node>\n    <xr-mesh id=\"cube\" node-id=\"mesh-cube\" position=\"-0.5 0 0\" geometry=\"cube\" uniforms=\"u_baseColorFactor:0.298 0.764 0.85 {{cubeAlpha}}\" states=\"alphaMode:BLEND\" />\n    <xr-mesh node-id=\"mesh-sphere\" position=\"0.5 0 0\" geometry=\"sphere\" uniforms=\"u_baseColorFactor:0.937 0.176 0.368 {{sphereAlpha}}\" states=\"alphaMode:BLEND\" />\n    <xr-node node-id=\"target\" position=\"0 0 0\" />\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 2 2\" clear-color=\"{{clearColor}}\"\n      target=\"target\" camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-alpha/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-animation/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-animation/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-animation/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load asset-id=\"basic-anim\" type=\"keyframe\" src=\"/assets/animation/basic-animation.json\"/>\n    <xr-asset-load type=\"texture\" asset-id=\"waifu\" src=\"/assets/waifu.png\" />\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-mesh\n      node-id=\"mesh-plane\" position=\"0 -0.8 0\" rotation=\"0 0 0\" scale=\"10 1 8\" geometry=\"plane\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\" states=\"cullOn: false\"\n      anim-keyframe=\"basic-anim\" anim-autoplay=\"clip:plane, speed:4\"\n      receive-shadow\n    ></xr-mesh>\n    <xr-mesh\n      node-id=\"mesh-cube\" position=\"-3 0 2\" scale=\"1 1 1\" rotation=\"0 0 0\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.298 0.764 0.85 1\"\n      anim-keyframe=\"basic-anim\" anim-clipmap=\"default:cube\" anim-autoplay=\"clip:cube, speed:2\"\n      cast-shadow\n    ></xr-mesh>\n    <xr-mesh \n      node-id=\"mesh-sphere\" position=\"-3 0 0\" scale=\"0.8 0.8 0.8\" geometry=\"sphere\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.937 0.176 0.368 1\"\n      anim-keyframe=\"basic-anim\" anim-autoplay=\"clip:sphere, speed:2\"\n      cast-shadow\n    ></xr-mesh>\n    <xr-mesh \n      node-id=\"mesh-cylinder\" position=\"-3 0 -2\" scale=\"1 0.6 1\" geometry=\"cylinder\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:1 0.776 0.364 1\"\n      anim-keyframe=\"basic-anim\" anim-autoplay=\"clip:cylinder, speed:2\"\n      cast-shadow\n    ></xr-mesh>\n    <xr-mesh node-id=\"mesh-light-cube\" position=\"-5 1 0\" scale=\"0.5 10 10\" rotation=\"0 0 0\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.3 0.3 0.3 1, u_baseColorMap: waifu\"></xr-mesh>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"5 3 0\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"camera-target\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"30 230 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow/>\n    <xr-light\n      type=\"spot\" position=\"-4 1 0\" rotation=\"0 -90 0\" color=\"0 1 0\" range=\"20\" intensity=\"100\" inner-cone-angle=\"20\" outer-cone-angle=\"60\"\n      anim-keyframe=\"basic-anim\" anim-autoplay=\"clip:spotLight, speed:2\"\n    />\n</xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-animation/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-envData/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-envData/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-envData/index.wxml",
    "content": "<xr-scene id=\"xr-scene\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"env-data\" asset-id=\"sunSet\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-test.bin\"/>\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\"/>\n  <xr-node wx:if=\"{{loaded}}\">\n    <xr-node node-id=\"center\" position=\"0 0 0\"></xr-node>\n\n    <!-- 基础反光小球  -->\n    <xr-mesh node-id=\"basic-roughness\" position=\"-1.1 0 -1.1\" geometry=\"sphere\"  uniforms=\"u_metallicRoughnessValues: 0 0\"></xr-mesh>\n    <xr-mesh node-id=\"basic-metal\" position=\"1.1 0 -1.1\" geometry=\"sphere\"  uniforms=\"u_metallicRoughnessValues: 1 0\"></xr-mesh>\n\n    <!-- 使用环境数据需要保证资源已经加载完  -->\n    <xr-mesh node-id=\"sunSet-roughness\" env-data=\"sunSet\" position=\"-1.1 0 1.1\" scale=\"1 1 1\" geometry=\"sphere\"  uniforms=\"u_metallicRoughnessValues: 0 0\"></xr-mesh>\n    <xr-mesh node-id=\"sunSet-metal\" env-data=\"sunSet\" position=\"1.1 0 1.1\" scale=\"1 1 1\" geometry=\"sphere\"  uniforms=\"u_metallicRoughnessValues: 1 0\"></xr-mesh>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"4 4 4\" clear-color=\"0.1 0.1 0.1 1\"\n      target=\"center\" near=\"0.1\" far=\"2000\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"20 120 0\" color=\"1 1 1\" intensity=\"1\" />\n  </xr-node>\n\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-envData/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-light/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-light/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-light/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-mesh node-id=\"mesh-cube-floor\" position=\"2 -1.01 0\" rotation=\"0 0 0\" scale=\"10 1 10\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.2 0.2 0.2 1\" states=\"cullOn: false\"></xr-mesh>\n    <xr-mesh node-id=\"mesh-cube\" position=\"0.6 -0.25 0.8\" rotation=\"0 30 0\" scale=\"0.5 0.5 0.5\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:1 1 1 1\"></xr-mesh>\n    <xr-mesh node-id=\"mesh-sphere\" position=\"2 -0.15 -1\" scale=\"0.4 0.4 0.4\" geometry=\"sphere\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:1 1 1 1\"></xr-mesh>\n    <xr-mesh node-id=\"mesh-cylinder\" position=\"-0.2 -0.2 -0.8\" scale=\"0.5 0.4 0.5\" geometry=\"cylinder\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:1 1 1 1\"></xr-mesh>\n    <xr-mesh node-id=\"mesh-cube-far\" position=\"3 -0.25 1\" rotation=\"0 -30 0\" scale=\"0.5 0.5 0.5\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:1 1 1 1\"></xr-mesh>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"-2 1 0\" clear-color=\"0 0 0 1\"\n      target=\"camera-target\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"0.2\" />\n    <xr-light type=\"point\" position=\"0 0 0\" color=\"1 0 0\" range=\"3\" intensity=\"3\" />\n    <xr-light type=\"point\" position=\"2 0 1\" color=\"0 1 0\" range=\"3\" intensity=\"3\" />\n    <xr-light type=\"spot\" position=\"0 0 0\" color=\"0 0 1\" range=\"12\" intensity=\"12\" rotation=\"0 120 0\" inner-cone-angle=\"30\" outer-cone-angle=\"35\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-light/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-postprocessing/index.js",
    "content": "const blurData = {\n  cullMask: 0b101,\n  aIntensity: 1,\n  dIntensity: 2,\n  env: '',\n  background: 'default',\n  cameraPosition: 1.3,\n  clearColor: '0 0 0 1',\n  cameraTarget: 'camera-target',\n\n  pp: 'blur',\n  // blurRadius: 0\n}\n\nconst bloomData = {\n  cullMask: 0b11,\n  aIntensity: 0,\n  dIntensity: 0,\n  env: '',\n  background: 'default',\n  cameraPosition: 10,\n  clearColor: '0 0 0 1',\n  cameraTarget: 'camera-target',\n\n  pp: 'bloom2',\n  // bloomRadius_0: 0,\n  // bloomRadius_1: 0\n}\n\nconst fxaaData = {\n  cullMask: 0b1001,\n  aIntensity: 1,\n  dIntensity: 3,\n  env: '',\n  background: 'default',\n  cameraPosition: 1,\n  clearColor: '0.925 0.925 0.925 1',\n  cameraTarget: 'mesh-sphere'\n}\n\nconst vignetteData = {\n  cullMask: 0b101,\n  aIntensity: 1,\n  dIntensity: 2,\n  env: '',\n  background: 'default',\n  cameraPosition: 1.3,\n  clearColor: '0 0 0 1',\n  cameraTarget: 'camera-target',\n  pp: 'vignette',\n}\n\nComponent({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    type: {\n      type: Number,\n      value: 0,\n      observer(newVal, oldVal) {\n        if (newVal !== oldVal) {\n          if (newVal === 0) {\n            this.activeBlur()\n          } else if (newVal === 1) {\n            this.activeBloom()\n          } else if (newVal === 2) {\n            this.activeVignette()\n          } else if (newVal === 3) {\n            this.activeFXAA()\n          }\n        }\n      }\n    },\n    blurRadius: {\n      type: Number,\n      value: 0\n    },\n    bloomRadius: {\n      type: Number,\n      value: 0,\n      observer(newVal, oldVal) {\n        this.setData({\n          bloomRadius_0: newVal * 0.2,\n          bloomRadius_1: newVal * 0.8\n        })\n      }\n    },\n    bloomIntensity: {\n      type: Number,\n      value: 1,\n    },\n    bloomThreshold: {\n      type: Number,\n      value: 0.5,\n    },\n    vignetteIntensity: {\n      type: Number,\n      value: 1,\n    },\n    vignetteSmoothness: {\n      type: Number,\n      value: 2,\n    },\n    vignetteRoundness: {\n      type: Number,\n      value: 1,\n    },\n    fxaaEnabled: {\n      type: Boolean,\n      value: false,\n      observer(newVal, oldVal) {\n        this.setData({\n          fxaaEnabled: newVal\n        })\n        if (this.data.type === 3) {\n          this.activeFXAA()\n        }\n      }\n    }\n  },\n  data: {\n    loaded: false,\n    env: '',\n    cullMask: 0,\n    background: 'default',\n    aIntensity: 0,\n    dIntensity: 0,\n    pp: '',\n    cameraPosition: 1,\n    cameraTarget: 'camera-target',\n\n    // ---bloom---\n    bloomRadius_0: 0,\n    bloomRadius_1: 1,\n\n    // ---fxaa---\n    fxaaEnabled: false\n  },\n  lifetimes: {\n    attached() {\n      console.log('data.a', this.data.a) // expected 123\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      console.log('scene', detail.value)\n      this.activeBlur()\n    },\n    handleTick() {\n      // const camera = this.scene.getNodeById(\"camera\");\n      // const transform = camera.el._components.transform;\n      // if (transform.rotation.y > Math.PI * 0.25) {\n      //   transform.rotation.y = Math.PI * 0.25;\n      // } else if  (transform.rotation.y < -Math.PI * 0.25) {\n      //   transform.rotation.y = -Math.PI * 0.25;\n      // }\n    },\n    handleAssetsProgress({ detail }) {\n      this.triggerEvent('assetsProgress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      this.triggerEvent('assetsLoaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    activeBlur() {\n      this.setData(blurData)\n    },\n    activeBloom() {\n      this.setData(bloomData)\n    },\n    activeVignette() {\n      this.setData(vignetteData)\n    },\n    activeFXAA() {\n      this.setData(fxaaData)\n      this.setData({\n        pp: this.data.fxaaEnabled ? 'fxaa' : ''\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-postprocessing/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-postprocessing/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\" bind:tick=\"handleTick\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load\n      type=\"env-data\" asset-id=\"env1\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-test.bin\"\n    />\n    <xr-asset-load type=\"gltf\" asset-id=\"night_car_landscape\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/night_car_landscape.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"bedroom\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/bedroom.glb\" />\n  </xr-assets>\n  <xr-env env-data=\"{{env}}\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-node layer=\"1\">\n      <xr-asset-post-process asset-id=\"bloom1\" type=\"bloom\" is-hdr data=\"radius: {{bloomRadius_0}}, intensity: {{bloomIntensity}}, threshold: {{bloomThreshold}}, softThreshold: 0.8\"/>\n      <xr-asset-post-process asset-id=\"bloom2\" type=\"bloom\" is-hdr data=\"radius: {{bloomRadius_1}}, intensity: {{bloomIntensity}}, threshold: {{bloomThreshold}}, softThreshold: 0.8\"/>\n      <xr-gltf node-id=\"gltf_1\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"0.01 0.01 0.01\" model=\"night_car_landscape\"></xr-gltf>\n    </xr-node>\n    <xr-node layer=\"2\">\n      <xr-asset-post-process asset-id=\"blur\" type=\"blur\" data=\"radius: {{blurRadius}}\"/>\n      <xr-asset-post-process asset-id=\"vignette\" type=\"vignette\" data=\"color:1 0 0 1,intensity:{{vignetteIntensity}},smoothness:{{vignetteSmoothness}},roundness:{{vignetteRoundness}}\"/>\n      <xr-gltf node-id=\"gltf_2\" position=\"0.5 -1 -2\" rotation=\"0 0 0\" scale=\"1 1 1\" model=\"bedroom\"></xr-gltf>\n    </xr-node>\n    <xr-node layer=\"3\">\n      <!-- xr-basic -->\n      <xr-asset-post-process asset-id=\"fxaa\" type=\"fxaa\"/>\n      <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n      <xr-mesh node-id=\"mesh-plane\" position=\"0 -0.02 -4\" rotation=\"0 0 0\" scale=\"5 1 5\" geometry=\"plane\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\" receive-shadow></xr-mesh>\n      <xr-mesh id=\"cube\" node-id=\"mesh-cube\" position=\"-1 0.5 -3.5\" scale=\"1 1 1\" rotation=\"0 45 0\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.298 0.764 0.85 1\" cast-shadow></xr-mesh>\n      <xr-mesh node-id=\"mesh-sphere\" position=\"0 1.25 -5\" scale=\"1.25 1.25 1.25\" geometry=\"sphere\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.937 0.176 0.368 1\" cast-shadow></xr-mesh>\n      <xr-mesh node-id=\"mesh-cylinder\" position=\"1 0.7 -3.5\" scale=\"1 0.7 1\" geometry=\"cylinder\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:1 0.776 0.364 1\" cast-shadow></xr-mesh>\n    </xr-node>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 0 {{cameraPosition}}\" clear-color=\"{{clearColor}}\"\n      near=\"0.1\"\n      far=\"2000\"\n      target=\"{{cameraTarget}}\" background=\"{{background}}\" camera-orbit-control=\"\"\n      cull-mask=\"{{cullMask}}\"\n      post-process=\"{{pp}}\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"{{aIntensity}}\" />\n    <xr-light type=\"directional\" rotation=\"40 180 0\" color=\"1 1 1\" intensity=\"{{dIntensity}}\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-postprocessing/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-render-texture/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-render-texture/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-render-texture/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n    <xr-asset-render-texture asset-id=\"rt\" width=\"2048\" height=\"1024\" />\n  </xr-assets>\n\n  <xr-node layer=\"1\">\n    <xr-mesh id=\"cube\" node-id=\"mesh-cube\" position=\"-1 0.5 1.5\" scale=\"1 1 1\" rotation=\"0 45 0\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.298 0.764 0.85 1\" />\n    <xr-mesh node-id=\"mesh-sphere\" position=\"0 1.25 0\" scale=\"1.25 1.25 1.25\" geometry=\"sphere\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.937 0.176 0.368 1\" />\n    <xr-mesh node-id=\"mesh-cylinder\" position=\"1 0.7 1.5\" scale=\"1 0.7 1\" geometry=\"cylinder\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:1 0.776 0.364 1\" />\n  </xr-node>\n\n  <xr-node layer=\"2\">\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 0 -6\" rotation=\"-90 0 0\" scale=\"16 1 12\" geometry=\"plane\" material=\"standard-mat\"\n    uniforms=\"u_baseColorMap:render-rt\" states=\"cullOn:false\" />\n  </xr-node>\n\n  <xr-node node-id=\"rt-camera-target\" position=\"0 1 0\"></xr-node>\n  <xr-camera\n    position=\"0 4 6\" clear-color=\"0.925 0.925 0.925 1\"\n    target=\"mesh-plane\" cull-mask=\"0b111\" camera-orbit-control=\"\"\n  >\n    <xr-camera\n      position=\"0 0 0\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"rt-camera-target\" render-target=\"rt\" cull-mask=\"0b011\"\n    />\n  </xr-camera>\n\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-render-texture/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-shadow/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  shadowRoot: null,\n  gltfModle: null,\n  properties: {\n    meshCount: {\n      type: Number,\n      value: 0,\n      observer(newVal, oldVal) {\n        if (newVal > oldVal) {\n          this.addOne()\n        } else if (newVal < oldVal) {\n          this.removeOne()\n        }\n      }\n    }\n  },\n  data: {\n    loaded: false,\n    arReady: false\n  },\n  methods: {\n    async handleReady({ detail }) {\n      const scene = this.scene = detail.value\n      console.log('xr-scene', scene)\n      this.meshList = []\n      const xrFrameSystem = wx.getXrFrameSystem()\n      this.shadowRoot = scene.getElementById('shadow-root')\n\n      const { value: envData } = await scene.assets.loadAsset({ type: 'env-data', assetId: 'env1', src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-test.bin' })\n      const envElement = scene.createElement(xrFrameSystem.XREnv)\n      this.shadowRoot.addChild(envElement)\n      const envComp = envElement.getComponent(xrFrameSystem.Env)\n      envComp.setData({ envData })\n\n      const { value: model } = await scene.assets.loadAsset({ type: 'gltf', assetId: 'damage-helmet', src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/index.glb' })\n      this.gltfModle = model\n      const gltfElement = scene.createElement(xrFrameSystem.XRGLTF)\n      this.shadowRoot.addChild(gltfElement)\n      const gltfComp = gltfElement.getComponent(xrFrameSystem.GLTF)\n      gltfComp.setData({ model })\n\n      const cameraElement = scene.createElement(xrFrameSystem.XRCamera)\n      this.shadowRoot.addChild(cameraElement)\n      cameraElement.getComponent(xrFrameSystem.Transform).position.setValue(0, 0, 9)\n      cameraElement.getComponent(xrFrameSystem.Camera).setData({\n        target: gltfElement.getComponent(xrFrameSystem.Transform),\n        background: 'skybox'\n      })\n      cameraElement.addComponent(xrFrameSystem.CameraOrbitControl, {})\n    },\n    addOne() {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const pos = [Math.random(), Math.random(), Math.random()].map(v => (v * 2 - 1) * 6)\n\n      const gltfElement = this.scene.createElement(xrFrameSystem.XRGLTF)\n      this.shadowRoot.addChild(gltfElement)\n      gltfElement.getComponent(xrFrameSystem.Transform).position.setArray(pos)\n      gltfElement.getComponent(xrFrameSystem.GLTF).setData({ model: this.gltfModle })\n\n      this.meshList.push(gltfElement)\n    },\n    removeOne() {\n      const element = this.meshList.pop()\n      if (element) {\n        this.shadowRoot.removeChild(element)\n      }\n    },\n    handleTick({ detail }) {\n      const { el, value } = detail\n    },\n    handleDesotry() {\n\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-shadow/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-shadow/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\" bind:tick=\"handleTick\">\n  <xr-shadow id=\"shadow-root\"></xr-shadow>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-shadow/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-share/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    captureState: {\n      type: Number,\n      value: 0,\n      observer(newVal, oldVal) {\n        if (newVal !== oldVal) {\n          if (newVal === 1) {\n            this.capture()\n          }\n        }\n      },\n    },\n    recordState: {\n      type: Number,\n      value: 0,\n      observer(newVal, oldVal) {\n        if (newVal !== oldVal) {\n          if (newVal === 0) {\n            this.recordEnd()\n          } else {\n            this.recordStart()\n          }\n        }\n      }\n    },\n    captureQuality: {\n      type: Number,\n      value: 0.8,\n    },\n    captureType: {\n      type: String,\n      value: 'jpg',\n    },\n    recordFPS: {\n      type: Number,\n      value: 30,\n    },\n    recordWidth: {\n      type: Number,\n      value: undefined,\n    },\n    recordHeight: {\n      type: Number,\n      value: undefined,\n    },\n    recordBPS: {\n      type: Number,\n      value: 1000,\n    },\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const scene = this.scene = detail.value\n      const appHide = () => this.scene.share.recordPause()\n      const appShow = () => this.scene.share.recordResume()\n      wx.onAppHide(appHide)\n      wx.onAppShow(appShow)\n      wx.offAppHide(appHide)\n      wx.offAppShow(appShow)\n\n      this.triggerEvent('sceneReady', { width: scene.width, height: scene.height })\n    },\n    capture() {\n      this.scene.share.captureToFriends({\n        fileType: this.data.captureType,\n        quality: this.data.captureQuality\n      })\n    },\n    recordStart() {\n      console.log('recordStart')\n      this.scene.share.recordStart({\n        fps: this.data.recordFPS,\n        videoBitsPerSecond: this.data.recordBPS,\n        width: this.data.recordWidth,\n        height: this.data.recordHeight\n      })\n    },\n    recordEnd() {\n      console.log('recordEnd')\n      this.scene.share.recordFinishToAlbum()\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-share/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-share/index.wxml",
    "content": "<xr-scene bind:ready=\"handleReady\">\n  <xr-asset-load type=\"gltf\" asset-id=\"clock\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/clock/scene.gltf\" />\n\n  <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n  <xr-light type=\"directional\" rotation=\"40 70 0\" color=\"1 1 1\" intensity=\"3\" cast-shadow />\n\n  <slot></slot>\n  \n  <xr-gltf model=\"clock\" scale=\"0.1 0.1 0.1\" rotation=\"90 0 0\" anim-autoplay />\n\n  <xr-node node-id=\"target\"></xr-node>\n  <xr-camera node-id=\"camera\" clear-color=\"0.4 0.8 0.6 1\" position=\"0 0 4\" target=\"target\" camera-orbit-control />\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-share/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-touch/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    touchingMoon: false,\n    touchingEarth: false,\n    θ: Math.PI,\n    r: 10,\n    ω: 5e-4,\n    outerRing: 20,\n    innerRing: 10\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleTouchEarth() {\n      this.setData({\n        touchingEarth: true\n      })\n    },\n    handleUntouchEarth() {\n      this.setData({\n        touchingEarth: false\n      })\n    },\n    handleEarthRotation({ detail }) {\n      const { target, deltaX } = detail.value\n      target._components.transform.rotation.y += deltaX / 100\n    },\n    handleDragMoon({ detail }) {\n      const { dir, target, camera } = detail.value\n      const cameraPos = camera.el._components.transform.worldPosition\n      const k = -cameraPos.y / dir[1]\n      const x = cameraPos.x + k * dir[0]\n      const z = cameraPos.z + k * dir[2]\n      const len = Math.sqrt(x * x + z * z)\n      if (len > this.data.innerRing) {\n        const transform = target._components.transform\n        const scale = len > this.data.outerRing ? this.data.outerRing / len : 1.0\n        transform.position.x = x * scale\n        transform.position.z = z * scale\n      }\n    },\n    handleTouchMoon() {\n      this.setData({ touchingMoon: true })\n    },\n    handleUntouchMoon() {\n      const moon = this.scene.getNodeById('mesh-moon')\n      const transform = moon.el._components.transform\n      const x = transform.position.x\n      const z = transform.position.z\n      const len = Math.sqrt(x * x + z * z)\n      this.setData({\n        r: len,\n        θ: x < 0 ? Math.atan(z / x) + Math.PI : Math.atan(z / x),\n        ω: Math.sqrt(2.5e-4 / (len * len * len))\n      })\n      this.setData({ touchingMoon: false })\n    },\n    handleTick({ detail }) {\n      if (this.data.touchingMoon || !this.scene) return\n      const deltaTime = detail.value\n      const moon = this.scene.getNodeById('mesh-moon')\n      const transform = moon.el._components.transform\n      const x = Math.cos(this.data.θ) * this.data.r\n      const z = Math.sin(this.data.θ) * this.data.r\n      transform.position.x = x\n      transform.position.z = z\n      transform.rotation.y -= this.data.ω * deltaTime\n      this.setData({\n        θ: this.data.θ + this.data.ω * deltaTime\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-touch/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-touch/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:tick=\"handleTick\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"texture\" asset-id=\"earth-texture\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/2k_earth_daymap.jpeg\" />\n    <xr-asset-load type=\"texture\" asset-id=\"moon-texture\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/2k_moon.jpeg\" />\n    <xr-asset-load type=\"texture\" asset-id=\"sky\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/dark-cosmos.jpg\" />\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n    <xr-asset-material asset-id=\"earth-mat\" effect=\"standard\" uniforms=\"u_baseColorMap: earth-texture\" render-queue=\"501\"/>\n    <xr-asset-material asset-id=\"earth-silhouette\" effect=\"simple\" uniforms=\"u_baseColorFactor: 1.0 0.5 0 1.0\" states=\"depthTestWrite: false\" render-queue=\"500\"/>\n    <xr-asset-material asset-id=\"moon-mat\" effect=\"standard\" uniforms=\"u_baseColorMap: moon-texture\" render-queue=\"503\"/>\n    <xr-asset-material asset-id=\"moon-silhouette\" effect=\"simple\" uniforms=\"u_baseColorFactor: 0.476 0.82 0.957 1.0\" states=\"depthTestWrite: false\" render-queue=\"502\"/>\n  </xr-assets>\n  <xr-env sky-map=\"sky\" is-sky2d/>\n  <xr-node>\n    <xr-mesh node-id=\"mesh-earth\" position=\"0 0 0\" scale=\"8 8 8\" geometry=\"sphere\" material=\"earth-mat\" bind:touch-shape=\"handleTouchEarth\" bind:untouch-shape=\"handleUntouchEarth\" bind:drag-shape=\"handleEarthRotation\" sphere-shape receive-shadow cast-shadow></xr-mesh>\n    <xr-mesh node-id=\"earth-silhouette\" scale=\"8.15 8.15 8.15\" geometry=\"sphere\" material=\"earth-silhouette\" visible=\"{{touchingEarth}}\"></xr-mesh>\n    <xr-mesh node-id=\"mesh-moon\" position=\"10 0 0\" scale=\"1.5 1.5 1.5\" rotation=\"0 90 0\" geometry=\"sphere\" material=\"moon-mat\" bind:drag-shape=\"handleDragMoon\" bind:touch-shape=\"handleTouchMoon\" bind:untouch-shape=\"handleUntouchMoon\" sphere-shape=\"radius: 1.5\" receive-shadow cast-shadow>\n    <xr-mesh node-id=\"moon-silhouette\" scale=\"1.1 1.1 1.1\" geometry=\"sphere\" material=\"moon-silhouette\" visible=\"{{touchingMoon}}\"></xr-mesh>\n    </xr-mesh>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 20 -35\" clear-color=\"0 0 0 1\"\n      target=\"mesh-earth\"\n      background=\"skybox\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.1\" />\n    <xr-light id=\"directional-light\" type=\"directional\" rotation=\"0 60 0\" color=\"1 1 1\" intensity=\"5\"  shadow-distance=\"40\" cast-shadow shadow-bias=\"0.004\"/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-touch/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-video/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    async handleTouchCube() {\n      const xrSystem = wx.getXrFrameSystem()\n      const video = this.scene.assets.getAsset('video-texture', 'cat')\n\n      if (!video) {\n        return\n      }\n\n      if (video.state === xrSystem.EVideoState.Playing) {\n        video.pause()\n      } else if (video.state === xrSystem.EVideoState.Paused) {\n        video.resume()\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-video/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-video/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load\n      type=\"video-texture\" asset-id=\"cat\"\n      src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/videos/cat.mp4\" options=\"autoPlay:true,loop:true,abortAudio:false,placeHolder:https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/videos/cat.jpg\"\n    />\n    <xr-asset-load\n      type=\"video-texture\" asset-id=\"skybox\"\n      src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/videos/office-skybox.mp4\" options=\"autoPlay:true,loop:true,placeHolder:https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/videos/office-skybox.jpg\"\n    />\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-env sky-map=\"video-skybox\" />\n  <xr-node>\n    <xr-node node-id=\"target\" />\n    <xr-mesh\n      node-id=\"mesh-cube\" scale=\"1.6 0.9 0.9\"\n      geometry=\"cube\" material=\"standard-mat\"\n      uniforms=\"u_baseColorMap:video-cat\"\n      cube-shape=\"autoFit:true\"\n      bind:touch-shape=\"handleTouchCube\"\n    />\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 0 3\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"target\" background=\"skybox\" camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 0 0\" color=\"1 1 1\" intensity=\"3\"/>\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-video/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-visible-layer/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    visibleIndex: {\n      type: Number,\n      value: 1,\n      observer(newVal, oldVal) {\n\n      }\n    },\n    cullMask: {\n      type: Number,\n      value: 0b001,\n      observer(newVal, oldVal) {\n\n      }\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-visible-layer/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-visible-layer/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-node node-id=\"camera-target\" position=\"0 1.25 -5\"></xr-node>\n  <xr-node visible=\"{{visibleIndex === 1}}\">\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -0.05 -4\" rotation=\"0 0 0\" scale=\"5 1 5\" geometry=\"plane\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"></xr-mesh>\n  </xr-node>\n  <xr-node visible=\"{{visibleIndex === 2}}\">\n    <xr-mesh id=\"cube\" node-id=\"mesh-cube\" position=\"-1 0.5 -3.5\" scale=\"1 1 1\" rotation=\"0 45 0\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.298 0.764 0.85 1\"></xr-mesh>\n  </xr-node>\n  <xr-node layer=\"1\">\n    <xr-mesh node-id=\"mesh-sphere\" position=\"0 1.25 -5\" scale=\"1.25 1.25 1.25\" geometry=\"sphere\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:0.937 0.176 0.368 1\"></xr-mesh>\n    <xr-node layer=\"2\">\n      <xr-mesh node-id=\"mesh-cylinder\" position=\"1 0.7 -3.5\" scale=\"1 0.7 1\" geometry=\"cylinder\" material=\"standard-mat\" uniforms=\"u_baseColorFactor:1 0.776 0.364 1\"></xr-mesh>\n    </xr-node>\n  </xr-node>\n  <xr-camera\n    id=\"camera\" node-id=\"camera\" position=\"0 1.6 0\" clear-color=\"0.925 0.925 0.925 1\"\n    target=\"camera-target\" cull-mask=\"{{cullMask}}\"\n    camera-orbit-control=\"\"\n  ></xr-camera>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-basic-visible-layer/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-beside-edge/config.js",
    "content": "export default {\r\n  intro: {\r\n    texts: [\r\n      '你有点浑浑噩噩，感觉有些不对，但是回忆不起是哪里不对。',\r\n      '你究竟在逃避些什么？那些痛苦的回忆？',\r\n      '我知道你撑不住了，这里是你封藏的那些记忆，和某些人、某个人相关的回忆。',\r\n      '作为一个四处奔波的异乡人，刚被某游戏公司裁掉的你，当时究竟为什么还会留在这座城市。',\r\n      '努力想想，你们初次相遇时，就在那个吧台，点了一瓶酒，我还记得店员是{{在柜子的第二层}}取下来的。',\r\n      '你是程序，她是美术。'\r\n    ]\r\n  },\r\n  steps: [\r\n    {\r\n      itemCount: 1,\r\n      texts: [\r\n        '那时的你并未想到，你们还会有第二次相遇。',\r\n        '这相遇仍是一次偶然，并且恰巧还会在同一个地点——',\r\n        '一次游戏活动，她就在那个{{自动售货机}}前。'\r\n      ]\r\n    },\r\n    {\r\n      itemCount: 1,\r\n      texts: [\r\n        '你们在一起了，却在相处后，有了越来越多的争吵。',\r\n        '终于有一次，你们都说了一些狠话，仅仅是踟蹰的瞬间，她的身影便消失于了眼前。',\r\n        '犹豫和徘徊了许久的你，按照直觉，再次来到了这里，然后你发现——',\r\n        '她{{正坐在那个角落，望着窗外}}，一言不发。'\r\n      ]\r\n    },\r\n    {\r\n      itemCount: 1,\r\n      texts: [\r\n        '那次之后，连带着你们共同的游戏理想，她彻底离开了你。',\r\n        '你失魂落魄，反复诘问着自己为了理想到底牺牲了什么，然后又不断用新的“理想”麻醉自己。',\r\n        '你完成了一些项目，内心却知道再也找不到那样的一个人了，再也没有那样的快乐了。',\r\n        '你再也没有找过新的对象，出于“体面”，你也再也没有打探过她的消息。',\r\n        '直到多年后的某一天，出于一次偶然，不知道是忘却了还是...你打破了“原则”，再次来到了这里。',\r\n        '在这一次名为GlobalGameJam的活动中，你却发现她就{{坐在那个沙发上}}，错愕地望着你。'\r\n      ]\r\n    },\r\n    {\r\n      itemCount: 1,\r\n      texts: [\r\n        '你逃走了，连带着这些记忆。',\r\n        '但既然又回到了这个地方，走到了这一步，还是让我告诉你一件真正重要的事情吧。',\r\n        '她在最后给你留下了一封信，虽然从未真正“看过”，但我却一直保存着。',\r\n        '打开它吧，然后做出选择。'\r\n      ]\r\n    }\r\n  ],\r\n  items: {\r\n    wine: {\r\n      texts: [\r\n        '你们点了一瓶质量并不高的红酒，那时的你并不知道她和你一样，都不怎么喝酒。',\r\n        '对酒精比较敏感的你们小酌稍许，便打开了话匣子。',\r\n        '你说：“现在的业界都是什么垃圾游戏”。',\r\n        '她说：“是啊，一直这么搞下去，不知道什么时候才能出来精彩的作品。”',\r\n        '你说：“对，像极乐迪斯科、Gorogoa那样精彩的作品！”',\r\n        '她说：“哈哈，我也很喜欢这两部，遇到同好了。”'\r\n      ]\r\n    },\r\n    vending: {\r\n      texts: [\r\n        '“这么巧？”你远远就望见了她，假装偶遇漫不经心搭起了话。',\r\n        '“啊是你，我就猜你也会来。”她转过了头，甜甜得笑着。',\r\n        '你说：“嗯，这次活动来了不少独立开发者，扩展一下交际圈。”',\r\n        '她停顿了下，拿出了手机：“我也是这么想的...嗯，这么巧，不如加个微信？”',\r\n        '你看着她，故作体面，缓缓拿出了手机：“好，有什么好作品可以互相交流。”',\r\n        '她说：“对哦，正好有个双人游戏一直找不到人打，你有兴趣嘛？”'\r\n      ]\r\n    },\r\n    corner: {\r\n      texts: [\r\n        '你走到了角落，默默看着她，一言不发。',\r\n        '她用余光瞥了你一眼，你能够看到她的眼角还有泪花。',\r\n        '你说：“我...我还是觉得我想的没错，你太激动了，这事肯定还有办法。”',\r\n        '她低着头，小声：“你，还是这个样子，真是一点都没变。”',\r\n        '你不解，仿佛还有点自豪：“我当然不会改变，这是我的特质，改变了就不是我了。”',\r\n        '她说：“唉...是啊，你是不会改变的，我知道的。”',\r\n        '接着她站了起来，给了你一个拥抱，你很错愕，杵在原地不知如何是好。',\r\n        '“我...”还没等你说完，她便松开了你，转身快步离去。',\r\n        '从此，你再也没有找到过她。'\r\n      ]\r\n    },\r\n    sofa: {\r\n      texts: [\r\n        '虽然已经过去了许久，但你还是一眼就认出了她。',\r\n        '同样她也一眼就认出了你，在互相错愕的神情中，你们相视无言。',\r\n        '“好...好久不见”这次仍然是她先主动开的口。',\r\n        '你忽然有一种感觉，想说什么，却下意识克制住了：“确实...好久不见。”',\r\n        '再也没有对话，再也没有交流，活动就这么过去了。',\r\n        '只是在结束之后，她似乎递过来了什么东西，你好像收了，又好像没收。',\r\n        '然后，你就被困住了。'\r\n      ]\r\n    }\r\n  },\r\n  chars: {\r\n    xinyi: {\r\n      name: '路人Z?',\r\n      texts: [\r\n        '这两人聊得还挺投机的，说不定有戏。',\r\n        '就是这小子，最后扭扭捏捏的，真不像话。',\r\n        '年轻人，试一试有什么大不了的，连个微信都不敢加，呸！',\r\n        '哪怕再勇敢一点点...这事八成不就成了吗？'\r\n      ]\r\n    },\r\n    roam: {\r\n      name: '路人Y?',\r\n      texts: [\r\n        '怯懦，退缩，故作体面。',\r\n        '现在的小伙子，都不如女孩子勇敢。',\r\n        '要是这时候开始改变心态，不被牵着走，多付出些努力。',\r\n        '也不会是后来的下场吧？'\r\n      ]\r\n    },\r\n    hikari: {\r\n      name: '路人H?',\r\n      texts: [\r\n        '以“永远不会改变”为傲的少年。',\r\n        '以“不为任何人妥协”为荣的少年。',\r\n        '不知伤害为何物的少年。',\r\n        '不知妥协为何物的少年。',\r\n        '现在的你，是怎么想的呢？'\r\n      ]\r\n    },\r\n    final: {\r\n      name: '你的影子们',\r\n      texts: [\r\n        '相识时，被动。',\r\n        '相知时，被动。',\r\n        '相离时，被动。',\r\n        '用“理想”掩饰“怠惰”。',\r\n        '以“桀骜”定义“崇高”。',\r\n        '将“鲁莽”命名为“真诚”。',\r\n        '脆弱的我，懦弱的我，怯懦的我。',\r\n        '如果真的勇敢一些，会不会更好呢？'\r\n      ]\r\n    }\r\n  },\r\n  letter: {\r\n    texts: [\r\n      '不知道你会不会打开这封信，按照你的性格，大概是不会吧。',\r\n      '毕竟，我最了解你了，你会觉得很麻烦嘛，逃避麻烦，也是你“不变”的一部分。',\r\n      '但即便如此，我还是写了这封信，之所以如此，是因为——',\r\n      '我恨你，非常得恨，因为我倾尽了所有勇气对你好，却没有任何用。',\r\n      '你一直都是那个样子，从未变过，你不懂得什么是包容，不懂得什么是妥协。',\r\n      '你将其命名为“真诚”，哪怕明知会伤害我，却将其称为“必要的代价”。',\r\n      '什么代价啊？这么爱你的人，却要被你当做代价，你真的有人的心吗？',\r\n      '......',\r\n      '虽然想骂更多，但边看着你边写的我，却也只能到此为止了。',\r\n      '毕竟你现在样子，和那时候已经完全不同了。',\r\n      '你看起来更“友善随和”了，但可能只有我知道这对于你而言是多么得艰难。',\r\n      '所以虽然别人看起来你成为了一个更好的人，但我却觉得有些可悲。',\r\n      '你失去了原先那种鲁莽的勇气，却没有找到更为坚定的勇气。',\r\n      '你到底在畏惧什么呢？到底...在害怕什么呢？畏惧改变，畏惧失去自我吗？',\r\n      '你想一直活在悬浮于空的象牙塔上，畏惧在真正的大地上生根，那样会让你失去自由，所以你必须永不认错，一直桀骜——本应是如此。',\r\n      '但你刚才的眼神，你这个人啊，永远都需要有人主动拉一把才会去做选择。',\r\n      '那么，这次你的选择到底是什么？'\r\n    ]\r\n  }\r\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-beside-edge/index.js",
    "content": "import CONFIG from './config.js'\n\nconst info = wx.getSystemInfoSync()\nconst dpi = info.pixelRatio\nconst width = info.windowWidth * dpi\nconst height = info.windowHeight * dpi\n\nconst ROOT_DURATIONS = [\n  3000, 4500, 6000, Infinity\n]\nconst ROOT_DELAYS = [\n  2000, 1500, 1000, 0\n]\nconst ROOT_AMBIENTS = [\n  0.05, 0.15, 0.4, 1\n]\nconst ROOT_BLURS = [\n  32, 32, 16, 0\n]\nconst REAL_BLURS = [\n  0, 32, 48, 96\n]\n\nfunction showFinalChoose(content, callback) {\n  wx.showModal({\n    title: '做出选择',\n    content,\n    showCancel: true,\n    confirmText: '正视现实',\n    cancelText: '我不要！',\n    success: (res) => {\n      if (res.cancel) {\n        showFinalChoose('不能逃避！', callback)\n      } else {\n        callback()\n        setTimeout(() => {\n          wx.showToast({\n            title: '勇敢一些\\n不要怯懦',\n            duration: 5000,\n            icon: 'none'\n          })\n        }, 500)\n      }\n    }\n  })\n}\n\nComponent({\n  scene: null,\n  properties: {\n    nextAction: {\n      type: String,\n      value: '',\n      observer(fromWhat, old) {\n        if (fromWhat === 'item') {\n          this.remainItems -= 1\n          if (this.remainItems === 0) {\n            this.disable3DTouch = false\n            this.setData({ subStep: true })\n            return\n          }\n\n          this.switchSide(false)\n          this.triggerEvent('requireLight', { state: 'idle' })\n          return\n        }\n\n        if (fromWhat === 'char') {\n          const { texts } = this.config.steps[this.data.step]\n          this.requireDialog({ texts, from: 'step' })\n          return\n        }\n\n        if (fromWhat === 'step' || fromWhat === 'intro') {\n          const step = this.data.step + 1\n          if (step === 4) {\n            wx.showModal({\n              title: '最后的信',\n              content: this.config.letter.texts.join('\\n'),\n              showCancel: false,\n              confirmText: '做出选择',\n              complete: () => {\n                showFinalChoose('', () => this.switchSide(false, 0))\n              }\n            })\n            return\n          }\n\n          if (step === 3) {\n            this.bgm.stop()\n            this.bgm2.play()\n          }\n\n          this.remainItems = this.config.steps[step].itemCount\n          this.setData({ step, subStep: false, ambient: ROOT_AMBIENTS[step] })\n          this.switchSide(false)\n          this.triggerEvent('requireLight', { state: 'idle' })\n          return\n        }\n\n        if (fromWhat === 'light') {\n          this.switchSide(true)\n          this.disable3DTouch = false\n          this.lightDuration = ROOT_DURATIONS[this.data.step]\n          this.lightDelay = ROOT_DELAYS[this.data.step]\n        }\n      }\n    }\n  },\n  data: {\n    step: -1,\n    subStep: false,\n    ambient: 0,\n    width,\n    height,\n    loaded: false,\n    arReady: false\n  },\n  lifetimes: {\n    detached() {\n      this.bgm.stop()\n      this.bgm2.stop()\n      wx.setKeepScreenOn({ keepScreenOn: false })\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      this.scene.event.add('tick', this.handleTick.bind(this))\n      this.inited = false\n      this.disable3DTouch = false\n      this.remainItems = 0\n      this.lightDuration = 0\n      this.lightDelay = 0\n      this.bgm = wx.createInnerAudioContext({})\n      this.bgm.src = 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/beside-edge/bgm1.mp3'\n      this.bgm.loop = true\n      this.bgm2 = wx.createInnerAudioContext({})\n      this.bgm2.src = 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/beside-edge/bgm2.mp3'\n      this.bgm2.loop = true\n    },\n    handleARReady() {\n      wx.setKeepScreenOn({ keepScreenOn: true })\n      this.setData({ arReady: true })\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.config = CONFIG\n      this.setData({ loaded: true })\n    },\n    handleTick(dt) {\n      const mainCamera = this.scene.getNodeById('main-camera')\n      const light = this.scene.getNodeById('light')\n\n      if (mainCamera && light) {\n        light.position.set(mainCamera.position)\n        light.rotation.set(mainCamera.rotation)\n        light.rotation.x = Math.PI - light.rotation.x\n        light.rotation.y += Math.PI\n      }\n\n      if (this.inited) {\n        const nextDuration = Math.max(this.lightDuration - dt, 0)\n        if (this.lightDuration > 0 && nextDuration === 0) {\n          this.disable3DTouch = true\n          this.switchSide(false)\n          this.triggerEvent('requireLight', { state: 'cd', wait: 1 })\n        } else if (this.lightDuration === 0) {\n          const nextDelay = Math.max(this.lightDelay - dt, 0)\n          if (this.lightDelay > 0 && nextDelay === 0) {\n            this.triggerEvent('requireLight', { state: 'idle' })\n          } else if (this.lightDelay > 0) {\n            this.triggerEvent('requireLight', { state: 'cd', wait: nextDelay / ROOT_DELAYS[this.data.step] })\n          }\n          this.lightDelay = nextDelay\n        }\n\n        this.lightDuration = nextDuration\n        return\n      }\n\n      if (!this.data.arReady || !this.data.loaded) {\n        return\n      }\n\n      const setItem = this.scene.getNodeById('setitem')\n      setItem.position.set(mainCamera.position)\n      setItem.position.y = 1\n      this.inited = true\n\n      setTimeout(() => {\n        this.switchSide(true, ROOT_BLURS[0])\n        const { texts } = this.config.intro\n        this.requireDialog({ texts, from: 'intro' })\n        this.bgm.play()\n      }, 1000)\n    },\n    switchSide(virtual, blur) {\n      const setItem = this.scene.getNodeById('setitem')\n      setItem.visible = virtual\n      const blurAsset = this.scene.assets.getAsset('post-process', 'blur')\n      if (virtual) {\n        blurAsset.data.radius = blur === undefined ? ROOT_BLURS[this.data.step] : blur\n        this.triggerEvent('requireLight', { state: 'hide' })\n      } else {\n        blurAsset.data.radius = blur === undefined ? REAL_BLURS[this.data.step] : blur\n      }\n    },\n    handleResume() {\n      if (this.inited) {\n        this.data.step === 3 ? this.bgm2.play() : this.bgm2.play()\n      }\n    },\n    handleTouchObj({ detail }) {\n      if (!this.inDistance(detail)) {\n        return\n      }\n\n      const id = detail.value.target.id\n      const { texts } = this.config.items[id]\n\n      this.requireDialog({ texts, from: 'item' })\n    },\n    handleTouchChar({ detail }) {\n      if (!this.inDistance(detail)) {\n        return\n      }\n\n      const id = this.data.step === 3 ? 'final' : detail.value.target.id\n      const { name, texts } = this.config.chars[id]\n      this.requireDialog({ name, texts, from: 'char' })\n    },\n    requireDialog(info) {\n      this.disable3DTouch = true\n      this.lightDuration = Infinity\n      this.triggerEvent('requireLight', { state: 'hide' })\n      info.name = info.name || '某个声音'\n      this.triggerEvent('requireDialog', info)\n    },\n    inDistance(detail) {\n      if (detail.value.camera.el.id !== 'main-camera') {\n        return false\n      }\n\n      if (this.disable3DTouch) {\n        return false\n      }\n\n      const xrSystem = wx.getXrFrameSystem()\n      const { camera, target } = detail.value\n      const camTrs = camera.el.getComponent(xrSystem.Transform)\n      const targetTrs = target.getComponent(xrSystem.Transform)\n      const diff = camTrs.worldPosition.sub(targetTrs.worldPosition)\n\n      return Math.sqrt(diff.x * diff.x + diff.z * diff.z) < 3\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-beside-edge/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-beside-edge/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Plane\" id=\"xr-scene\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\" bind:pause=\"handlePause\" bind:resume=\"handleResume\">\n  <xr-assets bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"loading\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/loading.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"sky\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/sky.gltf\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"office\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/ggj2023-scene.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"hikari\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/hikari-unlit.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"roam\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/roam-unlit.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"xinyi\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/xinyi-unlit.glb\" />\n    <xr-asset-load type=\"texture\" asset-id=\"particle-point\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/point.png\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node id=\"setitem\" node-id=\"setitem\" visible=\"false\">\n      <xr-gltf\n        id=\"sky\" model=\"sky\"\n        states=\"cullOn: false\"\n      />\n\n      <xr-gltf\n        id=\"scene-mesh\" model=\"office\"\n      />\n\n      <xr-node wx:if=\"{{step === 0}}\" position=\"5.6 -0.5 2.27\">\n        <xr-node\n          id=\"wine\" wx:if=\"{{!subStep}}\"\n          cube-shape=\"size:0.2 0.4 1.6\" bind:touch-shape=\"handleTouchObj\"\n        />\n        <xr-gltf id=\"xinyi\" wx:if=\"{{subStep}}\"\n          position=\"-1.2 -1.8 -0.5\" rotation=\"0 80 0\" model=\"xinyi\"\n          anim-autoplay=\"clip:Idle\" capsule-shape=\"height:1;raduis:0.2;center:0 0.7 0\"\n          bind:touch-shape=\"handleTouchChar\"\n        />\n      </xr-node>\n\n      <xr-node wx:if=\"{{step === 1}}\" position=\"-3.2 -1.3 -5\" >\n        <xr-node\n          id=\"vending\" wx:if=\"{{!subStep}}\" rotation=\"0 0 0\"\n          cube-shape=\"size:2 2 0.4\" bind:touch-shape=\"handleTouchObj\"\n        />\n        <xr-gltf id=\"roam\" wx:if=\"{{subStep}}\"\n          position=\"-0.4 -1 0.6\" rotation=\"0 180 0\" model=\"roam\"\n          anim-autoplay=\"clip:Idle\" capsule-shape=\"height:1;raduis:0.2;center:0 0.7 0\"\n          bind:touch-shape=\"handleTouchChar\"\n        />\n      </xr-node>\n\n      <xr-node wx:if=\"{{step === 2}}\" position=\"-5.7 -1.17 4.47\">\n        <xr-node\n          id=\"corner\" wx:if=\"{{!subStep}}\"\n          cube-shape=\"size:1 1 1\" bind:touch-shape=\"handleTouchObj\"\n        />\n        <xr-gltf id=\"hikari\" wx:if=\"{{subStep}}\"\n          position=\"1.5 -0.6 -0.6\" rotation=\"0 90 0\" model=\"hikari\"\n          anim-autoplay=\"clip:Idle\" capsule-shape=\"height:1;raduis:0.2;center:0 0.7 0\"\n          bind:touch-shape=\"handleTouchChar\"\n        />\n      </xr-node>\n\n      <xr-node wx:if=\"{{step === 3}}\" position=\"0 -2 -4.5\">\n        <xr-node\n          id=\"sofa\" wx:if=\"{{!subStep}}\" rotation=\"0 16 0\"\n          cube-shape=\"size:2 0.6 1\" bind:touch-shape=\"handleTouchObj\"\n        />\n        <xr-node wx:if=\"{{subStep}}\" position=\"0 -0.4 0.2\">\n          <xr-gltf id=\"xinyi\"\n            position=\"-0.6 0 0\" rotation=\"0 180 0\" model=\"xinyi\"\n            anim-autoplay=\"clip:Sitting\" capsule-shape=\"height:1;raduis:0.2;center:0 0.7 0\"\n            bind:touch-shape=\"handleTouchChar\"\n          />\n          <xr-gltf id=\"roam\"\n            position=\"0.6 0 0\" rotation=\"0 180 0\" model=\"roam\"\n            anim-autoplay=\"clip:Sitting\" capsule-shape=\"height:1;raduis:0.2;center:0 0.7 0\"\n            bind:touch-shape=\"handleTouchChar\"\n          />\n          <xr-gltf id=\"hikari\"\n            position=\"0 0 0\" rotation=\"0 180 0\" model=\"hikari\"\n            anim-autoplay=\"clip:Sitting\" capsule-shape=\"height:1;raduis:0.2;center:0 0.7 0\"\n            bind:touch-shape=\"handleTouchChar\"\n          />\n        </xr-node>\n      </xr-node>\n    </xr-node>\n\n    <xr-asset-post-process asset-id=\"blur\" type=\"blur\" data=\"radius:0\" />\n    <xr-camera\n      id=\"main-camera\" node-id=\"main-camera\"\n      background=\"ar\" is-ar-camera\n      near=\"0.1\" far=\"2000\"\n      is-ar-camera clear-color=\"0 0 0 1\" post-process=\"blur\"\n    >\n      <xr-gltf wx:if=\"{{arReady && !loaded}}\" position=\"0 0 10\" model=\"loading\" anim-autoplay />\n    </xr-camera>\n  </xr-node>\n\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"{{ambient}}\" />\n    <xr-light node-id=\"light\" type=\"spot\" color=\"1 1 1\" intensity=\"4\" inner-cone-angle=\"5\" outer-cone-angle=\"25\" range=\"4\" wx:if=\"{{step < 3}}\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-beside-edge/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-face/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      xrScene.event.add('tick', this.handleTick.bind(this))\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleARReady({ detail }) {\n      console.log('arReady')\n      this.setData({ arReady: true })\n    },\n    handleTick() {\n      const xrSystem = wx.getXrFrameSystem()\n      const trackerEl = this.scene.getElementById('tracker')\n      if (!trackerEl) {\n        return\n      }\n\n      const tracker = trackerEl.getComponent(xrSystem.ARTracker)\n      if (!tracker.arActive) {\n        return\n      }\n\n      // 这里只是例子，实际上用的是`ARTracker`的`autoSync`属性。\n      // 但也是一个更高自由度的选项。\n      // 视情况需要自己同步`tracker`的`scale`和`rotation`特定节点。\n      // 第一个参数是特征点编好，第二个是可选的复用结果，第三个是可选的是否相对于`ARTracker`。\n      // 为`false`为世界空间的位置，需要配合`scale`自己使用\n      const position = tracker.getPosition(98, new xrSystem.Vector3(), false)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-face/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-face/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Face;camera:Front\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-glass\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/jokers_mask_persona5.glb\" />\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\" />\n  <xr-node wx:if=\"{{arReady}}\">\n    <xr-ar-tracker id='tracker' mode=\"Face\" auto-sync=\"43\">\n      <xr-node name=\"nose\" >\n        <xr-gltf node-id=\"gltf-glass\" position=\"0 0.02 -0.05\" rotation=\"0 180 0\" scale=\"0.5 0.5 0.5\" model=\"gltf-glass\"></xr-gltf>\n      </xr-node>\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera near=\"0.01\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.2\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"1\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-face/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-osd/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    markerImg: {\n      type: String\n    },\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n    toyReady: false,\n    gzDayReady: false,\n    gzNightReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({\n      detail\n    }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({\n      detail\n    }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({\n      detail\n    }) {\n      console.log('assets loaded', detail.value)\n      this.setData({\n        loaded: true\n      })\n    },\n    handleToySwitch({ detail }) {\n      const active = detail.value\n      if (active) {\n        this.setData({ toyReady: true })\n      } else {\n        this.setData({ toyReady: false })\n      }\n    },\n    handleDaySwitch({ detail }) {\n      const active = detail.value\n      if (active) {\n        this.setData({ gzDayReady: true })\n      } else {\n        this.setData({ gzDayReady: false })\n      }\n    },\n    handleNightSwitch({ detail }) {\n      const active = detail.value\n      if (active) {\n        this.setData({ gzNightReady: true })\n      } else {\n        this.setData({ gzNightReady: false })\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-osd/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-osd/index.wxml",
    "content": "<xr-scene ar-system=\"modes:OSD\" id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"simple\" effect=\"simple\" />\n    <xr-asset-material asset-id=\"text-simple\" effect=\"simple\" />\n  </xr-assets>\n  <xr-node>\n    <xr-ar-tracker mode=\"OSD\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/osdmarker-test.jpg\"  bind:ar-tracker-switch=\"handleToySwitch\">\n      <xr-node wx:if=\"{{toyReady}}\" rotation=\"0 180 0\">\n        <xr-mesh node-id=\"text-wrap\" position=\"0.9 0.4 0\" rotation=\"90 0 0\" scale=\"0.8 1 0.2\" geometry=\"plane\" material=\"simple\"\n          uniforms=\"u_baseColorFactor: 0.2 0.6 0.4 0.95\"\n          states=\"alphaMode: BLEND\"\n        ></xr-mesh>\n        <xr-mesh node-id=\"text-wrap-sub\" position=\"0.9 0.1 0\" rotation=\"90 0 0\" scale=\"0.8 1 0.4\" geometry=\"plane\" material=\"simple\"\n          uniforms=\"u_baseColorFactor: 0 0 0 0.95\"\n          states=\"alphaMode: BLEND\"\n        ></xr-mesh>\n        <!-- 文本处于beta版本，功能不完备，仅支持使用独立材质的基础渲染，不能更新渲染（修复中） -->\n        <xr-text node-id=\"text-name\" position=\"0.7 0.36 0.01\" scale=\"0.1 0.1 1\" material=\"text-simple\"\n          value=\"牛年公仔\"\n        ></xr-text>\n        <xr-text node-id=\"text-name\" position=\"0.6 0.16 0.01\" scale=\"0.06 0.06 1\" material=\"text-simple\"\n          value=\"牛年发布的奶牛公仔\"\n        ></xr-text>\n        <xr-text node-id=\"text-name\" position=\"0.6 0.06 0.01\" scale=\"0.06 0.06 1\" material=\"text-simple\"\n          value=\"礼盒中还包含玩具盲盒\"\n        ></xr-text>\n      </xr-node>\n    </xr-ar-tracker>\n\n    <xr-ar-tracker mode=\"OSD\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/gz-tower/day.jpg\"  bind:ar-tracker-switch=\"handleDaySwitch\">\n      <xr-node wx:if=\"{{gzDayReady}}\" rotation=\"0 180 0\" >\n        <xr-mesh node-id=\"text-wrap\" position=\"1 0.4 0\" rotation=\"90 0 0\" scale=\"1 1 0.2\" geometry=\"plane\" material=\"simple\"\n          uniforms=\"u_baseColorFactor: 0.2 0.6 0.4 0.95\"\n          states=\"alphaMode: BLEND\"\n        ></xr-mesh>\n        <xr-mesh node-id=\"text-wrap-sub\" position=\"1 0.1 0\" rotation=\"90 0 0\" scale=\"1 1 0.4\" geometry=\"plane\" material=\"simple\"\n          uniforms=\"u_baseColorFactor: 0 0 0 0.95\"\n          states=\"alphaMode: BLEND\"\n        ></xr-mesh>\n        <!-- 文本处于beta版本，功能不完备，仅支持使用独立材质的基础渲染，不能更新渲染（修复中） -->\n        <xr-text node-id=\"text-name\" position=\"0.85 0.36 0.01\" scale=\"0.1 0.1 1\" material=\"text-simple\"\n          value=\"广州塔\"\n        ></xr-text>\n        <xr-text node-id=\"text-name\" position=\"0.6 0.18 0.01\" scale=\"0.05 0.05 1\" material=\"text-simple\"\n          value=\"广州塔（英语：Canton Tower）\"\n        ></xr-text>\n        <xr-text node-id=\"text-name\" position=\"0.6 0.08 0.01\" scale=\"0.05 0.05 1\" material=\"text-simple\"\n          value=\"又称广州新电视塔，昵称小蛮腰\"\n        ></xr-text>\n        <xr-text node-id=\"text-name\" position=\"0.6 -0.02 0.01\" scale=\"0.05 0.05 1\" material=\"text-simple\"\n          value=\"海拔高程600米，距离珠江南岸125米\"\n        ></xr-text>\n      </xr-node>\n    </xr-ar-tracker>\n\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"1 1 1\" clear-color=\"0.925 0.925 0.925 1\"\n      far=\"2000\" background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"30 60 0\" color=\"1 1 1\" intensity=\"1\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-osd/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-perspect/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({\n      detail\n    }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({\n      detail\n    }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({\n      detail\n    }) {\n      console.log('assets loaded', detail.value)\n      this.setData({\n        loaded: true\n      })\n    }\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-perspect/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-perspect/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" ar-system=\"modes:Marker\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"env-data\" asset-id=\"env1\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-test.bin\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-fiesta_tea\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/fiesta_tea/scene.gltf\" />\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-env env-data=\"env1\"/>\n  <xr-node wx:if=\"{{loaded}}\">\n\n    <xr-ar-tracker mode=\"Marker\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/portalImage.jpg\">\n      <xr-node scale=\"1 1 1\">\n        <xr-gltf node-id=\"mesh-gltf-fiesta_tea\" position=\"0 -1.6 1\" rotation=\"-90 0 0\" scale=\"0.6 0.6 0.6\" model=\"gltf-fiesta_tea\"\n          states=\"stencilTestOn: true, stencilComp: 3, stencilRef: 1, stencilReadMask: 1\"\n        ></xr-gltf>\n\n        <!-- <xr-mesh node-id=\"door\" position=\"0 1.5 0\" rotation=\"0 0 0\" scale=\"1 0.1 1\" geometry=\"cube\" material=\"standard-mat\"\n          states=\"renderQueue: 2, depthTestOn: false\"\n        ></xr-mesh> -->\n\n        <xr-mesh node-id=\"plane-cull\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"1 0.1 0.9\" geometry=\"plane\"\n          states=\"renderQueue: 1, stencilTestOn: true, stencilComp: 7, stencilRef: 1, stencilReadMask: 1, stencilWriteMask: 1, stencilPass: 1, stencilFail: 2, stencilZFail: 2\"\n        ></xr-mesh>\n      </xr-node>\n    </xr-ar-tracker>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"2 0.4 0\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"30 60 0\" color=\"1 1 1\" intensity=\"1\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-perspect/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-portal/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    detached() {\n      wx.setKeepScreenOn({ keepScreenOn: false })\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      this.inRealWorld = true\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n      this.scene.event.addOnce('touchstart', this.placeNode.bind(this))\n      wx.showToast({ title: '点击屏幕放置' })\n    },\n    handleTick() {\n      if (!this.placed) {\n        return\n      }\n\n      const xrSystem = wx.getXrFrameSystem()\n      const mainCamEl = this.scene.getElementById('main-camera')\n      const magicCamEl = this.scene.getElementById('magic-camera')\n      const mainTrs = mainCamEl.getComponent(xrSystem.Transform)\n      const door = this.scene.getElementById('door').getComponent(xrSystem.Transform)\n\n      let forward = door.worldForward\n      forward = xrSystem.Vector2.createFromNumber(forward.x, forward.z)\n      let diff = mainTrs.worldPosition.sub(door.worldPosition)\n      diff = xrSystem.Vector2.createFromNumber(diff.x, diff.z)\n      const preDiff = this.diff || diff\n      this.diff = diff\n\n      const dis = diff.length()\n      const preDis = preDiff.length()\n      const dir = forward.dot(diff)\n\n      // @todo: 等待物理加上碰撞检测，替换\n      if (preDis <= 0.2 || dis > 0.2) {\n        return\n      }\n\n      if (this.inRealWorld && dir >= 0) {\n        return\n      }\n\n      if (!this.inRealWorld && dir <= 0) {\n        return\n      }\n\n      const mainCam = mainCamEl.getComponent(xrSystem.Camera)\n      const magicCam = magicCamEl.getComponent(xrSystem.Camera)\n      const doorMesh = this.scene.getElementById('door-mesh').getComponent(xrSystem.Mesh)\n      const sceneMesh = this.scene.getElementById('scene-mesh').getComponent(xrSystem.GLTF)\n\n      if (!this.inRealWorld) {\n        // 现实世界\n        // mainCam: ar -> stencil -> scene\n        // magicCam: nothing\n        this.inRealWorld = true\n        mainCam.setData({ background: 'ar' })\n        magicCam.setData({ background: 'default' })\n        magicCam.setData({ isClearDepth: false })\n        magicCam.clearBackgroundRenderStates()\n        doorMesh.material.renderQueue = 1\n        doorMesh.material.setRenderState('cullFace', 2)\n        sceneMesh.meshes.forEach(mesh => mesh.material.setRenderState('stencilComp', 3))\n      } else {\n        // 虚拟世界\n        // mainCam: scene -> stencil\n        // magicCam: ar\n        this.inRealWorld = false\n        mainCam.setData({ background: 'default' })\n        magicCam.setData({ background: 'ar' })\n        magicCam.setData({ isClearDepth: true })\n        magicCam.setBackgroundRenderStates({\n          stencilComp: 3,\n          stencilRef: 1,\n          stencilReadMask: 1\n        })\n        doorMesh.material.renderQueue = 9999\n        doorMesh.material.setRenderState('cullFace', 1)\n        sceneMesh.meshes.forEach(mesh => mesh.material.setRenderState('stencilComp', 0))\n      }\n    },\n    placeNode(event) {\n      const { clientX, clientY } = event.touches[0]\n      const { frameWidth: width, frameHeight: height } = this.scene\n\n      if (clientY / height > 0.8 && clientX / width > 0.8) {\n        this.scene.getNodeById('setitem').visible = false\n        this.scene.ar.resetPlane()\n        this.scene.event.addOnce('touchstart', this.placeNode.bind(this))\n      } else {\n        this.scene.ar.placeHere('setitem', true)\n        this.scene.getElementById('anchor').getComponent(wx.getXrFrameSystem().Transform).setData({ visible: false })\n        this.placed = true\n        wx.setKeepScreenOn({ keepScreenOn: true })\n      }\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-portal/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-portal/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Plane\" id=\"xr-scene\" bind:ready=\"handleReady\" bind:tick=\"handleTick\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"anchor\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/ar-plane-marker.glb\" /> \n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-model\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/ship_in_clouds/scene.gltf\" />\n    <xr-asset-material asset-id=\"mat\" effect=\"simple\" />\n  </xr-assets>\n  <xr-node wx:if=\"{{loaded}}\">\n    <xr-ar-tracker mode=\"Plane\">\n      <xr-gltf id=\"anchor\" model=\"anchor\" />\n    </xr-ar-tracker>\n\n    <xr-node id=\"setitem\" node-id=\"setitem\" visible=\"false\">\n      <xr-gltf\n        id=\"scene-mesh\" model=\"gltf-model\"\n        position=\"0 2 8\" rotation=\"0 0 0\" scale=\"5 5 5\"\n        states=\"stencilComp: 3, stencilRef: 1, stencilReadMask: 1\"\n      />\n\n      <xr-node id=\"door\" position=\"0 1 0\">\n        <xr-mesh\n          id=\"door-mesh\" rotation=\"90 0 0\" scale=\"0.8 1 1.6\"\n          geometry=\"plane\" material=\"mat\"\n          states=\"renderQueue: 1, stencilComp: 7, stencilRef: 1, stencilReadMask: 1, stencilWriteMask: 1, stencilPass: 1, stencilFail: 2, stencilZFail: 2\"\n        />\n      </xr-node>\n    </xr-node>\n  </xr-node>\n\n  <xr-camera\n    id=\"main-camera\" near=\"0.1\" far=\"2000\"\n    background=\"ar\" is-ar-camera clear-color=\"1 0 0 1\"\n  />\n  <xr-camera\n    id=\"magic-camera\" background=\"default\" cull-mask=\"0\"\n    is-clear-color=\"false\" is-clear-stencil=\"false\" is-clear-depth=\"false\"\n  />\n\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.6\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-portal/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-video/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {},\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({\n        loaded: true\n      })\n    },\n    handleTrackerSwitch({ detail }) {\n      const active = detail.value\n      console.log('handleTrackerSwitch', detail)\n      const video = this.scene.assets.getAsset('video-texture', 'hikari')\n      if (active) {\n        video.play()\n      } else {\n        video.stop()\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-video/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-video/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Marker\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n   <xr-asset-load\n      type=\"video-texture\" asset-id=\"hikari\"\n      src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/2dmarker/hikari-v.mp4\" options=\"loop:true\"\n    />\n    <xr-asset-material asset-id=\"mat\" effect=\"simple\" uniforms=\"u_baseColorMap: video-hikari\" />\n  </xr-assets>\n  <xr-node wx:if=\"{{loaded}}\">\n    <xr-ar-tracker mode=\"Marker\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/2dmarker/hikari.jpg\" bind:ar-tracker-switch=\"handleTrackerSwitch\">\n      <xr-mesh node-id=\"mesh-plane\" geometry=\"plane\" material=\"mat\" />\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"1 1 1\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"ar\" is-ar-camera\n    />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-video/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-wxball/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  wxball: null,\n  wxballTransform: null,\n  wxballAnimator: null,\n  animationRuning: false,\n  properties: {\n  },\n  data: {\n    loaded: false,\n    arReady: false,\n  },\n  lifetimes: {\n    async attached() {\n      console.log('data', this.data)\n    }\n  },\n  methods: {\n    handleReady({\n      detail\n    }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      this.wxball = xrScene.getElementById('wxball')\n\n      this.wxballTransform = this.wxball.getComponent(xrFrameSystem.Transform)\n      this.wxballTransform.visible = false\n    },\n    handleAssetsProgress({\n      detail\n    }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({\n      detail\n    }) {\n      console.log('assets loaded', detail.value)\n      this.setData({\n        loaded: true\n      })\n    },\n    handleGltfLoaded() {\n      const xrScene = this.scene\n\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      this.wxball = xrScene.getElementById('wxball')\n\n      this.wxballAnimator = this.wxball.getComponent(xrFrameSystem.Animator)\n\n      this.wxballAnimator.play('gltfAnimation', {\n        loop: 0,\n      })\n\n      this.wxballAnimator.play('gltfAnimation#0', {\n        loop: 0,\n      })\n\n      this.wxballAnimator.pauseToFrame('gltfAnimation', 1)\n      this.wxballAnimator.pauseToFrame('gltfAnimation#0', 1)\n\n      this.wxballTransform.visible = true\n    },\n    handleTouchWXball() {\n      if (!this.animationRuning) {\n        console.log('WXBALL TOUCH')\n\n        this.animationRuning = true\n\n        this.wxballAnimator.pauseToFrame('gltfAnimation', 1)\n        this.wxballAnimator.pauseToFrame('gltfAnimation#0', 1)\n\n        this.wxballAnimator.resume('gltfAnimation')\n        this.wxballAnimator.resume('gltfAnimation#0')\n      }\n    },\n    handleAnimationStop() {\n      console.log('animation Stop')\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-wxball/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-wxball/index.wxml",
    "content": "<xr-scene ar-system=\"modes:OSD\" id=\"xr-scene\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\" bind:log=\"handleLog\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"env-data\" asset-id=\"env1\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-test.bin\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-wxball\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/wxball/wxball.gltf\" />\n  </xr-assets>\n  <xr-env env-data=\"env1\"/>\n  <xr-node>\n    <xr-ar-tracker mode=\"OSD\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/wxball.jpg\">\n      <xr-gltf id=\"wxball\" node-id=\"mesh-gltf-wxball\" position=\"0 -0.1 0\" rotation=\"-45 30 0\" scale=\"0.16 0.16 0.16\" model=\"gltf-wxball\"\n        bind:gltf-loaded=\"handleGltfLoaded\"\n        bind:touch-shape=\"handleTouchWXball\" sphere-shape=\"radius: 1.5\"\n        bind:anim-stop=\"handleAnimationStop\"\n      />\n    </xr-ar-tracker>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"1 1 1\" clear-color=\"0.925 0.925 0.925 1\"\n      far=\"2000\" background=\"ar\" is-ar-camera\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"30 60 0\" color=\"1 1 1\" intensity=\"1\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-classic-wxball/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-custom-logic/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {},\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      this.rotSpeed = 1\n      this.rotAxis = 0\n    },\n    handleTouchStart({ detail }) {\n      console.log('touch start', detail.value)\n    },\n    handleTouchEnd({ detail }) {\n      console.log('touch end', detail.value)\n      this.rotAxis += 1\n      if (this.rotAxis >= 3) {\n        this.rotAxis = 0\n      }\n\n      this.changeSpeed()\n    },\n    handleDrag({ detail }) {\n      const info = detail.value\n      console.log('drag', info)\n      this.rotSpeed += info.deltaX / this.scene.width\n      this.changeSpeed()\n    },\n    changeSpeed() {\n      const xrSystem = wx.getXrFrameSystem()\n      const el = this.scene.getElementById('artg')\n      const comp = el.getComponent('auto-rotate')\n\n      if (comp) {\n        comp.setData({ speed: [0, 0, 0].map((_, i) => (i === this.rotAxis ? this.rotSpeed : 0)) })\n      }\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleLog({ detail }) {\n      console.log('log', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-custom-logic/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-custom-logic/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\" bind:log=\"handleLog\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load\n      type=\"env-data\" asset-id=\"env1\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-test.bin\"\n    />\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-damageHelmet\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/index.glb\" />\n  </xr-assets>\n  <xr-env env-data=\"env1\" />\n  <xr-node node-id=\"target\">\n    <xr-gltf model=\"gltf-damageHelmet\" position=\"2 0 0\" auto-rotate=\"speed:2 1 3\" />\n    <xr-auto-rotate-touchable-gltf id=\"artg\" position=\"-2 0 0\" model=\"gltf-damageHelmet\" speed=\"1 0 0\" bind:drag-shape=\"handleDrag\" bind:touch-shape=\"handleTouchStart\" bind:untouch-shape=\"handleTouchEnd\" />\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 0 8\" clear-color=\"0.925 0.925 0.925 1\"\n      background=\"skybox\" target=\"target\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-custom-logic/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-custom-render/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {},\n  data: {\n    stars: []\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      const stars = new Array(44).fill(0).map(() => ({\n        pos: [\n          (Math.random() * 2 - 1) * 4,\n          (Math.random() * 2 - 1) * 4,\n          (Math.random() * 2 - 1) * 4,\n        ].join(' '),\n        color: [\n          Math.random(),\n          Math.random(),\n          Math.random(),\n          1\n        ].join(' '),\n        speed: (Math.random() + 0.2) * 3\n      }))\n      console.log(stars)\n\n      this.setData({ stars })\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-custom-render/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-custom-render/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"texture\" asset-id=\"waifu\" src=\"/assets/waifu.png\" />\n    <xr-asset-material asset-id=\"shining-mat\" effect=\"shining\" uniforms=\"u_color:1 1 0 1\" />\n  </xr-assets>\n  <xr-node node-id=\"target\">\n    <xr-mesh geometry=\"star\" material=\"shining-mat\" rotation=\"90 0 0\" />\n    <xr-node wx:for=\"{{stars}}\" wx:for-item=\"star\">\n      <xr-shining-star rotation=\"90 0 0\" position=\"{{star.pos}}\" uniforms=\"u_color:{{star.color}},u_reflection:waifu,u_speed:{{star.speed}}\" />\n    </xr-node>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 0 10\" clear-color=\"0.4 0.6 0.7 1\"\n      background=\"default\" target=\"target\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"{{test}}\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 170 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-custom-render/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-firework/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    capacity: {\n      type: Number,\n      value: 20\n    },\n    emitRate: {\n      type: Number,\n      value: 5\n    },\n    lifeTime: {\n      type: Number,\n      value: 3\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      const fireworkField = xrScene.getElementById('firework')\n      const tempSystem = fireworkField.getComponent('custom-particle')\n      tempSystem.addSizeGradient(0, 0.2)\n      tempSystem.addSizeGradient(3, 0.5)\n\n      let myData = {}\n      myData = {\n        capacity: 200,\n        emitRate: 0, // 子发射器不进行每秒发射\n        burstCount: 200, // 一次爆发200粒子\n        burstTime: 0, // 爆发延时为0\n        burstCycle: 1, // 发射一次\n        size: [0.05],\n        startColor: [1, 1, 0, 1],\n        endColor: [1, 0, 0, 0],\n        emitterType: 'SphereShape',\n        emitterProps: [['radius', '0.8']],\n        lifeTime: [3], // 粒子生命周期为3秒\n        stopDuration: [3], // 子发射器生命周期为3秒\n        speed: [1],\n        texture: 'flarePicture'\n      }\n\n      const subEmitter = tempSystem.createSubEmitter(myData)\n\n      subEmitter.state = 1 // 设置为1为当粒子消失后出现作用子发射器\n      // 可以规定多个子发射器的阵列\n      tempSystem.subEmitters = [subEmitter]\n    },\n\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-firework/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-firework/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\"   bind:assetsLoaded=\"handleLoaded\">\n  <xr-assets>\n    <xr-asset-load type=\"texture\" asset-id=\"particle-texture\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/point.png\" />\n    <xr-asset-load type=\"texture\" asset-id=\"flarePicture\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/flare.png\" />\n  </xr-assets>\n\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 0.2 5\"\n      geometry=\"cube\" material=\"blue-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"\n    ></xr-mesh>\n    <xr-env sky-map=\"sky\" is-sky2d/>\n\n    <xr-custom-particle id=\"firework\" position=\"0 0 0\" start-color=\"1 1 1 1\" end-color=\"1 0 0 1\" capacity=\"1\" speed=\"1\" size=\"0.5\" emit-rate=\"1\" life-time=\"3\" angle=\"0\"  texture=\"particle-texture\">\n    </xr-custom-particle>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 6 -6\" clear-color=\"0.1 0.1 0.1 1\"\n      target=\"mesh-plane\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"90 0 0\" color=\"1 1 1\" intensity=\"2.5\"  />\n  </xr-node>\n\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-meshEmitter/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    capacity: {\n      type: Number,\n      value: 20\n    },\n    emitRate: {\n      type: Number,\n      value: 5\n    },\n    lifeTime: {\n      type: Number,\n      value: 3\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n      this.setMeshRender()\n    },\n    async setMeshRender() {\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const magicField = this.scene.getElementById('magicField')\n      const tempSystem = magicField.getComponent('custom-particle')\n\n      tempSystem.addSizeGradient(0, 0.7)\n      tempSystem.addSizeGradient(0.5, 1.0)\n      tempSystem.addColorGradient(0, xrFrameSystem.Vector4.createFromNumber(1, 0.89, 0.27, 1))\n      tempSystem.addColorGradient(1, xrFrameSystem.Vector4.createFromNumber(1, 0.64, 0, 1))\n      tempSystem.addAlphaGradient(0, 0, 0)\n      tempSystem.addAlphaGradient(0.5, 1, 1)\n      tempSystem.addAlphaGradient(1, 0, 0)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-meshEmitter/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-meshEmitter/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\"   bind:assetsLoaded=\"handleLoaded\">\n  <xr-assets bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"texture\" asset-id=\"glow_circle\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/glow_circle.png\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-ballon\" src=\"https://webar.hereto.cn/asset/fe/ast-show/ballon-anim.glb\" /> \n  </xr-assets>\n\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 0.2 5\"\n      geometry=\"cube\" material=\"blue-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"\n    ></xr-mesh>\n    <xr-env sky-map=\"sky\" is-sky2d/>\n\n    <!-- <xr-custom-particle  id=\"magicField\" position=\"0 0 0\" rotation=\"0 0 180\" capacity=\"10\" speed=\"0.1\" size=\"2\" emit-rate=\"6\" life-time=\"0.5\" angle=\"0\"  render-mode=\"mesh\" mesh=\"specialCylinder\" texture=\"glow_circle\" angular-speed=\"0\"></xr-custom-particle> -->\n\n    <xr-custom-particle  id=\"magicField\" position=\"0 0 0\" rotation=\"0 0 0\" capacity=\"10\" speed=\"0.1\" size=\"0.02\" emit-rate=\"6\" life-time=\"0.5\" angle=\"0\"  texture=\"glow_circle\" angular-speed=\"0\" render-model=\"gltf-ballon\"></xr-custom-particle>\n\n    <xr-gltf id=\"ballon\" node-id=\"gltf-ballon\" position=\"0.8 0 0\" rotation=\"0 0 0\" scale=\"1.2 1.2 1.2\" model=\"gltf-ballon\"></xr-gltf>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 6 -6\" clear-color=\"0.1 0.1 0.1 1\"\n      target=\"mesh-plane\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n    \n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"90 0 0\" color=\"1 1 1\" intensity=\"2.5\"  />\n  </xr-node>\n\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-orb/index.js",
    "content": "Component({\n  properties: {\n    capacity: {\n      type: Number,\n      value: 20\n    },\n    emitRate: {\n      type: Number,\n      value: 5\n    },\n    lifeTime: {\n      type: Number,\n      value: 3\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      // orb vfx\n      const orb = xrScene.getElementById('orb')\n      let tempSystem = orb.getComponent('custom-particle')\n      tempSystem.addAlphaGradient(0, 0, 0)\n      tempSystem.addAlphaGradient(0.5, 1, 1)\n      tempSystem.addAlphaGradient(1, 0, 0)\n      tempSystem.addSizeGradient(0, 1, 1)\n      tempSystem.addSizeGradient(1, 0, 0)\n\n      // orbline vfx\n      const orbLine = xrScene.getElementById('orbLine')\n      tempSystem = orbLine.getComponent('custom-particle')\n      tempSystem.addColorGradient(0, xrFrameSystem.Vector4.createFromNumber(1, 1, 0, 1))\n      tempSystem.addColorGradient(1, xrFrameSystem.Vector4.createFromNumber(1, 0.68, 0, 1))\n      tempSystem.addAlphaGradient(0, 0, 0)\n      tempSystem.addAlphaGradient(0.5, 1, 1)\n      tempSystem.addAlphaGradient(1, 0, 0)\n      tempSystem.addSizeGradient(0, 1, 1)\n      tempSystem.addSizeGradient(1, 0, 0)\n    },\n\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-orb/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-orb/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"texture\" asset-id=\"orb\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/orb.png\" />\n    <xr-asset-load type=\"texture\" asset-id=\"magic-line\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/magic_line.png\" />\n  </xr-assets>\n\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 0.2 5\"\n      geometry=\"cube\" material=\"blue-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"\n    ></xr-mesh>\n    <xr-env sky-map=\"sky\" is-sky2d/>\n\n\n    <xr-custom-particle id=\"orb\" position=\"0 0 2\" rotation=\"0 0 0\" capacity=\"1000\" speed=\"0\" size=\"5\" emit-rate=\"18\" life-time=\"0.2\" angle=\"0\"  texture=\"orb\">\n    </xr-custom-particle>\n\n    <xr-custom-particle id=\"orbLine\" position=\"0 0 2\" rotation=\"0 0 0\" angle=\"90\" capacity=\"1000\" speed=\"-4 -2\" size=\"0.4 0.7\" emit-rate=\"70\" life-time=\"0.2 0.4\" texture=\"magic-line\" emitter-type=\"SphereShape\" emitter-props=\"radius:0.7\" render-mode=\"stretched\">\n    </xr-custom-particle>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 6 -6\" clear-color=\"0.1 0.1 0.1 1\"\n      target=\"mesh-plane\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"90 0 0\" color=\"1 1 1\" intensity=\"2.5\"  />\n  </xr-node>\n\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-portal/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    capacity: {\n      type: Number,\n      value: 20\n    },\n    emitRate: {\n      type: Number,\n      value: 5\n    },\n    lifeTime: {\n      type: Number,\n      value: 3\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      const portal = xrScene.getElementById('portal')\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const tempSystem = portal.getComponent('custom-particle')\n      tempSystem.addSizeGradient(0, 1, 1)\n      tempSystem.addSizeGradient(0.5, 0.8, 0.8)\n      tempSystem.addSizeGradient(0.75, 0.5, 0.5)\n      tempSystem.addSizeGradient(0.9, 0.2, 0.2)\n      tempSystem.addSizeGradient(1, 0, 0)\n    },\n\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-portal/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-portal/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n    <xr-assets  bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"atlas\" asset-id=\"portal-atlas\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/portal.json\" />\n  </xr-assets>\n\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 0.2 5\"\n      geometry=\"cube\" material=\"blue-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"\n    ></xr-mesh>\n    <xr-env sky-map=\"sky\" is-sky2d/>\n    \n    <xr-custom-particle  id=\"portal\" position=\"0 0 2\" atlas=\"portal-atlas\" capacity=\"1000\" speed=\"0\" size=\"2 2.5\" emit-rate=\"12\" life-time=\"0.4\" angle=\"0 360\" atlas-speed=\"0\" atlas-random=\"true\" emitter-type=\"SphereShape\" emitter-props=\"radius:0.03\" angular-speed=\"-300\"></xr-custom-particle>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 6 -6\" clear-color=\"0.1 0.1 0.1 1\"\n      target=\"mesh-plane\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"90 0 0\" color=\"1 1 1\" intensity=\"2.5\"  />\n  </xr-node>\n\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-shapeEmitter/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    capacity: {\n      type: Number,\n      value: 20\n    },\n    emitRate: {\n      type: Number,\n      value: 5\n    },\n    lifeTime: {\n      type: Number,\n      value: 3\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n    },\n\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-shapeEmitter/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-customParticle-shapeEmitter/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets  bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"texture\" asset-id=\"particle-texture\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/point.png\" />\n  </xr-assets>\n\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 0.2 5\"\n      geometry=\"cube\" material=\"blue-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"\n    ></xr-mesh>\n    <xr-env sky-map=\"sky\" is-sky2d/>\n\n    <xr-custom-particle  position=\"0 0 2\" start-color=\"0 1 0 1\" end-color=\"1 1 0 1\" capacity=\"100\" speed=\"-5\" size=\"0.1 0.2\" emit-rate=\"80\" life-time=\"0.2 0.4\" angle=\"0 360\" angular-speed=\"-300\" emitter-type=\"SphereShape\" emitter-props=\"radius:1.5\" texture=\"particle-texture\">\n    </xr-custom-particle>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 6 -6\" clear-color=\"0.1 0.1 0.1 1\"\n      target=\"mesh-plane\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"90 0 0\" color=\"1 1 1\" intensity=\"2.5\"  />\n  </xr-node>\n\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-demo-viewer/index.js",
    "content": "Component({\n  properties: {\n    title: {\n      type: String,\n      value: '',\n    },\n    intro: {\n      type: String,\n      value: '',\n    },\n    hint: {\n      type: String,\n      value: '',\n    },\n    code: {\n      type: String,\n      value: '',\n    },\n    json: {\n      type: String,\n      value: '',\n    },\n    js: {\n      type: String,\n      value: '',\n    },\n    showBackBtn: {\n      type: Boolean,\n      value: false,\n    },\n  },\n  data: {\n  },\n  lifetimes: {\n    attached() {\n      wx.xrTitle = this.data.title\n    }\n  },\n  methods: {\n    onClickBack() {\n      wx.navigateBack()\n    },\n  },\n  options: {\n    multipleSlots: true\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-demo-viewer/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-demo-viewer/index.wxml",
    "content": "<view class=\"demo-wrap\">\n  <scroll-view class=\"demo-viewer\" scroll-y=\"{{true}}\">\n    <block bind:sceneReady=\"handleSceneReady\">\n      <slot></slot>\n    </block>\n    <view class=\"intro\">\n      <view class=\"intro-detail\">\n        <view class=\"intro-title\" ><text>{{title}}</text> <button class=\"share\" open-type=\"share\">分享给好友</button></view>\n        <view class=\"description\">{{intro}}</view>\n        <slot name=\"intro\"></slot>\n      </view>\n    </view>\n    <view wx:if=\"{{hint.length > 0}}\">\n      <view class=\"hint-wrap\">\n        <text class=\"hint-words\" >{{hint}}</text>\n      </view>\n    </view>\n    <view wx:if=\"{{code.length > 0}}\">\n      <view class=\"intro\">\n        <view class=\"intro-detail\">\n          <view class=\"title\">代码演示</view>\n          <view class=\"code-inner\">\n            <rich-text nodes=\"{{code}}\"></rich-text>\n          </view>\n        </view>\n      </view>\n    </view>\n    <view wx:if=\"{{js.length > 0}}\">\n      <view class=\"intro\">\n        <view class=\"intro-detail\">\n          <view class=\"title\">脚本演示</view>\n          <view class=\"code-inner\">\n            <rich-text nodes=\"{{js}}\"></rich-text>\n          </view>\n        </view>\n      </view>\n    </view>\n    <view wx:if=\"{{json.length > 0}}\">\n      <view class=\"intro\">\n        <view class=\"intro-detail\">\n          <view class=\"title\">动画数据结构</view>\n          <view class=\"code-inner\">\n            <rich-text nodes=\"{{json}}\"></rich-text>\n          </view>\n        </view>\n      </view>\n    </view>\n    <view class=\"holder\"></view>\n  </scroll-view>\n  <view class=\"back-btn-wrap\" wx:if=\"{{showBackBtn}}\" bind:tap=\"onClickBack\">\n    <view class=\"back-line-t\"></view>\n    <view class=\"back-line-b\"></view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-demo-viewer/index.wxss",
    "content": ".demo-wrap {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n.demo-viewer {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.holder {\n  height: 60rpx;\n}\n\n.hint-wrap {\n  text-align: center;\n}\n\n.hint-words {\n  display: block;\n  font-size: 14px;\n  color: #000;\n  text-align: center;\n  font-weight: normal;\n  margin: 10px 20px;\n  padding: 10px;\n  border-radius: 5px;\n  border: 1px dashed #000;\n  background-color: #fff;\n}\n\n.intro {\n  display: block;\n  margin: 20rpx 0;\n  background: #fff;\n}\n\n.intro .title {\n  font-size: 36rpx;\n  padding-bottom: 20rpx;\n}\n\n.intro .description {\n  color: #8f8f8f;\n  font-size: 28rpx;\n}\n\n.intro-detail {\n  padding: 30rpx;\n}\n\n\n.code-inner {\n  margin: 0rpx;\n  padding: 30rpx;\n  font-size: 30rpx;\n  background-color: #f9f9fa;\n}\n\n.code-inner rich-text {\n  word-wrap: break-word;\n}\n\n.block-name {\n  display: inline-block;\n  color: #b457ff;\n}\n\n.attr-name {\n  display: inline-block;\n  color: #ff4d00;\n}\n\n.ml20 {\n  margin-left: 20rpx;\n}\n\n.intro-title {\n  font-size: 30rpx;\n  font-weight: bold;\n  display: flex;\n  justify-content: space-between;\n  align-items: baseline;\n  margin-bottom: 24rpx;\n}\n\n.share {\n  margin: 0 !important;\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n  padding: 0;\n  width: 160rpx !important;\n  background: none;\n  font-size: 28rpx;\n  color: #ff4d00;\n}\n\n.back-btn-wrap {\n  position: absolute;\n  left: 30rpx;\n  top: 100rpx;\n  width: 90rpx;\n  height: 80rpx;\n}\n.back-line-t {\n  position: absolute;\n  left: 20rpx;\n  top: 15rpx;\n  width: 30rpx;\n  height: 6rpx;\n  background-color: #000;\n  transform: rotate(-45deg);\n  border-radius: 5rpx;\n}\n.back-line-b {\n  position: absolute;\n  left: 20rpx;\n  top: 32rpx;\n  width: 30rpx;\n  height: 6rpx;\n  background-color: #000;\n  transform: rotate(45deg);\n  border-radius: 5rpx;\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-animation/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {\n    attached() {\n      console.log('data.a', this.data.a) // expected 123\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      console.log('scene', detail.value)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-animation/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-animation/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load asset-id=\"anim\" type=\"keyframe\" src=\"/assets/animation/miku-kawaii-animation.json\"/>\n    <xr-asset-load type=\"gltf\" asset-id=\"cloud-station\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/cloud-station/index.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"miku-kawaii\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/shiteyanyo-hatsune-miku/index.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"miku\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/miku.glb\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"target\" position=\"0 1 0\" />\n    <xr-gltf position=\"0 0 0\" scale=\"1 1 1\" model=\"cloud-station\" anim-autoplay></xr-gltf>\n    <xr-gltf position=\"1.8 -0.5 1.5\" scale=\"0.12 0.12 0.12\" rotation=\"0 180 0\" model=\"miku\" anim-autoplay></xr-gltf>\n    <xr-node anim-keyframe=\"anim\" anim-autoplay=\"clip:parent\">\n      <xr-node position=\"0 -0.5 3\" rotation=\"0 90 0\" anim-keyframe=\"anim\" anim-autoplay=\"clip:child\">\n        <xr-gltf model=\"miku-kawaii\" anim-keyframe=\"anim\" anim-autoplay></xr-gltf>\n      </xr-node>\n    </xr-node>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 1 7\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"target\" background=\"default\" camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 180 0\" color=\"1 1 1\" intensity=\"2\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-animation/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-compressTextures/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-compressTextures/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-compressTextures/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/compress-textures-test/gltf/index.gltf\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"glb\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/compress-textures-test/glb/index.glb\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-gltf position=\"-5 0 0\" model=\"gltf\"></xr-gltf>\n    <xr-gltf position=\"5 0 0\" model=\"glb\"></xr-gltf>\n    <xr-camera\n      position=\"0 0 -20\" clear-color=\"0.9 0.9 0.9 1\"\n      target=\"camera-target\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"2\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-compressTextures/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-damageHelmet/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {\n    attached() {\n      console.log('data.a', this.data.a) // expected 123\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      console.log('scene', detail.value)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-damageHelmet/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-damageHelmet/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load\n      type=\"env-data\" asset-id=\"env1\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-test.bin\"\n    />\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-damageHelmet\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/index.gltf\" />\n  </xr-assets>\n  <xr-env env-data=\"env1\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-gltf node-id=\"gltf-damageHelmet\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"1.2 1.2 1.2\" model=\"gltf-damageHelmet\"></xr-gltf>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 0 3\" clear-color=\"0.925 0.925 0.925 1\"\n      near=\"0.1\"\n      far=\"2000\"\n      target=\"camera-target\" background=\"skybox\" camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"40 180 0\" color=\"1 1 1\" intensity=\"2\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-damageHelmet/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-light-loading/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      this.triggerEvent('assetsProgress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      this.triggerEvent('assetsLoaded', detail.value)\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-light-loading/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-light-loading/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load asset-id=\"gltf-anim\" type=\"keyframe\" src=\"/assets/animation/gltf-animation.json\"/>\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-Sponza\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/Sponza/glTF/Sponza.gltf\" />\n  </xr-assets>\n  <xr-node wx:if=\"{{loaded}}\">\n    <xr-node node-id=\"camera-target\" position=\"0 2 0\"></xr-node>\n    <xr-gltf node-id=\"mesh-gltf-Sponza\" position=\"0 -2 0.3\" rotation=\"0 0 0\" scale=\"2 2 2\" model=\"gltf-Sponza\"></xr-gltf>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"-1 2 0\" clear-color=\"0.925 0.925 0.925 1\"\n      draw-sky target=\"camera-target\" far=\"1000\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.8\" />\n    <xr-light type=\"directional\" rotation=\"120 -40 0\" color=\"1 1 1\" intensity=\"4\" />\n    <xr-light\n      type=\"point\" position=\"10 0 0\" color=\"1 1 1\" range=\"10\" intensity=\"30\"\n      anim-keyframe=\"gltf-anim\" anim-autoplay=\"clip:pointLight, speed:2\"\n    />\n    <xr-light\n      type=\"spot\" color=\"0.8 0.8 0.2\" position=\"10 4 -0.3\" range=\"20\" intensity=\"100\" rotation=\"16 90 0\" inner-cone-angle=\"5\" outer-cone-angle=\"24\"\n    />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-light-loading/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-lightsPunctual/index.js",
    "content": "Component({\n  properties: {\n    behaviors: [require('../common/share-behavior').default],\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {\n    attached() {\n      console.log('data.a', this.data.a) // expected 123\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      console.log('scene', detail.value)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-lightsPunctual/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-lightsPunctual/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-LightsPunctualLamp\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/LightsPunctualLamp.glb\" />\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-gltf node-id=\"gltf-LightsPunctualLamp\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"1 1 1\" model=\"gltf-LightsPunctualLamp\"></xr-gltf>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 0 3\" clear-color=\"0.1 0.1 0.1 1\"\n      near=\"0.1\"\n      far=\"2000\"\n      target=\"camera-target\"  camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <!-- 场上最多只允许4个光源，所以不需要场景光源，由模型提供实际光源 -->\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-lightsPunctual/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-morph/index.js",
    "content": "Component({\n  properties: {\n    behaviors: [require('../common/share-behavior').default],\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {\n    attached() {\n      console.log('data.a', this.data.a) // expected 123\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      console.log('scene', detail.value)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-morph/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-morph/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"home\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/pokemon_loreleis_arena/index.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"baibianguai\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/baibianguai/index.glb\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"target\" position=\"0 1 0\" />\n    <xr-gltf position=\"0 2.4 0\" scale=\"0.03 0.03 0.03\" model=\"baibianguai\" cast-shadow anim-autoplay></xr-gltf>\n    <xr-gltf position=\"0 0 0\" scale=\"100 100 100\" model=\"home\" receive-shadow anim-autoplay></xr-gltf>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 4 6\" clear-color=\"0.925 0.925 0.925 1\"\n      target=\"target\" background=\"default\" camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"40 180 0\" color=\"1 1 1\" intensity=\"2\" cast-shadow />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-morph/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-sheen/index.js",
    "content": "Component({\n  properties: {\n    behaviors: [require('../common/share-behavior').default],\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {\n    attached() {\n      console.log('data.a', this.data.a) // expected 123\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      console.log('scene', detail.value)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-sheen/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-sheen/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-sheenChair\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/SheenChair/glTF-Binary/SheenChair.glb\" />\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-gltf node-id=\"gltf-sheenChair\" position=\"0 -3 0\" rotation=\"0 0 0\" scale=\"8 8 8\" model=\"gltf-sheenChair\"></xr-gltf>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"4 2 8\" clear-color=\"0.925 0.925 0.925 1\"\n      near=\"0.1\"\n      far=\"2000\"\n      target=\"camera-target\" background=\"skybox\" camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.6\" />\n    <xr-light type=\"directional\" rotation=\"120 20 0\" color=\"1 1 1\" intensity=\"1\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-sheen/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-specularGlossiness/index.js",
    "content": "Component({\n  properties: {\n    behaviors: [require('../common/share-behavior').default],\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {\n    attached() {\n      console.log('data.a', this.data.a) // expected 123\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      console.log('scene', detail.value)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-specularGlossiness/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-specularGlossiness/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-mech_drone\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/mech_drone/scene.gltf\" />\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-gltf node-id=\"gltf-mech_drone\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 5 5\" model=\"gltf-mech_drone\" anim-autoplay></xr-gltf>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 0 -3\" clear-color=\"0.925 0.925 0.925 1\"\n      near=\"0.1\"\n      far=\"2000\"\n      target=\"camera-target\" background=\"skybox\" camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.6\" />\n    <xr-light type=\"directional\" rotation=\"40 180 0\" color=\"1 1 1\" intensity=\"2\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-specularGlossiness/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-textureTransform/index.js",
    "content": "Component({\n  properties: {\n    behaviors: [require('../common/share-behavior').default],\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {\n    attached() {\n      console.log('data.a', this.data.a) // expected 123\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      console.log('scene', detail.value)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-textureTransform/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-textureTransform/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-TextureTransformMultiTest\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/TextureTransformMultiTest/glTF-Binary/TextureTransformMultiTest.glb\" />\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-gltf node-id=\"gltf-TextureTransformMultiTest\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"1.2 1.2 1.2\" model=\"gltf-TextureTransformMultiTest\"></xr-gltf>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 0 3\" clear-color=\"0.925 0.925 0.925 1\"\n      near=\"0.1\"\n      far=\"2000\"\n      target=\"camera-target\" background=\"skybox\" camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"40 180 0\" color=\"1 1 1\" intensity=\"2\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-textureTransform/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-transmission/index.js",
    "content": "Component({\n  properties: {\n    behaviors: [require('../common/share-behavior').default],\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {\n    attached() {\n      console.log('data.a', this.data.a) // expected 123\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      console.log('scene', detail.value)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-transmission/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-transmission/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-transmission\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/TransmissionTest/glTF-Binary/TransmissionTest.glb\" />\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\" />\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-gltf node-id=\"gltf-transmission\" position=\"0 0 0\" rotation=\"0 0 0\" scale=\"8 8 8\" model=\"gltf-transmission\"></xr-gltf>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"4 2 8\" clear-color=\"0 1 0 1\"\n      near=\"0.1\"\n      far=\"2000\"\n      background=\"skybox\"\n      target=\"camera-target\" camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.6\" />\n    <xr-light type=\"directional\" rotation=\"120 20 0\" color=\"1 1 1\" intensity=\"1\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-transmission/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-unlit/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleRaf({ detail }) {\n      console.log('raf', detail.value)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-unlit/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-unlit/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-just_a_girl\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/just_a_girl/index.glb\" />\n  </xr-assets>\n  <xr-node>\n    <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n    <xr-gltf node-id=\"gltf-just_a_girl\" position=\"0 -0.5 0\" rotation=\"0 0 0\" scale=\"0.01 0.01 0.01\" model=\"gltf-just_a_girl\"></xr-gltf>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 0.4 1.6\" clear-color=\"0.9 0.9 0.9 1\"\n      target=\"camera-target\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"2\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-gltf-unlit/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-last-record/index.js",
    "content": "const info = wx.getSystemInfoSync()\nconst dpi = info.pixelRatio\nconst width = info.windowWidth * dpi\nconst height = info.windowHeight * dpi\n\nComponent({\n  scene: null,\n  properties: {},\n  data: {\n    width,\n    height,\n    loaded: false,\n    arReady: false,\n    placed: false,\n    gateClosed: false\n  },\n  lifetimes: {\n    attached() {\n      wx.reportEvent('xr_frame', {\n        xr_page_path: '/pages/scene-last-record/index',\n        xr_last_record_click: 1\n      })\n    },\n    detached() {\n      this.bgm.stop()\n      wx.setKeepScreenOn({ keepScreenOn: false })\n    }\n  },\n  methods: {\n    handleReady({ detail }) {\n      this.scene = detail.value\n      this.scene.event.add('tick', this.handleTick.bind(this))\n      this.inRealWorld = true\n      this.texts = {}\n      this.textsIndex = {}\n      this.bgm = wx.createInnerAudioContext({})\n      this.bgm.src = 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/bgm.mp3'\n      this.bgm.loop = true\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleARReady() {\n      this.setData({ arReady: true })\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.records = JSON.parse(this.scene.assets.getAsset('raw', 'records'))\n      this.note = this.scene.assets.getAsset('raw', 'note')\n      this.setData({ loaded: true })\n    },\n    handleTick(dt) {\n      this.syncTexts()\n\n      if (!this.data.placed || !this.inRealWorld) {\n        return\n      }\n\n      const xrSystem = wx.getXrFrameSystem()\n      const mainCamEl = this.scene.getElementById('main-camera')\n      const mainTrs = mainCamEl.getComponent(xrSystem.Transform)\n      const door = this.scene.getElementById('door').getComponent(xrSystem.Transform)\n\n      let forward = door.worldForward\n      forward = xrSystem.Vector2.createFromNumber(forward.x, forward.z)\n      let diff = mainTrs.worldPosition.sub(door.worldPosition)\n      diff = xrSystem.Vector2.createFromNumber(diff.x, diff.z)\n      const preDiff = this.diff || diff\n      this.diff = diff\n\n      const dis = diff.length()\n      const preDis = preDiff.length()\n      const dir = forward.dot(diff)\n      this.startDis = this.startDis || dis\n\n      const blurAsset = this.scene.assets.getAsset('post-process', 'blur')\n      const vignetteAsset = this.scene.assets.getAsset('post-process', 'vignette')\n      const bloomAsset = this.scene.assets.getAsset('post-process', 'bloom')\n      const edgeEnv1 = 0.5\n      const edgeEnv2 = 0.8\n      const edgeDoor1 = 0.3\n      const edgeDoor2 = 0.7\n\n      if (this.blurDuration) {\n        this.blurDuration = Math.max(0, this.blurDuration - dt)\n        const p = 1 - this.blurDuration / this.blurTotal\n\n        if (p <= edgeEnv1) {\n          const progress = xrSystem.noneParamsEaseFuncs['ease-in-out'](p / edgeEnv1)\n          vignetteAsset.data.intensity = progress * 2\n          blurAsset.data.radius = progress * 86 + 10\n        } else if (p > edgeEnv2) {\n          const progress = xrSystem.noneParamsEaseFuncs['ease-in-out']((1 - p) / (1 - edgeEnv2))\n          vignetteAsset.data.intensity = progress * 2\n          blurAsset.data.radius = progress * 96\n        }\n\n        if (p >= edgeDoor1 && p < edgeDoor2) {\n          const progress = xrSystem.noneParamsEaseFuncs['ease-in-out']((p - edgeDoor1) / (edgeDoor2 - edgeDoor1))\n          door.scale.setValue(progress, 1, 1)\n        }\n      } else if (this.blurTotal) {\n        let progress = (1 - Math.max(0, Math.min(dis / this.startDis, 0.8)))\n        if (progress >= 0.2) {\n          progress = (progress - 0.2) / 0.6\n          blurAsset.data.radius = progress * 96\n          vignetteAsset.data.intensity = progress * 2\n          bloomAsset.data.threshold = 0.5 + progress * 2\n        }\n      }\n\n      // @todo: 等待物理加上碰撞检测，替换\n      if (dir >= 0 || preDis <= 0.2 || dis > 0.2) {\n        return\n      }\n\n      ['sky', 'scene-mesh', 'hikari', 'roam', 'xinyi'].forEach(id => {\n        this.scene\n          .getElementById(id)\n          .getComponent(xrSystem.GLTF).meshes.forEach(mesh => mesh.material.setRenderState('stencilComp', 0))\n      })\n      mainCamEl.getComponent(xrSystem.Camera).setData({\n        renderTarget: null,\n        postProcess: ['tone']\n      })\n      this.setData({ gateClosed: true })\n      this.inRealWorld = false\n    },\n    handleShowDoor({ detail }) {\n      if (detail.value.camera.el.id !== 'main-camera') {\n        return\n      }\n\n      const success = this.scene.ar.placeHere('setitem', true)\n      if (!success) {\n        return\n      }\n\n      setTimeout(() => {\n        this.blurTotal = this.blurDuration = 1700\n      }, 300)\n      wx.setKeepScreenOn({ keepScreenOn: true })\n      this.bgm.play()\n      this.setData({ placed: true })\n    },\n    handleResume() {\n      if (this.data.placed) {\n        this.bgm.play()\n      }\n    },\n    handleTouchNote({ detail }) {\n      if (detail.value.camera.el.id !== 'main-camera') {\n        return\n      }\n\n      this.triggerEvent('showNote', this.note)\n    },\n    handleTouchObj({ detail }) {\n      if (detail.value.camera.el.id !== 'main-camera') {\n        return\n      }\n\n      const xrSystem = wx.getXrFrameSystem()\n      const { el, value } = detail\n      const { camera, target } = value\n      const id = target.id\n      const text = this.texts[id]\n      const camTrs = camera.el.getComponent(xrSystem.Transform)\n      const targetTrs = target.getComponent(xrSystem.Transform)\n      const diff = camTrs.worldPosition.sub(targetTrs.worldPosition)\n      const distance = Math.sqrt(diff.x * diff.x + diff.z * diff.z)\n\n      if (!this.records[id]) {\n        return\n      }\n\n      const { y, d, texts: records } = this.records[id]\n\n      if (distance > (d || 1.5)) {\n        return\n      }\n\n      if (text) {\n        clearTimeout(text.timerId)\n      }\n\n      let index = this.textsIndex[id] === undefined ? -1 : this.textsIndex[id]\n      if (index >= records.length - 1) {\n        index = 0\n      } else {\n        index += 1\n      }\n      this.textsIndex[id] = index\n\n      this.texts[id] = {\n        content: records[index],\n        camera,\n        target,\n        y,\n        timerId: setTimeout(() => {\n          delete this.texts[id]\n        }, 4000)\n      }\n    },\n    syncTexts() {\n      const texts = Object.keys(this.texts).map(id => {\n        const {\n          camera, target, content, y\n        } = this.texts[id]\n        const xrSystem = wx.getXrFrameSystem()\n        const trs = target.getComponent(xrSystem.Transform)\n        const tmp = trs.worldPosition.clone()\n        tmp.y += y\n        const clipPos = camera.convertWorldPositionToClip(tmp)\n        const { frameWidth, frameHeight } = this.scene\n\n        return {\n          content,\n          id,\n          x: ((clipPos.x + 1) / 2) * frameWidth,\n          y: (1 - (clipPos.y + 1) / 2) * frameHeight\n        }\n      })\n\n      this.triggerEvent('changeTexts', texts)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-last-record/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-last-record/index.wxml",
    "content": "<xr-scene ar-system=\"modes:Plane\" id=\"xr-scene\" bind:ready=\"handleReady\" bind:ar-ready=\"handleARReady\" bind:pause=\"handlePause\" bind:resume=\"handleResume\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"raw\" asset-id=\"records\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/last-record.json\" options=\"encoding:utf-8\" />\n    <xr-asset-load type=\"raw\" asset-id=\"note\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/last-note.txt\" options=\"encoding:utf-8\" />\n    <xr-asset-load asset-id=\"anchor\" type=\"keyframe\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/last-record-anchor-animation.json\"/>\n    <xr-asset-load type=\"gltf\" asset-id=\"loading\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/loading.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"anchor\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/ar-plane-marker.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"butterfly\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/butterfly/index.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"sky\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/sky.gltf\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"office\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/last-record-unlit.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"hikari\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/hikari-unlit.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"roam\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/roam-unlit.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"xinyi\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/xinyi-unlit.glb\" />\n    <xr-asset-load type=\"texture\" asset-id=\"particle-point\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/point.png\" />\n  </xr-assets>\n  <xr-node layer=\"1\">\n    <xr-ar-tracker wx:if=\"{{loaded && !placed}}\" mode=\"Plane\" visible=\"false\">\n      <xr-node node-id=\"anchor\" anim-keyframe=\"anchor\" anim-autoplay=\"clip:parent\">\n        <xr-gltf model=\"anchor\" />\n        <xr-particle\n          position=\"0 0.8 0\"\n          cube-shape=\"size:0.8 1.6 0.8\" bind:touch-shape=\"handleShowDoor\"\n          capacity=\"4000\" emit-rate=\"20\"\n          size=\"0.01 0.03\" life-time=\"2.5 5\" speed=\"0.2 0.4\"\n          start-color=\"1 1 1 1\" end-color=\"1 1 1 0.5\"\n          emitter-type=\"BoxShape\"\n          emitter-props=\"minEmitBox:-0.15 -0.8 -0.15,maxEmitBox:0.15 -0.6 0.15,direction:0 1 0,direction2:0 1 0\"\n          atlas=\"numbers\" atlas-frames=\"0 1\" atlas-speed=\"4\" atlas-random\n        />\n      </xr-node>\n    </xr-ar-tracker>\n\n    <xr-node id=\"setitem\" node-id=\"setitem\" visible=\"false\">\n      <xr-gltf\n        id=\"sky\" model=\"sky\"\n        states=\"cullOn: false, stencilComp: 3, stencilRef: 1, stencilReadMask: 1\"\n      />\n\n      <xr-gltf\n        id=\"scene-mesh\" model=\"office\"\n        states=\"stencilComp: 3, stencilRef: 1, stencilReadMask: 1\"\n      />\n\n      <xr-gltf id=\"hikari\"\n        position=\"-0.192 0.073 -5.403\" rotation=\"0 106 0\" model=\"hikari\"\n        anim-autoplay=\"clip:Sitting\" capsule-shape=\"height:1;raduis:0.2;center:0 0.7 0\"\n        states=\"stencilComp: 3, stencilRef: 1, stencilReadMask: 1\"\n        bind:touch-shape=\"handleTouchObj\"\n      />\n\n      <xr-gltf id=\"roam\"\n        position=\"-2.404 0.015 -5.152\" rotation=\"0 -84 0\" model=\"roam\"\n        anim-autoplay=\"clip:Sitting\" capsule-shape=\"height:1;raduis:0.2;center:0 0.7 0\"\n        states=\"stencilComp: 3, stencilRef: 1, stencilReadMask: 1\"\n        bind:touch-shape=\"handleTouchObj\"\n      />\n\n      <xr-gltf id=\"xinyi\"\n        position=\"-0.883 0.089 -7.118\" rotation=\"0 -60 0\" model=\"xinyi\"\n        anim-autoplay=\"clip:Sitting\" capsule-shape=\"height:1;raduis:0.2;center:0 0.7 0\"\n        states=\"stencilComp: 3, stencilRef: 1, stencilReadMask: 1\"\n        bind:touch-shape=\"handleTouchObj\"\n      />\n\n      <xr-node\n        id=\"hikari-keyboard\" position=\"-0.865 0.775 -5.276\" rotation=\"0 9 0\"\n        cube-shape=\"size:0.3 0.05 0.4\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"hikari-telephone\" position=\"-1.103 0.809 -4.786\" rotation=\"0 0 0\"\n        cube-shape=\"size:0.07 0.16 0.2\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"hikari-qq\" position=\"-1.14 1.344 -5.195\" rotation=\"0 0 0\"\n        cube-shape=\"size:0.1 0.2 0.2\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"hikari-cap\" position=\"-0.493 0.786 -4.598\" rotation=\"0 56 0\"\n        cube-shape=\"size:0.3 0.05 0.15\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"hikari-calendar\" position=\"-0.798 0.8 -4.674\" rotation=\"0 111 0\"\n        cube-shape=\"size:0.2 0.05 0.1\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"hikari-drinks\" position=\"-0.617 0.795 -4.749\" rotation=\"0 52 0\"\n        cube-shape=\"size:0.15 0.1 0.1\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"chair\" position=\"-0.413 0.638 -4.054\" rotation=\"0 3 0\"\n        cube-shape=\"size:0.4 0.5 0.3\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"hikari-earphone\" position=\"-0.892 0.752 -4.934\" rotation=\"0 10 0\"\n        cube-shape=\"size:0.1 0.03 0.1\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"roam-pc\" position=\"-1.69 0.805 -5.272\" rotation=\"0 6 0\"\n        cube-shape=\"size:0.2 0.05 0.3\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"roam-monitor\" position=\"-1.577 1.085 -4.565\" rotation=\"0 143 0\"\n        cube-shape=\"size:0.05 0.4 0.5\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"xinyi-desktop\" position=\"-0.181 0.787 -7.306\" rotation=\"0 10 0\"\n        cube-shape=\"size:0.33 0.06 0.67\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"xinyi-plant\" position=\"0.164 0.896 -7.923\" rotation=\"0 10 0\"\n        cube-shape=\"size:0.33 0.3 0.3\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"xinyi-plant\" position=\"0.164 0.896 -7.923\" rotation=\"0 10 0\"\n        cube-shape=\"size:0.33 0.3 0.3\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"xinyi-box\" position=\"-0.254 0.282 -8.048\" rotation=\"0 0 0\"\n        cube-shape=\"size:0.5 0.5 0.5\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"disorder-desktop\" position=\"-1.181 0.906 -4.05\" rotation=\"0 272 0\"\n        cube-shape=\"size:0.5 0.3 0.65\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"fan\" position=\"-2.179 0.459 -4.022\" rotation=\"0 272 0\"\n        cube-shape=\"size:0.3 1 0.3\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"face-mask\" position=\"-4.124 0.795 -4.512\" rotation=\"0 286 0\"\n        cube-shape=\"size:0.2 0.05 0.3\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"oscilloscope\" position=\"-1.729 0.875 -4.084\" rotation=\"0 25 0\"\n        cube-shape=\"size:0.3 0.3 0.2\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"vege-dog\" position=\"-1.872 0.833 -4.227\" rotation=\"0 26 0\"\n        cube-shape=\"size:0.4 0.2 0.2\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"trash\" position=\"-3.164 0.405 -3.856\" rotation=\"0 0 0\"\n        cube-shape=\"size:0.3 0.63 0.55\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"light-monitor\" position=\"-2.682 0.984 -7.266\" rotation=\"0 0 0\"\n        cube-shape=\"size:0.1 0.28 0.55\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"charge-pal\" position=\"-2.438 0.181 -7.887\" rotation=\"0 0 0\"\n        cube-shape=\"size:0.2 0.28 0.3\" bind:touch-shape=\"handleTouchObj\"\n      />\n      <xr-node\n        id=\"note\" position=\"-0.719 0.747 -5.008\" rotation=\"0 16 0\"\n        cube-shape=\"size:0.22 0.04 0.15\" bind:touch-shape=\"handleTouchNote\"\n      />\n\n      <xr-node wx:if=\"{{gateClosed}}\">\n        <xr-particle\n          material=\"particle-mat\" position=\"-2.2 0.2 -5\"\n          capacity=\"2000\" emit-rate=\"40\" never-cull\n          size=\"0.06 0.12\" life-time=\"15 20\" speed=\"0.2 0.4\"\n          start-color=\"1 1 1 1\" end-color=\"1 1 1 0.4\"\n          emitter-type=\"BoxShape\"\n          emitter-props=\"minEmitBox:-20 0 -20,maxEmitBox:20 0 20,direction:0 1 0,direction2:0 1 0\"\n          texture=\"particle-point\"\n        />\n        <xr-node\n          id=\"oberon\" position=\"0 1.4 1\" rotation=\"0 0 0\"\n          sphere-shape=\"radius:0.3\" bind:touch-shape=\"handleTouchObj\"\n        >\n          <xr-particle\n            capacity=\"1000\" emit-rate=\"80\" never-cull\n            size=\"0.02 0.03\" life-time=\"1.5 2\" speed=\"0.04 0.08\"\n            start-color=\"0.5 0.9 0.7 1\" end-color=\"0.5 0.9 0.7 0.4\"\n            emitter-type=\"SphereShape\"\n            emitter-props=\"radius:0.05,randomizeDirection:0\"\n            texture=\"particle-point\"\n          />\n        </xr-node>\n        <xr-node\n          id=\"noname\" position=\"-1 1.4 1\" rotation=\"0 0 0\"\n          sphere-shape=\"radius:0.3\" bind:touch-shape=\"handleTouchObj\"\n        >\n          <xr-particle\n            capacity=\"1000\" emit-rate=\"80\" never-cull\n            size=\"0.02 0.03\" life-time=\"1.5 2\" speed=\"0.04 0.08\"\n            start-color=\"0.5 0.7 0.9 1\" end-color=\"0.5 0.7 0.9 0.4\"\n            emitter-type=\"SphereShape\"\n            emitter-props=\"radius:0.05,randomizeDirection:0\"\n            texture=\"particle-point\"\n          />\n        </xr-node>\n      </xr-node>\n\n      <xr-node\n        wx:if=\"{{placed && !gateClosed}}\" id=\"door\" position=\"0 1 0\" scale=\"0 0 0\"\n      >\n        <xr-mesh\n          id=\"door-mesh\" rotation=\"90 0 0\" scale=\"0.8 1 1.6\"\n          geometry=\"plane\"\n          states=\"renderQueue: 1, stencilComp: 7, stencilRef: 1, stencilReadMask: 1, stencilWriteMask: 1, stencilPass: 1, stencilFail: 2, stencilZFail: 2\"\n        />\n      </xr-node>\n    </xr-node>\n\n    <xr-element wx:if=\"{{!gateClosed}}\">\n      <xr-asset-render-texture asset-id=\"ar-camera\" width=\"{{width}}\" height=\"{{height}}\" />\n      <xr-asset-render-texture asset-id=\"main-camera\" width=\"{{width}}\" height=\"{{height}}\" />\n\n      <xr-asset-post-process asset-id=\"blur\" type=\"blur\" data=\"radius:0\" />\n      <xr-asset-post-process\n        asset-id=\"vignette\" type=\"vignette\"\n        data=\"intensity:0,smoothness:2,color:0.1 0.1 0.1 1\"\n      />\n      <xr-camera\n        id=\"ar-bg-camera\" cull-mask=\"0\" depth=\"0\"\n        background=\"ar\" post-process=\"blur vignette\"\n        render-target=\"ar-camera\"\n      />\n\n      <xr-asset-material asset-id=\"final\" effect=\"last-record-final\" uniforms=\"u_arBg:render-ar-camera,u_main:render-main-camera\" />\n      <xr-mesh node-id=\"final\" layer=\"2\" geometry=\"ar-camera-plane\" material=\"final\" position=\"0 0 2\" />\n      <xr-camera\n        id=\"final-camera\" cull-mask=\"0b101\" depth=\"2\"\n        target=\"final\" is-clear-color=\"false\"\n      />\n    </xr-element>\n\n    <xr-asset-post-process asset-id=\"bloom\" type=\"bloom\" is-hdr data=\"radius:32,intensity:2,threshold:0.7\" />\n    <xr-asset-post-process asset-id=\"tone\" type=\"tone\" />\n    <xr-camera\n      id=\"main-camera\" near=\"0.1\" far=\"2000\" cull-mask=\"0b11\" depth=\"1\"\n      is-ar-camera clear-color=\"0 0 0 0\" post-process=\"bloom tone\"\n      render-target=\"main-camera\"\n    >\n      <xr-gltf wx:if=\"{{arReady && !loaded}}\" position=\"0 0 10\" model=\"loading\" anim-autoplay />\n    </xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"2\" />\n  </xr-node>\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-last-record/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-custom/earring.js",
    "content": "const content = [\n  [\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.10980392156862745,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.1450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.09019607843137255,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.050980392156862744,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.10588235294117647,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.0784313725490196\n  ],\n  [\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.050980392156862744,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.13725490196078433,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.07058823529411765\n  ],\n  [\n    0.06666666666666667,\n    0.08235294117647057,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.10980392156862745,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.09019607843137255,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.1176470588235294,\n    0.10196078431372549,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.11372549019607843,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.050980392156862744,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.050980392156862744,\n    0.043137254901960784,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.10980392156862745,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863\n  ],\n  [\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.10588235294117647,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.1176470588235294,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.12549019607843137,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.0784313725490196,\n    0.10196078431372549,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.050980392156862744,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.0588235294117647,\n    0.11372549019607843,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.047058823529411764,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.10588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.10196078431372549,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.050980392156862744,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.07450980392156863\n  ],\n  [\n    0.06666666666666667,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.0784313725490196,\n    0.10588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.10980392156862745,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.08235294117647057,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.11372549019607843,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863\n  ],\n  [\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.10588235294117647,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.09803921568627452,\n    0.07450980392156863\n  ],\n  [\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647\n  ],\n  [\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.10980392156862745,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.10588235294117647,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.047058823529411764,\n    0.07450980392156863\n  ],\n  [\n    0.0588235294117647,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.047058823529411764,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.10980392156862745,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.054901960784313725,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.11372549019607843,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.09019607843137255,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.09803921568627452,\n    0.1176470588235294,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.0588235294117647,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.09019607843137255,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.050980392156862744,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.1176470588235294,\n    0.08627450980392157,\n    0.054901960784313725,\n    0.047058823529411764,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.10588235294117647,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.10980392156862745,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.06666666666666667,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.1411764705882353,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.11372549019607843,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.1176470588235294,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.0588235294117647,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.0784313725490196,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.10588235294117647,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863\n  ],\n  [\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.10196078431372549,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.13725490196078433,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.10588235294117647,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.12941176470588237,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.09411764705882353,\n    0.10980392156862745,\n    0.17647058823529413,\n    0.2235294117647059,\n    0.10196078431372549,\n    0.09803921568627452,\n    0.09019607843137255,\n    0.08235294117647057,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.1176470588235294,\n    0.07450980392156863,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.1568627450980392,\n    0.12549019607843137,\n    0.0784313725490196,\n    0.10588235294117647,\n    0.10196078431372549,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.11372549019607843,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.1176470588235294,\n    0.6901960784313725,\n    0.8196078431372549,\n    0.7647058823529411,\n    0.6666666666666665,\n    0.6549019607843136,\n    0.6627450980392156,\n    0.5686274509803921,\n    0.615686274509804,\n    0.5254901960784314,\n    0.44313725490196076,\n    0.10980392156862745,\n    0.09019607843137255,\n    0.09803921568627452,\n    0.09411764705882353,\n    0.08235294117647057,\n    0.12156862745098039,\n    0.09803921568627452,\n    0.08235294117647057,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.10980392156862745,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.13333333333333333,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863\n  ],\n  [\n    0.09411764705882353,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.09019607843137255,\n    0.12941176470588237,\n    0.050980392156862744,\n    0.08235294117647057,\n    0.1176470588235294,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.054901960784313725,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.1176470588235294,\n    0.08627450980392157,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.7137254901960784,\n    0.6431372549019607,\n    0.6862745098039216,\n    0.5450980392156862,\n    0.803921568627451,\n    0.6980392156862745,\n    0.5450980392156862,\n    0.8117647058823529,\n    0.9294117647058823,\n    0.8588235294117647,\n    0.6235294117647059,\n    0.6392156862745098,\n    0.6745098039215687,\n    0.5882352941176471,\n    0.15294117647058825,\n    0.10588235294117647,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.047058823529411764,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.0784313725490196,\n    0.09411764705882353,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.10980392156862745,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.12941176470588237,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.09019607843137255,\n    0.06274509803921569,\n    0.09803921568627452,\n    0.06274509803921569,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.12156862745098039,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.050980392156862744,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.2549019607843137,\n    0.596078431372549,\n    0.7647058823529411,\n    0.7058823529411765,\n    0.6039215686274509,\n    0.8156862745098039,\n    0.3176470588235294,\n    0.7882352941176471,\n    0.9725490196078431,\n    0.9647058823529412,\n    0.984313725490196,\n    0.9529411764705881,\n    0.9921568627450981,\n    0.9294117647058823,\n    0.9490196078431371,\n    0.7137254901960784,\n    0.6274509803921569,\n    0.25098039215686274,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.050980392156862744,\n    0.09803921568627452,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.047058823529411764,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.054901960784313725,\n    0.0784313725490196,\n    0.12549019607843137,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.047058823529411764,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.08235294117647057,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.1176470588235294,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.12156862745098039,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.10588235294117647,\n    0.12156862745098039,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.06274509803921569,\n    0.10980392156862745,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.054901960784313725,\n    0.0588235294117647,\n    0.10588235294117647,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.1411764705882353,\n    0.5411764705882353,\n    0.5647058823529412,\n    0.6784313725490196,\n    0.7411764705882353,\n    0.7490196078431373,\n    0.403921568627451,\n    0.38431372549019616,\n    0.6039215686274509,\n    0.8549019607843137,\n    0.9607843137254902,\n    0.9294117647058823,\n    0.9568627450980393,\n    0.7686274509803923,\n    0.9333333333333332,\n    0.9568627450980393,\n    0.9098039215686274,\n    0.5843137254901961,\n    0.5607843137254902,\n    0.4470588235294118,\n    0.1450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.10588235294117647,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.11372549019607843,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.10980392156862745,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.10196078431372549,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.10588235294117647,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.12941176470588237,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.25098039215686274,\n    0.5058823529411764,\n    0.7098039215686275,\n    0.8509803921568627,\n    0.9254901960784313,\n    0.9058823529411765,\n    0.8627450980392157,\n    0.8823529411764706,\n    0.9098039215686274,\n    0.8627450980392157,\n    0.8117647058823529,\n    0.7529411764705882,\n    0.6901960784313725,\n    0.9490196078431371,\n    0.8823529411764706,\n    0.8509803921568627,\n    0.8627450980392157,\n    0.9019607843137255,\n    0.8313725490196079,\n    0.5882352941176471,\n    0.6,\n    0.47450980392156855,\n    0.3294117647058823,\n    0.08235294117647057,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.07058823529411765\n  ],\n  [\n    0.06274509803921569,\n    0.10588235294117647,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.050980392156862744,\n    0.0588235294117647,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.12156862745098039,\n    0.10588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.10588235294117647,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.10196078431372549,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.1411764705882353,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.08235294117647057,\n    0.43137254901960786,\n    0.8431372549019608,\n    0.8235294117647058,\n    0.8980392156862745,\n    0.9686274509803922,\n    0.9529411764705881,\n    0.9490196078431371,\n    0.8784313725490196,\n    0.9215686274509803,\n    0.803921568627451,\n    0.7882352941176471,\n    0.9254901960784313,\n    0.807843137254902,\n    0.9568627450980393,\n    0.7803921568627452,\n    0.6941176470588235,\n    0.6,\n    0.9215686274509803,\n    0.9411764705882352,\n    0.8470588235294118,\n    0.8627450980392157,\n    0.8823529411764706,\n    0.47843137254901963,\n    0.3607843137254902,\n    0.37254901960784315,\n    0.41568627450980394,\n    0.1843137254901961,\n    0.09019607843137255,\n    0.10588235294117647,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.06274509803921569,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.10196078431372549,\n    0.06274509803921569,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.12549019607843137,\n    0.07058823529411765,\n    0.10588235294117647,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.050980392156862744,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.08235294117647057,\n    0.09019607843137255,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.0588235294117647,\n    0.12156862745098039,\n    0.13725490196078433,\n    0.13333333333333333,\n    0.19607843137254904,\n    0.5411764705882353,\n    0.4549019607843137,\n    0.5647058823529412,\n    0.6823529411764706,\n    0.807843137254902,\n    0.7960784313725491,\n    0.8745098039215686,\n    0.9372549019607842,\n    0.9568627450980393,\n    0.9411764705882352,\n    0.9686274509803922,\n    0.8627450980392157,\n    0.6470588235294117,\n    0.5529411764705883,\n    0.7372549019607844,\n    0.7686274509803923,\n    0.8666666666666667,\n    0.5843137254901961,\n    0.5411764705882353,\n    0.5568627450980392,\n    0.6196078431372549,\n    0.807843137254902,\n    0.7215686274509804,\n    0.7137254901960784,\n    0.35294117647058826,\n    0.2549019607843137,\n    0.20392156862745098,\n    0.30980392156862746,\n    0.1803921568627451,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.0588235294117647,\n    0.11372549019607843,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.13725490196078433,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.10980392156862745,\n    0.0784313725490196,\n    0.10196078431372549,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.14901960784313725,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.054901960784313725,\n    0.10980392156862745,\n    0.3686274509803922,\n    0.3058823529411765,\n    0.5019607843137255,\n    0.8196078431372549,\n    0.8941176470588236,\n    0.6823529411764706,\n    0.8431372549019608,\n    0.7333333333333333,\n    0.6627450980392156,\n    0.7450980392156863,\n    0.7764705882352942,\n    0.592156862745098,\n    0.3294117647058823,\n    0.5254901960784314,\n    0.8627450980392157,\n    0.9450980392156861,\n    0.9647058823529412,\n    0.9490196078431371,\n    0.9686274509803922,\n    0.6666666666666665,\n    0.6352941176470588,\n    0.7215686274509804,\n    0.6745098039215687,\n    0.6941176470588235,\n    0.5372549019607843,\n    0.47843137254901963,\n    0.7647058823529411,\n    0.8156862745098039,\n    0.7803921568627452,\n    0.5450980392156862,\n    0.27058823529411763,\n    0.2235294117647059,\n    0.2823529411764706,\n    0.22745098039215686,\n    0.1176470588235294,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.11372549019607843,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667\n  ],\n  [\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.11372549019607843,\n    0.1411764705882353,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.11372549019607843,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.047058823529411764,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.09411764705882353,\n    0.12156862745098039,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.054901960784313725,\n    0.10196078431372549,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.10980392156862745,\n    0.09019607843137255,\n    0.08627450980392157,\n    0.054901960784313725,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.10980392156862745,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.20784313725490197,\n    0.6588235294117646,\n    0.7764705882352942,\n    0.9058823529411765,\n    0.8196078431372549,\n    0.8352941176470589,\n    0.7254901960784313,\n    0.7607843137254902,\n    0.8274509803921568,\n    0.6392156862745098,\n    0.8941176470588236,\n    0.7803921568627452,\n    0.8627450980392157,\n    0.6588235294117646,\n    0.6509803921568627,\n    0.47843137254901963,\n    0.6549019607843136,\n    0.615686274509804,\n    0.6705882352941175,\n    0.996078431372549,\n    0.9725490196078431,\n    0.7686274509803923,\n    0.6196078431372549,\n    0.7254901960784313,\n    0.5411764705882353,\n    0.6941176470588235,\n    0.8705882352941177,\n    0.6078431372549019,\n    0.6,\n    0.38431372549019616,\n    0.8784313725490196,\n    0.7647058823529411,\n    0.6235294117647059,\n    0.39607843137254906,\n    0.19607843137254904,\n    0.09411764705882353,\n    0.21568627450980393,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.10196078431372549,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.0588235294117647,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.10588235294117647,\n    0.06274509803921569,\n    0.10980392156862745,\n    0.10588235294117647,\n    0.0784313725490196,\n    0.13725490196078433,\n    0.0784313725490196,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.10588235294117647,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.20784313725490197,\n    0.8156862745098039,\n    0.8431372549019608,\n    0.7529411764705882,\n    0.8745098039215686,\n    0.8274509803921568,\n    0.8392156862745098,\n    0.7960784313725491,\n    0.6588235294117646,\n    0.7254901960784313,\n    0.6980392156862745,\n    0.5607843137254902,\n    0.8392156862745098,\n    0.8431372549019608,\n    0.8235294117647058,\n    0.7921568627450981,\n    0.8313725490196079,\n    0.6549019607843136,\n    0.6862745098039216,\n    0.6549019607843136,\n    0.5137254901960784,\n    0.5568627450980392,\n    0.5803921568627451,\n    0.9725490196078431,\n    0.9686274509803922,\n    0.6784313725490196,\n    0.8627450980392157,\n    0.5882352941176471,\n    0.6039215686274509,\n    0.803921568627451,\n    0.5411764705882353,\n    0.6274509803921569,\n    0.4980392156862745,\n    0.7686274509803923,\n    0.7176470588235294,\n    0.5254901960784314,\n    0.5058823529411764,\n    0.2,\n    0.1803921568627451,\n    0.12549019607843137,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.12941176470588237,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.08235294117647057\n  ],\n  [\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.050980392156862744,\n    0.10588235294117647,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.12549019607843137,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.09411764705882353,\n    0.06274509803921569,\n    0.13333333333333333,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.10588235294117647,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.1411764705882353,\n    0.11372549019607843,\n    0.6666666666666665,\n    0.8901960784313725,\n    0.7725490196078433,\n    0.8196078431372549,\n    0.8745098039215686,\n    0.8745098039215686,\n    0.7607843137254902,\n    0.7372549019607844,\n    0.8431372549019608,\n    0.8470588235294118,\n    0.8352941176470589,\n    0.8196078431372549,\n    0.8352941176470589,\n    0.7725490196078433,\n    0.7058823529411765,\n    0.8470588235294118,\n    0.7411764705882353,\n    0.7254901960784313,\n    0.7254901960784313,\n    0.6196078431372549,\n    0.6235294117647059,\n    0.5529411764705883,\n    0.6235294117647059,\n    0.5686274509803921,\n    0.7137254901960784,\n    0.8588235294117647,\n    0.7490196078431373,\n    0.8,\n    0.6039215686274509,\n    0.5254901960784314,\n    0.6509803921568627,\n    0.5843137254901961,\n    0.7254901960784313,\n    0.3764705882352941,\n    0.6196078431372549,\n    0.4470588235294118,\n    0.35294117647058826,\n    0.43529411764705883,\n    0.12941176470588237,\n    0.1450980392156863,\n    0.11372549019607843,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863\n  ],\n  [\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.12156862745098039,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.13333333333333333,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.11372549019607843,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.12549019607843137,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.10980392156862745,\n    0.10588235294117647,\n    0.17254901960784313,\n    0.9254901960784313,\n    0.8745098039215686,\n    0.8941176470588236,\n    0.8627450980392157,\n    0.8745098039215686,\n    0.8666666666666667,\n    0.8823529411764706,\n    0.8274509803921568,\n    0.8901960784313725,\n    0.8431372549019608,\n    0.7882352941176471,\n    0.807843137254902,\n    0.8784313725490196,\n    0.8705882352941177,\n    0.8196078431372549,\n    0.7803921568627452,\n    0.6705882352941175,\n    0.7254901960784313,\n    0.6980392156862745,\n    0.6941176470588235,\n    0.6705882352941175,\n    0.6901960784313725,\n    0.6078431372549019,\n    0.6431372549019607,\n    0.43529411764705883,\n    0.6980392156862745,\n    0.4,\n    0.7137254901960784,\n    0.6823529411764706,\n    0.8352941176470589,\n    0.48627450980392156,\n    0.47843137254901963,\n    0.5882352941176471,\n    0.5019607843137255,\n    0.4549019607843137,\n    0.3411764705882353,\n    0.6470588235294117,\n    0.29411764705882354,\n    0.2235294117647059,\n    0.30980392156862746,\n    0.13725490196078433,\n    0.2235294117647059,\n    0.10196078431372549,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.047058823529411764,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667\n  ],\n  [\n    0.08627450980392157,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.09019607843137255,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.12549019607843137,\n    0.09803921568627452,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.10980392156862745,\n    0.09019607843137255,\n    0.050980392156862744,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.0784313725490196,\n    0.13725490196078433,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.11372549019607843,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.37254901960784315,\n    0.8431372549019608,\n    0.7686274509803923,\n    0.7725490196078433,\n    0.8313725490196079,\n    0.8431372549019608,\n    0.8627450980392157,\n    0.7725490196078433,\n    0.8117647058823529,\n    0.8862745098039215,\n    0.8745098039215686,\n    0.7372549019607844,\n    0.8235294117647058,\n    0.7843137254901962,\n    0.7725490196078433,\n    0.8117647058823529,\n    0.8235294117647058,\n    0.7607843137254902,\n    0.7921568627450981,\n    0.8509803921568627,\n    0.6941176470588235,\n    0.7372549019607844,\n    0.6627450980392156,\n    0.7019607843137254,\n    0.611764705882353,\n    0.611764705882353,\n    0.596078431372549,\n    0.5686274509803921,\n    0.5843137254901961,\n    0.4117647058823529,\n    0.6941176470588235,\n    0.6313725490196078,\n    0.7921568627450981,\n    0.5019607843137255,\n    0.42745098039215684,\n    0.44313725490196076,\n    0.49411764705882355,\n    0.22745098039215686,\n    0.4705882352941176,\n    0.6627450980392156,\n    0.20784313725490197,\n    0.2627450980392157,\n    0.3254901960784313,\n    0.09411764705882353,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.10196078431372549\n  ],\n  [\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.11372549019607843,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.09803921568627452,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.10980392156862745,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.16862745098039217,\n    0.10980392156862745,\n    0.9215686274509803,\n    0.8588235294117647,\n    0.9019607843137255,\n    0.8627450980392157,\n    0.8627450980392157,\n    0.8313725490196079,\n    0.8235294117647058,\n    0.8745098039215686,\n    0.8196078431372549,\n    0.8901960784313725,\n    0.8705882352941177,\n    0.8431372549019608,\n    0.8235294117647058,\n    0.803921568627451,\n    0.6588235294117646,\n    0.803921568627451,\n    0.7490196078431373,\n    0.7882352941176471,\n    0.6941176470588235,\n    0.7294117647058823,\n    0.6235294117647059,\n    0.7215686274509804,\n    0.7568627450980392,\n    0.5725490196078431,\n    0.6980392156862745,\n    0.6980392156862745,\n    0.6470588235294117,\n    0.49411764705882355,\n    0.49019607843137253,\n    0.27058823529411763,\n    0.32156862745098036,\n    0.6784313725490196,\n    0.592156862745098,\n    0.6039215686274509,\n    0.5019607843137255,\n    0.29411764705882354,\n    0.2627450980392157,\n    0.33333333333333326,\n    0.3294117647058823,\n    0.7137254901960784,\n    0.2627450980392157,\n    0.25098039215686274,\n    0.23137254901960783,\n    0.21568627450980393,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863\n  ],\n  [\n    0.06274509803921569,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.1568627450980392,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.12156862745098039,\n    0.0784313725490196,\n    0.10588235294117647,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.7882352941176471,\n    0.8509803921568627,\n    0.9294117647058823,\n    0.9098039215686274,\n    0.8823529411764706,\n    0.8313725490196079,\n    0.8549019607843137,\n    0.8235294117647058,\n    0.8196078431372549,\n    0.8588235294117647,\n    0.7843137254901962,\n    0.803921568627451,\n    0.8627450980392157,\n    0.8666666666666667,\n    0.7568627450980392,\n    0.6862745098039216,\n    0.7019607843137254,\n    0.8,\n    0.7490196078431373,\n    0.7803921568627452,\n    0.7019607843137254,\n    0.7372549019607844,\n    0.7647058823529411,\n    0.6745098039215687,\n    0.6196078431372549,\n    0.7294117647058823,\n    0.8470588235294118,\n    0.7372549019607844,\n    0.35294117647058826,\n    0.5843137254901961,\n    0.3411764705882353,\n    0.34509803921568627,\n    0.21176470588235294,\n    0.29411764705882354,\n    0.5215686274509804,\n    0.47843137254901963,\n    0.47450980392156855,\n    0.26666666666666666,\n    0.28627450980392155,\n    0.2901960784313726,\n    0.8470588235294118,\n    0.35294117647058826,\n    0.2549019607843137,\n    0.25098039215686274,\n    0.10588235294117647,\n    0.10196078431372549,\n    0.09411764705882353,\n    0.10196078431372549,\n    0.11372549019607843,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.13333333333333333,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.06666666666666667,\n    0.15294117647058825,\n    0.0784313725490196,\n    0.047058823529411764,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.10588235294117647,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.09803921568627452,\n    0.09411764705882353,\n    0.0588235294117647,\n    0.13725490196078433,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.09411764705882353,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.10196078431372549,\n    0.16470588235294115,\n    0.8313725490196079,\n    0.8627450980392157,\n    0.8745098039215686,\n    0.9372549019607842,\n    0.8509803921568627,\n    0.8470588235294118,\n    0.8666666666666667,\n    0.8196078431372549,\n    0.7921568627450981,\n    0.9529411764705881,\n    0.7686274509803923,\n    0.8,\n    0.8235294117647058,\n    0.8666666666666667,\n    0.8392156862745098,\n    0.8705882352941177,\n    0.9215686274509803,\n    0.7294117647058823,\n    0.7411764705882353,\n    0.7529411764705882,\n    0.7882352941176471,\n    0.7803921568627452,\n    0.7450980392156863,\n    0.7843137254901962,\n    0.7215686274509804,\n    0.7058823529411765,\n    0.6666666666666665,\n    0.6549019607843136,\n    0.6313725490196078,\n    0.4705882352941176,\n    0.403921568627451,\n    0.45098039215686275,\n    0.3568627450980392,\n    0.09019607843137255,\n    0.2235294117647059,\n    0.21176470588235294,\n    0.5372549019607843,\n    0.4705882352941176,\n    0.3137254901960784,\n    0.21568627450980393,\n    0.27450980392156865,\n    0.7098039215686275,\n    0.4588235294117647,\n    0.2627450980392157,\n    0.23137254901960783,\n    0.14901960784313725,\n    0.09803921568627452,\n    0.09019607843137255,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.09019607843137255,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.10196078431372549,\n    0.09019607843137255,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.1176470588235294,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.09019607843137255,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.047058823529411764,\n    0.33333333333333326,\n    0.8156862745098039,\n    0.7450980392156863,\n    0.7803921568627452,\n    0.8470588235294118,\n    0.9254901960784313,\n    0.8392156862745098,\n    0.8823529411764706,\n    0.7372549019607844,\n    0.8705882352941177,\n    0.8117647058823529,\n    0.7215686274509804,\n    0.7843137254901962,\n    0.8,\n    0.7450980392156863,\n    0.8862745098039215,\n    0.6588235294117646,\n    0.803921568627451,\n    0.7921568627450981,\n    0.8156862745098039,\n    0.7294117647058823,\n    0.8313725490196079,\n    0.8313725490196079,\n    0.6745098039215687,\n    0.7450980392156863,\n    0.7607843137254902,\n    0.7450980392156863,\n    0.6745098039215687,\n    0.7058823529411765,\n    0.6431372549019607,\n    0.7372549019607844,\n    0.40784313725490196,\n    0.30980392156862746,\n    0.3764705882352941,\n    0.2823529411764706,\n    0.09803921568627452,\n    0.1176470588235294,\n    0.36470588235294116,\n    0.46274509803921565,\n    0.44313725490196076,\n    0.2784313725490196,\n    0.33333333333333326,\n    0.9098039215686274,\n    0.5529411764705883,\n    0.2627450980392157,\n    0.23921568627450981,\n    0.28627450980392155,\n    0.10196078431372549,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.050980392156862744,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.06666666666666667,\n    0.047058823529411764,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.09803921568627452,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.10588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.12549019607843137,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.8549019607843137,\n    0.7686274509803923,\n    0.9019607843137255,\n    0.8509803921568627,\n    0.8117647058823529,\n    0.8156862745098039,\n    0.8941176470588236,\n    0.8705882352941177,\n    0.8588235294117647,\n    0.7450980392156863,\n    0.8823529411764706,\n    0.803921568627451,\n    0.8392156862745098,\n    0.7686274509803923,\n    0.7254901960784313,\n    0.7215686274509804,\n    0.8901960784313725,\n    0.8862745098039215,\n    0.7490196078431373,\n    0.7843137254901962,\n    0.7843137254901962,\n    0.7450980392156863,\n    0.6823529411764706,\n    0.803921568627451,\n    0.8117647058823529,\n    0.7137254901960784,\n    0.6901960784313725,\n    0.7294117647058823,\n    0.7294117647058823,\n    0.5882352941176471,\n    0.5411764705882353,\n    0.43529411764705883,\n    0.4117647058823529,\n    0.48627450980392156,\n    0.23921568627450981,\n    0.35294117647058826,\n    0.27450980392156865,\n    0.23137254901960783,\n    0.3176470588235294,\n    0.49019607843137253,\n    0.3882352941176471,\n    0.29411764705882354,\n    0.807843137254902,\n    0.5372549019607843,\n    0.23921568627450981,\n    0.25098039215686274,\n    0.4470588235294118,\n    0.14901960784313725,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765\n  ],\n  [\n    0.09803921568627452,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.10980392156862745,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.10588235294117647,\n    0.1411764705882353,\n    0.8431372549019608,\n    0.6588235294117646,\n    0.8666666666666667,\n    0.8745098039215686,\n    0.7372549019607844,\n    0.7843137254901962,\n    0.7058823529411765,\n    0.8431372549019608,\n    0.8901960784313725,\n    0.8117647058823529,\n    0.8705882352941177,\n    0.7137254901960784,\n    0.8313725490196079,\n    0.7764705882352942,\n    0.7098039215686275,\n    0.7568627450980392,\n    0.7372549019607844,\n    0.8745098039215686,\n    0.8588235294117647,\n    0.7882352941176471,\n    0.8470588235294118,\n    0.803921568627451,\n    0.8392156862745098,\n    0.7764705882352942,\n    0.7372549019607844,\n    0.7098039215686275,\n    0.7607843137254902,\n    0.6588235294117646,\n    0.611764705882353,\n    0.3921568627450981,\n    0.23921568627450981,\n    0.30980392156862746,\n    0.43137254901960786,\n    0.2980392156862745,\n    0.3294117647058823,\n    0.3921568627450981,\n    0.2627450980392157,\n    0.4392156862745098,\n    0.2627450980392157,\n    0.34509803921568627,\n    0.43137254901960786,\n    0.40784313725490196,\n    0.6431372549019607,\n    0.6745098039215687,\n    0.2627450980392157,\n    0.25098039215686274,\n    0.34901960784313724,\n    0.43529411764705883,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.11372549019607843,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.10588235294117647,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.12549019607843137,\n    0.043137254901960784,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.10980392156862745,\n    0.10588235294117647,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.054901960784313725,\n    0.09411764705882353,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.12156862745098039,\n    0.7764705882352942,\n    0.8470588235294118,\n    0.7647058823529411,\n    0.8392156862745098,\n    0.8392156862745098,\n    0.7607843137254902,\n    0.8156862745098039,\n    0.8431372549019608,\n    0.7294117647058823,\n    0.9137254901960784,\n    0.8549019607843137,\n    0.7450980392156863,\n    0.7607843137254902,\n    0.8196078431372549,\n    0.7215686274509804,\n    0.6784313725490196,\n    0.6862745098039216,\n    0.6745098039215687,\n    0.7137254901960784,\n    0.7647058823529411,\n    0.8,\n    0.7803921568627452,\n    0.8784313725490196,\n    0.7254901960784313,\n    0.7921568627450981,\n    0.7529411764705882,\n    0.47450980392156855,\n    0.6078431372549019,\n    0.6980392156862745,\n    0.7019607843137254,\n    0.38431372549019616,\n    0.3254901960784313,\n    0.30980392156862746,\n    0.33333333333333326,\n    0.3686274509803922,\n    0.33725490196078434,\n    0.36470588235294116,\n    0.2901960784313726,\n    0.3803921568627451,\n    0.4,\n    0.3254901960784313,\n    0.33725490196078434,\n    0.32156862745098036,\n    0.6823529411764706,\n    0.7843137254901962,\n    0.36470588235294116,\n    0.2980392156862745,\n    0.33725490196078434,\n    0.4470588235294118,\n    0.13725490196078433,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.11372549019607843,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08235294117647057\n  ],\n  [\n    0.06274509803921569,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.10588235294117647,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.09019607843137255,\n    0.09803921568627452,\n    0.10588235294117647,\n    0.047058823529411764,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.09411764705882353,\n    0.050980392156862744,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.7098039215686275,\n    0.7019607843137254,\n    0.7137254901960784,\n    0.6549019607843136,\n    0.7137254901960784,\n    0.8705882352941177,\n    0.8823529411764706,\n    0.7843137254901962,\n    0.9098039215686274,\n    0.7725490196078433,\n    0.803921568627451,\n    0.8627450980392157,\n    0.6823529411764706,\n    0.6980392156862745,\n    0.5843137254901961,\n    0.5254901960784314,\n    0.6313725490196078,\n    0.6627450980392156,\n    0.6823529411764706,\n    0.7098039215686275,\n    0.7098039215686275,\n    0.6784313725490196,\n    0.6705882352941175,\n    0.7058823529411765,\n    0.7098039215686275,\n    0.34509803921568627,\n    0.6039215686274509,\n    0.5568627450980392,\n    0.7098039215686275,\n    0.5882352941176471,\n    0.33725490196078434,\n    0.1450980392156863,\n    0.3254901960784313,\n    0.1411764705882353,\n    0.38431372549019616,\n    0.2352941176470588,\n    0.2823529411764706,\n    0.3176470588235294,\n    0.30980392156862746,\n    0.24313725490196078,\n    0.35294117647058826,\n    0.2196078431372549,\n    0.4,\n    0.5843137254901961,\n    0.7411764705882353,\n    0.30196078431372547,\n    0.2823529411764706,\n    0.29411764705882354,\n    0.4549019607843137,\n    0.09019607843137255,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.09803921568627452,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.12941176470588237,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.10980392156862745,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.19607843137254904,\n    0.6,\n    0.5490196078431373,\n    0.9490196078431371,\n    0.9058823529411765,\n    0.9215686274509803,\n    0.8745098039215686,\n    0.9686274509803922,\n    0.8980392156862745,\n    0.8666666666666667,\n    0.6549019607843136,\n    0.8,\n    0.8274509803921568,\n    0.7294117647058823,\n    0.6392156862745098,\n    0.6431372549019607,\n    0.6235294117647059,\n    0.6823529411764706,\n    0.6078431372549019,\n    0.5019607843137255,\n    0.5529411764705883,\n    0.6901960784313725,\n    0.5764705882352941,\n    0.7294117647058823,\n    0.6588235294117646,\n    0.7137254901960784,\n    0.27058823529411763,\n    0.6,\n    0.403921568627451,\n    0.2549019607843137,\n    0.5568627450980392,\n    0.3686274509803922,\n    0.37254901960784315,\n    0.3411764705882353,\n    0.10980392156862745,\n    0.29411764705882354,\n    0.3176470588235294,\n    0.2,\n    0.3882352941176471,\n    0.2627450980392157,\n    0.27450980392156865,\n    0.33333333333333326,\n    0.27450980392156865,\n    0.26666666666666666,\n    0.8313725490196079,\n    0.7843137254901962,\n    0.3607843137254902,\n    0.2549019607843137,\n    0.2784313725490196,\n    0.44313725490196076,\n    0.47843137254901963,\n    0.10588235294117647,\n    0.0392156862745098,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863\n  ],\n  [\n    0.08235294117647057,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.09019607843137255,\n    0.054901960784313725,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.10196078431372549,\n    0.1411764705882353,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.14901960784313725,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.050980392156862744,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.1568627450980392,\n    0.10980392156862745,\n    0.47843137254901963,\n    0.9686274509803922,\n    0.8588235294117647,\n    0.9450980392156861,\n    0.9647058823529412,\n    0.9607843137254902,\n    0.9058823529411765,\n    0.9254901960784313,\n    0.9411764705882352,\n    0.8862745098039215,\n    0.7568627450980392,\n    0.7294117647058823,\n    0.8196078431372549,\n    0.7372549019607844,\n    0.7607843137254902,\n    0.6627450980392156,\n    0.6509803921568627,\n    0.6784313725490196,\n    0.5725490196078431,\n    0.3686274509803922,\n    0.2980392156862745,\n    0.4980392156862745,\n    0.5725490196078431,\n    0.7058823529411765,\n    0.9019607843137255,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.09411764705882353,\n    0.10196078431372549,\n    0.2549019607843137,\n    0.25882352941176473,\n    0.38431372549019616,\n    0.2196078431372549,\n    0.27058823529411763,\n    0.1176470588235294,\n    0.23921568627450981,\n    0.39607843137254906,\n    0.12156862745098039,\n    0.34901960784313724,\n    0.2823529411764706,\n    0.3176470588235294,\n    0.2901960784313726,\n    0.2549019607843137,\n    0.8745098039215686,\n    0.9372549019607842,\n    0.3607843137254902,\n    0.23921568627450981,\n    0.2549019607843137,\n    0.4,\n    0.5529411764705883,\n    0.12941176470588237,\n    0.10980392156862745,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.0588235294117647,\n    0.12941176470588237,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647\n  ],\n  [\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.08235294117647057,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.0588235294117647,\n    0.10980392156862745,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.18823529411764706,\n    0.9686274509803922,\n    0.9215686274509803,\n    0.9450980392156861,\n    0.9686274509803922,\n    0.9450980392156861,\n    0.9254901960784313,\n    0.9568627450980393,\n    0.9215686274509803,\n    0.9294117647058823,\n    0.9254901960784313,\n    0.8156862745098039,\n    0.7529411764705882,\n    0.6196078431372549,\n    0.6509803921568627,\n    0.7058823529411765,\n    0.6313725490196078,\n    0.5607843137254902,\n    0.8549019607843137,\n    0.38431372549019616,\n    0.3882352941176471,\n    0.1803921568627451,\n    0.3882352941176471,\n    0.4666666666666666,\n    0.6078431372549019,\n    0.4666666666666666,\n    0.33333333333333326,\n    0.3294117647058823,\n    0.09019607843137255,\n    0.34509803921568627,\n    0.3411764705882353,\n    0.3294117647058823,\n    0.2823529411764706,\n    0.4392156862745098,\n    0.2901960784313726,\n    0.21176470588235294,\n    0.2235294117647059,\n    0.3058823529411765,\n    0.37254901960784315,\n    0.403921568627451,\n    0.33725490196078434,\n    0.3411764705882353,\n    0.2980392156862745,\n    0.28627450980392155,\n    0.8549019607843137,\n    0.9137254901960784,\n    0.33333333333333326,\n    0.24313725490196078,\n    0.30196078431372547,\n    0.5843137254901961,\n    0.5137254901960784,\n    0.16470588235294115,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.10196078431372549\n  ],\n  [\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.09803921568627452,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.12156862745098039,\n    0.12156862745098039,\n    0.12549019607843137,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.09803921568627452,\n    0.0784313725490196,\n    0.5764705882352941,\n    0.9568627450980393,\n    0.8274509803921568,\n    0.9333333333333332,\n    0.9725490196078431,\n    0.8941176470588236,\n    0.9686274509803922,\n    0.9254901960784313,\n    0.9333333333333332,\n    0.9098039215686274,\n    0.9176470588235294,\n    0.9411764705882352,\n    0.9058823529411765,\n    0.8274509803921568,\n    0.7764705882352942,\n    0.6039215686274509,\n    0.4117647058823529,\n    0.6705882352941175,\n    0.8,\n    0.7960784313725491,\n    0.10588235294117647,\n    0.21568627450980393,\n    0.45098039215686275,\n    0.4,\n    0.33725490196078434,\n    0.45098039215686275,\n    0.2980392156862745,\n    0.3764705882352941,\n    0.19215686274509808,\n    0.20392156862745098,\n    0.3803921568627451,\n    0.5098039215686274,\n    0.3764705882352941,\n    0.3803921568627451,\n    0.4,\n    0.3764705882352941,\n    0.23137254901960783,\n    0.15294117647058825,\n    0.19215686274509808,\n    0.32156862745098036,\n    0.34509803921568627,\n    0.3058823529411765,\n    0.0784313725490196,\n    0.1843137254901961,\n    0.8627450980392157,\n    0.6196078431372549,\n    0.34509803921568627,\n    0.27450980392156865,\n    0.24313725490196078,\n    0.5333333333333333,\n    0.3882352941176471,\n    0.10980392156862745,\n    0.0588235294117647,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.10980392156862745,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057\n  ],\n  [\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.1176470588235294,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.11372549019607843,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.09803921568627452,\n    0.08235294117647057,\n    0.13333333333333333,\n    0.9411764705882352,\n    0.9411764705882352,\n    0.7568627450980392,\n    0.7882352941176471,\n    0.9176470588235294,\n    0.9725490196078431,\n    0.9490196078431371,\n    0.8980392156862745,\n    0.9058823529411765,\n    0.9058823529411765,\n    0.9176470588235294,\n    0.8862745098039215,\n    0.9294117647058823,\n    0.8588235294117647,\n    0.8431372549019608,\n    0.6980392156862745,\n    0.3882352941176471,\n    0.4,\n    0.5176470588235295,\n    0.807843137254902,\n    0.4549019607843137,\n    0.24705882352941178,\n    0.2823529411764706,\n    0.27058823529411763,\n    0.3058823529411765,\n    0.27058823529411763,\n    0.4705882352941176,\n    0.2901960784313726,\n    0.2549019607843137,\n    0.34901960784313724,\n    0.2627450980392157,\n    0.26666666666666666,\n    0.35294117647058826,\n    0.3921568627450981,\n    0.4,\n    0.13725490196078433,\n    0.3686274509803922,\n    0.30196078431372547,\n    0.1803921568627451,\n    0.1803921568627451,\n    0.3058823529411765,\n    0.22745098039215686,\n    0.13725490196078433,\n    0.17647058823529413,\n    0.8235294117647058,\n    0.7882352941176471,\n    0.35294117647058826,\n    0.30980392156862746,\n    0.25882352941176473,\n    0.4666666666666666,\n    0.45098039215686275,\n    0.25882352941176473,\n    0.2627450980392157,\n    0.054901960784313725,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.11372549019607843,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.09803921568627452\n  ],\n  [\n    0.07450980392156863,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.054901960784313725,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.08627450980392157,\n    0.08627450980392157,\n    0.09803921568627452,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.12549019607843137,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.09411764705882353,\n    0.054901960784313725,\n    0.5686274509803921,\n    0.8745098039215686,\n    0.8313725490196079,\n    0.9450980392156861,\n    0.8784313725490196,\n    0.9411764705882352,\n    0.7647058823529411,\n    0.8745098039215686,\n    0.9137254901960784,\n    0.9176470588235294,\n    0.9019607843137255,\n    0.8627450980392157,\n    0.9333333333333332,\n    0.9333333333333332,\n    0.9372549019607842,\n    0.8313725490196079,\n    0.8941176470588236,\n    0.8235294117647058,\n    0.5882352941176471,\n    0.3176470588235294,\n    0.4196078431372549,\n    0.3294117647058823,\n    0.25882352941176473,\n    0.09411764705882353,\n    0.2196078431372549,\n    0.2784313725490196,\n    0.28627450980392155,\n    0.2352941176470588,\n    0.40784313725490196,\n    0.2196078431372549,\n    0.2196078431372549,\n    0.10196078431372549,\n    0.27450980392156865,\n    0.38431372549019616,\n    0.3882352941176471,\n    0.403921568627451,\n    0.2549019607843137,\n    0.24313725490196078,\n    0.16470588235294115,\n    0.24313725490196078,\n    0.15294117647058825,\n    0.09803921568627452,\n    0.3411764705882353,\n    0.27058823529411763,\n    0.0784313725490196,\n    0.9411764705882352,\n    0.7803921568627452,\n    0.3686274509803922,\n    0.33725490196078434,\n    0.2352941176470588,\n    0.3607843137254902,\n    0.49019607843137253,\n    0.23137254901960783,\n    0.10196078431372549,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.10980392156862745,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.11372549019607843,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.10588235294117647,\n    0.11372549019607843,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.08627450980392157,\n    0.09803921568627452,\n    0.7333333333333333,\n    0.8901960784313725,\n    0.8901960784313725,\n    0.9450980392156861,\n    0.9647058823529412,\n    0.9686274509803922,\n    0.9803921568627451,\n    0.9725490196078431,\n    0.9450980392156861,\n    0.9372549019607842,\n    0.9176470588235294,\n    0.9490196078431371,\n    0.8705882352941177,\n    0.9058823529411765,\n    0.9294117647058823,\n    0.9411764705882352,\n    0.8823529411764706,\n    0.8862745098039215,\n    0.807843137254902,\n    0.7215686274509804,\n    0.34509803921568627,\n    0.25098039215686274,\n    0.28627450980392155,\n    0.21176470588235294,\n    0.25098039215686274,\n    0.3411764705882353,\n    0.16862745098039217,\n    0.18823529411764706,\n    0.10980392156862745,\n    0.2352941176470588,\n    0.3607843137254902,\n    0.13725490196078433,\n    0.10588235294117647,\n    0.34901960784313724,\n    0.25882352941176473,\n    0.3294117647058823,\n    0.32156862745098036,\n    0.2901960784313726,\n    0.2627450980392157,\n    0.44313725490196076,\n    0.3411764705882353,\n    0.0784313725490196,\n    0.22745098039215686,\n    0.16470588235294115,\n    0.07058823529411765,\n    0.5450980392156862,\n    0.7921568627450981,\n    0.3686274509803922,\n    0.27058823529411763,\n    0.2196078431372549,\n    0.2901960784313726,\n    0.4980392156862745,\n    0.25098039215686274,\n    0.10588235294117647,\n    0.09411764705882353,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.10588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667\n  ],\n  [\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.047058823529411764,\n    0.050980392156862744,\n    0.12941176470588237,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.10588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.10980392156862745,\n    0.6862745098039216,\n    0.8352941176470589,\n    0.8274509803921568,\n    0.7686274509803923,\n    0.9294117647058823,\n    0.8980392156862745,\n    0.9333333333333332,\n    0.9294117647058823,\n    0.8627450980392157,\n    0.8862745098039215,\n    0.8980392156862745,\n    0.8627450980392157,\n    0.7647058823529411,\n    0.8941176470588236,\n    0.8196078431372549,\n    0.8901960784313725,\n    0.8980392156862745,\n    0.8274509803921568,\n    0.8196078431372549,\n    0.7372549019607844,\n    0.611764705882353,\n    0.3294117647058823,\n    0.19607843137254904,\n    0.08627450980392157,\n    0.47450980392156855,\n    0.1450980392156863,\n    0.11372549019607843,\n    0.12156862745098039,\n    0.10196078431372549,\n    0.12549019607843137,\n    0.20392156862745098,\n    0.20784313725490197,\n    0.16862745098039217,\n    0.13725490196078433,\n    0.2196078431372549,\n    0.10588235294117647,\n    0.29411764705882354,\n    0.3686274509803922,\n    0.22745098039215686,\n    0.33725490196078434,\n    0.42745098039215684,\n    0.33725490196078434,\n    0.34509803921568627,\n    0.26666666666666666,\n    0.16470588235294115,\n    0.5215686274509804,\n    0.7215686274509804,\n    0.34509803921568627,\n    0.3176470588235294,\n    0.22745098039215686,\n    0.2549019607843137,\n    0.5019607843137255,\n    0.34901960784313724,\n    0.17254901960784313,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.043137254901960784,\n    0.0784313725490196,\n    0.11372549019607843,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.054901960784313725,\n    0.1176470588235294,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.050980392156862744,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.10980392156862745,\n    0.09803921568627452,\n    0.2901960784313726,\n    0.7333333333333333,\n    0.7882352941176471,\n    0.7960784313725491,\n    0.6392156862745098,\n    0.9215686274509803,\n    0.9568627450980393,\n    0.9137254901960784,\n    0.8196078431372549,\n    0.8117647058823529,\n    0.7568627450980392,\n    0.8235294117647058,\n    0.7450980392156863,\n    0.7960784313725491,\n    0.7294117647058823,\n    0.8392156862745098,\n    0.8235294117647058,\n    0.8392156862745098,\n    0.8235294117647058,\n    0.7764705882352942,\n    0.6078431372549019,\n    0.5215686274509804,\n    0.3568627450980392,\n    0.35294117647058826,\n    0.27450980392156865,\n    0.24313725490196078,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.11372549019607843,\n    0.10196078431372549,\n    0.19607843137254904,\n    0.13333333333333333,\n    0.0784313725490196,\n    0.2549019607843137,\n    0.10980392156862745,\n    0.24313725490196078,\n    0.13333333333333333,\n    0.29411764705882354,\n    0.3294117647058823,\n    0.38431372549019616,\n    0.3607843137254902,\n    0.3254901960784313,\n    0.29411764705882354,\n    0.3254901960784313,\n    0.10196078431372549,\n    0.21568627450980393,\n    0.7882352941176471,\n    0.4117647058823529,\n    0.34901960784313724,\n    0.26666666666666666,\n    0.2549019607843137,\n    0.6274509803921569,\n    0.3058823529411765,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.13725490196078433,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.054901960784313725,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.13333333333333333,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.10588235294117647,\n    0.11372549019607843,\n    0.24313725490196078,\n    0.3764705882352941,\n    0.49411764705882355,\n    0.5882352941176471,\n    0.6823529411764706,\n    0.9098039215686274,\n    0.9137254901960784,\n    0.9176470588235294,\n    0.803921568627451,\n    0.7058823529411765,\n    0.7215686274509804,\n    0.7372549019607844,\n    0.7450980392156863,\n    0.9058823529411765,\n    0.7960784313725491,\n    0.7647058823529411,\n    0.7607843137254902,\n    0.8823529411764706,\n    0.8235294117647058,\n    0.7490196078431373,\n    0.6980392156862745,\n    0.5490196078431373,\n    0.3411764705882353,\n    0.24313725490196078,\n    0.34509803921568627,\n    0.1843137254901961,\n    0.27058823529411763,\n    0.3058823529411765,\n    0.10980392156862745,\n    0.25098039215686274,\n    0.11372549019607843,\n    0.27058823529411763,\n    0.21176470588235294,\n    0.08235294117647057,\n    0.23137254901960783,\n    0.1176470588235294,\n    0.3176470588235294,\n    0.24705882352941178,\n    0.35294117647058826,\n    0.3568627450980392,\n    0.34901960784313724,\n    0.2627450980392157,\n    0.37254901960784315,\n    0.10196078431372549,\n    0.13333333333333333,\n    0.27058823529411763,\n    0.8666666666666667,\n    0.47450980392156855,\n    0.3568627450980392,\n    0.23921568627450981,\n    0.2549019607843137,\n    0.7098039215686275,\n    0.5176470588235295,\n    0.14901960784313725,\n    0.0784313725490196,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.10588235294117647,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.09411764705882353\n  ],\n  [\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.1411764705882353,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.10588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.10196078431372549,\n    0.1411764705882353,\n    0.38431372549019616,\n    0.9372549019607842,\n    0.7960784313725491,\n    0.26666666666666666,\n    0.13333333333333333,\n    0.9019607843137255,\n    0.9647058823529412,\n    0.8705882352941177,\n    0.7490196078431373,\n    0.6274509803921569,\n    0.7647058823529411,\n    0.5803921568627451,\n    0.6823529411764706,\n    0.8274509803921568,\n    0.8627450980392157,\n    0.8117647058823529,\n    0.7882352941176471,\n    0.8313725490196079,\n    0.8901960784313725,\n    0.7686274509803923,\n    0.5529411764705883,\n    0.42745098039215684,\n    0.3686274509803922,\n    0.26666666666666666,\n    0.1803921568627451,\n    0.30196078431372547,\n    0.2784313725490196,\n    0.3176470588235294,\n    0.30980392156862746,\n    0.20784313725490197,\n    0.2784313725490196,\n    0.08627450980392157,\n    0.18823529411764706,\n    0.0784313725490196,\n    0.10588235294117647,\n    0.24313725490196078,\n    0.15294117647058825,\n    0.1843137254901961,\n    0.2196078431372549,\n    0.3764705882352941,\n    0.24313725490196078,\n    0.18823529411764706,\n    0.26666666666666666,\n    0.08627450980392157,\n    0.054901960784313725,\n    0.14901960784313725,\n    0.9254901960784313,\n    0.4117647058823529,\n    0.40784313725490196,\n    0.25098039215686274,\n    0.27450980392156865,\n    0.5607843137254902,\n    0.6196078431372549,\n    0.21568627450980393,\n    0.20392156862745098,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.10196078431372549,\n    0.0784313725490196,\n    0.12941176470588237,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765\n  ],\n  [\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.10588235294117647,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.10588235294117647,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.10980392156862745,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.13333333333333333,\n    0.11372549019607843,\n    0.09019607843137255,\n    0.8901960784313725,\n    0.6784313725490196,\n    0.2549019607843137,\n    0.34901960784313724,\n    0.8549019607843137,\n    0.9490196078431371,\n    0.8588235294117647,\n    0.6705882352941175,\n    0.6313725490196078,\n    0.6901960784313725,\n    0.7137254901960784,\n    0.8509803921568627,\n    0.7568627450980392,\n    0.7490196078431373,\n    0.47843137254901963,\n    0.5137254901960784,\n    0.5725490196078431,\n    0.7568627450980392,\n    0.7411764705882353,\n    0.6,\n    0.3686274509803922,\n    0.37254901960784315,\n    0.30980392156862746,\n    0.25098039215686274,\n    0.1450980392156863,\n    0.07450980392156863,\n    0.2784313725490196,\n    0.2901960784313726,\n    0.29411764705882354,\n    0.2196078431372549,\n    0.07450980392156863,\n    0.3254901960784313,\n    0.050980392156862744,\n    0.13333333333333333,\n    0.12156862745098039,\n    0.1803921568627451,\n    0.11372549019607843,\n    0.3568627450980392,\n    0.33333333333333326,\n    0.3294117647058823,\n    0.2627450980392157,\n    0.23137254901960783,\n    0.09411764705882353,\n    0.11372549019607843,\n    0.1176470588235294,\n    0.8745098039215686,\n    0.43529411764705883,\n    0.5254901960784314,\n    0.2980392156862745,\n    0.27450980392156865,\n    0.48627450980392156,\n    0.6274509803921569,\n    0.1803921568627451,\n    0.09019607843137255,\n    0.050980392156862744,\n    0.23921568627450981,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08627450980392157\n  ],\n  [\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.09803921568627452,\n    0.08627450980392157,\n    0.08627450980392157,\n    0.49411764705882355,\n    0.8470588235294118,\n    0.8862745098039215,\n    0.9019607843137255,\n    0.7176470588235294,\n    0.8862745098039215,\n    0.9333333333333332,\n    0.7686274509803923,\n    0.6039215686274509,\n    0.6,\n    0.8,\n    0.7647058823529411,\n    0.9176470588235294,\n    0.9725490196078431,\n    0.9529411764705881,\n    0.12941176470588237,\n    0.2352941176470588,\n    0.3803921568627451,\n    0.4666666666666666,\n    0.6313725490196078,\n    0.5490196078431373,\n    0.3686274509803922,\n    0.4117647058823529,\n    0.39607843137254906,\n    0.3607843137254902,\n    0.2823529411764706,\n    0.24313725490196078,\n    0.2627450980392157,\n    0.2549019607843137,\n    0.33725490196078434,\n    0.2549019607843137,\n    0.27058823529411763,\n    0.12941176470588237,\n    0.2549019607843137,\n    0.3254901960784313,\n    0.09019607843137255,\n    0.08235294117647057,\n    0.28627450980392155,\n    0.2627450980392157,\n    0.28627450980392155,\n    0.34509803921568627,\n    0.2627450980392157,\n    0.24705882352941178,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.14901960784313725,\n    0.8431372549019608,\n    0.5019607843137255,\n    0.6470588235294117,\n    0.25098039215686274,\n    0.28627450980392155,\n    0.5882352941176471,\n    0.6745098039215687,\n    0.24705882352941178,\n    0.11372549019607843,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.10196078431372549,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07450980392156863\n  ],\n  [\n    0.0784313725490196,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.09803921568627452,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.9490196078431371,\n    0.8941176470588236,\n    0.807843137254902,\n    0.8196078431372549,\n    0.7019607843137254,\n    0.9019607843137255,\n    0.9254901960784313,\n    0.6784313725490196,\n    0.6235294117647059,\n    0.5843137254901961,\n    0.7568627450980392,\n    0.6980392156862745,\n    0.996078431372549,\n    0.9764705882352941,\n    0.6078431372549019,\n    0.29411764705882354,\n    0.14901960784313725,\n    0.1568627450980392,\n    0.3568627450980392,\n    0.47843137254901963,\n    0.4,\n    0.4470588235294118,\n    0.4196078431372549,\n    0.37254901960784315,\n    0.3764705882352941,\n    0.33725490196078434,\n    0.29411764705882354,\n    0.19215686274509808,\n    0.27450980392156865,\n    0.32156862745098036,\n    0.3058823529411765,\n    0.1568627450980392,\n    0.12941176470588237,\n    0.12549019607843137,\n    0.2823529411764706,\n    0.21568627450980393,\n    0.10980392156862745,\n    0.17647058823529413,\n    0.23137254901960783,\n    0.1411764705882353,\n    0.33333333333333326,\n    0.20784313725490197,\n    0.12941176470588237,\n    0.10588235294117647,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.8313725490196079,\n    0.592156862745098,\n    0.7529411764705882,\n    0.2549019607843137,\n    0.24313725490196078,\n    0.592156862745098,\n    0.5686274509803921,\n    0.29411764705882354,\n    0.2235294117647059,\n    0.08627450980392157,\n    0.25882352941176473,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.13725490196078433,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06274509803921569\n  ],\n  [\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.043137254901960784,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.09411764705882353,\n    0.1176470588235294,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.11372549019607843,\n    0.06666666666666667,\n    0.9254901960784313,\n    0.9058823529411765,\n    0.9058823529411765,\n    0.8431372549019608,\n    0.9529411764705881,\n    0.9725490196078431,\n    0.8784313725490196,\n    0.6784313725490196,\n    0.6470588235294117,\n    0.611764705882353,\n    0.7490196078431373,\n    0.8862745098039215,\n    0.8196078431372549,\n    0.9019607843137255,\n    0.8823529411764706,\n    0.24313725490196078,\n    0.2901960784313726,\n    0.3058823529411765,\n    0.42745098039215684,\n    0.5019607843137255,\n    0.3882352941176471,\n    0.41568627450980394,\n    0.4823529411764706,\n    0.3686274509803922,\n    0.403921568627451,\n    0.3254901960784313,\n    0.3137254901960784,\n    0.24313725490196078,\n    0.14901960784313725,\n    0.27450980392156865,\n    0.32156862745098036,\n    0.10196078431372549,\n    0.2549019607843137,\n    0.13333333333333333,\n    0.18823529411764706,\n    0.09803921568627452,\n    0.2196078431372549,\n    0.13333333333333333,\n    0.24705882352941178,\n    0.1803921568627451,\n    0.23921568627450981,\n    0.13725490196078433,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.8156862745098039,\n    0.6313725490196078,\n    0.7921568627450981,\n    0.44313725490196076,\n    0.24313725490196078,\n    0.5058823529411764,\n    0.36470588235294116,\n    0.5411764705882353,\n    0.16078431372549018,\n    0.09411764705882353,\n    0.1450980392156863,\n    0.12156862745098039,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07058823529411765\n  ],\n  [\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.10980392156862745,\n    0.09411764705882353,\n    0.09803921568627452,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.09019607843137255,\n    0.9176470588235294,\n    0.8588235294117647,\n    0.9411764705882352,\n    0.9686274509803922,\n    0.9529411764705881,\n    0.984313725490196,\n    0.8431372549019608,\n    0.7764705882352942,\n    0.6352941176470588,\n    0.6039215686274509,\n    0.8509803921568627,\n    0.8980392156862745,\n    0.9372549019607842,\n    0.7725490196078433,\n    0.8117647058823529,\n    0.5372549019607843,\n    0.48627450980392156,\n    0.2901960784313726,\n    0.4980392156862745,\n    0.7019607843137254,\n    0.7843137254901962,\n    0.6784313725490196,\n    0.615686274509804,\n    0.5411764705882353,\n    0.4980392156862745,\n    0.3686274509803922,\n    0.3176470588235294,\n    0.30980392156862746,\n    0.23137254901960783,\n    0.21568627450980393,\n    0.33333333333333326,\n    0.2823529411764706,\n    0.24313725490196078,\n    0.1450980392156863,\n    0.07450980392156863,\n    0.23137254901960783,\n    0.33333333333333326,\n    0.18823529411764706,\n    0.3058823529411765,\n    0.13725490196078433,\n    0.16078431372549018,\n    0.14901960784313725,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.09411764705882353,\n    0.047058823529411764,\n    0.803921568627451,\n    0.8274509803921568,\n    0.9529411764705881,\n    0.8313725490196079,\n    0.22745098039215686,\n    0.27450980392156865,\n    0.596078431372549,\n    0.45098039215686275,\n    0.17254901960784313,\n    0.050980392156862744,\n    0.14901960784313725,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.12941176470588237,\n    0.06666666666666667,\n    0.9294117647058823,\n    0.9294117647058823,\n    0.8352941176470589,\n    0.8705882352941177,\n    0.9529411764705881,\n    0.9647058823529412,\n    0.8549019607843137,\n    0.7411764705882353,\n    0.6470588235294117,\n    0.5803921568627451,\n    0.9058823529411765,\n    0.9333333333333332,\n    0.8901960784313725,\n    0.8901960784313725,\n    0.8352941176470589,\n    0.7450980392156863,\n    0.6196078431372549,\n    0.6588235294117646,\n    0.6705882352941175,\n    0.6431372549019607,\n    0.7764705882352942,\n    0.7843137254901962,\n    0.6470588235294117,\n    0.4705882352941176,\n    0.3882352941176471,\n    0.43137254901960786,\n    0.34509803921568627,\n    0.3254901960784313,\n    0.30196078431372547,\n    0.24705882352941178,\n    0.24705882352941178,\n    0.3058823529411765,\n    0.12156862745098039,\n    0.20784313725490197,\n    0.08627450980392157,\n    0.10588235294117647,\n    0.24313725490196078,\n    0.25098039215686274,\n    0.30196078431372547,\n    0.19607843137254904,\n    0.13333333333333333,\n    0.13333333333333333,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.6705882352941175,\n    0.8352941176470589,\n    0.7568627450980392,\n    0.8470588235294118,\n    0.27450980392156865,\n    0.2235294117647059,\n    0.7411764705882353,\n    0.46274509803921565,\n    0.2627450980392157,\n    0.26666666666666666,\n    0.16470588235294115,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.10196078431372549,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.9411764705882352,\n    0.7803921568627452,\n    0.9529411764705881,\n    0.9568627450980393,\n    0.8431372549019608,\n    0.9215686274509803,\n    0.7568627450980392,\n    0.5647058823529412,\n    0.6431372549019607,\n    0.6078431372549019,\n    0.8392156862745098,\n    0.8627450980392157,\n    0.8784313725490196,\n    0.9450980392156861,\n    0.8862745098039215,\n    0.8313725490196079,\n    0.8156862745098039,\n    0.8196078431372549,\n    0.7294117647058823,\n    0.8,\n    0.8156862745098039,\n    0.8117647058823529,\n    0.6078431372549019,\n    0.4823529411764706,\n    0.33725490196078434,\n    0.34901960784313724,\n    0.34901960784313724,\n    0.3568627450980392,\n    0.2980392156862745,\n    0.29411764705882354,\n    0.2549019607843137,\n    0.30196078431372547,\n    0.3411764705882353,\n    0.22745098039215686,\n    0.33725490196078434,\n    0.12941176470588237,\n    0.17254901960784313,\n    0.17254901960784313,\n    0.16470588235294115,\n    0.20784313725490197,\n    0.20784313725490197,\n    0.3176470588235294,\n    0.17647058823529413,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.09411764705882353,\n    0.6627450980392156,\n    0.8705882352941177,\n    0.7019607843137254,\n    0.9137254901960784,\n    0.3254901960784313,\n    0.23137254901960783,\n    0.6705882352941175,\n    0.47450980392156855,\n    0.09411764705882353,\n    0.3137254901960784,\n    0.1568627450980392,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.08627450980392157,\n    0.9333333333333332,\n    0.9137254901960784,\n    0.8470588235294118,\n    0.9411764705882352,\n    0.9450980392156861,\n    0.7568627450980392,\n    0.6941176470588235,\n    0.611764705882353,\n    0.5882352941176471,\n    0.615686274509804,\n    0.7529411764705882,\n    0.8941176470588236,\n    0.9490196078431371,\n    0.9372549019607842,\n    0.8980392156862745,\n    0.9647058823529412,\n    0.9176470588235294,\n    0.8745098039215686,\n    0.8862745098039215,\n    0.7843137254901962,\n    0.7921568627450981,\n    0.6823529411764706,\n    0.5607843137254902,\n    0.47450980392156855,\n    0.33333333333333326,\n    0.34901960784313724,\n    0.33725490196078434,\n    0.3568627450980392,\n    0.33725490196078434,\n    0.3294117647058823,\n    0.23921568627450981,\n    0.26666666666666666,\n    0.17254901960784313,\n    0.27058823529411763,\n    0.30980392156862746,\n    0.28627450980392155,\n    0.1843137254901961,\n    0.12941176470588237,\n    0.11372549019607843,\n    0.16862745098039217,\n    0.12941176470588237,\n    0.09803921568627452,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.4235294117647059,\n    0.8313725490196079,\n    0.5372549019607843,\n    0.8862745098039215,\n    0.2823529411764706,\n    0.25098039215686274,\n    0.6235294117647059,\n    0.3411764705882353,\n    0.24705882352941178,\n    0.4,\n    0.35294117647058826,\n    0.12156862745098039,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.047058823529411764,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.10588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.9137254901960784,\n    0.9372549019607842,\n    0.9411764705882352,\n    0.9215686274509803,\n    0.9294117647058823,\n    0.7215686274509804,\n    0.6235294117647059,\n    0.5450980392156862,\n    0.5137254901960784,\n    0.5450980392156862,\n    0.7215686274509804,\n    0.807843137254902,\n    0.8784313725490196,\n    0.9490196078431371,\n    0.9490196078431371,\n    0.9372549019607842,\n    0.9725490196078431,\n    0.9568627450980393,\n    0.8745098039215686,\n    0.8549019607843137,\n    0.7137254901960784,\n    0.6627450980392156,\n    0.5568627450980392,\n    0.38431372549019616,\n    0.39607843137254906,\n    0.34509803921568627,\n    0.33725490196078434,\n    0.3176470588235294,\n    0.3058823529411765,\n    0.3568627450980392,\n    0.26666666666666666,\n    0.24313725490196078,\n    0.25882352941176473,\n    0.21568627450980393,\n    0.16470588235294115,\n    0.20784313725490197,\n    0.34509803921568627,\n    0.1843137254901961,\n    0.09803921568627452,\n    0.1176470588235294,\n    0.08627450980392157,\n    0.12549019607843137,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.1176470588235294,\n    0.29411764705882354,\n    0.8,\n    0.5176470588235295,\n    0.8470588235294118,\n    0.29411764705882354,\n    0.22745098039215686,\n    0.6509803921568627,\n    0.24313725490196078,\n    0.19215686274509808,\n    0.34901960784313724,\n    0.33725490196078434,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.10980392156862745\n  ],\n  [\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.10980392156862745,\n    0.09019607843137255,\n    0.13725490196078433,\n    0.9137254901960784,\n    0.8431372549019608,\n    0.9215686274509803,\n    0.9098039215686274,\n    0.7843137254901962,\n    0.6627450980392156,\n    0.615686274509804,\n    0.5215686274509804,\n    0.5058823529411764,\n    0.5333333333333333,\n    0.8705882352941177,\n    0.8745098039215686,\n    0.9058823529411765,\n    0.8823529411764706,\n    0.9019607843137255,\n    0.9450980392156861,\n    0.9254901960784313,\n    0.8901960784313725,\n    0.7960784313725491,\n    0.8117647058823529,\n    0.7411764705882353,\n    0.6392156862745098,\n    0.45098039215686275,\n    0.33333333333333326,\n    0.3568627450980392,\n    0.32156862745098036,\n    0.3764705882352941,\n    0.37254901960784315,\n    0.37254901960784315,\n    0.3568627450980392,\n    0.27058823529411763,\n    0.25098039215686274,\n    0.25882352941176473,\n    0.22745098039215686,\n    0.12941176470588237,\n    0.2352941176470588,\n    0.2627450980392157,\n    0.19215686274509808,\n    0.16862745098039217,\n    0.25098039215686274,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.0588235294117647,\n    0.1176470588235294,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.20784313725490197,\n    0.7725490196078433,\n    0.6431372549019607,\n    0.9215686274509803,\n    0.33333333333333326,\n    0.30196078431372547,\n    0.5764705882352941,\n    0.2784313725490196,\n    0.23921568627450981,\n    0.15294117647058825,\n    0.2823529411764706,\n    0.12941176470588237,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.12549019607843137,\n    0.07058823529411765,\n    0.11372549019607843,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.047058823529411764,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.050980392156862744,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.12156862745098039,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.0588235294117647,\n    0.09019607843137255,\n    0.10980392156862745,\n    0.807843137254902,\n    0.9490196078431371,\n    0.9098039215686274,\n    0.9333333333333332,\n    0.7843137254901962,\n    0.6823529411764706,\n    0.5137254901960784,\n    0.5529411764705883,\n    0.5450980392156862,\n    0.4549019607843137,\n    0.592156862745098,\n    0.9411764705882352,\n    0.9254901960784313,\n    0.7921568627450981,\n    0.8431372549019608,\n    0.8862745098039215,\n    0.9019607843137255,\n    0.807843137254902,\n    0.7450980392156863,\n    0.5803921568627451,\n    0.6352941176470588,\n    0.5882352941176471,\n    0.4117647058823529,\n    0.33725490196078434,\n    0.34509803921568627,\n    0.40784313725490196,\n    0.39607843137254906,\n    0.33725490196078434,\n    0.3921568627450981,\n    0.3254901960784313,\n    0.2901960784313726,\n    0.3254901960784313,\n    0.19215686274509808,\n    0.1803921568627451,\n    0.26666666666666666,\n    0.33333333333333326,\n    0.3294117647058823,\n    0.18823529411764706,\n    0.12941176470588237,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.10588235294117647,\n    0.09803921568627452,\n    0.20392156862745098,\n    0.7568627450980392,\n    0.5882352941176471,\n    0.9568627450980393,\n    0.3294117647058823,\n    0.30196078431372547,\n    0.7176470588235294,\n    0.6313725490196078,\n    0.2352941176470588,\n    0.13725490196078433,\n    0.2196078431372549,\n    0.1450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.12156862745098039,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.09803921568627452\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.09803921568627452,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.40784313725490196,\n    0.9568627450980393,\n    0.9568627450980393,\n    0.8627450980392157,\n    0.5372549019607843,\n    0.5725490196078431,\n    0.5450980392156862,\n    0.48627450980392156,\n    0.5215686274509804,\n    0.43529411764705883,\n    0.47450980392156855,\n    0.8823529411764706,\n    0.9411764705882352,\n    0.8549019607843137,\n    0.8745098039215686,\n    0.7803921568627452,\n    0.8235294117647058,\n    0.8235294117647058,\n    0.7176470588235294,\n    0.6509803921568627,\n    0.6313725490196078,\n    0.4196078431372549,\n    0.3803921568627451,\n    0.32156862745098036,\n    0.35294117647058826,\n    0.39607843137254906,\n    0.3882352941176471,\n    0.35294117647058826,\n    0.29411764705882354,\n    0.3764705882352941,\n    0.26666666666666666,\n    0.3058823529411765,\n    0.24705882352941178,\n    0.34509803921568627,\n    0.30196078431372547,\n    0.23921568627450981,\n    0.20784313725490197,\n    0.06666666666666667,\n    0.15294117647058825,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.12549019607843137,\n    0.8901960784313725,\n    0.6941176470588235,\n    0.8862745098039215,\n    0.3411764705882353,\n    0.29411764705882354,\n    0.6549019607843136,\n    0.8980392156862745,\n    0.2784313725490196,\n    0.10980392156862745,\n    0.3294117647058823,\n    0.3411764705882353,\n    0.09803921568627452,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647\n  ],\n  [\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.11372549019607843,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.10980392156862745,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.19215686274509808,\n    0.9098039215686274,\n    0.9411764705882352,\n    0.9254901960784313,\n    0.7607843137254902,\n    0.3294117647058823,\n    0.3411764705882353,\n    0.40784313725490196,\n    0.403921568627451,\n    0.4705882352941176,\n    0.3058823529411765,\n    0.8784313725490196,\n    0.9529411764705881,\n    0.9215686274509803,\n    0.8549019607843137,\n    0.8274509803921568,\n    0.7960784313725491,\n    0.8156862745098039,\n    0.6666666666666665,\n    0.6431372549019607,\n    0.596078431372549,\n    0.48627450980392156,\n    0.3411764705882353,\n    0.34509803921568627,\n    0.3568627450980392,\n    0.3411764705882353,\n    0.3764705882352941,\n    0.3568627450980392,\n    0.3803921568627451,\n    0.34901960784313724,\n    0.32156862745098036,\n    0.2980392156862745,\n    0.30196078431372547,\n    0.3294117647058823,\n    0.30980392156862746,\n    0.2352941176470588,\n    0.16470588235294115,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.11372549019607843,\n    0.8627450980392157,\n    0.7019607843137254,\n    0.9333333333333332,\n    0.3254901960784313,\n    0.33333333333333326,\n    0.6509803921568627,\n    0.9450980392156861,\n    0.33333333333333326,\n    0.14901960784313725,\n    0.2784313725490196,\n    0.5529411764705883,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057\n  ],\n  [\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.12941176470588237,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.09019607843137255,\n    0.9254901960784313,\n    0.9333333333333332,\n    0.9098039215686274,\n    0.9764705882352941,\n    0.8509803921568627,\n    0.40784313725490196,\n    0.3764705882352941,\n    0.43137254901960786,\n    0.5333333333333333,\n    0.5764705882352941,\n    0.8705882352941177,\n    0.8980392156862745,\n    0.8392156862745098,\n    0.8627450980392157,\n    0.8823529411764706,\n    0.7803921568627452,\n    0.8941176470588236,\n    0.6823529411764706,\n    0.6745098039215687,\n    0.5450980392156862,\n    0.42745098039215684,\n    0.3568627450980392,\n    0.37254901960784315,\n    0.403921568627451,\n    0.43137254901960786,\n    0.4,\n    0.3411764705882353,\n    0.39607843137254906,\n    0.37254901960784315,\n    0.3058823529411765,\n    0.3254901960784313,\n    0.3254901960784313,\n    0.3764705882352941,\n    0.2549019607843137,\n    0.25098039215686274,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.10980392156862745,\n    0.043137254901960784,\n    0.9411764705882352,\n    0.7529411764705882,\n    0.8784313725490196,\n    0.37254901960784315,\n    0.3568627450980392,\n    0.6901960784313725,\n    0.9725490196078431,\n    0.44313725490196076,\n    0.22745098039215686,\n    0.1803921568627451,\n    0.5450980392156862,\n    0.09803921568627452,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765\n  ],\n  [\n    0.06274509803921569,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.10196078431372549,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.08235294117647057,\n    0.11372549019607843,\n    0.08235294117647057,\n    0.09803921568627452,\n    0.8745098039215686,\n    0.9215686274509803,\n    0.9372549019607842,\n    0.9411764705882352,\n    0.8823529411764706,\n    0.6470588235294117,\n    0.6784313725490196,\n    0.6627450980392156,\n    0.7372549019607844,\n    0.803921568627451,\n    0.8509803921568627,\n    0.9411764705882352,\n    0.8274509803921568,\n    0.8705882352941177,\n    0.8274509803921568,\n    0.7450980392156863,\n    0.6313725490196078,\n    0.6588235294117646,\n    0.6352941176470588,\n    0.4980392156862745,\n    0.403921568627451,\n    0.40784313725490196,\n    0.3764705882352941,\n    0.403921568627451,\n    0.43137254901960786,\n    0.4,\n    0.3176470588235294,\n    0.36470588235294116,\n    0.29411764705882354,\n    0.3764705882352941,\n    0.38431372549019616,\n    0.32156862745098036,\n    0.30980392156862746,\n    0.19215686274509808,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.08235294117647057,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.08627450980392157,\n    0.9568627450980393,\n    0.9725490196078431,\n    0.8745098039215686,\n    0.43529411764705883,\n    0.4,\n    0.8509803921568627,\n    0.9686274509803922,\n    0.4980392156862745,\n    0.24313725490196078,\n    0.20784313725490197,\n    0.47843137254901963,\n    0.16470588235294115,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.12156862745098039,\n    0.596078431372549,\n    0.9529411764705881,\n    0.984313725490196,\n    0.8745098039215686,\n    0.9411764705882352,\n    0.5803921568627451,\n    0.6588235294117646,\n    0.6941176470588235,\n    0.6705882352941175,\n    0.803921568627451,\n    0.7803921568627452,\n    0.8313725490196079,\n    0.7803921568627452,\n    0.807843137254902,\n    0.8156862745098039,\n    0.6901960784313725,\n    0.6392156862745098,\n    0.6745098039215687,\n    0.5568627450980392,\n    0.49019607843137253,\n    0.4470588235294118,\n    0.38431372549019616,\n    0.34901960784313724,\n    0.38431372549019616,\n    0.36470588235294116,\n    0.36470588235294116,\n    0.3803921568627451,\n    0.33725490196078434,\n    0.3176470588235294,\n    0.27450980392156865,\n    0.1411764705882353,\n    0.25882352941176473,\n    0.12941176470588237,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.20784313725490197,\n    0.9411764705882352,\n    0.8705882352941177,\n    0.9058823529411765,\n    0.4666666666666666,\n    0.35294117647058826,\n    0.34509803921568627,\n    0.9176470588235294,\n    0.9647058823529412,\n    0.24313725490196078,\n    0.20784313725490197,\n    0.30980392156862746,\n    0.42745098039215684,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.050980392156862744,\n    0.08235294117647057,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.054901960784313725,\n    0.12549019607843137,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.9019607843137255,\n    0.7411764705882353,\n    0.6549019607843136,\n    0.6588235294117646,\n    0.6274509803921569,\n    0.6392156862745098,\n    0.6705882352941175,\n    0.6941176470588235,\n    0.7254901960784313,\n    0.7764705882352942,\n    0.7607843137254902,\n    0.8392156862745098,\n    0.8196078431372549,\n    0.6588235294117646,\n    0.6627450980392156,\n    0.5254901960784314,\n    0.5725490196078431,\n    0.5176470588235295,\n    0.4705882352941176,\n    0.46274509803921565,\n    0.4666666666666666,\n    0.4549019607843137,\n    0.44313725490196076,\n    0.4,\n    0.4705882352941176,\n    0.403921568627451,\n    0.3764705882352941,\n    0.3411764705882353,\n    0.2823529411764706,\n    0.22745098039215686,\n    0.2823529411764706,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.14901960784313725,\n    0.1176470588235294,\n    0.9294117647058823,\n    0.7882352941176471,\n    0.9450980392156861,\n    0.4666666666666666,\n    0.3607843137254902,\n    0.37254901960784315,\n    0.9568627450980393,\n    0.9450980392156861,\n    0.2627450980392157,\n    0.2549019607843137,\n    0.3137254901960784,\n    0.4235294117647059,\n    0.15294117647058825,\n    0.2235294117647059,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.1450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.1176470588235294,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.9019607843137255,\n    0.9411764705882352,\n    0.6078431372549019,\n    0.4980392156862745,\n    0.6235294117647059,\n    0.5764705882352941,\n    0.596078431372549,\n    0.5843137254901961,\n    0.6549019607843136,\n    0.6627450980392156,\n    0.7764705882352942,\n    0.8352941176470589,\n    0.7647058823529411,\n    0.6705882352941175,\n    0.6,\n    0.6392156862745098,\n    0.5372549019607843,\n    0.5058823529411764,\n    0.4470588235294118,\n    0.4588235294117647,\n    0.5098039215686274,\n    0.47843137254901963,\n    0.43529411764705883,\n    0.4980392156862745,\n    0.40784313725490196,\n    0.39607843137254906,\n    0.3411764705882353,\n    0.29411764705882354,\n    0.27058823529411763,\n    0.27450980392156865,\n    0.18823529411764706,\n    0.2352941176470588,\n    0.10196078431372549,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.13725490196078433,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.1411764705882353,\n    0.9019607843137255,\n    0.9254901960784313,\n    0.8705882352941177,\n    0.4549019607843137,\n    0.3686274509803922,\n    0.3176470588235294,\n    0.8,\n    0.9215686274509803,\n    0.27058823529411763,\n    0.16078431372549018,\n    0.25098039215686274,\n    0.45098039215686275,\n    0.592156862745098,\n    0.3764705882352941,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0588235294117647\n  ],\n  [\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.3254901960784313,\n    0.8901960784313725,\n    0.7098039215686275,\n    0.7058823529411765,\n    0.6666666666666665,\n    0.7882352941176471,\n    0.47450980392156855,\n    0.5529411764705883,\n    0.5019607843137255,\n    0.6196078431372549,\n    0.7372549019607844,\n    0.7294117647058823,\n    0.6549019607843136,\n    0.7411764705882353,\n    0.6235294117647059,\n    0.5686274509803921,\n    0.49411764705882355,\n    0.47843137254901963,\n    0.44313725490196076,\n    0.48627450980392156,\n    0.5254901960784314,\n    0.5294117647058824,\n    0.48627450980392156,\n    0.48627450980392156,\n    0.4705882352941176,\n    0.41568627450980394,\n    0.36470588235294116,\n    0.3058823529411765,\n    0.2784313725490196,\n    0.3176470588235294,\n    0.2901960784313726,\n    0.23137254901960783,\n    0.11372549019607843,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.12941176470588237,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.1568627450980392,\n    0.9529411764705881,\n    0.9490196078431371,\n    0.9411764705882352,\n    0.4823529411764706,\n    0.37254901960784315,\n    0.33333333333333326,\n    0.8392156862745098,\n    0.9176470588235294,\n    0.43137254901960786,\n    0.1843137254901961,\n    0.3176470588235294,\n    0.5529411764705883,\n    0.2784313725490196,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196\n  ],\n  [\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.1176470588235294,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.09411764705882353,\n    0.08235294117647057,\n    0.09019607843137255,\n    0.12156862745098039,\n    0.09411764705882353,\n    0.8196078431372549,\n    0.8901960784313725,\n    0.9529411764705881,\n    0.8705882352941177,\n    0.8117647058823529,\n    0.6901960784313725,\n    0.6745098039215687,\n    0.615686274509804,\n    0.6509803921568627,\n    0.7686274509803923,\n    0.7960784313725491,\n    0.6784313725490196,\n    0.6274509803921569,\n    0.5647058823529412,\n    0.5254901960784314,\n    0.48627450980392156,\n    0.5058823529411764,\n    0.5098039215686274,\n    0.5019607843137255,\n    0.5058823529411764,\n    0.5137254901960784,\n    0.5215686274509804,\n    0.5294117647058824,\n    0.4823529411764706,\n    0.4,\n    0.3568627450980392,\n    0.37254901960784315,\n    0.3254901960784313,\n    0.9019607843137255,\n    0.3764705882352941,\n    0.2980392156862745,\n    0.1803921568627451,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.14901960784313725,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.054901960784313725,\n    0.10980392156862745,\n    0.0784313725490196,\n    0.9450980392156861,\n    0.9647058823529412,\n    0.9215686274509803,\n    0.5254901960784314,\n    0.5529411764705883,\n    0.3803921568627451,\n    0.7882352941176471,\n    0.9294117647058823,\n    0.7450980392156863,\n    0.2549019607843137,\n    0.25882352941176473,\n    0.4117647058823529,\n    0.3607843137254902,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06666666666666667\n  ],\n  [\n    0.09019607843137255,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.09411764705882353,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.7882352941176471,\n    0.9098039215686274,\n    0.8509803921568627,\n    0.8549019607843137,\n    0.6509803921568627,\n    0.5803921568627451,\n    0.6274509803921569,\n    0.6039215686274509,\n    0.7019607843137254,\n    0.7686274509803923,\n    0.7686274509803923,\n    0.7568627450980392,\n    0.6745098039215687,\n    0.596078431372549,\n    0.5647058823529412,\n    0.5294117647058824,\n    0.5176470588235295,\n    0.5137254901960784,\n    0.47450980392156855,\n    0.4823529411764706,\n    0.5450980392156862,\n    0.5137254901960784,\n    0.5294117647058824,\n    0.4549019607843137,\n    0.4235294117647059,\n    0.30980392156862746,\n    0.30980392156862746,\n    0.34509803921568627,\n    0.9294117647058823,\n    0.5372549019607843,\n    0.24705882352941178,\n    0.17647058823529413,\n    0.13333333333333333,\n    0.1176470588235294,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.09411764705882353,\n    0.13333333333333333,\n    0.9490196078431371,\n    0.9372549019607842,\n    0.9764705882352941,\n    0.5058823529411764,\n    0.5725490196078431,\n    0.3882352941176471,\n    0.8745098039215686,\n    0.803921568627451,\n    0.9686274509803922,\n    0.23921568627450981,\n    0.28627450980392155,\n    0.4117647058823529,\n    0.5607843137254902,\n    0.09019607843137255,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.043137254901960784,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.19215686274509808,\n    0.9686274509803922,\n    0.8196078431372549,\n    0.6941176470588235,\n    0.6274509803921569,\n    0.6078431372549019,\n    0.5764705882352941,\n    0.6078431372549019,\n    0.611764705882353,\n    0.6470588235294117,\n    0.6549019607843136,\n    0.7019607843137254,\n    0.5686274509803921,\n    0.5529411764705883,\n    0.5686274509803921,\n    0.5725490196078431,\n    0.5137254901960784,\n    0.5333333333333333,\n    0.5215686274509804,\n    0.5254901960784314,\n    0.596078431372549,\n    0.5137254901960784,\n    0.5333333333333333,\n    0.4980392156862745,\n    0.34901960784313724,\n    0.2901960784313726,\n    0.3411764705882353,\n    0.403921568627451,\n    0.5764705882352941,\n    0.42745098039215684,\n    0.16470588235294115,\n    0.14901960784313725,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.23137254901960783,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.16078431372549018,\n    0.12156862745098039,\n    0.12549019607843137,\n    0.10980392156862745,\n    0.09411764705882353,\n    0.9411764705882352,\n    0.9607843137254902,\n    0.9450980392156861,\n    0.611764705882353,\n    0.8352941176470589,\n    0.403921568627451,\n    0.7254901960784313,\n    0.9058823529411765,\n    0.9686274509803922,\n    0.27058823529411763,\n    0.3176470588235294,\n    0.3294117647058823,\n    0.5411764705882353,\n    0.14901960784313725,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.11372549019607843,\n    0.08627450980392157,\n    0.9254901960784313,\n    0.9333333333333332,\n    0.8588235294117647,\n    0.8901960784313725,\n    0.6196078431372549,\n    0.5529411764705883,\n    0.592156862745098,\n    0.6313725490196078,\n    0.6588235294117646,\n    0.6509803921568627,\n    0.6941176470588235,\n    0.5803921568627451,\n    0.5725490196078431,\n    0.5725490196078431,\n    0.47843137254901963,\n    0.596078431372549,\n    0.5490196078431373,\n    0.6,\n    0.615686274509804,\n    0.5215686274509804,\n    0.5686274509803921,\n    0.49411764705882355,\n    0.3294117647058823,\n    0.37254901960784315,\n    0.3568627450980392,\n    0.34509803921568627,\n    0.3607843137254902,\n    0.30980392156862746,\n    0.4823529411764706,\n    0.24313725490196078,\n    0.4549019607843137,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.09019607843137255,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.054901960784313725,\n    0.1450980392156863,\n    0.16078431372549018,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.9411764705882352,\n    0.9294117647058823,\n    0.8352941176470589,\n    0.6549019607843136,\n    0.8784313725490196,\n    0.39607843137254906,\n    0.8666666666666667,\n    0.9137254901960784,\n    0.9215686274509803,\n    0.24705882352941178,\n    0.27058823529411763,\n    0.16470588235294115,\n    0.5882352941176471,\n    0.5098039215686274,\n    0.11372549019607843,\n    0.10196078431372549,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.12156862745098039,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863\n  ],\n  [\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.047058823529411764,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.09803921568627452,\n    0.9333333333333332,\n    0.9490196078431371,\n    0.9411764705882352,\n    0.9137254901960784,\n    0.7803921568627452,\n    0.7450980392156863,\n    0.6705882352941175,\n    0.5647058823529412,\n    0.6,\n    0.6235294117647059,\n    0.5882352941176471,\n    0.6078431372549019,\n    0.6039215686274509,\n    0.5882352941176471,\n    0.5803921568627451,\n    0.611764705882353,\n    0.5686274509803921,\n    0.5607843137254902,\n    0.5254901960784314,\n    0.5607843137254902,\n    0.403921568627451,\n    0.41568627450980394,\n    0.37254901960784315,\n    0.34509803921568627,\n    0.3803921568627451,\n    0.3764705882352941,\n    0.34509803921568627,\n    0.3764705882352941,\n    0.5411764705882353,\n    0.3686274509803922,\n    0.2627450980392157,\n    0.16470588235294115,\n    0.2,\n    0.36470588235294116,\n    0.5372549019607843,\n    0.3607843137254902,\n    0.5333333333333333,\n    0.596078431372549,\n    0.4980392156862745,\n    0.3568627450980392,\n    0.33725490196078434,\n    0.3176470588235294,\n    0.1176470588235294,\n    0.807843137254902,\n    0.9529411764705881,\n    0.6313725490196078,\n    0.7294117647058823,\n    0.9254901960784313,\n    0.39607843137254906,\n    0.5450980392156862,\n    0.8980392156862745,\n    0.8784313725490196,\n    0.3058823529411765,\n    0.20392156862745098,\n    0.3803921568627451,\n    0.49411764705882355,\n    0.6352941176470588,\n    0.16862745098039217,\n    0.10980392156862745,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.09019607843137255,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.1803921568627451,\n    0.9294117647058823,\n    0.9686274509803922,\n    0.8666666666666667,\n    0.7764705882352942,\n    0.7490196078431373,\n    0.6784313725490196,\n    0.6196078431372549,\n    0.5725490196078431,\n    0.5725490196078431,\n    0.5764705882352941,\n    0.5490196078431373,\n    0.611764705882353,\n    0.5803921568627451,\n    0.5058823529411764,\n    0.6274509803921569,\n    0.5254901960784314,\n    0.5607843137254902,\n    0.4235294117647059,\n    0.44313725490196076,\n    0.3882352941176471,\n    0.41568627450980394,\n    0.33725490196078434,\n    0.3686274509803922,\n    0.38431372549019616,\n    0.34901960784313724,\n    0.3411764705882353,\n    0.34509803921568627,\n    0.2196078431372549,\n    0.2901960784313726,\n    0.49019607843137253,\n    0.6,\n    0.5725490196078431,\n    0.6,\n    0.5686274509803921,\n    0.6941176470588235,\n    0.6745098039215687,\n    0.5882352941176471,\n    0.5254901960784314,\n    0.4666666666666666,\n    0.34901960784313724,\n    0.3058823529411765,\n    0.27450980392156865,\n    0.8784313725490196,\n    0.8784313725490196,\n    0.6549019607843136,\n    0.7019607843137254,\n    0.9019607843137255,\n    0.7803921568627452,\n    0.403921568627451,\n    0.8823529411764706,\n    0.9372549019607842,\n    0.36470588235294116,\n    0.12156862745098039,\n    0.2823529411764706,\n    0.43529411764705883,\n    0.5607843137254902,\n    0.12156862745098039,\n    0.12549019607843137,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07450980392156863,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.09019607843137255,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.10588235294117647,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.3294117647058823,\n    0.8784313725490196,\n    0.8745098039215686,\n    0.7960784313725491,\n    0.7176470588235294,\n    0.5882352941176471,\n    0.5686274509803921,\n    0.5803921568627451,\n    0.5215686274509804,\n    0.5607843137254902,\n    0.5882352941176471,\n    0.5333333333333333,\n    0.5215686274509804,\n    0.5843137254901961,\n    0.5294117647058824,\n    0.49411764705882355,\n    0.4196078431372549,\n    0.45098039215686275,\n    0.4235294117647059,\n    0.4,\n    0.39607843137254906,\n    0.42745098039215684,\n    0.34509803921568627,\n    0.36470588235294116,\n    0.3803921568627451,\n    0.3294117647058823,\n    0.4235294117647059,\n    0.5803921568627451,\n    0.7764705882352942,\n    0.7568627450980392,\n    0.8352941176470589,\n    0.8274509803921568,\n    0.7803921568627452,\n    0.6352941176470588,\n    0.6039215686274509,\n    0.6509803921568627,\n    0.6666666666666665,\n    0.5450980392156862,\n    0.45098039215686275,\n    0.3764705882352941,\n    0.34509803921568627,\n    0.25098039215686274,\n    0.5686274509803921,\n    0.8862745098039215,\n    0.6196078431372549,\n    0.596078431372549,\n    0.9215686274509803,\n    0.9647058823529412,\n    0.41568627450980394,\n    0.8941176470588236,\n    0.9254901960784313,\n    0.3921568627450981,\n    0.3137254901960784,\n    0.25882352941176473,\n    0.2901960784313726,\n    0.6196078431372549,\n    0.2901960784313726,\n    0.0784313725490196,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667\n  ],\n  [\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.054901960784313725,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.44313725490196076,\n    0.6666666666666665,\n    0.6470588235294117,\n    0.5529411764705883,\n    0.4980392156862745,\n    0.5411764705882353,\n    0.5254901960784314,\n    0.37254901960784315,\n    0.3568627450980392,\n    0.4196078431372549,\n    0.4980392156862745,\n    0.39607843137254906,\n    0.4196078431372549,\n    0.41568627450980394,\n    0.5333333333333333,\n    0.4823529411764706,\n    0.4705882352941176,\n    0.45098039215686275,\n    0.45098039215686275,\n    0.43137254901960786,\n    0.5019607843137255,\n    0.5176470588235295,\n    0.7411764705882353,\n    0.9450980392156861,\n    0.9137254901960784,\n    0.9450980392156861,\n    0.9058823529411765,\n    0.8941176470588236,\n    0.8980392156862745,\n    0.8392156862745098,\n    0.6509803921568627,\n    0.6862745098039216,\n    0.6745098039215687,\n    0.42745098039215684,\n    0.28627450980392155,\n    0.1411764705882353,\n    0.25098039215686274,\n    0.27450980392156865,\n    0.2823529411764706,\n    0.1843137254901961,\n    0.5333333333333333,\n    0.7333333333333333,\n    0.6392156862745098,\n    0.7411764705882353,\n    0.8156862745098039,\n    0.9490196078431371,\n    0.4549019607843137,\n    0.8784313725490196,\n    0.9490196078431371,\n    0.7254901960784313,\n    0.14901960784313725,\n    0.22745098039215686,\n    0.3803921568627451,\n    0.5137254901960784,\n    0.4196078431372549,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09019607843137255\n  ],\n  [\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.043137254901960784,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.1450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0392156862745098,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.1176470588235294,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.08627450980392157,\n    0.08627450980392157,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.047058823529411764,\n    0.17647058823529413,\n    0.2235294117647059,\n    0.2549019607843137,\n    0.17254901960784313,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.3176470588235294,\n    0.7137254901960784,\n    0.6352941176470588,\n    0.6196078431372549,\n    0.5607843137254902,\n    0.5607843137254902,\n    0.5137254901960784,\n    0.5490196078431373,\n    0.35294117647058826,\n    0.9333333333333332,\n    0.9764705882352941,\n    0.9647058823529412,\n    0.8980392156862745,\n    0.9490196078431371,\n    0.9568627450980393,\n    0.984313725490196,\n    0.9411764705882352,\n    0.8862745098039215,\n    0.7725490196078433,\n    0.7450980392156863,\n    0.49019607843137253,\n    0.24705882352941178,\n    0.24313725490196078,\n    0.28627450980392155,\n    0.27058823529411763,\n    0.2352941176470588,\n    0.25882352941176473,\n    0.24313725490196078,\n    0.25882352941176473,\n    0.2627450980392157,\n    0.23137254901960783,\n    0.41568627450980394,\n    0.6470588235294117,\n    0.6509803921568627,\n    0.8980392156862745,\n    0.7137254901960784,\n    0.9058823529411765,\n    0.42745098039215684,\n    0.7647058823529411,\n    0.8823529411764706,\n    0.9372549019607842,\n    0.2627450980392157,\n    0.21568627450980393,\n    0.39607843137254906,\n    0.44313725490196076,\n    0.5647058823529412,\n    0.10588235294117647,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.10980392156862745,\n    0.8156862745098039,\n    0.807843137254902,\n    0.7764705882352942,\n    0.6196078431372549,\n    0.5803921568627451,\n    0.5215686274509804,\n    0.9372549019607842,\n    0.9764705882352941,\n    0.996078431372549,\n    0.9450980392156861,\n    0.9333333333333332,\n    0.9686274509803922,\n    0.9725490196078431,\n    0.9882352941176471,\n    0.9764705882352941,\n    0.8901960784313725,\n    0.7058823529411765,\n    0.34901960784313724,\n    0.25098039215686274,\n    0.23137254901960783,\n    0.20392156862745098,\n    0.20392156862745098,\n    0.1843137254901961,\n    0.22745098039215686,\n    0.2352941176470588,\n    0.19215686274509808,\n    0.2235294117647059,\n    0.22745098039215686,\n    0.27450980392156865,\n    0.2549019607843137,\n    0.21568627450980393,\n    0.6431372549019607,\n    0.7176470588235294,\n    0.9294117647058823,\n    0.6313725490196078,\n    0.7843137254901962,\n    0.4470588235294118,\n    0.6666666666666665,\n    0.8705882352941177,\n    0.9372549019607842,\n    0.3411764705882353,\n    0.19215686274509808,\n    0.33333333333333326,\n    0.32156862745098036,\n    0.5176470588235295,\n    0.1803921568627451,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863\n  ],\n  [\n    0.07450980392156863,\n    0.07058823529411765,\n    0.11372549019607843,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.050980392156862744,\n    0.08235294117647057,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.12549019607843137,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.047058823529411764,\n    0.054901960784313725,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.45098039215686275,\n    0.7372549019607844,\n    0.9019607843137255,\n    0.7764705882352942,\n    0.9019607843137255,\n    0.9411764705882352,\n    0.9490196078431371,\n    0.9725490196078431,\n    0.9333333333333332,\n    0.9882352941176471,\n    0.9529411764705881,\n    0.9607843137254902,\n    0.803921568627451,\n    0.592156862745098,\n    0.32156862745098036,\n    0.3137254901960784,\n    0.24313725490196078,\n    0.25882352941176473,\n    0.24705882352941178,\n    0.14901960784313725,\n    0.11372549019607843,\n    0.1843137254901961,\n    0.24313725490196078,\n    0.24313725490196078,\n    0.22745098039215686,\n    0.2235294117647059,\n    0.19215686274509808,\n    0.2235294117647059,\n    0.25882352941176473,\n    0.1568627450980392,\n    0.16862745098039217,\n    0.7019607843137254,\n    0.6588235294117646,\n    0.9098039215686274,\n    0.7254901960784313,\n    0.8745098039215686,\n    0.5137254901960784,\n    0.3764705882352941,\n    0.8666666666666667,\n    0.9764705882352941,\n    0.2901960784313726,\n    0.1568627450980392,\n    0.34509803921568627,\n    0.3058823529411765,\n    0.5215686274509804,\n    0.2901960784313726,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.043137254901960784,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.047058823529411764,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.047058823529411764,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.6666666666666665,\n    0.7490196078431373,\n    0.8627450980392157,\n    0.9372549019607842,\n    0.9529411764705881,\n    0.8980392156862745,\n    0.9725490196078431,\n    0.9607843137254902,\n    0.9607843137254902,\n    0.5176470588235295,\n    0.5725490196078431,\n    0.4549019607843137,\n    0.27450980392156865,\n    0.27450980392156865,\n    0.25882352941176473,\n    0.2627450980392157,\n    0.21568627450980393,\n    0.21568627450980393,\n    0.16862745098039217,\n    0.22745098039215686,\n    0.1843137254901961,\n    0.25882352941176473,\n    0.21568627450980393,\n    0.2,\n    0.19607843137254904,\n    0.2196078431372549,\n    0.14901960784313725,\n    0.15294117647058825,\n    0.27450980392156865,\n    0.1568627450980392,\n    0.7568627450980392,\n    0.6509803921568627,\n    0.9254901960784313,\n    0.8980392156862745,\n    0.6745098039215687,\n    0.596078431372549,\n    0.37254901960784315,\n    0.7803921568627452,\n    0.9137254901960784,\n    0.3411764705882353,\n    0.12549019607843137,\n    0.2196078431372549,\n    0.5294117647058824,\n    0.4705882352941176,\n    0.4823529411764706,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.12549019607843137,\n    0.8941176470588236,\n    0.807843137254902,\n    0.984313725490196,\n    0.9333333333333332,\n    0.9098039215686274,\n    0.984313725490196,\n    0.9647058823529412,\n    0.9254901960784313,\n    0.6431372549019607,\n    0.611764705882353,\n    0.5098039215686274,\n    0.34509803921568627,\n    0.34901960784313724,\n    0.2352941176470588,\n    0.29411764705882354,\n    0.28627450980392155,\n    0.2235294117647059,\n    0.14901960784313725,\n    0.1843137254901961,\n    0.18823529411764706,\n    0.2196078431372549,\n    0.23137254901960783,\n    0.1843137254901961,\n    0.22745098039215686,\n    0.11372549019607843,\n    0.19215686274509808,\n    0.19607843137254904,\n    0.13725490196078433,\n    0.17254901960784313,\n    0.10980392156862745,\n    0.7568627450980392,\n    0.7803921568627452,\n    0.7882352941176471,\n    0.9294117647058823,\n    0.6784313725490196,\n    0.7725490196078433,\n    0.43137254901960786,\n    0.6980392156862745,\n    0.8745098039215686,\n    0.4392156862745098,\n    0.19607843137254904,\n    0.27058823529411763,\n    0.6392156862745098,\n    0.39607843137254906,\n    0.4235294117647059,\n    0.12549019607843137,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196\n  ],\n  [\n    0.07450980392156863,\n    0.07450980392156863,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.11372549019607843,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.12941176470588237,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.09803921568627452,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.09019607843137255,\n    0.9098039215686274,\n    0.7921568627450981,\n    0.9411764705882352,\n    0.9490196078431371,\n    0.8901960784313725,\n    0.9137254901960784,\n    0.9294117647058823,\n    0.7098039215686275,\n    0.6352941176470588,\n    0.6235294117647059,\n    0.5725490196078431,\n    0.5176470588235295,\n    0.41568627450980394,\n    0.3764705882352941,\n    0.3176470588235294,\n    0.27058823529411763,\n    0.1803921568627451,\n    0.21176470588235294,\n    0.13333333333333333,\n    0.21176470588235294,\n    0.25882352941176473,\n    0.24313725490196078,\n    0.20784313725490197,\n    0.16470588235294115,\n    0.12156862745098039,\n    0.13333333333333333,\n    0.2,\n    0.21568627450980393,\n    0.18823529411764706,\n    0.1176470588235294,\n    0.13333333333333333,\n    0.7882352941176471,\n    0.9490196078431371,\n    0.7372549019607844,\n    0.7411764705882353,\n    0.6549019607843136,\n    0.9372549019607842,\n    0.4666666666666666,\n    0.6470588235294117,\n    0.7450980392156863,\n    0.7215686274509804,\n    0.2549019607843137,\n    0.27058823529411763,\n    0.5882352941176471,\n    0.4117647058823529,\n    0.5607843137254902,\n    0.12156862745098039,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.12156862745098039,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.19215686274509808,\n    0.9490196078431371,\n    0.9490196078431371,\n    0.9137254901960784,\n    0.9764705882352941,\n    0.8627450980392157,\n    0.6509803921568627,\n    0.7450980392156863,\n    0.7607843137254902,\n    0.7254901960784313,\n    0.6705882352941175,\n    0.596078431372549,\n    0.45098039215686275,\n    0.33333333333333326,\n    0.32156862745098036,\n    0.23921568627450981,\n    0.2823529411764706,\n    0.2549019607843137,\n    0.23137254901960783,\n    0.1843137254901961,\n    0.2196078431372549,\n    0.2352941176470588,\n    0.2196078431372549,\n    0.20392156862745098,\n    0.2,\n    0.2,\n    0.12156862745098039,\n    0.2,\n    0.17254901960784313,\n    0.16078431372549018,\n    0.21176470588235294,\n    0.10588235294117647,\n    0.7137254901960784,\n    0.9372549019607842,\n    0.7333333333333333,\n    0.8980392156862745,\n    0.6705882352941175,\n    0.9490196078431371,\n    0.4470588235294118,\n    0.5529411764705883,\n    0.592156862745098,\n    0.8705882352941177,\n    0.2,\n    0.1450980392156863,\n    0.5686274509803921,\n    0.42745098039215684,\n    0.6235294117647059,\n    0.3137254901960784,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.12156862745098039,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.9647058823529412,\n    0.9686274509803922,\n    0.9764705882352941,\n    0.9372549019607842,\n    0.8431372549019608,\n    0.6352941176470588,\n    0.7254901960784313,\n    0.7843137254901962,\n    0.7647058823529411,\n    0.8,\n    0.7372549019607844,\n    0.5294117647058824,\n    0.5176470588235295,\n    0.3803921568627451,\n    0.32156862745098036,\n    0.3058823529411765,\n    0.29411764705882354,\n    0.23921568627450981,\n    0.1568627450980392,\n    0.16470588235294115,\n    0.23137254901960783,\n    0.1803921568627451,\n    0.16470588235294115,\n    0.1176470588235294,\n    0.21568627450980393,\n    0.16078431372549018,\n    0.1843137254901961,\n    0.2352941176470588,\n    0.23137254901960783,\n    0.17254901960784313,\n    0.11372549019607843,\n    0.1843137254901961,\n    0.7568627450980392,\n    0.9215686274509803,\n    0.8941176470588236,\n    0.8862745098039215,\n    0.7490196078431373,\n    0.8784313725490196,\n    0.7843137254901962,\n    0.403921568627451,\n    0.592156862745098,\n    0.8235294117647058,\n    0.21568627450980393,\n    0.15294117647058825,\n    0.47843137254901963,\n    0.4588235294117647,\n    0.5686274509803921,\n    0.3882352941176471,\n    0.18823529411764706,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.10980392156862745,\n    0.07450980392156863\n  ],\n  [\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.050980392156862744,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.14901960784313725,\n    0.9411764705882352,\n    0.9294117647058823,\n    0.9411764705882352,\n    0.9686274509803922,\n    0.6705882352941175,\n    0.8274509803921568,\n    0.7921568627450981,\n    0.8941176470588236,\n    0.8470588235294118,\n    0.7764705882352942,\n    0.8,\n    0.7294117647058823,\n    0.5647058823529412,\n    0.5254901960784314,\n    0.30196078431372547,\n    0.3058823529411765,\n    0.3176470588235294,\n    0.21568627450980393,\n    0.16862745098039217,\n    0.12156862745098039,\n    0.2,\n    0.21568627450980393,\n    0.16470588235294115,\n    0.17254901960784313,\n    0.2,\n    0.16862745098039217,\n    0.16470588235294115,\n    0.24705882352941178,\n    0.16078431372549018,\n    0.2352941176470588,\n    0.1568627450980392,\n    0.14901960784313725,\n    0.10980392156862745,\n    0.4,\n    0.9568627450980393,\n    0.8862745098039215,\n    0.8901960784313725,\n    0.7529411764705882,\n    0.8980392156862745,\n    0.8235294117647058,\n    0.4,\n    0.5176470588235295,\n    0.7921568627450981,\n    0.3686274509803922,\n    0.17647058823529413,\n    0.49019607843137253,\n    0.35294117647058826,\n    0.48627450980392156,\n    0.6901960784313725,\n    0.4196078431372549,\n    0.15294117647058825,\n    0.06666666666666667,\n    0.10980392156862745,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.047058823529411764,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.1411764705882353,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.25098039215686274,\n    0.9450980392156861,\n    0.9647058823529412,\n    0.8862745098039215,\n    0.6352941176470588,\n    0.7176470588235294,\n    0.8509803921568627,\n    0.8666666666666667,\n    0.9058823529411765,\n    0.7921568627450981,\n    0.8941176470588236,\n    0.7686274509803923,\n    0.6313725490196078,\n    0.5647058823529412,\n    0.39607843137254906,\n    0.3058823529411765,\n    0.30196078431372547,\n    0.2784313725490196,\n    0.22745098039215686,\n    0.32156862745098036,\n    0.10980392156862745,\n    0.1568627450980392,\n    0.16470588235294115,\n    0.2235294117647059,\n    0.20784313725490197,\n    0.13333333333333333,\n    0.0784313725490196,\n    0.16862745098039217,\n    0.1843137254901961,\n    0.2549019607843137,\n    0.19607843137254904,\n    0.12941176470588237,\n    0.19215686274509808,\n    0.1176470588235294,\n    0.34509803921568627,\n    0.8509803921568627,\n    0.7803921568627452,\n    0.9372549019607842,\n    0.6901960784313725,\n    0.7019607843137254,\n    0.9490196078431371,\n    0.41568627450980394,\n    0.5686274509803921,\n    0.2,\n    0.2784313725490196,\n    0.19215686274509808,\n    0.3568627450980392,\n    0.4588235294117647,\n    0.46274509803921565,\n    0.9607843137254902,\n    0.3882352941176471,\n    0.25098039215686274,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.10588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.8627450980392157,\n    0.9137254901960784,\n    0.9764705882352941,\n    0.5372549019607843,\n    0.7568627450980392,\n    0.7450980392156863,\n    0.8509803921568627,\n    0.8980392156862745,\n    0.8862745098039215,\n    0.8156862745098039,\n    0.7019607843137254,\n    0.592156862745098,\n    0.6078431372549019,\n    0.4392156862745098,\n    0.38431372549019616,\n    0.3411764705882353,\n    0.2901960784313726,\n    0.26666666666666666,\n    0.2980392156862745,\n    0.17647058823529413,\n    0.14901960784313725,\n    0.2,\n    0.16078431372549018,\n    0.09803921568627452,\n    0.1450980392156863,\n    0.14901960784313725,\n    0.11372549019607843,\n    0.21176470588235294,\n    0.16862745098039217,\n    0.1803921568627451,\n    0.1568627450980392,\n    0.16470588235294115,\n    0.1803921568627451,\n    0.1450980392156863,\n    0.0784313725490196,\n    0.803921568627451,\n    0.9098039215686274,\n    0.9333333333333332,\n    0.8588235294117647,\n    0.6313725490196078,\n    0.7607843137254902,\n    0.49019607843137253,\n    0.4196078431372549,\n    0.4823529411764706,\n    0.3294117647058823,\n    0.3137254901960784,\n    0.42745098039215684,\n    0.3137254901960784,\n    0.5490196078431373,\n    0.8901960784313725,\n    0.592156862745098,\n    0.30980392156862746,\n    0.09803921568627452,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.1176470588235294,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.9058823529411765,\n    0.9803921568627451,\n    0.5725490196078431,\n    0.6470588235294117,\n    0.6627450980392156,\n    0.8352941176470589,\n    0.7882352941176471,\n    0.8823529411764706,\n    0.7176470588235294,\n    0.8,\n    0.8627450980392157,\n    0.7529411764705882,\n    0.5411764705882353,\n    0.403921568627451,\n    0.4235294117647059,\n    0.4196078431372549,\n    0.3137254901960784,\n    0.27450980392156865,\n    0.3254901960784313,\n    0.12549019607843137,\n    0.16470588235294115,\n    0.14901960784313725,\n    0.19215686274509808,\n    0.1843137254901961,\n    0.12549019607843137,\n    0.16078431372549018,\n    0.12549019607843137,\n    0.17647058823529413,\n    0.21568627450980393,\n    0.19607843137254904,\n    0.20784313725490197,\n    0.22745098039215686,\n    0.22745098039215686,\n    0.15294117647058825,\n    0.10588235294117647,\n    0.9215686274509803,\n    0.8588235294117647,\n    0.9568627450980393,\n    0.7529411764705882,\n    0.8235294117647058,\n    0.9215686274509803,\n    0.4666666666666666,\n    0.5176470588235295,\n    0.7294117647058823,\n    0.4,\n    0.23137254901960783,\n    0.35294117647058826,\n    0.6470588235294117,\n    0.7215686274509804,\n    0.9019607843137255,\n    0.6392156862745098,\n    0.30196078431372547,\n    0.10980392156862745,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.11372549019607843,\n    0.10588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.12156862745098039,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.047058823529411764,\n    0.7960784313725491,\n    0.6235294117647059,\n    0.6823529411764706,\n    0.5294117647058824,\n    0.6313725490196078,\n    0.7490196078431373,\n    0.7568627450980392,\n    0.7843137254901962,\n    0.8235294117647058,\n    0.8235294117647058,\n    0.8470588235294118,\n    0.6392156862745098,\n    0.5725490196078431,\n    0.45098039215686275,\n    0.4196078431372549,\n    0.3882352941176471,\n    0.34901960784313724,\n    0.19607843137254904,\n    0.12156862745098039,\n    0.13725490196078433,\n    0.17647058823529413,\n    0.12941176470588237,\n    0.16470588235294115,\n    0.13725490196078433,\n    0.15294117647058825,\n    0.16078431372549018,\n    0.1450980392156863,\n    0.20392156862745098,\n    0.24705882352941178,\n    0.20392156862745098,\n    0.2196078431372549,\n    0.23137254901960783,\n    0.12941176470588237,\n    0.16078431372549018,\n    0.1843137254901961,\n    0.9411764705882352,\n    0.8941176470588236,\n    0.8509803921568627,\n    0.9215686274509803,\n    0.8117647058823529,\n    0.7607843137254902,\n    0.47450980392156855,\n    0.49019607843137253,\n    0.6588235294117646,\n    0.4823529411764706,\n    0.3921568627450981,\n    0.2901960784313726,\n    0.8313725490196079,\n    0.7725490196078433,\n    0.7764705882352942,\n    0.7333333333333333,\n    0.29411764705882354,\n    0.3686274509803922,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765\n  ],\n  [\n    0.06666666666666667,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.10588235294117647,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.10980392156862745,\n    0.07450980392156863,\n    0.11372549019607843,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.09803921568627452,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.027450980392156862,\n    0.7960784313725491,\n    0.7215686274509804,\n    0.5803921568627451,\n    0.6392156862745098,\n    0.7215686274509804,\n    0.7372549019607844,\n    0.7725490196078433,\n    0.8588235294117647,\n    0.8352941176470589,\n    0.8117647058823529,\n    0.7568627450980392,\n    0.7333333333333333,\n    0.615686274509804,\n    0.5725490196078431,\n    0.4392156862745098,\n    0.3137254901960784,\n    0.27058823529411763,\n    0.2,\n    0.1568627450980392,\n    0.14901960784313725,\n    0.1843137254901961,\n    0.10588235294117647,\n    0.1843137254901961,\n    0.16078431372549018,\n    0.17647058823529413,\n    0.09411764705882353,\n    0.17254901960784313,\n    0.1176470588235294,\n    0.23921568627450981,\n    0.1450980392156863,\n    0.16470588235294115,\n    0.16862745098039217,\n    0.17254901960784313,\n    0.09803921568627452,\n    0.13333333333333333,\n    0.9098039215686274,\n    0.8549019607843137,\n    0.9607843137254902,\n    0.8705882352941177,\n    0.7529411764705882,\n    0.8156862745098039,\n    0.46274509803921565,\n    0.46274509803921565,\n    0.7294117647058823,\n    0.4588235294117647,\n    0.34901960784313724,\n    0.41568627450980394,\n    0.7254901960784313,\n    0.8274509803921568,\n    0.8470588235294118,\n    0.6705882352941175,\n    0.5490196078431373,\n    0.24313725490196078,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.6470588235294117,\n    0.48627450980392156,\n    0.6941176470588235,\n    0.6509803921568627,\n    0.6784313725490196,\n    0.7450980392156863,\n    0.8666666666666667,\n    0.8352941176470589,\n    0.8274509803921568,\n    0.8509803921568627,\n    0.8392156862745098,\n    0.7568627450980392,\n    0.6941176470588235,\n    0.7215686274509804,\n    0.6784313725490196,\n    0.5411764705882353,\n    0.3176470588235294,\n    0.2823529411764706,\n    0.23921568627450981,\n    0.16470588235294115,\n    0.2196078431372549,\n    0.21568627450980393,\n    0.1803921568627451,\n    0.14901960784313725,\n    0.1176470588235294,\n    0.19215686274509808,\n    0.10196078431372549,\n    0.23921568627450981,\n    0.17254901960784313,\n    0.19607843137254904,\n    0.2,\n    0.17647058823529413,\n    0.1176470588235294,\n    0.14901960784313725,\n    0.12549019607843137,\n    0.09803921568627452,\n    0.7882352941176471,\n    0.8941176470588236,\n    0.8627450980392157,\n    0.8313725490196079,\n    0.8509803921568627,\n    0.8117647058823529,\n    0.5490196078431373,\n    0.44313725490196076,\n    0.7764705882352942,\n    0.5215686274509804,\n    0.4,\n    0.3882352941176471,\n    0.7529411764705882,\n    0.8509803921568627,\n    0.8823529411764706,\n    0.7921568627450981,\n    0.5058823529411764,\n    0.35294117647058826,\n    0.043137254901960784,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.0588235294117647,\n    0.5882352941176471,\n    0.6862745098039216,\n    0.8313725490196079,\n    0.7647058823529411,\n    0.6941176470588235,\n    0.9058823529411765,\n    0.9333333333333332,\n    0.8392156862745098,\n    0.8705882352941177,\n    0.7882352941176471,\n    0.7098039215686275,\n    0.6549019607843136,\n    0.5803921568627451,\n    0.5607843137254902,\n    0.5490196078431373,\n    0.7098039215686275,\n    0.26666666666666666,\n    0.30196078431372547,\n    0.1568627450980392,\n    0.4196078431372549,\n    0.17647058823529413,\n    0.21568627450980393,\n    0.17647058823529413,\n    0.17647058823529413,\n    0.23921568627450981,\n    0.19607843137254904,\n    0.09803921568627452,\n    0.1843137254901961,\n    0.10588235294117647,\n    0.20392156862745098,\n    0.12941176470588237,\n    0.12941176470588237,\n    0.13333333333333333,\n    0.13333333333333333,\n    0.09019607843137255,\n    0.1176470588235294,\n    0.8509803921568627,\n    0.8823529411764706,\n    0.8901960784313725,\n    0.5686274509803921,\n    0.7843137254901962,\n    0.7882352941176471,\n    0.5058823529411764,\n    0.3607843137254902,\n    0.7254901960784313,\n    0.6,\n    0.5098039215686274,\n    0.2627450980392157,\n    0.7254901960784313,\n    0.8980392156862745,\n    0.7607843137254902,\n    0.8470588235294118,\n    0.6196078431372549,\n    0.35294117647058826,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.06666666666666667,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.6509803921568627,\n    0.6039215686274509,\n    0.6901960784313725,\n    0.7647058823529411,\n    0.7137254901960784,\n    0.8274509803921568,\n    0.8235294117647058,\n    0.9333333333333332,\n    0.6627450980392156,\n    0.6352941176470588,\n    0.6941176470588235,\n    0.6666666666666665,\n    0.6901960784313725,\n    0.7960784313725491,\n    0.7215686274509804,\n    0.6745098039215687,\n    0.5450980392156862,\n    0.5843137254901961,\n    0.20392156862745098,\n    0.16470588235294115,\n    0.1803921568627451,\n    0.1843137254901961,\n    0.2196078431372549,\n    0.14901960784313725,\n    0.16470588235294115,\n    0.17254901960784313,\n    0.1568627450980392,\n    0.1450980392156863,\n    0.21176470588235294,\n    0.1803921568627451,\n    0.2196078431372549,\n    0.15294117647058825,\n    0.17647058823529413,\n    0.16862745098039217,\n    0.13725490196078433,\n    0.10980392156862745,\n    0.10588235294117647,\n    0.596078431372549,\n    0.7450980392156863,\n    0.6823529411764706,\n    0.7176470588235294,\n    0.7058823529411765,\n    0.8,\n    0.6823529411764706,\n    0.4549019607843137,\n    0.6745098039215687,\n    0.6313725490196078,\n    0.5568627450980392,\n    0.23921568627450981,\n    0.5764705882352941,\n    0.8941176470588236,\n    0.7686274509803923,\n    0.807843137254902,\n    0.5490196078431373,\n    0.47843137254901963,\n    0.09019607843137255,\n    0.10588235294117647,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863\n  ],\n  [\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.12549019607843137,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.050980392156862744,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.1450980392156863,\n    0.12156862745098039,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.5254901960784314,\n    0.7607843137254902,\n    0.5568627450980392,\n    0.8,\n    0.8117647058823529,\n    0.6392156862745098,\n    0.9764705882352941,\n    0.5686274509803921,\n    0.6392156862745098,\n    0.6039215686274509,\n    0.6,\n    0.7254901960784313,\n    0.7725490196078433,\n    0.6627450980392156,\n    0.7294117647058823,\n    0.7372549019607844,\n    0.6784313725490196,\n    0.6588235294117646,\n    0.3882352941176471,\n    0.2235294117647059,\n    0.2235294117647059,\n    0.25098039215686274,\n    0.21176470588235294,\n    0.1803921568627451,\n    0.13333333333333333,\n    0.16078431372549018,\n    0.17647058823529413,\n    0.14901960784313725,\n    0.20392156862745098,\n    0.16470588235294115,\n    0.16078431372549018,\n    0.19215686274509808,\n    0.13725490196078433,\n    0.12156862745098039,\n    0.1176470588235294,\n    0.10588235294117647,\n    0.12941176470588237,\n    0.5803921568627451,\n    0.5568627450980392,\n    0.7294117647058823,\n    0.7411764705882353,\n    0.8745098039215686,\n    0.8901960784313725,\n    0.6313725490196078,\n    0.43137254901960786,\n    0.6549019607843136,\n    0.7529411764705882,\n    0.6431372549019607,\n    0.20784313725490197,\n    0.5137254901960784,\n    0.7372549019607844,\n    0.6784313725490196,\n    0.8901960784313725,\n    0.5450980392156862,\n    0.3176470588235294,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.12156862745098039,\n    0.07450980392156863,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.047058823529411764,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.47450980392156855,\n    0.5843137254901961,\n    0.5490196078431373,\n    0.803921568627451,\n    0.7921568627450981,\n    0.6,\n    0.6274509803921569,\n    0.41568627450980394,\n    0.6274509803921569,\n    0.6235294117647059,\n    0.6313725490196078,\n    0.6941176470588235,\n    0.6666666666666665,\n    0.7803921568627452,\n    0.8588235294117647,\n    0.8352941176470589,\n    0.7764705882352942,\n    0.615686274509804,\n    0.8274509803921568,\n    0.5411764705882353,\n    0.30980392156862746,\n    0.30980392156862746,\n    0.2196078431372549,\n    0.30196078431372547,\n    0.24705882352941178,\n    0.23921568627450981,\n    0.23921568627450981,\n    0.1411764705882353,\n    0.12549019607843137,\n    0.09411764705882353,\n    0.1450980392156863,\n    0.16862745098039217,\n    0.1411764705882353,\n    0.17647058823529413,\n    0.11372549019607843,\n    0.1176470588235294,\n    0.11372549019607843,\n    0.17647058823529413,\n    0.615686274509804,\n    0.7019607843137254,\n    0.6078431372549019,\n    0.6666666666666665,\n    0.8470588235294118,\n    0.7882352941176471,\n    0.5882352941176471,\n    0.45098039215686275,\n    0.5098039215686274,\n    0.6901960784313725,\n    0.5764705882352941,\n    0.33725490196078434,\n    0.40784313725490196,\n    0.807843137254902,\n    0.803921568627451,\n    0.8862745098039215,\n    0.4235294117647059,\n    0.34901960784313724,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.07450980392156863\n  ],\n  [\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.10980392156862745,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.3764705882352941,\n    0.5254901960784314,\n    0.6274509803921569,\n    0.7098039215686275,\n    0.5607843137254902,\n    0.5803921568627451,\n    0.4588235294117647,\n    0.5647058823529412,\n    0.47843137254901963,\n    0.6235294117647059,\n    0.7254901960784313,\n    0.8666666666666667,\n    0.7176470588235294,\n    0.803921568627451,\n    0.8392156862745098,\n    0.7882352941176471,\n    0.8274509803921568,\n    0.8470588235294118,\n    0.7568627450980392,\n    0.5372549019607843,\n    0.2196078431372549,\n    0.2784313725490196,\n    0.22745098039215686,\n    0.3137254901960784,\n    0.34509803921568627,\n    0.3411764705882353,\n    0.2196078431372549,\n    0.19607843137254904,\n    0.14901960784313725,\n    0.16470588235294115,\n    0.20784313725490197,\n    0.21176470588235294,\n    0.19215686274509808,\n    0.18823529411764706,\n    0.10588235294117647,\n    0.13333333333333333,\n    0.1176470588235294,\n    0.19215686274509808,\n    0.5333333333333333,\n    0.7450980392156863,\n    0.7215686274509804,\n    0.6274509803921569,\n    0.8,\n    0.8313725490196079,\n    0.6392156862745098,\n    0.4705882352941176,\n    0.47450980392156855,\n    0.6941176470588235,\n    0.5137254901960784,\n    0.3921568627450981,\n    0.615686274509804,\n    0.7803921568627452,\n    0.9176470588235294,\n    0.5803921568627451,\n    0.403921568627451,\n    0.0784313725490196,\n    0.09803921568627452,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196\n  ],\n  [\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.5372549019607843,\n    0.4235294117647059,\n    0.4235294117647059,\n    0.6274509803921569,\n    0.5372549019607843,\n    0.5294117647058824,\n    0.4235294117647059,\n    0.5411764705882353,\n    0.48627450980392156,\n    0.6352941176470588,\n    0.6784313725490196,\n    0.8,\n    0.8666666666666667,\n    0.9058823529411765,\n    0.8313725490196079,\n    0.8705882352941177,\n    0.8941176470588236,\n    0.8,\n    0.7725490196078433,\n    0.7215686274509804,\n    0.5529411764705883,\n    0.2196078431372549,\n    0.2549019607843137,\n    0.2352941176470588,\n    0.3058823529411765,\n    0.3568627450980392,\n    0.2196078431372549,\n    0.3137254901960784,\n    0.27058823529411763,\n    0.1803921568627451,\n    0.18823529411764706,\n    0.22745098039215686,\n    0.1411764705882353,\n    0.20392156862745098,\n    0.1568627450980392,\n    0.10588235294117647,\n    0.1176470588235294,\n    0.10980392156862745,\n    0.10196078431372549,\n    0.5843137254901961,\n    0.7137254901960784,\n    0.6078431372549019,\n    0.6431372549019607,\n    0.6666666666666665,\n    0.7843137254901962,\n    0.7568627450980392,\n    0.3294117647058823,\n    0.3568627450980392,\n    0.10196078431372549,\n    0.11372549019607843,\n    0.13333333333333333,\n    0.27058823529411763,\n    0.1803921568627451,\n    0.12549019607843137,\n    0.10980392156862745,\n    0.12941176470588237,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.07450980392156863\n  ],\n  [\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.10588235294117647,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.5764705882352941,\n    0.48627450980392156,\n    0.45098039215686275,\n    0.6274509803921569,\n    0.6235294117647059,\n    0.5333333333333333,\n    0.5294117647058824,\n    0.5764705882352941,\n    0.6941176470588235,\n    0.6745098039215687,\n    0.6823529411764706,\n    0.7607843137254902,\n    0.7568627450980392,\n    0.5411764705882353,\n    0.6980392156862745,\n    0.6901960784313725,\n    0.7215686274509804,\n    0.7294117647058823,\n    0.7607843137254902,\n    0.7294117647058823,\n    0.592156862745098,\n    0.2901960784313726,\n    0.3568627450980392,\n    0.26666666666666666,\n    0.30980392156862746,\n    0.3411764705882353,\n    0.33725490196078434,\n    0.34901960784313724,\n    0.3058823529411765,\n    0.14901960784313725,\n    0.29411764705882354,\n    0.23137254901960783,\n    0.21176470588235294,\n    0.1568627450980392,\n    0.14901960784313725,\n    0.12549019607843137,\n    0.1176470588235294,\n    0.11372549019607843,\n    0.09411764705882353,\n    0.615686274509804,\n    0.7137254901960784,\n    0.6509803921568627,\n    0.615686274509804,\n    0.6431372549019607,\n    0.7215686274509804,\n    0.7372549019607844,\n    0.3254901960784313,\n    0.2196078431372549,\n    0.1176470588235294,\n    0.08235294117647057,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.09019607843137255,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.1568627450980392,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.050980392156862744,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.09019607843137255,\n    0.5058823529411764,\n    0.5843137254901961,\n    0.5215686274509804,\n    0.6627450980392156,\n    0.5843137254901961,\n    0.6431372549019607,\n    0.6078431372549019,\n    0.6666666666666665,\n    0.7098039215686275,\n    0.6705882352941175,\n    0.7176470588235294,\n    0.6823529411764706,\n    0.7725490196078433,\n    0.8352941176470589,\n    0.6901960784313725,\n    0.6470588235294117,\n    0.6784313725490196,\n    0.7019607843137254,\n    0.7254901960784313,\n    0.6862745098039216,\n    0.6470588235294117,\n    0.2784313725490196,\n    0.3137254901960784,\n    0.2196078431372549,\n    0.3607843137254902,\n    0.3176470588235294,\n    0.32156862745098036,\n    0.32156862745098036,\n    0.26666666666666666,\n    0.33725490196078434,\n    0.30196078431372547,\n    0.34901960784313724,\n    0.21176470588235294,\n    0.2196078431372549,\n    0.13333333333333333,\n    0.10980392156862745,\n    0.09803921568627452,\n    0.1176470588235294,\n    0.10980392156862745,\n    0.6509803921568627,\n    0.4823529411764706,\n    0.6039215686274509,\n    0.5764705882352941,\n    0.4823529411764706,\n    0.5372549019607843,\n    0.6862745098039216,\n    0.2823529411764706,\n    0.2,\n    0.23137254901960783,\n    0.08235294117647057,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.07058823529411765,\n    0.4117647058823529,\n    0.4980392156862745,\n    0.7137254901960784,\n    0.5843137254901961,\n    0.44313725490196076,\n    0.6470588235294117,\n    0.5294117647058824,\n    0.7137254901960784,\n    0.6274509803921569,\n    0.6549019607843136,\n    0.807843137254902,\n    0.7647058823529411,\n    0.7019607843137254,\n    0.5882352941176471,\n    0.7176470588235294,\n    0.6352941176470588,\n    0.7333333333333333,\n    0.6862745098039216,\n    0.7098039215686275,\n    0.6823529411764706,\n    0.6862745098039216,\n    0.5529411764705883,\n    0.4705882352941176,\n    0.3568627450980392,\n    0.32156862745098036,\n    0.24705882352941178,\n    0.34509803921568627,\n    0.33725490196078434,\n    0.3058823529411765,\n    0.2980392156862745,\n    0.23921568627450981,\n    0.2549019607843137,\n    0.3176470588235294,\n    0.16078431372549018,\n    0.32156862745098036,\n    0.12549019607843137,\n    0.1176470588235294,\n    0.16078431372549018,\n    0.12156862745098039,\n    0.08235294117647057,\n    0.6823529411764706,\n    0.5803921568627451,\n    0.611764705882353,\n    0.615686274509804,\n    0.596078431372549,\n    0.6352941176470588,\n    0.7019607843137254,\n    0.2784313725490196,\n    0.20784313725490197,\n    0.1176470588235294,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.17647058823529413,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.09411764705882353,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.43137254901960786,\n    0.5294117647058824,\n    0.5725490196078431,\n    0.6862745098039216,\n    0.6470588235294117,\n    0.5843137254901961,\n    0.6941176470588235,\n    0.6666666666666665,\n    0.7333333333333333,\n    0.7215686274509804,\n    0.7529411764705882,\n    0.7372549019607844,\n    0.8,\n    0.6745098039215687,\n    0.6,\n    0.6666666666666665,\n    0.6392156862745098,\n    0.6470588235294117,\n    0.6509803921568627,\n    0.6078431372549019,\n    0.7294117647058823,\n    0.6549019607843136,\n    0.6431372549019607,\n    0.4470588235294118,\n    0.34509803921568627,\n    0.23921568627450981,\n    0.24313725490196078,\n    0.2901960784313726,\n    0.2549019607843137,\n    0.3176470588235294,\n    0.13333333333333333,\n    0.25098039215686274,\n    0.2,\n    0.1803921568627451,\n    0.33333333333333326,\n    0.15294117647058825,\n    0.2,\n    0.15294117647058825,\n    0.12549019607843137,\n    0.10980392156862745,\n    0.5568627450980392,\n    0.5843137254901961,\n    0.5254901960784314,\n    0.6549019607843136,\n    0.8509803921568627,\n    0.6745098039215687,\n    0.6901960784313725,\n    0.1450980392156863,\n    0.20784313725490197,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.0588235294117647,\n    0.11372549019607843,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863\n  ],\n  [\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.047058823529411764,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.4588235294117647,\n    0.5333333333333333,\n    0.596078431372549,\n    0.5254901960784314,\n    0.5490196078431373,\n    0.7333333333333333,\n    0.6392156862745098,\n    0.8588235294117647,\n    0.7960784313725491,\n    0.7058823529411765,\n    0.7607843137254902,\n    0.7568627450980392,\n    0.6862745098039216,\n    0.596078431372549,\n    0.48627450980392156,\n    0.5764705882352941,\n    0.5803921568627451,\n    0.6941176470588235,\n    0.6901960784313725,\n    0.6039215686274509,\n    0.6549019607843136,\n    0.6509803921568627,\n    0.615686274509804,\n    0.4588235294117647,\n    0.33725490196078434,\n    0.32156862745098036,\n    0.27058823529411763,\n    0.14901960784313725,\n    0.2980392156862745,\n    0.30196078431372547,\n    0.25098039215686274,\n    0.3137254901960784,\n    0.25882352941176473,\n    0.2627450980392157,\n    0.26666666666666666,\n    0.2901960784313726,\n    0.25882352941176473,\n    0.22745098039215686,\n    0.1411764705882353,\n    0.11372549019607843,\n    0.5019607843137255,\n    0.45098039215686275,\n    0.49411764705882355,\n    0.6274509803921569,\n    0.3764705882352941,\n    0.4196078431372549,\n    0.4549019607843137,\n    0.2901960784313726,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.12549019607843137,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.30196078431372547,\n    0.5098039215686274,\n    0.5372549019607843,\n    0.6392156862745098,\n    0.592156862745098,\n    0.6745098039215687,\n    0.7921568627450981,\n    0.7725490196078433,\n    0.6705882352941175,\n    0.8666666666666667,\n    0.8392156862745098,\n    0.7372549019607844,\n    0.596078431372549,\n    0.5137254901960784,\n    0.5333333333333333,\n    0.5450980392156862,\n    0.5137254901960784,\n    0.6196078431372549,\n    0.5882352941176471,\n    0.6509803921568627,\n    0.5607843137254902,\n    0.611764705882353,\n    0.596078431372549,\n    0.5019607843137255,\n    0.35294117647058826,\n    0.32156862745098036,\n    0.2980392156862745,\n    0.24313725490196078,\n    0.23921568627450981,\n    0.2549019607843137,\n    0.12941176470588237,\n    0.27450980392156865,\n    0.22745098039215686,\n    0.24705882352941178,\n    0.2627450980392157,\n    0.39607843137254906,\n    0.2,\n    0.29411764705882354,\n    0.27450980392156865,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.09019607843137255,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.10588235294117647,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.5176470588235295,\n    0.5490196078431373,\n    0.7372549019607844,\n    0.6196078431372549,\n    0.7215686274509804,\n    0.8196078431372549,\n    0.7568627450980392,\n    0.8627450980392157,\n    0.7803921568627452,\n    0.8274509803921568,\n    0.7568627450980392,\n    0.6941176470588235,\n    0.6235294117647059,\n    0.5686274509803921,\n    0.5490196078431373,\n    0.5372549019607843,\n    0.5686274509803921,\n    0.5019607843137255,\n    0.5450980392156862,\n    0.4549019607843137,\n    0.5411764705882353,\n    0.5882352941176471,\n    0.6196078431372549,\n    0.47843137254901963,\n    0.4392156862745098,\n    0.35294117647058826,\n    0.3254901960784313,\n    0.21176470588235294,\n    0.13725490196078433,\n    0.2196078431372549,\n    0.26666666666666666,\n    0.2352941176470588,\n    0.2235294117647059,\n    0.26666666666666666,\n    0.28627450980392155,\n    0.29411764705882354,\n    0.24313725490196078,\n    0.30980392156862746,\n    0.26666666666666666,\n    0.23921568627450981,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.11372549019607843,\n    0.12549019607843137,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.047058823529411764,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.5725490196078431,\n    0.6745098039215687,\n    0.5098039215686274,\n    0.6705882352941175,\n    0.7921568627450981,\n    0.8745098039215686,\n    0.8901960784313725,\n    0.8627450980392157,\n    0.8470588235294118,\n    0.8549019607843137,\n    0.7725490196078433,\n    0.6980392156862745,\n    0.5607843137254902,\n    0.5098039215686274,\n    0.4666666666666666,\n    0.5137254901960784,\n    0.49019607843137253,\n    0.6313725490196078,\n    0.6313725490196078,\n    0.6235294117647059,\n    0.43137254901960786,\n    0.4823529411764706,\n    0.5725490196078431,\n    0.5607843137254902,\n    0.5176470588235295,\n    0.3686274509803922,\n    0.36470588235294116,\n    0.26666666666666666,\n    0.2627450980392157,\n    0.2549019607843137,\n    0.16862745098039217,\n    0.16078431372549018,\n    0.20392156862745098,\n    0.21176470588235294,\n    0.18823529411764706,\n    0.3176470588235294,\n    0.1568627450980392,\n    0.32156862745098036,\n    0.33725490196078434,\n    0.2352941176470588,\n    0.12549019607843137,\n    0.10980392156862745,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.10196078431372549,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.49411764705882355,\n    0.6980392156862745,\n    0.6705882352941175,\n    0.611764705882353,\n    0.6666666666666665,\n    0.8431372549019608,\n    0.8941176470588236,\n    0.9215686274509803,\n    0.7843137254901962,\n    0.8588235294117647,\n    0.8156862745098039,\n    0.8470588235294118,\n    0.6549019607843136,\n    0.5333333333333333,\n    0.5098039215686274,\n    0.43137254901960786,\n    0.4666666666666666,\n    0.5215686274509804,\n    0.5019607843137255,\n    0.5058823529411764,\n    0.5450980392156862,\n    0.5215686274509804,\n    0.5490196078431373,\n    0.5843137254901961,\n    0.6,\n    0.592156862745098,\n    0.4196078431372549,\n    0.32156862745098036,\n    0.19607843137254904,\n    0.25882352941176473,\n    0.25882352941176473,\n    0.12156862745098039,\n    0.2196078431372549,\n    0.23921568627450981,\n    0.1568627450980392,\n    0.12941176470588237,\n    0.2784313725490196,\n    0.23921568627450981,\n    0.17647058823529413,\n    0.29411764705882354,\n    0.1411764705882353,\n    0.2549019607843137,\n    0.11372549019607843,\n    0.09411764705882353,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.1176470588235294,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.1843137254901961,\n    0.7137254901960784,\n    0.7058823529411765,\n    0.5254901960784314,\n    0.611764705882353,\n    0.45098039215686275,\n    0.8196078431372549,\n    0.8156862745098039,\n    0.7843137254901962,\n    0.8941176470588236,\n    0.8588235294117647,\n    0.8431372549019608,\n    0.7254901960784313,\n    0.5450980392156862,\n    0.5215686274509804,\n    0.4705882352941176,\n    0.5098039215686274,\n    0.5607843137254902,\n    0.4549019607843137,\n    0.4196078431372549,\n    0.5764705882352941,\n    0.47843137254901963,\n    0.4392156862745098,\n    0.5450980392156862,\n    0.4980392156862745,\n    0.5647058823529412,\n    0.5764705882352941,\n    0.5254901960784314,\n    0.26666666666666666,\n    0.2235294117647059,\n    0.15294117647058825,\n    0.2235294117647059,\n    0.23137254901960783,\n    0.29411764705882354,\n    0.25098039215686274,\n    0.2352941176470588,\n    0.24705882352941178,\n    0.19215686274509808,\n    0.24313725490196078,\n    0.25098039215686274,\n    0.2352941176470588,\n    0.2,\n    0.2784313725490196,\n    0.25882352941176473,\n    0.10980392156862745,\n    0.08235294117647057,\n    0.10980392156862745,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.08235294117647057,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.6274509803921569,\n    0.7529411764705882,\n    0.6588235294117646,\n    0.611764705882353,\n    0.6666666666666665,\n    0.6784313725490196,\n    0.8156862745098039,\n    0.9058823529411765,\n    0.9058823529411765,\n    0.9058823529411765,\n    0.8470588235294118,\n    0.7803921568627452,\n    0.6901960784313725,\n    0.6941176470588235,\n    0.5607843137254902,\n    0.4823529411764706,\n    0.42745098039215684,\n    0.4666666666666666,\n    0.5725490196078431,\n    0.4823529411764706,\n    0.43137254901960786,\n    0.5137254901960784,\n    0.4705882352941176,\n    0.4470588235294118,\n    0.48627450980392156,\n    0.47450980392156855,\n    0.5372549019607843,\n    0.3764705882352941,\n    0.29411764705882354,\n    0.16470588235294115,\n    0.2784313725490196,\n    0.13725490196078433,\n    0.2901960784313726,\n    0.18823529411764706,\n    0.21568627450980393,\n    0.22745098039215686,\n    0.20392156862745098,\n    0.1568627450980392,\n    0.34509803921568627,\n    0.25882352941176473,\n    0.1843137254901961,\n    0.2235294117647059,\n    0.2196078431372549,\n    0.27058823529411763,\n    0.20392156862745098,\n    0.13333333333333333,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.050980392156862744,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.12156862745098039,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.2352941176470588,\n    0.7176470588235294,\n    0.7058823529411765,\n    0.6078431372549019,\n    0.5803921568627451,\n    0.6,\n    0.8784313725490196,\n    0.7803921568627452,\n    0.807843137254902,\n    0.8352941176470589,\n    0.6705882352941175,\n    0.6862745098039216,\n    0.7333333333333333,\n    0.6941176470588235,\n    0.46274509803921565,\n    0.5098039215686274,\n    0.47450980392156855,\n    0.4392156862745098,\n    0.4588235294117647,\n    0.46274509803921565,\n    0.4117647058823529,\n    0.44313725490196076,\n    0.45098039215686275,\n    0.4666666666666666,\n    0.4117647058823529,\n    0.42745098039215684,\n    0.5137254901960784,\n    0.4196078431372549,\n    0.3764705882352941,\n    0.3176470588235294,\n    0.13725490196078433,\n    0.2352941176470588,\n    0.16078431372549018,\n    0.27450980392156865,\n    0.19215686274509808,\n    0.27058823529411763,\n    0.27058823529411763,\n    0.28627450980392155,\n    0.08627450980392157,\n    0.30980392156862746,\n    0.3137254901960784,\n    0.19607843137254904,\n    0.25098039215686274,\n    0.3137254901960784,\n    0.22745098039215686,\n    0.1803921568627451,\n    0.1803921568627451,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.10980392156862745,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.09411764705882353,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.6235294117647059,\n    0.7294117647058823,\n    0.5882352941176471,\n    0.6588235294117646,\n    0.6039215686274509,\n    0.6627450980392156,\n    0.8117647058823529,\n    0.5803921568627451,\n    0.4980392156862745,\n    0.5411764705882353,\n    0.6549019607843136,\n    0.6862745098039216,\n    0.596078431372549,\n    0.6,\n    0.49411764705882355,\n    0.4588235294117647,\n    0.45098039215686275,\n    0.4823529411764706,\n    0.40784313725490196,\n    0.43137254901960786,\n    0.4549019607843137,\n    0.39607843137254906,\n    0.47843137254901963,\n    0.48627450980392156,\n    0.4823529411764706,\n    0.6705882352941175,\n    0.5294117647058824,\n    0.4588235294117647,\n    0.3294117647058823,\n    0.2549019607843137,\n    0.1450980392156863,\n    0.2,\n    0.14901960784313725,\n    0.24705882352941178,\n    0.2549019607843137,\n    0.27058823529411763,\n    0.25882352941176473,\n    0.27450980392156865,\n    0.1176470588235294,\n    0.2627450980392157,\n    0.3568627450980392,\n    0.2549019607843137,\n    0.1568627450980392,\n    0.2549019607843137,\n    0.2549019607843137,\n    0.26666666666666666,\n    0.26666666666666666,\n    0.16470588235294115,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.11372549019607843,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.11372549019607843,\n    0.06274509803921569,\n    0.047058823529411764,\n    0.07058823529411765,\n    0.7098039215686275,\n    0.6509803921568627,\n    0.6,\n    0.6666666666666665,\n    0.6039215686274509,\n    0.7803921568627452,\n    0.7058823529411765,\n    0.4549019607843137,\n    0.5137254901960784,\n    0.45098039215686275,\n    0.5176470588235295,\n    0.611764705882353,\n    0.5843137254901961,\n    0.6039215686274509,\n    0.4666666666666666,\n    0.4588235294117647,\n    0.47843137254901963,\n    0.4235294117647059,\n    0.43137254901960786,\n    0.4196078431372549,\n    0.44313725490196076,\n    0.38431372549019616,\n    0.4392156862745098,\n    0.4,\n    0.48627450980392156,\n    0.5372549019607843,\n    0.5490196078431373,\n    0.4705882352941176,\n    0.3921568627450981,\n    0.2,\n    0.1450980392156863,\n    0.20392156862745098,\n    0.1411764705882353,\n    0.23921568627450981,\n    0.30196078431372547,\n    0.24313725490196078,\n    0.25882352941176473,\n    0.2627450980392157,\n    0.1411764705882353,\n    0.2823529411764706,\n    0.3058823529411765,\n    0.25098039215686274,\n    0.12549019607843137,\n    0.27450980392156865,\n    0.23137254901960783,\n    0.2901960784313726,\n    0.1450980392156863,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.050980392156862744,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.050980392156862744,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765\n  ],\n  [\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.050980392156862744,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.6,\n    0.7490196078431373,\n    0.5372549019607843,\n    0.6039215686274509,\n    0.5607843137254902,\n    0.6274509803921569,\n    0.7803921568627452,\n    0.6274509803921569,\n    0.43529411764705883,\n    0.4666666666666666,\n    0.49019607843137253,\n    0.5019607843137255,\n    0.5529411764705883,\n    0.615686274509804,\n    0.5411764705882353,\n    0.48627450980392156,\n    0.4549019607843137,\n    0.49411764705882355,\n    0.3607843137254902,\n    0.4470588235294118,\n    0.41568627450980394,\n    0.5058823529411764,\n    0.4117647058823529,\n    0.3686274509803922,\n    0.5725490196078431,\n    0.4980392156862745,\n    0.6,\n    0.592156862745098,\n    0.5372549019607843,\n    0.4,\n    0.23137254901960783,\n    0.21568627450980393,\n    0.19215686274509808,\n    0.14901960784313725,\n    0.20784313725490197,\n    0.2980392156862745,\n    0.2549019607843137,\n    0.27058823529411763,\n    0.22745098039215686,\n    0.10980392156862745,\n    0.27450980392156865,\n    0.25098039215686274,\n    0.25882352941176473,\n    0.12941176470588237,\n    0.25882352941176473,\n    0.24313725490196078,\n    0.2196078431372549,\n    0.25098039215686274,\n    0.16862745098039217,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.047058823529411764,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.16470588235294115,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.11372549019607843,\n    0.6980392156862745,\n    0.7333333333333333,\n    0.6313725490196078,\n    0.6392156862745098,\n    0.592156862745098,\n    0.7686274509803923,\n    0.6823529411764706,\n    0.6235294117647059,\n    0.3058823529411765,\n    0.4470588235294118,\n    0.403921568627451,\n    0.4823529411764706,\n    0.5607843137254902,\n    0.6431372549019607,\n    0.6666666666666665,\n    0.4549019607843137,\n    0.45098039215686275,\n    0.47843137254901963,\n    0.39607843137254906,\n    0.4470588235294118,\n    0.4470588235294118,\n    0.403921568627451,\n    0.3176470588235294,\n    0.4588235294117647,\n    0.5019607843137255,\n    0.5686274509803921,\n    0.6039215686274509,\n    0.5450980392156862,\n    0.5215686274509804,\n    0.44313725490196076,\n    0.27058823529411763,\n    0.2,\n    0.2,\n    0.2,\n    0.3137254901960784,\n    0.3137254901960784,\n    0.30196078431372547,\n    0.23137254901960783,\n    0.27058823529411763,\n    0.12549019607843137,\n    0.34901960784313724,\n    0.3607843137254902,\n    0.2980392156862745,\n    0.1843137254901961,\n    0.19607843137254904,\n    0.17254901960784313,\n    0.2627450980392157,\n    0.2627450980392157,\n    0.21568627450980393,\n    0.13333333333333333,\n    0.054901960784313725,\n    0.09411764705882353,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.10588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.10588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.10588235294117647,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.12156862745098039,\n    0.06274509803921569,\n    0.10196078431372549,\n    0.07450980392156863,\n    0.7176470588235294,\n    0.6980392156862745,\n    0.6274509803921569,\n    0.5372549019607843,\n    0.5372549019607843,\n    0.8235294117647058,\n    0.9450980392156861,\n    0.8705882352941177,\n    0.4980392156862745,\n    0.4588235294117647,\n    0.4823529411764706,\n    0.44313725490196076,\n    0.5294117647058824,\n    0.49019607843137253,\n    0.6352941176470588,\n    0.611764705882353,\n    0.5490196078431373,\n    0.5137254901960784,\n    0.43529411764705883,\n    0.3921568627450981,\n    0.2980392156862745,\n    0.4666666666666666,\n    0.40784313725490196,\n    0.4392156862745098,\n    0.3411764705882353,\n    0.6196078431372549,\n    0.5333333333333333,\n    0.5686274509803921,\n    0.5686274509803921,\n    0.5215686274509804,\n    0.4196078431372549,\n    0.3058823529411765,\n    0.21176470588235294,\n    0.21176470588235294,\n    0.2,\n    0.13725490196078433,\n    0.2823529411764706,\n    0.21568627450980393,\n    0.2549019607843137,\n    0.16078431372549018,\n    0.1450980392156863,\n    0.34901960784313724,\n    0.3137254901960784,\n    0.35294117647058826,\n    0.23137254901960783,\n    0.18823529411764706,\n    0.13725490196078433,\n    0.3568627450980392,\n    0.2823529411764706,\n    0.22745098039215686,\n    0.19607843137254904,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.09803921568627452,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.050980392156862744,\n    0.06274509803921569,\n    0.047058823529411764,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.22745098039215686,\n    0.7176470588235294,\n    0.6627450980392156,\n    0.6,\n    0.5803921568627451,\n    0.6980392156862745,\n    0.8196078431372549,\n    0.8666666666666667,\n    0.8745098039215686,\n    0.592156862745098,\n    0.3137254901960784,\n    0.3254901960784313,\n    0.4549019607843137,\n    0.47843137254901963,\n    0.5450980392156862,\n    0.6862745098039216,\n    0.6392156862745098,\n    0.615686274509804,\n    0.5411764705882353,\n    0.46274509803921565,\n    0.4705882352941176,\n    0.47450980392156855,\n    0.47450980392156855,\n    0.4196078431372549,\n    0.3607843137254902,\n    0.4117647058823529,\n    0.6235294117647059,\n    0.7058823529411765,\n    0.6352941176470588,\n    0.5333333333333333,\n    0.5568627450980392,\n    0.25882352941176473,\n    0.3176470588235294,\n    0.23921568627450981,\n    0.17647058823529413,\n    0.10588235294117647,\n    0.1843137254901961,\n    0.29411764705882354,\n    0.19607843137254904,\n    0.24705882352941178,\n    0.22745098039215686,\n    0.16862745098039217,\n    0.35294117647058826,\n    0.4117647058823529,\n    0.34509803921568627,\n    0.30196078431372547,\n    0.19215686274509808,\n    0.25098039215686274,\n    0.17647058823529413,\n    0.1568627450980392,\n    0.23137254901960783,\n    0.17647058823529413,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.050980392156862744,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.10196078431372549,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.14901960784313725,\n    0.5725490196078431,\n    0.7176470588235294,\n    0.5529411764705883,\n    0.5568627450980392,\n    0.6078431372549019,\n    0.7450980392156863,\n    0.8666666666666667,\n    0.8352941176470589,\n    0.8274509803921568,\n    0.5294117647058824,\n    0.3764705882352941,\n    0.3607843137254902,\n    0.43529411764705883,\n    0.4588235294117647,\n    0.5882352941176471,\n    0.596078431372549,\n    0.592156862745098,\n    0.5803921568627451,\n    0.5411764705882353,\n    0.4470588235294118,\n    0.42745098039215684,\n    0.39607843137254906,\n    0.4235294117647059,\n    0.39607843137254906,\n    0.3882352941176471,\n    0.47843137254901963,\n    0.5568627450980392,\n    0.6705882352941175,\n    0.6431372549019607,\n    0.5725490196078431,\n    0.5647058823529412,\n    0.33725490196078434,\n    0.27058823529411763,\n    0.28627450980392155,\n    0.2235294117647059,\n    0.19607843137254904,\n    0.20392156862745098,\n    0.17254901960784313,\n    0.20784313725490197,\n    0.24705882352941178,\n    0.2352941176470588,\n    0.2823529411764706,\n    0.3764705882352941,\n    0.33333333333333326,\n    0.34901960784313724,\n    0.3254901960784313,\n    0.25098039215686274,\n    0.20392156862745098,\n    0.19607843137254904,\n    0.2901960784313726,\n    0.24705882352941178,\n    0.21176470588235294,\n    0.09411764705882353,\n    0.08235294117647057,\n    0.10196078431372549,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.06274509803921569,\n    0.050980392156862744,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.18823529411764706,\n    0.6392156862745098,\n    0.6784313725490196,\n    0.6235294117647059,\n    0.6274509803921569,\n    0.6666666666666665,\n    0.8117647058823529,\n    0.8705882352941177,\n    0.8431372549019608,\n    0.6627450980392156,\n    0.5647058823529412,\n    0.4,\n    0.40784313725490196,\n    0.3803921568627451,\n    0.4980392156862745,\n    0.5647058823529412,\n    0.5764705882352941,\n    0.5450980392156862,\n    0.6,\n    0.5490196078431373,\n    0.4392156862745098,\n    0.39607843137254906,\n    0.43137254901960786,\n    0.4,\n    0.3686274509803922,\n    0.4,\n    0.4588235294117647,\n    0.5882352941176471,\n    0.615686274509804,\n    0.5450980392156862,\n    0.6274509803921569,\n    0.5098039215686274,\n    0.43529411764705883,\n    0.28627450980392155,\n    0.2823529411764706,\n    0.19215686274509808,\n    0.1843137254901961,\n    0.1176470588235294,\n    0.17254901960784313,\n    0.2784313725490196,\n    0.18823529411764706,\n    0.2352941176470588,\n    0.2235294117647059,\n    0.3607843137254902,\n    0.33333333333333326,\n    0.3176470588235294,\n    0.3568627450980392,\n    0.22745098039215686,\n    0.20784313725490197,\n    0.16862745098039217,\n    0.21568627450980393,\n    0.2823529411764706,\n    0.22745098039215686,\n    0.12941176470588237,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.10980392156862745\n  ],\n  [\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.047058823529411764,\n    0.0588235294117647,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.13725490196078433,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.49019607843137253,\n    0.6470588235294117,\n    0.6392156862745098,\n    0.5607843137254902,\n    0.5882352941176471,\n    0.7843137254901962,\n    0.9019607843137255,\n    0.8235294117647058,\n    0.8823529411764706,\n    0.6745098039215687,\n    0.5215686274509804,\n    0.4549019607843137,\n    0.33725490196078434,\n    0.34509803921568627,\n    0.5137254901960784,\n    0.5607843137254902,\n    0.6392156862745098,\n    0.596078431372549,\n    0.5882352941176471,\n    0.48627450980392156,\n    0.45098039215686275,\n    0.3607843137254902,\n    0.4235294117647059,\n    0.3607843137254902,\n    0.25882352941176473,\n    0.44313725490196076,\n    0.4196078431372549,\n    0.5490196078431373,\n    0.5803921568627451,\n    0.5764705882352941,\n    0.6078431372549019,\n    0.4705882352941176,\n    0.43137254901960786,\n    0.2627450980392157,\n    0.2980392156862745,\n    0.17647058823529413,\n    0.16862745098039217,\n    0.2627450980392157,\n    0.2352941176470588,\n    0.16862745098039217,\n    0.16862745098039217,\n    0.18823529411764706,\n    0.2980392156862745,\n    0.3254901960784313,\n    0.3411764705882353,\n    0.3803921568627451,\n    0.33333333333333326,\n    0.2235294117647059,\n    0.19607843137254904,\n    0.2352941176470588,\n    0.27058823529411763,\n    0.1568627450980392,\n    0.2,\n    0.12156862745098039,\n    0.10588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.09411764705882353,\n    0.1176470588235294,\n    0.07058823529411765,\n    0.28627450980392155,\n    0.6431372549019607,\n    0.5882352941176471,\n    0.6,\n    0.6470588235294117,\n    0.5490196078431373,\n    0.7411764705882353,\n    0.9333333333333332,\n    0.7921568627450981,\n    0.7843137254901962,\n    0.592156862745098,\n    0.5176470588235295,\n    0.3921568627450981,\n    0.3411764705882353,\n    0.33725490196078434,\n    0.4980392156862745,\n    0.5725490196078431,\n    0.5490196078431373,\n    0.6274509803921569,\n    0.5254901960784314,\n    0.5176470588235295,\n    0.4117647058823529,\n    0.403921568627451,\n    0.40784313725490196,\n    0.4392156862745098,\n    0.4,\n    0.2823529411764706,\n    0.4392156862745098,\n    0.592156862745098,\n    0.6313725490196078,\n    0.5372549019607843,\n    0.6,\n    0.48627450980392156,\n    0.3764705882352941,\n    0.23137254901960783,\n    0.2627450980392157,\n    0.2352941176470588,\n    0.1411764705882353,\n    0.1568627450980392,\n    0.1450980392156863,\n    0.19607843137254904,\n    0.13725490196078433,\n    0.17254901960784313,\n    0.25882352941176473,\n    0.2823529411764706,\n    0.25882352941176473,\n    0.2549019607843137,\n    0.20392156862745098,\n    0.30980392156862746,\n    0.2352941176470588,\n    0.2196078431372549,\n    0.29411764705882354,\n    0.17647058823529413,\n    0.13725490196078433,\n    0.10588235294117647,\n    0.10196078431372549,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.09019607843137255,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863\n  ],\n  [\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.07450980392156863,\n    0.054901960784313725,\n    0.054901960784313725,\n    0.1176470588235294,\n    0.050980392156862744,\n    0.054901960784313725,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.5803921568627451,\n    0.6235294117647059,\n    0.5450980392156862,\n    0.6235294117647059,\n    0.6627450980392156,\n    0.7215686274509804,\n    0.8352941176470589,\n    0.8901960784313725,\n    0.7568627450980392,\n    0.5686274509803921,\n    0.615686274509804,\n    0.44313725490196076,\n    0.4666666666666666,\n    0.3254901960784313,\n    0.35294117647058826,\n    0.43137254901960786,\n    0.5882352941176471,\n    0.5843137254901961,\n    0.6274509803921569,\n    0.5843137254901961,\n    0.4235294117647059,\n    0.39607843137254906,\n    0.4549019607843137,\n    0.3254901960784313,\n    0.3686274509803922,\n    0.3803921568627451,\n    0.3921568627450981,\n    0.4,\n    0.5803921568627451,\n    0.5686274509803921,\n    0.5176470588235295,\n    0.5058823529411764,\n    0.3882352941176471,\n    0.35294117647058826,\n    0.3254901960784313,\n    0.19215686274509808,\n    0.20784313725490197,\n    0.16862745098039217,\n    0.1411764705882353,\n    0.08627450980392157,\n    0.20784313725490197,\n    0.22745098039215686,\n    0.2196078431372549,\n    0.12941176470588237,\n    0.23137254901960783,\n    0.22745098039215686,\n    0.24313725490196078,\n    0.13333333333333333,\n    0.1411764705882353,\n    0.1843137254901961,\n    0.22745098039215686,\n    0.1411764705882353,\n    0.2352941176470588,\n    0.12156862745098039,\n    0.12156862745098039,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.1411764705882353,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765\n  ],\n  [\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.047058823529411764,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.6235294117647059,\n    0.5490196078431373,\n    0.5803921568627451,\n    0.5803921568627451,\n    0.6980392156862745,\n    0.803921568627451,\n    0.8156862745098039,\n    0.7960784313725491,\n    0.5568627450980392,\n    0.6352941176470588,\n    0.5647058823529412,\n    0.611764705882353,\n    0.47843137254901963,\n    0.34509803921568627,\n    0.3411764705882353,\n    0.38431372549019616,\n    0.5411764705882353,\n    0.5764705882352941,\n    0.6039215686274509,\n    0.5686274509803921,\n    0.3882352941176471,\n    0.4196078431372549,\n    0.41568627450980394,\n    0.37254901960784315,\n    0.38431372549019616,\n    0.45098039215686275,\n    0.36470588235294116,\n    0.5254901960784314,\n    0.6392156862745098,\n    0.615686274509804,\n    0.5882352941176471,\n    0.5294117647058824,\n    0.5254901960784314,\n    0.44313725490196076,\n    0.32156862745098036,\n    0.2980392156862745,\n    0.26666666666666666,\n    0.17647058823529413,\n    0.18823529411764706,\n    0.17254901960784313,\n    0.14901960784313725,\n    0.1843137254901961,\n    0.19607843137254904,\n    0.1568627450980392,\n    0.2196078431372549,\n    0.13333333333333333,\n    0.15294117647058825,\n    0.21568627450980393,\n    0.21176470588235294,\n    0.23137254901960783,\n    0.2235294117647059,\n    0.19607843137254904,\n    0.2784313725490196,\n    0.2235294117647059,\n    0.12941176470588237,\n    0.10196078431372549,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765\n  ],\n  [\n    0.07058823529411765,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.10980392156862745,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.054901960784313725,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.39607843137254906,\n    0.615686274509804,\n    0.6235294117647059,\n    0.5843137254901961,\n    0.6627450980392156,\n    0.7647058823529411,\n    0.6784313725490196,\n    0.8,\n    0.7686274509803923,\n    0.6509803921568627,\n    0.6196078431372549,\n    0.6039215686274509,\n    0.5607843137254902,\n    0.4666666666666666,\n    0.33333333333333326,\n    0.30196078431372547,\n    0.32156862745098036,\n    0.5058823529411764,\n    0.5529411764705883,\n    0.596078431372549,\n    0.5764705882352941,\n    0.4666666666666666,\n    0.4392156862745098,\n    0.4,\n    0.4117647058823529,\n    0.35294117647058826,\n    0.33725490196078434,\n    0.4470588235294118,\n    0.43529411764705883,\n    0.5450980392156862,\n    0.5647058823529412,\n    0.6392156862745098,\n    0.5372549019607843,\n    0.46274509803921565,\n    0.3882352941176471,\n    0.33333333333333326,\n    0.28627450980392155,\n    0.21568627450980393,\n    0.13725490196078433,\n    0.15294117647058825,\n    0.1411764705882353,\n    0.20392156862745098,\n    0.19215686274509808,\n    0.2235294117647059,\n    0.1803921568627451,\n    0.22745098039215686,\n    0.1450980392156863,\n    0.16470588235294115,\n    0.1411764705882353,\n    0.16078431372549018,\n    0.17254901960784313,\n    0.23137254901960783,\n    0.19607843137254904,\n    0.1450980392156863,\n    0.25098039215686274,\n    0.09019607843137255,\n    0.13333333333333333,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.09019607843137255,\n    0.07058823529411765\n  ],\n  [\n    0.08627450980392157,\n    0.06666666666666667,\n    0.11372549019607843,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.09019607843137255,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.08627450980392157,\n    0.6274509803921569,\n    0.592156862745098,\n    0.6274509803921569,\n    0.5882352941176471,\n    0.6980392156862745,\n    0.7372549019607844,\n    0.8156862745098039,\n    0.7137254901960784,\n    0.8352941176470589,\n    0.5725490196078431,\n    0.615686274509804,\n    0.6196078431372549,\n    0.5450980392156862,\n    0.43137254901960786,\n    0.403921568627451,\n    0.3176470588235294,\n    0.3058823529411765,\n    0.4117647058823529,\n    0.5490196078431373,\n    0.5725490196078431,\n    0.5764705882352941,\n    0.4117647058823529,\n    0.4117647058823529,\n    0.43137254901960786,\n    0.41568627450980394,\n    0.41568627450980394,\n    0.3137254901960784,\n    0.4117647058823529,\n    0.41568627450980394,\n    0.4705882352941176,\n    0.49411764705882355,\n    0.5764705882352941,\n    0.615686274509804,\n    0.4588235294117647,\n    0.3568627450980392,\n    0.29411764705882354,\n    0.2901960784313726,\n    0.1176470588235294,\n    0.15294117647058825,\n    0.1411764705882353,\n    0.1411764705882353,\n    0.16470588235294115,\n    0.17647058823529413,\n    0.22745098039215686,\n    0.2549019607843137,\n    0.2196078431372549,\n    0.2549019607843137,\n    0.25098039215686274,\n    0.21176470588235294,\n    0.12941176470588237,\n    0.1568627450980392,\n    0.16470588235294115,\n    0.27450980392156865,\n    0.3058823529411765,\n    0.27450980392156865,\n    0.10980392156862745,\n    0.20392156862745098,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.09803921568627452,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.0784313725490196,\n    0.06666666666666667\n  ],\n  [\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.09411764705882353,\n    0.09803921568627452,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.09019607843137255,\n    0.12941176470588237,\n    0.49019607843137253,\n    0.5803921568627451,\n    0.596078431372549,\n    0.6078431372549019,\n    0.7764705882352942,\n    0.8,\n    0.7529411764705882,\n    0.7529411764705882,\n    0.6862745098039216,\n    0.6627450980392156,\n    0.6862745098039216,\n    0.5411764705882353,\n    0.5411764705882353,\n    0.4392156862745098,\n    0.38431372549019616,\n    0.32156862745098036,\n    0.2980392156862745,\n    0.34901960784313724,\n    0.48627450980392156,\n    0.6078431372549019,\n    0.5450980392156862,\n    0.4980392156862745,\n    0.4235294117647059,\n    0.40784313725490196,\n    0.4235294117647059,\n    0.3294117647058823,\n    0.3411764705882353,\n    0.37254901960784315,\n    0.4117647058823529,\n    0.5568627450980392,\n    0.43529411764705883,\n    0.4470588235294118,\n    0.3921568627450981,\n    0.27058823529411763,\n    0.2823529411764706,\n    0.3294117647058823,\n    0.2823529411764706,\n    0.1803921568627451,\n    0.12941176470588237,\n    0.12156862745098039,\n    0.1568627450980392,\n    0.14901960784313725,\n    0.18823529411764706,\n    0.25098039215686274,\n    0.26666666666666666,\n    0.17647058823529413,\n    0.1568627450980392,\n    0.15294117647058825,\n    0.17647058823529413,\n    0.16078431372549018,\n    0.13333333333333333,\n    0.21176470588235294,\n    0.16470588235294115,\n    0.2627450980392157,\n    0.17647058823529413,\n    0.13725490196078433,\n    0.2549019607843137,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.08235294117647057,\n    0.07450980392156863,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.08627450980392157,\n    0.07450980392156863\n  ],\n  [\n    0.14901960784313725,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.09411764705882353,\n    0.06274509803921569,\n    0.08235294117647057,\n    0.10980392156862745,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.10196078431372549,\n    0.047058823529411764,\n    0.06666666666666667,\n    0.09019607843137255,\n    0.06666666666666667,\n    0.0784313725490196,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.08235294117647057,\n    0.5490196078431373,\n    0.5450980392156862,\n    0.596078431372549,\n    0.592156862745098,\n    0.6862745098039216,\n    0.7686274509803923,\n    0.7372549019607844,\n    0.7725490196078433,\n    0.7490196078431373,\n    0.592156862745098,\n    0.5843137254901961,\n    0.6196078431372549,\n    0.5529411764705883,\n    0.5647058823529412,\n    0.3921568627450981,\n    0.39607843137254906,\n    0.2901960784313726,\n    0.27058823529411763,\n    0.3294117647058823,\n    0.5529411764705883,\n    0.5529411764705883,\n    0.592156862745098,\n    0.4980392156862745,\n    0.40784313725490196,\n    0.4549019607843137,\n    0.40784313725490196,\n    0.38431372549019616,\n    0.3568627450980392,\n    0.3294117647058823,\n    0.403921568627451,\n    0.5058823529411764,\n    0.5137254901960784,\n    0.5137254901960784,\n    0.4196078431372549,\n    0.35294117647058826,\n    0.27450980392156865,\n    0.2823529411764706,\n    0.17254901960784313,\n    0.16078431372549018,\n    0.14901960784313725,\n    0.20784313725490197,\n    0.21568627450980393,\n    0.1450980392156863,\n    0.1568627450980392,\n    0.16470588235294115,\n    0.13725490196078433,\n    0.21176470588235294,\n    0.1450980392156863,\n    0.1411764705882353,\n    0.10196078431372549,\n    0.16078431372549018,\n    0.1843137254901961,\n    0.14901960784313725,\n    0.2,\n    0.22745098039215686,\n    0.15294117647058825,\n    0.16470588235294115,\n    0.12549019607843137,\n    0.08235294117647057,\n    0.07058823529411765,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.06274509803921569,\n    0.0784313725490196,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.07058823529411765,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07450980392156863\n  ],\n  [\n    0.047058823529411764,\n    0.0784313725490196,\n    0.1411764705882353,\n    0.0784313725490196,\n    0.10588235294117647,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.06666666666666667,\n    0.10980392156862745,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.10588235294117647,\n    0.07058823529411765,\n    0.050980392156862744,\n    0.07450980392156863,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.07450980392156863,\n    0.07058823529411765,\n    0.07450980392156863,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.06666666666666667,\n    0.06666666666666667,\n    0.0588235294117647,\n    0.06666666666666667,\n    0.06274509803921569,\n    0.0588235294117647,\n    0.0784313725490196,\n    0.2,\n    0.5372549019607843,\n    0.5725490196078431,\n    0.5019607843137255,\n    0.5333333333333333,\n    0.6588235294117646,\n    0.6980392156862745,\n    0.7215686274509804,\n    0.7058823529411765,\n    0.6745098039215687,\n    0.5333333333333333,\n    0.5254901960784314,\n    0.5058823529411764,\n    0.47450980392156855,\n    0.3921568627450981,\n    0.4117647058823529,\n    0.3686274509803922,\n    0.3058823529411765,\n    0.2901960784313726,\n    0.3254901960784313,\n    0.42745098039215684,\n    0.4588235294117647,\n    0.4705882352941176,\n    0.46274509803921565,\n    0.47843137254901963,\n    0.3921568627450981,\n    0.4235294117647059,\n    0.3294117647058823,\n    0.3411764705882353,\n    0.3803921568627451,\n    0.5529411764705883,\n    0.5725490196078431,\n    0.5058823529411764,\n    0.4588235294117647,\n    0.4588235294117647,\n    0.35294117647058826,\n    0.2627450980392157,\n    0.27058823529411763,\n    0.20392156862745098,\n    0.12156862745098039,\n    0.1176470588235294,\n    0.1450980392156863,\n    0.1450980392156863,\n    0.12156862745098039,\n    0.12941176470588237,\n    0.16470588235294115,\n    0.15294117647058825,\n    0.10588235294117647,\n    0.12156862745098039,\n    0.1176470588235294,\n    0.12156862745098039,\n    0.12549019607843137,\n    0.10980392156862745,\n    0.11372549019607843,\n    0.24705882352941178,\n    0.2235294117647059,\n    0.20392156862745098,\n    0.1568627450980392,\n    0.12941176470588237,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.07450980392156863,\n    0.0784313725490196,\n    0.0588235294117647,\n    0.08235294117647057,\n    0.06274509803921569,\n    0.10588235294117647,\n    0.06666666666666667,\n    0.054901960784313725,\n    0.07058823529411765,\n    0.0588235294117647,\n    0.08627450980392157,\n    0.07058823529411765,\n    0.10980392156862745,\n    0.09411764705882353\n  ]\n]\n\nmodule.exports = content\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-custom/index.js",
    "content": "import cont from './earring'\n\nComponent({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    capacity: {\n      type: Number,\n      value: 20\n    },\n    emitRate: {\n      type: Number,\n      value: 5\n    },\n    lifeTime: {\n      type: Number,\n      value: 3\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const particle = xrScene.getElementById('human-face')\n      // // 来自图片数据的二元数组content\n      const content = cont\n      // // 影响画作的大小与粒子疏密程度的因子\n      const step = 0.02\n      const height = Math.floor(step * content.length)\n      // 设置箱型发射器的发射方向，与粒子初始位置范围\n      particle.getComponent(xrFrameSystem.Particle).createBoxEmitter(\n        xrFrameSystem.Vector3.createFromNumber(1.0, 0.0, 0),\n        xrFrameSystem.Vector3.createFromNumber(1.0, 0.0, 0),\n        xrFrameSystem.Vector3.createFromNumber(0, 0, 0.5),\n        xrFrameSystem.Vector3.createFromNumber(0, height, 0.0)\n      )\n      // 实现发射器的自定义粒子运作接口\n      particle.getComponent(xrFrameSystem.Particle).particleEmitter.processInstance = (instance, deltaTime) => {\n        const contentTemp = content\n        const cellNumY = contentTemp.length\n        const cellNumX = contentTemp[0].length\n        const width = Math.floor(step * cellNumX)\n        if (instance.position.x - instance.particleSystem.emitterPosition.x > width) {\n          instance.age = instance.lifeTime\n          return\n        }\n        instance.age = 0\n        const posX = Math.floor((instance.position.x - instance.particleSystem.emitterPosition.x) / step)\n        const posY = Math.floor(instance.position.y / step)\n        const speed = contentTemp[cellNumY - 1 - posY][posX] * 0.97\n        instance.position.x += (1 - speed * 0.97) * 0.03 + Math.random() * 0.007\n        instance.color.w = speed * 0.3\n      }\n    },\n\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-custom/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-custom/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\"   bind:assetsLoaded=\"handleLoaded\">\n  <xr-assets>\n    <xr-asset-load type=\"texture\" asset-id=\"particle-texture\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/point.png\" />\n  </xr-assets>\n\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 0.2 5\"\n      geometry=\"cube\" material=\"blue-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"\n    ></xr-mesh>\n    <xr-env sky-map=\"sky\" is-sky2d/>\n\n    <xr-particle id=\"human-face\" position=\"0 0 2\" capacity=\"3000\"  emit-rate=\"2000\" size=\"0.1\" start-color=\"1 1 1 0\" start-color2=\"1 1 1 0\" texture=\"particle-texture\"></xr-particle>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 6 -6\" clear-color=\"0.1 0.1 0.1 1\"\n      target=\"mesh-plane\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"90 0 0\" color=\"1 1 1\" intensity=\"2.5\"  />\n  </xr-node>\n\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-firework/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    capacity: {\n      type: Number,\n      value: 20\n    },\n    emitRate: {\n      type: Number,\n      value: 5\n    },\n    lifeTime: {\n      type: Number,\n      value: 3\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      const fireworkField = xrScene.getElementById('firework')\n      const tempSystem = fireworkField.getComponent(xrFrameSystem.Particle)\n      tempSystem.addSizeGradient(0, 0.2)\n      tempSystem.addSizeGradient(3, 0.5)\n\n      let myData = {}\n      myData = {\n        capacity: 200,\n        emitRate: 0, // 子发射器不进行每秒发射\n        burstCount: 200, // 一次爆发200粒子\n        burstTime: 0, // 爆发延时为0\n        burstCycle: 1, // 发射一次\n        size: [0.05],\n        startColor: [1, 1, 0, 1],\n        endColor: [1, 0, 0, 0],\n        emitterType: 'SphereShape',\n        emitterProps: [['radius', '0.8']],\n        lifeTime: [3], // 粒子生命周期为3秒\n        stopDuration: [3], // 子发射器生命周期为3秒\n        speed: [1],\n        texture: 'particle-texture'\n      }\n\n      const subEmitter = tempSystem.createSubEmitter(myData)\n\n      subEmitter.state = 1 // 设置为1为当粒子消失后出现作用子发射器\n      // 可以规定多个子发射器的阵列\n      tempSystem.subEmitters = [subEmitter]\n    },\n\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-firework/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-firework/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\"   bind:assetsLoaded=\"handleLoaded\">\n  <xr-assets>\n    <xr-asset-load type=\"texture\" asset-id=\"particle-texture\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/point.png\" />\n  </xr-assets>\n\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 0.2 5\"\n      geometry=\"cube\" material=\"blue-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"\n    ></xr-mesh>\n    <xr-env sky-map=\"sky\" is-sky2d/>\n\n    <xr-particle id=\"firework\" position=\"0 0 0\" start-color=\"1 1 1 1\" end-color=\"1 0 0 1\" capacity=\"1\" speed=\"1\" size=\"0.5\" emit-rate=\"1\" life-time=\"3\" angle=\"0\"  texture=\"particle-texture\">\n    </xr-particle>\n\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 6 -6\" clear-color=\"0.1 0.1 0.1 1\"\n      target=\"mesh-plane\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"90 0 0\" color=\"1 1 1\" intensity=\"2.5\"  />\n  </xr-node>\n\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-meshEmitter/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    capacity: {\n      type: Number,\n      value: 20\n    },\n    emitRate: {\n      type: Number,\n      value: 5\n    },\n    lifeTime: {\n      type: Number,\n      value: 3\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      const xrFrameSystem = wx.getXrFrameSystem()\n      const magicField = xrScene.getElementById('magicField')\n      const tempSystem = magicField.getComponent(xrFrameSystem.Particle)\n      tempSystem.addSizeGradient(0, 0.7)\n      tempSystem.addSizeGradient(0.5, 1.0)\n      tempSystem.addColorGradient(0, xrFrameSystem.Vector4.createFromNumber(1, 0.89, 0.27, 1))\n      tempSystem.addColorGradient(1, xrFrameSystem.Vector4.createFromNumber(1, 0.64, 0, 1))\n      tempSystem.addAlphaGradient(0, 0, 0)\n      tempSystem.addAlphaGradient(0.5, 1, 1)\n      tempSystem.addAlphaGradient(1, 0, 0)\n    },\n\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-meshEmitter/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-meshEmitter/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\"   bind:assetsLoaded=\"handleLoaded\">\n  <xr-assets>\n    <xr-asset-load type=\"texture\" asset-id=\"glow_circle\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/glow_circle.png\" />\n  </xr-assets>\n\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 0.2 5\"\n      geometry=\"cube\" material=\"blue-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"\n    ></xr-mesh>\n    <xr-env sky-map=\"sky\" is-sky2d/>\n\n    <xr-particle  id=\"magicField\" position=\"0 0 0\" rotation=\"0 0 180\" capacity=\"10\" speed=\"0.1\" size=\"2\" emit-rate=\"6\" life-time=\"0.5\" angle=\"0\"  render-mode=\"mesh\" mesh=\"specialCylinder\" texture=\"glow_circle\" angular-speed=\"0\"></xr-particle>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 6 -6\" clear-color=\"0.1 0.1 0.1 1\"\n      target=\"mesh-plane\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n    \n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"90 0 0\" color=\"1 1 1\" intensity=\"2.5\"  />\n  </xr-node>\n\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-meshEmitter/specialCylinder.js",
    "content": "const vBufferSpecialCylinder = new Float32Array([-5.678913339579594e-9, -0.10497161746025085, -1, -0.08775380253791809, 0.44548818469047546, -0.8909766674041748, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -5.678913339579594e-9, -0.10497161746025085, -1, 0.08775380253791809, 0.44548821449279785, -0.8909766674041748, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.19509032368659973, -0.10497161746025085, -0.9807852506637573, 0.08775380253791809, 0.44548821449279785, -0.8909766674041748, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.19509032368659973, -0.10497161746025085, -0.9807852506637573, 0.25988829135894775, 0.44548869132995605, -0.8567367792129517, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.3826834261417389, -0.10497161746025085, -0.9238795042037964, 0.25988829135894775, 0.44548869132995605, -0.8567367792129517, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.3826834261417389, -0.10497161746025085, -0.9238795042037964, 0.42203545570373535, 0.44548848271369934, -0.7895733714103699, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.5555702447891235, -0.10497161746025085, -0.8314695954322815, 0.42203545570373535, 0.44548848271369934, -0.7895733714103699, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.5555702447891235, -0.10497161746025085, -0.8314695954322815, 0.5679646134376526, 0.44548842310905457, -0.6920666098594666, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.7071067690849304, -0.10497161746025085, -0.7071067690849304, 0.5679646134376526, 0.44548842310905457, -0.6920666098594666, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.7071067690849304, -0.10497161746025085, -0.7071067690849304, 0.6920667886734009, 0.4454883933067322, -0.5679644346237183, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.8314695954322815, -0.10497161746025085, -0.5555702447891235, 0.6920667886734009, 0.4454883933067322, -0.5679644346237183, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.8314695954322815, -0.10497161746025085, -0.5555702447891235, 0.7895731925964355, 0.4454883635044098, -0.42203593254089355, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.9238795042037964, -0.10497161746025085, -0.3826834261417389, 0.7895731925964355, 0.4454883635044098, -0.42203593254089355, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.9238795042037964, -0.10497161746025085, -0.3826834261417389, 0.856736958026886, 0.4454883933067322, -0.2598881423473358, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.9807852506637573, -0.10497161746025085, -0.19509030878543854, 0.856736958026886, 0.4454883933067322, -0.2598881423473358, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.9807852506637573, -0.10497161746025085, -0.19509030878543854, 0.8909766674041748, 0.4454883337020874, -0.0877537727355957, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 1, -0.10497161746025085, 1.955777406692505e-8, 0.8909766674041748, 0.4454883337020874, -0.0877537727355957, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 1, -0.10497161746025085, 1.955777406692505e-8, 0.8909766674041748, 0.4454883337020874, 0.0877537727355957, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.9807852506637573, -0.10497161746025085, 0.19509033858776093, 0.856736958026886, 0.44548842310905457, 0.2598881423473358, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.9807852506637573, -0.10497161746025085, 0.19509033858776093, 0.8909766674041748, 0.4454883337020874, 0.0877537727355957, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.9238795042037964, -0.10497161746025085, 0.38268348574638367, 0.7895732522010803, 0.44548821449279785, 0.4220360517501831, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.9238795042037964, -0.10497161746025085, 0.38268348574638367, 0.856736958026886, 0.44548842310905457, 0.2598881423473358, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.8314695954322815, -0.10497161746025085, 0.5555702447891235, 0.6920667886734009, 0.4454882740974426, 0.5679645538330078, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.8314695954322815, -0.10497161746025085, 0.5555702447891235, 0.7895732522010803, 0.44548821449279785, 0.4220360517501831, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.7071067690849304, -0.10497161746025085, 0.7071067690849304, 0.5679647326469421, 0.4454883635044098, 0.6920666694641113, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.7071067690849304, -0.10497161746025085, 0.7071067690849304, 0.6920667886734009, 0.4454882740974426, 0.5679645538330078, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.5555702447891235, -0.10497161746025085, 0.8314695954322815, 0.4220355749130249, 0.4454882740974426, 0.7895734310150146, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.5555702447891235, -0.10497161746025085, 0.8314695954322815, 0.5679647326469421, 0.4454883635044098, 0.6920666694641113, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.3826834261417389, -0.10497161746025085, 0.9238795042037964, 0.25988829135894775, 0.44548851251602173, 0.8567368388175964, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.3826834261417389, -0.10497161746025085, 0.9238795042037964, 0.4220355749130249, 0.4454882740974426, 0.7895734310150146, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.19509032368659973, -0.10497161746025085, 0.9807852506637573, 0.08775380253791809, 0.44548818469047546, 0.8909766674041748, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.19509032368659973, -0.10497161746025085, 0.9807852506637573, 0.25988829135894775, 0.44548851251602173, 0.8567368388175964, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -5.678913339579594e-9, -0.10497161746025085, 1, -0.08775380253791809, 0.44548821449279785, 0.8909766674041748, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -5.678913339579594e-9, -0.10497161746025085, 1, 0.08775380253791809, 0.44548818469047546, 0.8909766674041748, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.19509032368659973, -0.10497161746025085, 0.9807852506637573, -0.25988826155662537, 0.445488303899765, 0.8567370772361755, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.19509032368659973, -0.10497161746025085, 0.9807852506637573, -0.08775380253791809, 0.44548821449279785, 0.8909766674041748, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.38268348574638367, -0.10497161746025085, 0.9238795042037964, -0.4220356345176697, 0.44548842310905457, 0.7895733118057251, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.38268348574638367, -0.10497161746025085, 0.9238795042037964, -0.25988826155662537, 0.445488303899765, 0.8567370772361755, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.5555702447891235, -0.10497161746025085, 0.8314695954322815, -0.5679647326469421, 0.4454881548881531, 0.6920667290687561, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.5555702447891235, -0.10497161746025085, 0.8314695954322815, -0.4220356345176697, 0.44548842310905457, 0.7895733118057251, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.7071067690849304, -0.10497161746025085, 0.7071067690849304, -0.6920667290687561, 0.44548842310905457, 0.567964494228363, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.7071067690849304, -0.10497161746025085, 0.7071067690849304, -0.5679647326469421, 0.4454881548881531, 0.6920667290687561, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.8314695954322815, -0.10497161746025085, 0.5555702447891235, -0.7895732522010803, 0.44548821449279785, 0.4220360517501831, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.8314695954322815, -0.10497161746025085, 0.5555702447891235, -0.6920667290687561, 0.44548842310905457, 0.567964494228363, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.9238795042037964, -0.10497161746025085, 0.38268348574638367, -0.856736958026886, 0.4454883933067322, 0.2598881125450134, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.9238795042037964, -0.10497161746025085, 0.38268348574638367, -0.7895732522010803, 0.44548821449279785, 0.4220360517501831, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.9807852506637573, -0.10497161746025085, 0.19509033858776093, -0.8909767866134644, 0.44548824429512024, 0.08775343745946884, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.9807852506637573, -0.10497161746025085, 0.19509033858776093, -0.856736958026886, 0.4454883933067322, 0.2598881125450134, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.9999999403953552, -0.10497161746025085, 1.955777406692505e-8, -0.8909767866134644, 0.44548824429512024, -0.08775343745946884, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.9999999403953552, -0.10497161746025085, 1.955777406692505e-8, -0.8909767866134644, 0.44548824429512024, 0.08775343745946884, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.9807852506637573, -0.10497161746025085, -0.19509030878543854, -0.8909767866134644, 0.44548824429512024, -0.08775343745946884, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.9807852506637573, -0.10497161746025085, -0.19509030878543854, -0.856736958026886, 0.4454883933067322, -0.2598881721496582, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.9238795042037964, -0.10497161746025085, -0.3826834261417389, -0.856736958026886, 0.4454883933067322, -0.2598881721496582, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.9238795042037964, -0.10497161746025085, -0.3826834261417389, -0.7895731925964355, 0.4454882740974426, -0.42203593254089355, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.8314695954322815, -0.10497161746025085, -0.5555702447891235, -0.7895731925964355, 0.4454882740974426, -0.42203593254089355, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.8314695954322815, -0.10497161746025085, -0.5555702447891235, -0.6920668482780457, 0.44548824429512024, -0.567964494228363, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.7071067690849304, -0.10497161746025085, -0.7071067690849304, -0.6920668482780457, 0.44548824429512024, -0.567964494228363, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.7071067690849304, -0.10497161746025085, -0.7071067690849304, -0.5679647326469421, 0.4454882740974426, -0.6920666694641113, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.5555702447891235, -0.10497161746025085, -0.8314695954322815, -0.5679647326469421, 0.4454882740974426, -0.6920666694641113, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.5555702447891235, -0.10497161746025085, -0.8314695954322815, -0.42203566431999207, 0.44548851251602173, -0.7895731925964355, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.38268348574638367, -0.10497161746025085, -0.9238795042037964, -0.42203566431999207, 0.44548851251602173, -0.7895731925964355, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.38268348574638367, -0.10497161746025085, -0.9238795042037964, -0.259888231754303, 0.4454883933067322, -0.856736958026886, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.19509032368659973, -0.10497161746025085, -0.9807852506637573, -0.259888231754303, 0.4454883933067322, -0.856736958026886, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.19509032368659973, -0.10497161746025085, -0.9807852506637573, -0.08775380253791809, 0.44548818469047546, -0.8909766674041748, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -5.678913339579594e-9, 0.10497245192527771, -0.8950279951095581, -0.08775380253791809, 0.44548818469047546, -0.8909766674041748, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -5.678913339579594e-9, 0.10497245192527771, -0.8950279951095581, 0.08775380253791809, 0.44548821449279785, -0.8909766674041748, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.17461130023002625, 0.10497245192527771, -0.8778302073478699, 0.08775380253791809, 0.44548821449279785, -0.8909766674041748, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.17461130023002625, 0.10497245192527771, -0.8778302073478699, 0.25988829135894775, 0.44548869132995605, -0.8567367792129517, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.3425123393535614, 0.10497245192527771, -0.8268979787826538, 0.25988829135894775, 0.44548869132995605, -0.8567367792129517, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.3425123393535614, 0.10497245192527771, -0.8268979787826538, 0.42203545570373535, 0.44548848271369934, -0.7895733714103699, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.49725088477134705, 0.10497245192527771, -0.7441885471343994, 0.42203545570373535, 0.44548848271369934, -0.7895733714103699, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.49725088477134705, 0.10497245192527771, -0.7441885471343994, 0.5679646134376526, 0.44548842310905457, -0.6920666098594666, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.6328803300857544, 0.10497245192527771, -0.6328803300857544, 0.5679646134376526, 0.44548842310905457, -0.6920666098594666, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.6328803300857544, 0.10497245192527771, -0.6328803300857544, 0.6920667886734009, 0.4454883933067322, -0.5679644346237183, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.7441885471343994, 0.10497245192527771, -0.49725088477134705, 0.6920667886734009, 0.4454883933067322, -0.5679644346237183, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.7441885471343994, 0.10497245192527771, -0.49725088477134705, 0.7895731925964355, 0.4454883635044098, -0.42203593254089355, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.8268979787826538, 0.10497245192527771, -0.3425123393535614, 0.7895731925964355, 0.4454883635044098, -0.42203593254089355, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.8268979787826538, 0.10497245192527771, -0.3425123393535614, 0.856736958026886, 0.4454883933067322, -0.2598881423473358, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.8778302073478699, 0.10497245192527771, -0.17461128532886505, 0.856736958026886, 0.4454883933067322, -0.2598881423473358, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.8778302073478699, 0.10497245192527771, -0.17461128532886505, 0.8909766674041748, 0.4454883337020874, -0.0877537727355957, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.8950279951095581, 0.10497245192527771, 1.955777406692505e-8, 0.8909766674041748, 0.4454883337020874, -0.0877537727355957, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.8950279951095581, 0.10497245192527771, 1.955777406692505e-8, 0.8909766674041748, 0.4454883337020874, 0.0877537727355957, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.8778302073478699, 0.10497245192527771, 0.17461131513118744, 0.856736958026886, 0.44548842310905457, 0.2598881423473358, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.8778302073478699, 0.10497245192527771, 0.17461131513118744, 0.8909766674041748, 0.4454883337020874, 0.0877537727355957, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.8268979787826538, 0.10497245192527771, 0.3425123989582062, 0.7895732522010803, 0.44548821449279785, 0.4220360517501831, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.8268979787826538, 0.10497245192527771, 0.3425123989582062, 0.856736958026886, 0.44548842310905457, 0.2598881423473358, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.7441885471343994, 0.10497245192527771, 0.4972509443759918, 0.6920667886734009, 0.4454882740974426, 0.5679645538330078, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.7441885471343994, 0.10497245192527771, 0.4972509443759918, 0.7895732522010803, 0.44548821449279785, 0.4220360517501831, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.6328803300857544, 0.10497245192527771, 0.6328803300857544, 0.5679647326469421, 0.4454883635044098, 0.6920666694641113, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.6328803300857544, 0.10497245192527771, 0.6328803300857544, 0.6920667886734009, 0.4454882740974426, 0.5679645538330078, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.49725088477134705, 0.10497245192527771, 0.7441885471343994, 0.4220355749130249, 0.4454882740974426, 0.7895734310150146, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.49725088477134705, 0.10497245192527771, 0.7441885471343994, 0.5679647326469421, 0.4454883635044098, 0.6920666694641113, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.3425123393535614, 0.10497245192527771, 0.8268979787826538, 0.25988829135894775, 0.44548851251602173, 0.8567368388175964, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.3425123393535614, 0.10497245192527771, 0.8268979787826538, 0.4220355749130249, 0.4454882740974426, 0.7895734310150146, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.17461130023002625, 0.10497245192527771, 0.8778302073478699, 0.08775380253791809, 0.44548818469047546, 0.8909766674041748, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.17461130023002625, 0.10497245192527771, 0.8778302073478699, 0.25988829135894775, 0.44548851251602173, 0.8567368388175964, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -5.678913339579594e-9, 0.10497245192527771, 0.8950279951095581, -0.08775380253791809, 0.44548821449279785, 0.8909766674041748, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -5.678913339579594e-9, 0.10497245192527771, 0.8950279951095581, 0.08775380253791809, 0.44548818469047546, 0.8909766674041748, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.17461130023002625, 0.10497245192527771, 0.8778302073478699, -0.25988826155662537, 0.445488303899765, 0.8567370772361755, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.17461130023002625, 0.10497245192527771, 0.8778302073478699, -0.08775380253791809, 0.44548821449279785, 0.8909766674041748, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.3425123989582062, 0.10497245192527771, 0.8268979787826538, -0.4220356345176697, 0.44548842310905457, 0.7895733118057251, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.3425123989582062, 0.10497245192527771, 0.8268979787826538, -0.25988826155662537, 0.445488303899765, 0.8567370772361755, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.4972509443759918, 0.10497245192527771, 0.7441885471343994, -0.5679647326469421, 0.4454881548881531, 0.6920667290687561, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.4972509443759918, 0.10497245192527771, 0.7441885471343994, -0.4220356345176697, 0.44548842310905457, 0.7895733118057251, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.6328803300857544, 0.10497245192527771, 0.6328803300857544, -0.6920667290687561, 0.44548842310905457, 0.567964494228363, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.6328803300857544, 0.10497245192527771, 0.6328803300857544, -0.5679647326469421, 0.4454881548881531, 0.6920667290687561, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.7441885471343994, 0.10497245192527771, 0.4972509443759918, -0.7895732522010803, 0.44548821449279785, 0.4220360517501831, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.7441885471343994, 0.10497245192527771, 0.4972509443759918, -0.6920667290687561, 0.44548842310905457, 0.567964494228363, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.8268979787826538, 0.10497245192527771, 0.3425123989582062, -0.856736958026886, 0.4454883933067322, 0.2598881125450134, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.8268979787826538, 0.10497245192527771, 0.3425123989582062, -0.7895732522010803, 0.44548821449279785, 0.4220360517501831, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.8778302073478699, 0.10497245192527771, 0.17461131513118744, -0.8909767866134644, 0.44548824429512024, 0.08775343745946884, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.8778302073478699, 0.10497245192527771, 0.17461131513118744, -0.856736958026886, 0.4454883933067322, 0.2598881125450134, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.8950279951095581, 0.10497245192527771, 1.955777406692505e-8, -0.8909767866134644, 0.44548824429512024, -0.08775343745946884, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.8950279951095581, 0.10497245192527771, 1.955777406692505e-8, -0.8909767866134644, 0.44548824429512024, 0.08775343745946884, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.8778302073478699, 0.10497245192527771, -0.17461128532886505, -0.8909767866134644, 0.44548824429512024, -0.08775343745946884, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.8778302073478699, 0.10497245192527771, -0.17461128532886505, -0.856736958026886, 0.4454883933067322, -0.2598881721496582, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.8268979787826538, 0.10497245192527771, -0.3425123393535614, -0.856736958026886, 0.4454883933067322, -0.2598881721496582, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.8268979787826538, 0.10497245192527771, -0.3425123393535614, -0.7895731925964355, 0.4454882740974426, -0.42203593254089355, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.7441885471343994, 0.10497245192527771, -0.49725088477134705, -0.7895731925964355, 0.4454882740974426, -0.42203593254089355, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.7441885471343994, 0.10497245192527771, -0.49725088477134705, -0.6920668482780457, 0.44548824429512024, -0.567964494228363, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.6328803300857544, 0.10497245192527771, -0.6328803300857544, -0.6920668482780457, 0.44548824429512024, -0.567964494228363, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.6328803300857544, 0.10497245192527771, -0.6328803300857544, -0.5679647326469421, 0.4454882740974426, -0.6920666694641113, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.4972509443759918, 0.10497245192527771, -0.7441885471343994, -0.5679647326469421, 0.4454882740974426, -0.6920666694641113, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.4972509443759918, 0.10497245192527771, -0.7441885471343994, -0.42203566431999207, 0.44548851251602173, -0.7895731925964355, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.3425123989582062, 0.10497245192527771, -0.8268979787826538, -0.42203566431999207, 0.44548851251602173, -0.7895731925964355, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.3425123989582062, 0.10497245192527771, -0.8268979787826538, -0.259888231754303, 0.4454883933067322, -0.856736958026886, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.17461130023002625, 0.10497245192527771, -0.8778302073478699, -0.259888231754303, 0.4454883933067322, -0.856736958026886, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.17461130023002625, 0.10497245192527771, -0.8778302073478699, -0.08775380253791809, 0.44548818469047546, -0.8909766674041748, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0])\nconst iBufferSpecialCylinder = new Uint16Array([63, 127, 64, 63, 64, 0, 61, 125, 126, 61, 126, 62, 59, 123, 124, 59, 124, 60, 57, 121, 122, 57, 122, 58, 55, 119, 120, 55, 120, 56, 53, 117, 118, 53, 118, 54, 51, 115, 116, 51, 116, 52, 48, 112, 114, 48, 114, 50, 46, 110, 113, 46, 113, 49, 44, 108, 111, 44, 111, 47, 42, 106, 109, 42, 109, 45, 40, 104, 107, 40, 107, 43, 38, 102, 105, 38, 105, 41, 36, 100, 103, 36, 103, 39, 34, 98, 101, 34, 101, 37, 32, 96, 99, 32, 99, 35, 30, 94, 97, 30, 97, 33, 28, 92, 95, 28, 95, 31, 26, 90, 93, 26, 93, 29, 24, 88, 91, 24, 91, 27, 22, 86, 89, 22, 89, 25, 20, 84, 87, 20, 87, 23, 18, 82, 85, 18, 85, 21, 17, 81, 83, 17, 83, 19, 15, 79, 80, 15, 80, 16, 13, 77, 78, 13, 78, 14, 11, 75, 76, 11, 76, 12, 9, 73, 74, 9, 74, 10, 7, 71, 72, 7, 72, 8, 5, 69, 70, 5, 70, 6, 3, 67, 68, 3, 68, 4, 1, 65, 66, 1, 66, 2])\n\nconst xrFrameSystem = wx.getXrFrameSystem()\nconst boundCenter = xrFrameSystem.Vector3.createFromNumber(0, 0, 0)\nconst boundSize = xrFrameSystem.Vector3.createFromNumber(1, 1, 1)\nconst defaultSubMeshLength = iBufferSpecialCylinder.length\n\nxrFrameSystem.registerGeometry('specialCylinder', scene => {\n  const geo = scene.createGeometry(getSpecialVertexLayout(scene), vBufferSpecialCylinder, iBufferSpecialCylinder)\n\n  geo.setBoundBox(boundCenter, boundSize)\n  geo.addSubMesh(defaultSubMeshLength, 0, 0)\n\n  return geo\n})\n\nconst defaultAttributes = [\n  {\n    name: 'a_normal',\n    format: 2,\n    offset: 12,\n    usage: 2\n  },\n  {\n    name: 'a_position',\n    format: 2,\n    offset: 0,\n    usage: 1\n  },\n  {\n    name: 'a_tangent',\n    format: 3,\n    offset: 40,\n    usage: 3\n  },\n  {\n    name: 'a_texCoord',\n    format: 1,\n    offset: 24,\n    usage: 4\n  }\n]\nconst defaultStride = 48\n\nfunction getSpecialVertexLayout(scene) {\n  return scene.createVertexLayout({\n    attributes: defaultAttributes,\n    stride: defaultStride\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-orb/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    capacity: {\n      type: Number,\n      value: 20\n    },\n    emitRate: {\n      type: Number,\n      value: 5\n    },\n    lifeTime: {\n      type: Number,\n      value: 3\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({\n      detail\n    }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      // orb vfx\n      const orb = xrScene.getElementById('orb')\n      let tempSystem = orb.getComponent(xrFrameSystem.Particle)\n      tempSystem.addAlphaGradient(0, 0, 0)\n      tempSystem.addAlphaGradient(0.5, 1, 1)\n      tempSystem.addAlphaGradient(1, 0, 0)\n      tempSystem.addSizeGradient(0, 1, 1)\n      tempSystem.addSizeGradient(1, 0, 0)\n\n      // orbline vfx\n      const orbLine = xrScene.getElementById('orbLine')\n      tempSystem = orbLine.getComponent(xrFrameSystem.Particle)\n      tempSystem.addColorGradient(0, xrFrameSystem.Vector4.createFromNumber(1, 1, 0, 1))\n      tempSystem.addColorGradient(1, xrFrameSystem.Vector4.createFromNumber(1, 0.68, 0, 1))\n      tempSystem.addAlphaGradient(0, 0, 0)\n      tempSystem.addAlphaGradient(0.5, 1, 1)\n      tempSystem.addAlphaGradient(1, 0, 0)\n      tempSystem.addSizeGradient(0, 1, 1)\n      tempSystem.addSizeGradient(1, 0, 0)\n    },\n\n    handleAssetsProgress({\n      detail\n    }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({\n      detail\n    }) {\n      console.log('assets loaded', detail.value)\n      this.setData({\n        loaded: true\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-orb/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-orb/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\"   bind:assetsLoaded=\"handleLoaded\">\n  <xr-assets>\n    <xr-asset-load type=\"texture\" asset-id=\"orb\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/orb.png\" />\n    <xr-asset-load type=\"texture\" asset-id=\"magic-line\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/magic_line.png\" />\n  </xr-assets>\n\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 0.2 5\"\n      geometry=\"cube\" material=\"blue-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"\n    ></xr-mesh>\n    <xr-env sky-map=\"sky\" is-sky2d/>\n\n    <xr-particle id=\"orb\" position=\"0 0 2\" rotation=\"0 0 0\" capacity=\"1000\" speed=\"0\" size=\"5\" emit-rate=\"18\" life-time=\"0.2\" angle=\"0\"  texture=\"orb\">\n    </xr-particle>\n\n    <xr-particle id=\"orbLine\" position=\"0 0 2\" rotation=\"0 0 0\" angle=\"90\" capacity=\"1000\" speed=\"-4 -2\" size=\"0.4 0.7\" emit-rate=\"70\" life-time=\"0.2 0.4\" texture=\"magic-line\" emitter-type=\"SphereShape\" emitter-props=\"radius:0.7\" render-mode=\"stretched\">\n    </xr-particle>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 6 -6\" clear-color=\"0.1 0.1 0.1 1\"\n      target=\"mesh-plane\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"90 0 0\" color=\"1 1 1\" intensity=\"2.5\"  />\n  </xr-node>\n\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-portal/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    capacity: {\n      type: Number,\n      value: 20\n    },\n    emitRate: {\n      type: Number,\n      value: 5\n    },\n    lifeTime: {\n      type: Number,\n      value: 3\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      const xrFrameSystem = wx.getXrFrameSystem()\n\n      const portal = xrScene.getElementById('portal')\n      const tempSystem = portal.getComponent(xrFrameSystem.Particle)\n      tempSystem.addSizeGradient(0, 1, 1)\n      tempSystem.addSizeGradient(0.5, 0.8, 0.8)\n      tempSystem.addSizeGradient(0.75, 0.5, 0.5)\n      tempSystem.addSizeGradient(0.9, 0.2, 0.2)\n      tempSystem.addSizeGradient(1, 0, 0)\n    },\n\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-portal/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-portal/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\"   bind:assetsLoaded=\"handleLoaded\">\n  <xr-assets>\n    <xr-asset-load type=\"atlas\" asset-id=\"portal-atlas\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/portal.json\" />\n  </xr-assets>\n\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 0.2 5\"\n      geometry=\"cube\" material=\"blue-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"\n    ></xr-mesh>\n    <xr-env sky-map=\"sky\" is-sky2d/>\n\n    \n    <xr-particle  id=\"portal\" position=\"0 0 2\" atlas=\"portal-atlas\" capacity=\"1000\" speed=\"0\" size=\"2 2.5\" emit-rate=\"12\" life-time=\"0.4\" angle=\"0 360\" atlas-speed=\"0\" atlas-random=\"true\" emitter-type=\"SphereShape\" emitter-props=\"radius:0.03\" angular-speed=\"-300\"></xr-particle>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 6 -6\" clear-color=\"0.1 0.1 0.1 1\"\n      target=\"mesh-plane\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"90 0 0\" color=\"1 1 1\" intensity=\"2.5\"  />\n  </xr-node>\n\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-shapeEmitter/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    capacity: {\n      type: Number,\n      value: 20\n    },\n    emitRate: {\n      type: Number,\n      value: 5\n    },\n    lifeTime: {\n      type: Number,\n      value: 3\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n\n    },\n\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-shapeEmitter/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-particle-shapeEmitter/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\"   bind:assetsLoaded=\"handleLoaded\">\n  <xr-assets>\n    <xr-asset-load type=\"texture\" asset-id=\"particle-texture\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/point.png\" />\n  </xr-assets>\n\n  <xr-node>\n    <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 0.2 5\"\n      geometry=\"cube\" material=\"blue-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"\n    ></xr-mesh>\n    <xr-env sky-map=\"sky\" is-sky2d/>\n\n    <xr-particle  position=\"0 0 2\" start-color=\"0 1 0 1\" end-color=\"1 1 0 1\" capacity=\"1000\" speed=\"-5\" size=\"0.1 0.2\" emit-rate=\"80\" life-time=\"0.2 0.4\" angle=\"0 360\" angular-speed=\"-300\" emitter-type=\"SphereShape\" emitter-props=\"radius:1.5\" texture=\"particle-texture\">\n    </xr-particle>\n\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"0 6 -6\" clear-color=\"0.1 0.1 0.1 1\"\n      target=\"mesh-plane\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n    <xr-light type=\"directional\" rotation=\"90 0 0\" color=\"1 1 1\" intensity=\"2.5\"  />\n  </xr-node>\n\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-physics-shoot/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    a: Number,\n  },\n  data: {\n    loaded: false,\n    displayBricks: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      this.cubeGeometry = this.scene.assets.getAsset('geometry', 'cube')\n      this.bricksRoot = this.scene.getElementById('bricksRoot')\n      console.log('xr-scene', xrScene)\n      this.matMap = new Map()\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleARTrackerState({ detail }) {\n      console.log('ar state', detail.value.state)\n      // 事件的值即为`ARTracker`实例\n      const tracker = detail.value\n      // 获取当前状态和错误信息\n      const { state, errorMessage } = tracker\n      if (state === 2 && !this.inited) {\n        this.initBricks()\n        this.inited = true\n      }\n    },\n    initBricks() {\n      const xr = wx.getXrFrameSystem()\n      const logo = this.scene.assets.getAsset('raw', 'logo')\n      const logoView = new Uint8Array(logo)\n      if (logoView[0] !== 0x42 || logoView[1] !== 0x4D) {\n        console.error('Not a valid bmp file!')\n        return\n      }\n      const dataOffset = logoView[10]\n      const width = logoView[18]\n      const height = logoView[22]\n      for (let i = 0; i < width; i++) {\n        for (let j = 0; j < height; j++) {\n          const b = logoView[dataOffset + (j * width + i) * 4 + 0]\n          const g = logoView[dataOffset + (j * width + i) * 4 + 1]\n          const r = logoView[dataOffset + (j * width + i) * 4 + 2]\n          if (r !== 0xff || g !== 0x0 || b !== 0x80) {\n            // not transparent pixel\n            this.makeBrick((i - width * 0.5) * 0.11, (j - height * 0.5) * 0.11, r, g, b)\n          }\n        }\n      }\n      this.scene.event.add('touchstart', (e) => {\n        const touch0 = e.touches[0]\n        this.shoot(((touch0.pageX / this.scene.frameWidth) * 2 - 1) * 1, ((1.0 - touch0.pageY / this.scene.frameHeight) * 2 - 1) * 1)\n      })\n    },\n    makeBrick(x, y, r, g, b) {\n      const xr = wx.getXrFrameSystem()\n\n      let mat = this.matMap.get(r * 256 * 256 + g * 256 + b)\n      if (!mat) {\n        mat = new xr.Material(this.scene)\n        mat.initByEffect(this.scene.assets.getAsset('effect', 'standard'))\n        mat.setVector('u_baseColorFactor', xr.Vector4.createFromNumber(r / 256, g / 256, b / 256, 1))\n        this.matMap.set(r * 256 * 256 + g * 256 + b, mat)\n      }\n\n      const meshDesc = {\n        geometry: this.cubeGeometry,\n        material: mat\n      }\n      const brickEl = this.scene.createElement(xr.XRNode)\n      this.bricksRoot.addChild(brickEl)\n      const brickMesh = brickEl.addComponent(xr.Mesh, meshDesc)\n      const transform = brickEl.getComponent('transform')\n      transform.position.x = x\n      transform.position.y = y\n      transform.position.z = 0\n      transform.scale.setValue(0.1, 0.1, 0.1)\n\n      const rigidbody = brickEl.addComponent(xr.Rigidbody, { useGravity: false })\n      brickEl.addComponent(xr.CubeShape, { autoFit: true })\n      brickEl.addComponent(xr.ShapeInteract, { collide: true, bounciness: 0 })\n      rigidbody.sleep()\n\n      return brickMesh\n    },\n    shoot(x, y) {\n      const xr = wx.getXrFrameSystem()\n\n      const camera = this.scene.getElementById('camera').getComponent('camera')\n      const origin = this.scene.getElementById('camera').getComponent('transform')\n\n      const meshDesc = {\n        geometry: this.scene.assets.getAsset('geometry', 'sphere')\n      }\n      const bulletEl = this.scene.createElement(xr.XRNode)\n      this.bricksRoot.addChild(bulletEl)\n      const bulletMesh = bulletEl.addComponent(xr.Mesh, meshDesc)\n      const transform = bulletEl.getComponent('transform')\n      transform.position.set(origin.position)\n      transform.scale.setValue(0.1, 0.1, 0.1)\n\n      const rigidbody = bulletEl.addComponent(xr.Rigidbody, { useGravity: false })\n      bulletEl.addComponent(xr.SphereShape, { autoFit: true })\n      bulletEl.addComponent(xr.ShapeInteract, { collide: true, bounciness: 0 })\n      let ray = xr.Vector3.createFromNumber(0, 0, 0)\n      camera.convertClipPositionToWorld(xr.Vector3.createFromNumber(x, y, 0), ray)\n      ray = ray.sub(origin.position)\n      ray = ray.scale(10 / ray.length())\n      rigidbody.addForce(ray, 1)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-physics-shoot/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-physics-shoot/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\" ar-system=\"modes:Marker;camera:Back\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n    <xr-asset-load type=\"raw\" asset-id=\"logo\" src=\"/assets/wx_logo.bmp.bin\"></xr-asset-load>\n  </xr-assets>\n  <xr-physics></xr-physics>\n  <xr-node>\n    <xr-ar-tracker id=\"arTracker\" mode=\"Marker\" src=\"/components/xr-physics-shoot/weixin.png\" bind:ar-tracker-state=\"handleARTrackerState\">\n    <xr-node></xr-node>\n    </xr-ar-tracker>\n    <xr-node layer=\"1\">\n      <xr-shadow id=\"bricksRoot\" node-id=\"bricksRoot\"></xr-shadow>\n    </xr-node>\n    <xr-camera\n      id=\"camera2\" node-id=\"camera2\" clear-color=\"0.925 0.925 0.925 1\" position=\"0 0 5\"\n      background=\"ar\" is-ar-camera cull-mask=\"1\"\n    ></xr-camera>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"1 2 4\" is-clear-color=\"false\" target=\"bricksRoot\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-physics-shoot/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-physics-throw/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    throwing: {\n      type: Boolean,\n      value: false,\n      observer(newVal, oldVal) {\n        if (newVal !== oldVal) {\n          if (newVal) this.startThrowing()\n          else this.endThrowing()\n        }\n      }\n    }\n  },\n  data: {\n    showTarget: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n\n      this.vQueueLength = 5\n      this.vQueue = []\n      this.vQueueHead = 0\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    },\n    handleARTrackerState({ detail }) {\n      // 事件的值即为`ARTracker`实例\n      const tracker = detail.value\n      // 获取当前状态和错误信息\n      const { state, errorMessage } = tracker\n      if (state == 2) {\n        this.handleARDetected()\n      }\n    },\n    handleARDetected() {\n      this.scene.event.addOnce('touchstart', this.placeTarget.bind(this))\n    },\n    placeTarget() {\n      this.scene.ar.placeHere('targetTransform')\n      this.setData({\n        showTarget: true\n      })\n      this.triggerEvent('ar_detected')\n    },\n    startThrowing() {\n      if (!this.data.showTarget) return\n      this.makeBall()\n    },\n    endThrowing() {\n      this.releaseBall()\n    },\n    makeBall() {\n      const xr = wx.getXrFrameSystem()\n      const el = this.scene.createElement(xr.XRMesh, {\n        geometry: 'sphere',\n        scale: '0.1 0.1 0.1',\n        'sphere-shape': 'autoFit: true',\n        rigidbody: 'disabled: true',\n        'shape-interact': 'collide: true; bounciness: 0.5;'\n      })\n      const root = this.scene.getElementById('ballRoot')\n      root.addChild(el)\n      this.placeBall(el.getComponent('transform'))\n      this.currentBall = el\n    },\n    placeBall(transform) {\n      const camera = this.scene.getElementById('camera')\n      const cam_trans = camera.getComponent('transform')\n      transform.position.set(cam_trans.position.add(cam_trans.worldForward.scale(-1)))\n    },\n    handleTick({ detail }) {\n      if (this.currentBall) {\n        this.placeBall(this.currentBall.getComponent('transform'))\n        this.recordPosition(detail)\n      }\n    },\n    releaseBall() {\n      if (!this.currentBall) return\n      this.currentBall.getComponent('rigidbody').setData({\n        disabled: false\n      })\n      const r1 = this.vQueue[(this.vQueueHead - 1 + this.vQueueLength) % this.vQueueLength]\n      const r2 = this.vQueue[this.vQueueHead]\n      if (r1 && r2) {\n        const vscale = 1.3 // 初始速度调节\n        const v = r1[0].sub(r2[0]).scale(vscale * 1000 / (r1[1] - r2[1]))\n        this.currentBall.getComponent('rigidbody').velocity = v\n      }\n\n      this.currentBall = undefined\n      this.vQueue = []\n      this.vQueueHead = 0\n    },\n    recordPosition() {\n      const transform = this.currentBall.getComponent('transform')\n      this.vQueue[this.vQueueHead] = [transform.position.clone(), Date.now()]\n      this.vQueueHead = (this.vQueueHead + 1) % this.vQueueLength\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-physics-throw/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-physics-throw/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\" bind:tick=\"handleTick\" ar-system=\"modes:Plane;camera:Back\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"anchor\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/ar-plane-marker.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"basket\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/laundry_basket/scene.gltf\" />\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n  <xr-physics></xr-physics>\n  <xr-node>\n    <xr-ar-tracker mode=\"Plane\" bind:ar-tracker-state=\"handleARTrackerState\">\n      <xr-gltf model=\"anchor\" wx:if=\"{{!showTarget}}\"></xr-gltf>\n    </xr-ar-tracker>\n    <xr-node node-id=\"targetTransform\">\n      <xr-node id=\"targetRoot\" wx:if=\"{{showTarget}}\">\n        <xr-node scale=\"0.2 0.2 0.2\" position=\"0 -0.3 0\">\n          <xr-gltf model=\"basket\"></xr-gltf>\n          <xr-node cube-shape=\"size: 0.01 3 2\" position=\"-1.3 0 0\" shape-interact=\"collide: true\"></xr-node>\n          <xr-node cube-shape=\"size: 0.01 3 2\" position=\"1.3 0 0\" shape-interact=\"collide: true\"></xr-node>\n          <xr-node cube-shape=\"size: 2.3 3 0.01\" position=\"0 0 -1\" shape-interact=\"collide: true\"></xr-node>\n          <xr-node cube-shape=\"size: 2.3 3 0.01\" position=\"0 0 1\" shape-interact=\"collide: true\"></xr-node>\n        </xr-node>\n        <xr-node cube-shape=\"size: 10 0.001 10\" position=\"0 -0.3 0\" shape-interact=\"collide: true\"></xr-node>\n      </xr-node>\n    </xr-node>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" clear-color=\"0.925 0.925 0.925 1\" position=\"0 0 50\" \n      background=\"ar\" is-ar-camera\n    >\n    </xr-camera>\n    <xr-shadow id=\"ballRoot\" node-id=\"ballRoot\"></xr-shadow>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1\" />\n    <xr-light type=\"directional\" rotation=\"180 0 0\" color=\"1 1 1\" intensity=\"3\" />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-physics-throw/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-scan-render/index.js",
    "content": "Component({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    envIndex: {\n      type: Number,\n      value: 0\n    }\n  },\n  data: {\n    loaded: false\n  },\n  lifetimes: {},\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n    },\n    handleAssetsProgress({ detail }) {\n      console.log('assets progress', detail.value)\n    },\n    handleAssetsLoaded({ detail }) {\n      console.log('assets loaded', detail.value)\n      this.setData({ loaded: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-scan-render/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-scan-render/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load\n      type=\"env-data\" asset-id=\"env0\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-scan-test/dayb4.bin\"\n    />\n    <xr-asset-load\n      type=\"env-data\" asset-id=\"env1\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-scan-test/nightb1.bin\"\n    />\n    <xr-asset-load\n      type=\"env-data\" asset-id=\"env2\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-test.bin\"\n    />\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-wxdog\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/model-scan-test/wxdog/index.gltf\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"gltf-wxmail\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/model-scan-test/wxmail/index.gltf\" />\n\n    <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n  </xr-assets>\n    <xr-env env-data=\"env{{envIndex}}\" />\n  <xr-node>\n    <xr-node node-id=\"id2\" position=\"0 0 0\"></xr-node>\n    <xr-gltf node-id=\"mesh-gltf-wxdog\" position=\"-0.4 0 -1\" rotation=\"0 55 0\" scale=\"0.7 0.7 0.7\" model=\"gltf-wxdog\"></xr-gltf>\n    <xr-gltf node-id=\"mesh-gltf-wxmail\" position=\"1 0 1\" rotation=\"0 -10 0\" scale=\"0.7 0.7 0.7\" model=\"gltf-wxmail\"></xr-gltf>\n    <xr-mesh node-id=\"mesh-floor-wxdog\" position=\"-0.35 -0.62 -1\" rotation=\"-3 80 -2\" scale=\"1 0.02 1.8\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor: 0.32 0.32 0.36 1, u_metallicRoughnessValues: 0 0.1\"></xr-mesh>\n    <xr-mesh node-id=\"mesh-floor-wxmail\" position=\"0.95 -0.63 0.9\" rotation=\"5 -10 -2\" scale=\"0.9 0.02 1.7\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor: 0.32 0.32 0.36 1, u_metallicRoughnessValues: 0 0.1\"></xr-mesh>\n    <xr-mesh node-id=\"mesh-floor-roughmetal\" position=\"-0.6 -0.6 0.6\" rotation=\"0 -10 0\" scale=\"1.6 0.02 1.6\" geometry=\"cube\" material=\"standard-mat\" uniforms=\"u_baseColorFactor: 0.28 0.51 0.34 1, u_metallicRoughnessValues: 0.6 0.1\"></xr-mesh>\n    <xr-camera\n      id=\"camera\" node-id=\"camera\" position=\"-1.4 1.4 1.4\" clear-color=\"0.8 0.8 0.8 1\"\n      target=\"id2\" far=\"2000\" background=\"skybox\"\n      camera-orbit-control=\"\"\n    ></xr-camera>\n  </xr-node>\n  <xr-node node-id=\"lights\">\n    <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.3\" />\n  </xr-node>\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-scan-render/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-scan-team/index.js",
    "content": "import XrTeamCameraAnimation from '../../xr-custom/animations/XrTeamCameraAnimation'\n\nComponent({\n  behaviors: [require('../common/share-behavior').default],\n  properties: {\n    loaded: false,\n    run: {\n      type: Boolean,\n      value: false,\n      observer(newVal, oldVal) {\n        if (newVal && newVal !== oldVal) {\n          this.requireRun = true\n        }\n      }\n    }\n  },\n  lifetimes: {\n    detached() {\n      this.voice.stop()\n      this.bgm.stop()\n    },\n  },\n  methods: {\n    handleReady({ detail }) {\n      const xrScene = this.scene = detail.value\n      console.log('xr-scene', xrScene)\n      this.bgm = wx.createInnerAudioContext({})\n      this.bgm.src = 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/kaqituolitai.mp3'\n      this.bgm.volume = 0.5\n      this.voice = wx.createInnerAudioContext({ useWebAudioImplement: true })\n      this.voice.src = 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/homo.m4a'\n      this.voiceFrag = {\n        xinyi: [4, 2],\n        roam: [6.8, 2],\n        hikari: [53.9, 2],\n        jump: [8.9, 1.5]\n      }\n      this.tmpV3 = new (wx.getXrFrameSystem().Vector3)()\n    },\n    handleAssetsLoaded({ detail }) {\n      this.triggerEvent('assetsLoaded', detail.value)\n    },\n    handleRaf({ detail }) {\n      if (!this.init()) {\n        return\n      }\n\n      if (this.requireRun) {\n        this.requireRun = false\n        this.run()\n      }\n\n      this.triggerEvent('syncPositions', [\n        this.getScreenPosition(this.hikari, '瞬光'),\n        this.getScreenPosition(this.roam, 'roam'),\n        this.getScreenPosition(this.xinyi, 'xinyi')\n      ])\n    },\n    getScreenPosition(char, name) {\n      this.tmpV3.set(char.worldPosition)\n      this.tmpV3.x += -0.1\n      this.tmpV3.y += 1.2\n      const clipPos = this.camera.convertWorldPositionToClip(this.tmpV3)\n      const { frameWidth, frameHeight } = this.scene\n      return [((clipPos.x + 1) / 2) * frameWidth, (1 - (clipPos.y + 1) / 2) * frameHeight, name]\n    },\n    init() {\n      if (!this.camera) {\n        const camEl = this.scene.getElementById('camera')\n        this.camera = camEl.getComponent(wx.getXrFrameSystem().Camera)\n        this.cameraCtrl = camEl.getComponent('camera-orbit-control')\n      }\n\n      const inited = this.camera && this.hikari && this.roam && this.xinyi\n\n      if (inited && !this.cameraAnim) {\n        this.cameraAnim = this.camera.el.addComponent(wx.getXrFrameSystem().Animator)\n        this.cameraAnim.createAnimation(XrTeamCameraAnimation, {\n          targets: {\n            hikari: this.hikari.position,\n            roam: this.roam.position,\n            xinyi: this.xinyi.position,\n            final: this.hikari.position\n          },\n          startY: 1.2,\n          finalY: 0.8\n        })\n      }\n\n      return inited\n    },\n    handleModelLoaded({ detail }) {\n      const { target } = detail.value\n      this[target.id] = target.getComponent(wx.getXrFrameSystem().Transform)\n    },\n    async run() {\n      this.cameraCtrl.disable()\n\n      await this.prepareRun('xinyi')\n      await this.prepareRun('roam')\n      await this.prepareRun('hikari')\n\n      await this.prepareCamera()\n\n      this.runOne(this.hikari)\n      this.runOne(this.roam)\n      this.runOne(this.xinyi)\n\n      this.cameraCtrl.enable()\n    },\n    async prepareRun(char) {\n      const voiceFrag = this.voiceFrag[char]\n\n      return new Promise(resolve => {\n        const animator = this[char].el.getComponent(wx.getXrFrameSystem().Animator)\n\n        this.cameraAnim.play(char)\n        this.cameraAnim.el.event.addOnce('anim-stop', () => {\n          this.voice.seek(voiceFrag[0])\n          this.voice.play()\n\n          setTimeout(() => {\n            this.voice.stop()\n            animator.stop()\n            animator.pauseToFrame('Run', 0)\n            setTimeout(() => resolve(), 200)\n          }, voiceFrag[1] * 1000)\n        })\n      })\n    },\n    async prepareCamera() {\n      this.bgm.play()\n      this.bgm.seek(46)\n\n      return new Promise(resolve => {\n        this.cameraAnim.play('final')\n        this.cameraAnim.el.event.addOnce('anim-stop', () => {\n          setTimeout(() => {\n            resolve()\n          }, 1000)\n        })\n      })\n    },\n    runOne(char) {\n      const animator = char.el.getComponent(wx.getXrFrameSystem().Animator)\n      animator.resume()\n\n      const jump = () => {\n        this.voice.seek(this.voiceFrag.jump[0])\n        this.voice.play()\n        animator.stop()\n        animator.play('Jump', { loop: 0 })\n        animator.el.event.addOnce('anim-stop', () => {\n          animator.play('Run')\n          this.voice.stop()\n        })\n        char.el.event.addOnce('touch-shape', jump)\n      }\n\n      char.el.event.addOnce('touch-shape', jump)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-scan-team/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-scan-team/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\" bind:tick=\"handleRaf\">\n  <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n    <xr-asset-load type=\"gltf\" asset-id=\"hikari\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/hikari-unlit.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"roam\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/roam-unlit.glb\" />\n    <xr-asset-load type=\"gltf\" asset-id=\"xinyi\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/xinyi-unlit.glb\" />\n  </xr-assets>\n  <xr-env env-data=\"xr-frame-team-workspace-day\" />\n  <xr-node wx:if=\"{{loaded}}\">\n    <xr-gltf bind:gltf-loaded=\"handleModelLoaded\" id=\"hikari\" position=\"0 0 0\" rotation=\"0 180 0\" model=\"hikari\" anim-autoplay=\"clip:Idle\" capsule-shape=\"height:2;raduis:0.3;center:0 1 0\"></xr-gltf>\n    <xr-gltf bind:gltf-loaded=\"handleModelLoaded\" id=\"roam\" position=\"-1 0 0\" rotation=\"0 180 0\" model=\"roam\" anim-autoplay=\"clip:Idle\" capsule-shape=\"height:1;raduis:0.3;center:0 1 0\"></xr-gltf>\n    <xr-gltf bind:gltf-loaded=\"handleModelLoaded\" id=\"xinyi\" position=\"1 0 0\" rotation=\"0 180 0\" model=\"xinyi\" anim-autoplay=\"clip:Idle\" capsule-shape=\"height:1;raduis:0.3;center:0 1 0\"></xr-gltf>\n  </xr-node>\n  <xr-node node-id=\"camera-target\" position=\"0 0.8 0\"></xr-node>\n  <xr-camera\n    id=\"camera\" position=\"0 0.8 3\" clear-color=\"0.925 0.925 0.925 1\"\n    background=\"skybox\" target=\"camera-target\"\n    camera-orbit-control=\"\"\n  ></xr-camera>\n  <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.4\" />\n</xr-scene>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/components/xr-scan-team/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-2dmarker/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = `&lt;xr-scene ar-system=&quot;modes:Marker&quot; id=&quot;xr-scene&quot; bind:ready=&quot;handleReady&quot; bind:arReady=&quot;handleARReady&quot; bind:log=&quot;handleLog&quot;&gt;\n&lt;xr-assets bind:progress=&quot;handleAssetsProgress&quot; bind:loaded=&quot;handleAssetsLoaded&quot;&gt;\n  &lt;xr-asset-material asset-id=&quot;ar-anchor&quot; effect=&quot;standrand&quot; uniforms=&quot;u_baseColorFactor:0 1 0 1&quot;&gt;&lt;/xr-asset-material&gt;\n&lt;/xr-assets&gt;\n&lt;xr-node&gt;\n  &lt;xr-node node-id=&quot;id2&quot; scale=&quot;2 2 2&quot; position=&quot;0 0 0&quot;&gt;&lt;/xr-node&gt;\n  &lt;xr-ar-tracker mode=&quot;Marker&quot; src=&quot;{{markerImg}}&quot;&gt;\n    &lt;xr-mesh geometry=&quot;cylinder&quot; material=&quot;ar-anchor&quot; /&gt;\n  &lt;/xr-ar-tracker&gt;\n  &lt;xr-camera\n    id=&quot;camera&quot; node-id=&quot;camera&quot; position=&quot;0.8 2.2 -5&quot; clear-color=&quot;0.925 0.925 0.925 1&quot;\n    target=&quot;id2&quot; background=&quot;ar&quot; is-ar-camera\n    camera-orbit-control\n  &gt;&lt;/xr-camera&gt;\n&lt;/xr-node&gt;\n&lt;xr-node node-id=&quot;lights&quot;&gt;\n  &lt;xr-light type=&quot;ambient&quot; color=&quot;1 1 1&quot; intensity=&quot;1&quot; /&gt;\n  &lt;xr-light type=&quot;directional&quot; rotation=&quot;180 0 0&quot; color=&quot;1 1 1&quot; intensity=&quot;3&quot; /&gt;\n&lt;/xr-node&gt;\n&lt;/xr-scene&gt;\n`\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    markerImg: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/2dmarker-test.jpg'\n  },\n  handleChangeMarkerImg() {\n    wx.chooseMedia({\n      count: 1,\n      sizeType: ['compressed'],\n      mediaType: ['image'],\n      sourceType: ['album'],\n      success: res => {\n        const fp = res.tempFiles[0].tempFilePath\n        this.setData({ markerImg: fp })\n      },\n      fail: err => {\n        console.error('[xr-demo]chooseImage failed', err)\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-2dmarker/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-2dmarker\": \"../../../components/xr-ar-2dmarker/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-2dmarker/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR 2DMarker案例\"\n  intro=\"Marker识别案例，点击可以上传2DMarker。识别成功后，会于屏幕绘制一个纯色立方体展示位置。\"\n  hint=\"默认扫描图片见官网开发文档\\n组件 -> xr-frame -> 示例\"\n>\n  <xr-ar-2dmarker\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    markerImg=\"{{markerImg}}\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n\n  <button bindtap=\"handleChangeMarkerImg\">\n    点击替换Marker图像\n  </button>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-2dmarker/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-basic/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = `&lt;xr-scene ar-system=&quot;modes:Plane&quot; id=&quot;xr-scene&quot; bind:ready=&quot;handleReady&quot; bind:arReady=&quot;handleARReady&quot; bind:log=&quot;handleLog&quot;&gt;\n&lt;xr-assets bind:progress=&quot;handleAssetsProgress&quot; bind:loaded=&quot;handleAssetsLoaded&quot;&gt;\n  &lt;xr-asset-load type=&quot;gltf&quot; asset-id=&quot;gltf-item&quot; src=&quot;https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/just_a_girl/scene.gltf&quot; /&gt;\n  &lt;xr-asset-material asset-id=&quot;standard-mat&quot; effect=&quot;standard&quot; /&gt;\n&lt;/xr-assets&gt;\n&lt;xr-node&gt;\n  &lt;xr-node node-id=&quot;camera-target&quot; position=&quot;0 0 0&quot;&gt;&lt;/xr-node&gt;\n  &lt;xr-ar-tracker mode=&quot;Plane&quot;&gt;\n    &lt;xr-node&gt;\n      &lt;xr-mesh id=&quot;ar-tracker-mesh&quot; geometry=&quot;cube&quot; scale=&quot;0.5 0.05 0.5&quot; material=&quot;standard&quot; /&gt;\n    &lt;/xr-node&gt;\n  &lt;/xr-ar-tracker&gt;\n  &lt;xr-node node-id=&quot;setitem&quot;&gt;\n    &lt;xr-gltf model=&quot;gltf-item&quot; scale=&quot;0.006 0.006 0.006&quot;&gt;&lt;/xr-gltf&gt;\n  &lt;/xr-node&gt;\n  &lt;xr-camera\n    id=&quot;camera&quot; node-id=&quot;camera&quot; position=&quot;1 1 1&quot; clear-color=&quot;0.925 0.925 0.925 1&quot;\n    target=&quot;camera-target&quot; background=&quot;ar&quot; is-ar-camera\n    camera-orbit-control\n  &gt;&lt;/xr-camera&gt;\n&lt;/xr-node&gt;\n&lt;xr-node node-id=&quot;lights&quot;&gt;\n  &lt;xr-light type=&quot;ambient&quot; color=&quot;1 1 1&quot; intensity=&quot;1&quot; /&gt;\n  &lt;xr-light type=&quot;directional&quot; rotation=&quot;180 0 0&quot; color=&quot;1 1 1&quot; intensity=&quot;3&quot; /&gt;\n&lt;/xr-node&gt;\n&lt;/xr-scene&gt;\n`\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-basic/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-basic\": \"../../../components/xr-ar-basic/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-basic/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR 平面识别案例\"\n  intro=\"基础的平面识别案例，有一个图标用于展示目前平面定位的区域。每次点击渲染区域，会触发新的一次模型的的加载与模型放置到对应的平面区域。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-ar-basic\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-basic/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-body/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    score: undefined\n  },\n  handleInfo({ detail }) {\n    this.setData({ score: detail.score.toFixed(2) })\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-body/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-body\": \"../../../components/xr-ar-body/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-body/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR 人体识别案例\"\n  intro=\"人体识别案例。识别成功后，会在典型位置展示几何体。\"\n  hint=\"要求基础库 v2.28.1 及以上\"\n>\n  <xr-ar-body\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:info=\"handleInfo\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n    <view wx:if=\"{{score !== undefined}}\">置信度：{{score}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-body/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-body-3d/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    score: undefined\n  },\n  handleInfo({ detail }) {\n    this.setData({ score: detail.score.toFixed(2) })\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-body-3d/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-body-3d\": \"../../../components/xr-ar-body-3d/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-body-3d/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR 人体三维识别案例\"\n  intro=\"人体识别案例。识别成功后，会在典型位置展示几何体。\"\n  hint=\"要求基础库 v3.3.3 及以上\"\n>\n  <xr-ar-body-3d\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:info=\"handleInfo\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n    <view wx:if=\"{{score !== undefined}}\">置信度：{{score}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-body-3d/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-camera/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = `&lt;xr-scene id=&quot;xr-scene&quot; ar-system=&quot;modes:Marker&quot; bind:ready=&quot;handleReady&quot; bind:tick=&quot;handleTick&quot; bind:log=&quot;handleLog&quot;&gt;\n&lt;xr-assets bind:progress=&quot;handleAssetsProgress&quot; bind:loaded=&quot;handleAssetsLoaded&quot;&gt;\n  &lt;xr-asset-load type=&quot;env-data&quot; asset-id=&quot;env1&quot; src=&quot;https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/env-footprint/data.json&quot; /&gt;\n  &lt;xr-asset-load type=&quot;gltf&quot; asset-id=&quot;gltf-table&quot; src=&quot;https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/metal_table/scene.gltf&quot; /&gt;\n&lt;/xr-assets&gt;\n&lt;xr-env env-data=&quot;env1&quot;/&gt;\n&lt;xr-node wx:if=&quot;loaded&quot;&gt;\n  &lt;xr-node node-id=&quot;camera-target&quot; position=&quot;0 0 0&quot;&gt;&lt;/xr-node&gt;\n  &lt;xr-node node-id=&quot;table-wrap&quot; position=&quot;0 0 0&quot;&gt;\n    &lt;xr-gltf node-id=&quot;mesh-gltf-table&quot; position=&quot;0 -1 0&quot; rotation=&quot;0 45 0&quot; scale=&quot;0.5 0.5 0.5&quot; model=&quot;gltf-table&quot;&gt;&lt;/xr-gltf&gt;\n  &lt;/xr-node&gt;\n  &lt;xr-camera\n    id=&quot;camera&quot; node-id=&quot;camera&quot; position=&quot;2 1 2&quot; clear-color=&quot;0.925 0.925 0.925 1&quot;\n    target=&quot;camera-target&quot; background=&quot;ar&quot;\n    camera-orbit-control=&quot;&quot;\n  &gt;&lt;/xr-camera&gt;\n&lt;/xr-node&gt;\n&lt;xr-node node-id=&quot;lights&quot;&gt;\n  &lt;xr-light type=&quot;ambient&quot; color=&quot;1 1 1&quot; intensity=&quot;0.2&quot; /&gt;\n  &lt;xr-light type=&quot;directional&quot; rotation=&quot;180 0 0&quot; color=&quot;1 1 1&quot; intensity=&quot;2&quot; /&gt;\n&lt;/xr-node&gt;\n&lt;/xr-scene&gt;\n`\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-camera/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-camera\": \"../../../components/xr-ar-camera/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-camera/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR 相机渲染案例\"\n  intro=\"AR相机与glTF一同渲染的基础案例\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-ar-camera\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-camera/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-face/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>'\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-face/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-face\": \"../../../components/xr-ar-face/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-face/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR 人脸识别案例\"\n  intro=\"人脸识别案例。识别成功后，会在五官典型位置展示几何体。\"\n  hint=\"要求基础库 v2.28.1 及以上，前置相机需要客户端 8.0.31 及以上\"\n>\n  <xr-ar-face\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-face/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-face-3d/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>'\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-face-3d/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-face-3d\": \"../../../components/xr-ar-face-3d/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-face-3d/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR 人脸三维识别案例\"\n  intro=\"人脸识别案例。识别成功后，会在五官典型位置展示几何体。\"\n  hint=\"要求基础库 v3.3.3 及以上，前置相机需要客户端 8.0.31 及以上\"\n>\n  <xr-ar-face-3d\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-face-3d/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-hand/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    gesture: undefined,\n    score: undefined\n  },\n  handleInfo({ detail }) {\n    this.setData({ gesture: detail.gesture, score: detail.score.toFixed(2) })\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-hand/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-hand\": \"../../../components/xr-ar-hand/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-hand/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR 人手识别案例\"\n  intro=\"人手识别案例。识别成功后，会在典型位置展示几何体。手势对应可见官网文档->组件->XR-FRAME->AR追踪器。\"\n  hint=\"要求基础库 v2.28.1 及以上\"\n>\n  <xr-ar-hand\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:info=\"handleInfo\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n    <view wx:if=\"{{score !== undefined}}\">置信度：{{score}}</view>\n    <view wx:if=\"{{gesture !== undefined}}\">手势：{{gesture}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-hand/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-hand-3d/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    gesture: undefined,\n    score: undefined\n  },\n  handleInfo({ detail }) {\n    this.setData({ gesture: detail.gesture, score: detail.score.toFixed(2) })\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-hand-3d/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-hand-3d\": \"../../../components/xr-ar-hand-3d/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-hand-3d/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR 人手三维识别案例\"\n  intro=\"人手识别案例。识别成功后，会在典型位置展示几何体。手势对应可见官网文档->组件->XR-FRAME->AR追踪器。\"\n  hint=\"要求基础库 v3.3.3 及以上\"\n>\n  <xr-ar-hand-3d\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:info=\"handleInfo\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n    <view wx:if=\"{{score !== undefined}}\">置信度：{{score}}</view>\n    <view wx:if=\"{{gesture !== undefined}}\">手势：{{gesture}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-hand-3d/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-osdmarker/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = `&lt;xr-scene ar-system=&quot;modes:OSD&quot; id=&quot;xr-scene&quot; bind:ready=&quot;handleReady&quot; bind:arReady=&quot;handleARReady&quot; bind:log=&quot;handleLog&quot;&gt;\n&lt;xr-assets bind:progress=&quot;handleAssetsProgress&quot; bind:loaded=&quot;handleAssetsLoaded&quot;&gt;\n  &lt;xr-asset-load type=&quot;gltf&quot; asset-id=&quot;gltf-burger&quot; src=&quot;https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/burger/burger.gltf&quot; /&gt;\n  &lt;xr-asset-material asset-id=&quot;ar-anchor&quot; effect=&quot;standrand&quot; uniforms=&quot;u_baseColorFactor:0 1 0 1&quot;&gt;&lt;/xr-asset-material&gt;\n&lt;/xr-assets&gt;\n&lt;xr-node&gt;\n  &lt;xr-node node-id=&quot;id2&quot; scale=&quot;2 2 2&quot; position=&quot;0 0 0&quot;&gt;&lt;/xr-node&gt;\n  &lt;xr-ar-tracker mode=&quot;OSD&quot; src=&quot;{{markerImg}}&quot;&gt;\n    &lt;xr-mesh id=&quot;ar-tracker-mesh&quot; geometry=&quot;cylinder&quot; material=&quot;ar-anchor&quot; /&gt;\n  &lt;/xr-ar-tracker&gt;\n  &lt;xr-camera\n    id=&quot;camera&quot; node-id=&quot;camera&quot; position=&quot;0.8 2.2 -5&quot; clear-color=&quot;0.925 0.925 0.925 1&quot;\n    target=&quot;id2&quot; background=&quot;ar&quot; is-ar-camera\n    camera-orbit-control\n  &gt;&lt;/xr-camera&gt;\n&lt;/xr-node&gt;\n&lt;xr-node node-id=&quot;lights&quot;&gt;\n  &lt;xr-light type=&quot;ambient&quot; color=&quot;1 1 1&quot; intensity=&quot;1&quot; /&gt;\n  &lt;xr-light type=&quot;directional&quot; rotation=&quot;180 0 0&quot; color=&quot;1 1 1&quot; intensity=&quot;3&quot; /&gt;\n&lt;/xr-node&gt;\n&lt;/xr-scene&gt;\n`\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    markerImg: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/osdmarker-test.jpg'\n  },\n  handleChangeMarkerImg() {\n    wx.chooseMedia({\n      count: 1,\n      sizeType: ['compressed'],\n      mediaType: ['image'],\n      sourceType: ['album'],\n      success: res => {\n        const fp = res.tempFiles[0].tempFilePath\n        this.setData({ markerImg: fp })\n      },\n      fail: err => {\n        console.error('[xr-demo]chooseImage failed', err)\n      }\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-osdmarker/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-osdmarker\": \"../../../components/xr-ar-osdmarker/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-osdmarker/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR OSDMarker案例\"\n  intro=\"Marker识别案例，点击可以上传OSDMarker。识别成功后，会于屏幕绘制一个纯色立方体展示位置。\"\n  hint=\"默认扫描图片见官网开发文档\\n组件->xr-frame->示例\"\n>\n  <xr-ar-osdmarker\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    markerImg=\"{{markerImg}}\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n\n  <button bindtap=\"handleChangeMarkerImg\">\n    点击替换Marker图像\n  </button>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-osdmarker/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-shoe/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>'\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-shoe/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-shoe\": \"../../../components/xr-ar-shoe/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-shoe/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR 试鞋案例\"\n  intro=\"\"\n  hint=\"要求基础库 v3.3.3 及以上\"\n>\n  <xr-ar-shoe\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-shoe/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-threeDof/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = `&lt;xr-scene ar-system=&quot;modes:Plane&quot; id=&quot;xr-scene&quot; bind:ready=&quot;handleReady&quot; bind:arReady=&quot;handleARReady&quot; bind:log=&quot;handleLog&quot;&gt;\n&lt;xr-assets bind:progress=&quot;handleAssetsProgress&quot; bind:loaded=&quot;handleAssetsLoaded&quot;&gt;\n  &lt;xr-asset-load type=&quot;gltf&quot; asset-id=&quot;gltf-item&quot; src=&quot;https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/just_a_girl/scene.gltf&quot; /&gt;\n  &lt;xr-asset-material asset-id=&quot;standard-mat&quot; effect=&quot;standard&quot; /&gt;\n&lt;/xr-assets&gt;\n&lt;xr-node&gt;\n  &lt;xr-node node-id=&quot;camera-target&quot; position=&quot;0 0 0&quot;&gt;&lt;/xr-node&gt;\n  &lt;xr-ar-tracker mode=&quot;Plane&quot;&gt;\n    &lt;xr-node&gt;\n      &lt;xr-mesh id=&quot;ar-tracker-mesh&quot; geometry=&quot;cube&quot; scale=&quot;0.5 0.05 0.5&quot; material=&quot;standard&quot; /&gt;\n    &lt;/xr-node&gt;\n  &lt;/xr-ar-tracker&gt;\n  &lt;xr-node node-id=&quot;setitem&quot;&gt;\n    &lt;xr-gltf model=&quot;gltf-item&quot; scale=&quot;0.006 0.006 0.006&quot;&gt;&lt;/xr-gltf&gt;\n  &lt;/xr-node&gt;\n  &lt;xr-camera\n    id=&quot;camera&quot; node-id=&quot;camera&quot; position=&quot;1 1 1&quot; clear-color=&quot;0.925 0.925 0.925 1&quot;\n    target=&quot;camera-target&quot; background=&quot;ar&quot; is-ar-camera\n    camera-orbit-control\n  &gt;&lt;/xr-camera&gt;\n&lt;/xr-node&gt;\n&lt;xr-node node-id=&quot;lights&quot;&gt;\n  &lt;xr-light type=&quot;ambient&quot; color=&quot;1 1 1&quot; intensity=&quot;1&quot; /&gt;\n  &lt;xr-light type=&quot;directional&quot; rotation=&quot;180 0 0&quot; color=&quot;1 1 1&quot; intensity=&quot;3&quot; /&gt;\n&lt;/xr-node&gt;\n&lt;/xr-scene&gt;\n`\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-threeDof/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-threeDof\": \"../../../components/xr-ar-threeDof/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-threeDof/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR threeDof\"\n  intro=\"threeDof案例，用于在不需要SLAM的场景，支持手持相机旋转，兼容性较好。\"\n  hint=\"需要基础库版本 v2.30.4 及以上\"\n>\n  <xr-ar-threeDof\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-threeDof/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-vio-depth/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-vio-depth/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-vio-depth\": \"../../../components/xr-ar-vio-depth/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-vio-depth/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR Plane 使用 深度剔除案例\"\n  intro=\"设备支持V2的`Plane`模式下开启使用，Beta版本\"\n  hint=\"预计在基础库版本 v3.1.0 支持。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-ar-vio-depth\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-vio-depth/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-vio-marker/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-vio-marker/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-ar-vio-marker\": \"../../../components/xr-ar-vio-marker/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-vio-marker/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR Plane和Marker混合案例\"\n  intro=\"在设备支持V2的`Plane`模式时，可以同时开启`Plane`和`Makrer`模式进行融合识别。\"\n  hint=\"预计在基础库版本 v2.33.1 正式支持。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-ar-vio-marker\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar/scene-ar-vio-marker/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-face/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>'\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-face/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-classic-face\": \"../../../components/xr-classic-face/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-face/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"扫描人脸穿戴\"\n  intro=\"基于 人脸识别 的穿戴\"\n  hint=\"要求基础库 v2.28.1 及以上，前置相机需要客户端 8.0.31 及以上\"\n>\n  <xr-classic-face\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-face/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-osd/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    markerImg: ''\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-osd/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-classic-osd\": \"../../../components/xr-classic-osd/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-osd/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"扫描物体查看信息\"\n  intro=\"基于 OSD 实现的扫描 广州塔 或 虎年公仔，识别成功后会在物体右上角加上信息提示\"\n  hint=\"默认扫描图片见官网开发文档\\n组件 -> xr-frame -> 示例\"\n\n>\n  <xr-classic-osd\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    markerImg=\"{{markerImg}}\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-osd/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-perspect/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>'\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-perspect/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-classic-perspect\": \"../../../components/xr-classic-perspect/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-perspect/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"扫描图片模型透视案例\"\n  intro=\"基于 Stencil裁剪 实现的基本模型透视效果案例. Model from SketchFab By @Omar Faruq Tawsif\"\n  hint=\"默认扫描图片见官网开发文档\\n组件 -> xr-frame -> 示例\"\n>\n  <xr-classic-perspect\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-perspect/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-portal/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>'\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-portal/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-classic-portal\": \"../../../components/xr-classic-portal/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-portal/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"传送门效果案例\"\n  intro=\"基于 平面识别与模版剔除 实现的基本传送门效果案例.\"\n  hint=\"进入后等待资源加载完成，然后按照弹出提示操作\"\n>\n  <xr-classic-portal\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-portal/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-video/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = `&lt;xr-scene ar-system=&quot;modes:Marker&quot; bind:ready=&quot;handleReady&quot;&gt;\n  &lt;xr-assets bind:progress=&quot;handleAssetsProgress&quot; bind:loaded=&quot;handleAssetsLoaded&quot;&gt;\n  &lt;xr-asset-load\n      type=&quot;video-texture&quot; asset-id=&quot;hikari&quot;\n      src=&quot;https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/2dmarker/hikari.mp4&quot; options=&quot;autoPlay:true,loop:true&quot;\n    /&gt;\n  &lt;/xr-assets&gt;\n  &lt;xr-node wx:if=&quot;{{loaded}}&quot;&gt;\n    &lt;xr-ar-tracker mode=&quot;Marker&quot; src=&quot;https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/2dmarker/hikari.jpg&quot;&gt;\n      &lt;xr-mesh node-id=&quot;mesh-plane&quot; geometry=&quot;plane&quot; uniforms=&quot;u_baseColorMap: video-hikari&quot; /&gt;\n    &lt;/xr-ar-tracker&gt;\n    &lt;xr-camera\n      id=&quot;camera&quot; node-id=&quot;camera&quot; position=&quot;1 1 1&quot; clear-color=&quot;0.925 0.925 0.925 1&quot;\n      background=&quot;ar&quot; is-ar-camera\n    /&gt;\n  &lt;/xr-node&gt;\n&lt;/xr-scene&gt;`\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>'\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-video/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-classic-video\": \"../../../components/xr-classic-video/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-video/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"平面视频案例\"\n  intro=\"基于 2DMarker 实现，扫描工卡照片显示对应的生活场景.\"\n  hint=\"默认扫描图片见官网开发文档\\n组件 -> xr-frame -> 示例\"\n>\n  <xr-classic-video\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    markerImg=\"{{markerImg}}\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-video/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-wxball/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>'\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-wxball/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-classic-wxball\": \"../../../components/xr-classic-wxball/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-wxball/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"微信球案例\"\n  intro=\"扫描手握着的微信纪念球，会显示三维纪念球.点击三维纪念球会播放动画.\"\n  hint=\"默认扫描图片见官网开发文档\\n组件 -> xr-frame -> 示例\"\n\n>\n  <xr-classic-wxball\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/ar-classic/scene-classic-wxball/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = `&lt;xr-scene id=&quot;xr-scene&quot;&gt;\n&lt;xr-assets bind:progress=&quot;handleAssetsProgress&quot; bind:loaded=&quot;handleAssetsLoaded&quot;&gt;\n  &lt;xr-asset-material asset-id=&quot;standard-mat&quot; effect=&quot;standard&quot; /&gt;\n&lt;/xr-assets&gt;\n&lt;xr-node&gt;\n  &lt;xr-mesh node-id=&quot;mesh-plane&quot; position=&quot;0 -0.05 -4&quot; rotation=&quot;0 0 0&quot; scale=&quot;5 1 5&quot; geometry=&quot;plane&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:0.48 0.78 0.64 1&quot;&gt;&lt;/xr-mesh&gt;\n  &lt;xr-mesh node-id=&quot;mesh-cube&quot; position=&quot;-1 0.5 -3.5&quot; scale=&quot;1 1 1&quot; rotation=&quot;0 45 0&quot; geometry=&quot;cube&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:0.298 0.764 0.85 1&quot;&gt;&lt;/xr-mesh&gt;\n  &lt;xr-mesh node-id=&quot;mesh-sphere&quot; position=&quot;0 1.25 -5&quot; scale=&quot;1.25 1.25 1.25&quot; geometry=&quot;sphere&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:0.937 0.176 0.368 1&quot;&gt;&lt;/xr-mesh&gt;\n  &lt;xr-mesh node-id=&quot;mesh-cylinder&quot; position=&quot;1 0.7 -3.5&quot; scale=&quot;1 0.7 1&quot; geometry=&quot;cylinder&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:1 0.776 0.364 1&quot;&gt;&lt;/xr-mesh&gt;\n  &lt;xr-camera\n    id=&quot;camera&quot; node-id=&quot;camera&quot; position=&quot;0 1.6 0&quot; clear-color=&quot;0.925 0.925 0.925 1&quot;\n    target=&quot;mesh-sphere&quot;\n    camera-orbit-control=&quot;&quot;\n  &gt;&lt;/xr-camera&gt;\n&lt;/xr-node&gt;\n&lt;xr-node node-id=&quot;lights&quot;&gt;\n  &lt;xr-light type=&quot;ambient&quot; color=&quot;1 1 1&quot; intensity=&quot;1&quot; /&gt;\n  &lt;xr-light type=&quot;directional&quot; rotation=&quot;40 170 0&quot; color=&quot;1 1 1&quot; intensity=&quot;3&quot; /&gt;\n&lt;/xr-node&gt;\n&lt;/xr-scene&gt;`\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic\": \"../../../components/xr-basic/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"基础案例\"\n  intro=\"使用默认的PBR(基于物理渲染)材质下使用特定颜色的内置图形，场景包含基本的环境光与平行光。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-basic\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-alpha/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    heightScale: 0.5,\n    cubeAlpha: 100,\n    sphereAlpha: 100,\n    clearR: 0,\n    clearG: 0,\n    clearB: 0,\n    clearA: 0,\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  },\n  changeClearR(e) {\n    this.setData({\n      clearR: e.detail.value\n    })\n  },\n  changeClearG(e) {\n    this.setData({\n      clearG: e.detail.value\n    })\n  },\n  changeClearB(e) {\n    this.setData({\n      clearB: e.detail.value\n    })\n  },\n  changeClearA(e) {\n    this.setData({\n      clearA: e.detail.value\n    })\n  },\n  changeCubeAlpha(e) {\n    this.setData({\n      cubeAlpha: e.detail.value\n    })\n  },\n  changeSphereAlpha(e) {\n    this.setData({\n      sphereAlpha: e.detail.value\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-alpha/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic-alpha\": \"../../../components/xr-basic-alpha/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-alpha/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"透明画布\"\n  intro=\"使用透明画布能力，透出背景，背景的waifu是CSS写的。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-basic-alpha\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;background-image: url(https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/waifu.png);background-size: cover;background-position-x: center;\"\n    clearColor=\"{{clearR / 100}} {{clearG / 100}} {{clearB / 100}} {{clearA / 100}}\"\n    cubeAlpha=\"{{cubeAlpha / 100}}\"\n    sphereAlpha=\"{{sphereAlpha / 100}}\"\n  />\n\n  <view style=\"margin-top: 1rem;\"></view>\n  <view class=\"form-entry\">\n    <view class=\"form-entry-title\">清屏颜色（红色）</view>\n    <slider bindchange=\"changeClearR\" value=\"{{clearR}}\"></slider>\n  </view>\n  <view class=\"form-entry\">\n    <view class=\"form-entry-title\">清屏颜色（绿色）</view>\n    <slider bindchange=\"changeClearG\" value=\"{{clearG}}\"></slider>\n  </view>\n  <view class=\"form-entry\">\n    <view class=\"form-entry-title\">清屏颜色（蓝色）</view>\n    <slider bindchange=\"changeClearB\" value=\"{{clearB}}\"></slider>\n  </view>\n  <view class=\"form-entry\">\n    <view class=\"form-entry-title\">清屏颜色（透明度）</view>\n    <slider bindchange=\"changeClearA\" value=\"{{clearA}}\"></slider>\n  </view>\n  <view class=\"form-entry\">\n    <view class=\"form-entry-title\">立方体透明度</view>\n    <slider bindchange=\"changeCubeAlpha\" value=\"{{cubeAlpha}}\"></slider>\n  </view>\n  <view class=\"form-entry\">\n    <view class=\"form-entry-title\">球透明度</view>\n    <slider bindchange=\"changeSphereAlpha\" value=\"{{sphereAlpha}}\"></slider>\n  </view>\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-alpha/index.wxss",
    "content": ".form-entry {\n  margin: 15px;\n}\n\n.radio-item {\nmargin-right: 3%;\n}\n\n.form-entry-title {\n  margin-bottom: 10px;\n}\n\n.divider {\nwidth: 20%;\nheight: 2px;\nbackground-color: rgb(230, 230, 230);\n/* margin-left: 15px; */\nmargin: 0 auto 0 auto;\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-animation/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = `&lt;xr-scene id=&quot;xr-scene&quot;&gt;\n&lt;xr-assets bind:progress=&quot;handleAssetsProgress&quot; bind:loaded=&quot;handleAssetsLoaded&quot;&gt;\n  &lt;xr-asset-load asset-id=&quot;basic-anim&quot; type=&quot;keyframe&quot; src=&quot;/assets/animation/basic-animation.json&quot;/&gt;\n  &lt;xr-asset-material asset-id=&quot;standard-mat&quot; effect=&quot;standard&quot; /&gt;\n&lt;/xr-assets&gt;\n&lt;xr-node&gt;\n  &lt;xr-node node-id=&quot;camera-target&quot; position=&quot;0 0 0&quot;&gt;&lt;/xr-node&gt;\n  &lt;xr-mesh\n    node-id=&quot;mesh-plane&quot; position=&quot;0 -0.8 0&quot; rotation=&quot;0 0 0&quot; scale=&quot;10 1 8&quot; geometry=&quot;plane&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:0.48 0.78 0.64 1&quot;\n    anim-keyframe=&quot;basic-anim&quot; anim-autoplay=&quot;clip:plane, speed:4&quot;\n  &gt;&lt;/xr-mesh&gt;\n  &lt;xr-mesh\n    node-id=&quot;mesh-cube&quot; position=&quot;-3 0 2&quot; scale=&quot;1 1 1&quot; rotation=&quot;0 0 0&quot; geometry=&quot;cube&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:0.298 0.764 0.85 1&quot;\n    anim-keyframe=&quot;basic-anim&quot; anim-clipmap=&quot;default:cube&quot; anim-autoplay=&quot;clip:cube, speed:2&quot;\n  &gt;&lt;/xr-mesh&gt;\n  &lt;xr-mesh \n    node-id=&quot;mesh-sphere&quot; position=&quot;-3 0 0&quot; scale=&quot;0.8 0.8 0.8&quot; geometry=&quot;sphere&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:0.937 0.176 0.368 1&quot;\n    anim-keyframe=&quot;basic-anim&quot; anim-autoplay=&quot;clip:sphere, speed:2&quot;\n  &gt;&lt;/xr-mesh&gt;\n  &lt;xr-mesh \n    node-id=&quot;mesh-cylinder&quot; position=&quot;-3 0 -2&quot; scale=&quot;1 0.6 1&quot; geometry=&quot;cylinder&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:1 0.776 0.364 1&quot;\n    anim-keyframe=&quot;basic-anim&quot; anim-autoplay=&quot;clip:cylinder, speed:2&quot;\n  &gt;&lt;/xr-mesh&gt;\n  &lt;xr-mesh node-id=&quot;mesh-light-cube&quot; position=&quot;-5 1 0&quot; scale=&quot;0.5 2 10&quot; rotation=&quot;0 0 0&quot; geometry=&quot;cube&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:0.3 0.3 0.3 1&quot;&gt;&lt;/xr-mesh&gt;\n  &lt;xr-camera\n    id=&quot;camera&quot; node-id=&quot;camera&quot; position=&quot;5 3 0&quot; clear-color=&quot;0.925 0.925 0.925 1&quot;\n    target=&quot;camera-target&quot;\n    camera-orbit-control=&quot;&quot;\n  &gt;&lt;/xr-camera&gt;\n&lt;/xr-node&gt;\n&lt;xr-node node-id=&quot;lights&quot;&gt;\n  &lt;xr-light type=&quot;ambient&quot; color=&quot;1 1 1&quot; intensity=&quot;1&quot; /&gt;\n  &lt;xr-light type=&quot;directional&quot; rotation=&quot;30 230 0&quot; color=&quot;1 1 1&quot; intensity=&quot;3&quot; /&gt;\n  &lt;xr-light\n    type=&quot;spot&quot; position=&quot;-4 1 0&quot; rotation=&quot;0 -90 0&quot; color=&quot;0 0 1&quot; range=&quot;20&quot; intensity=&quot;100&quot; inner-cone-angle=&quot;30&quot; outer-cone-angle=&quot;40&quot;\n    anim-keyframe=&quot;basic-anim&quot; anim-autoplay=&quot;clip:spotLight, speed:2&quot;\n  /&gt;\n&lt;/xr-node&gt;\n&lt;/xr-scene&gt;\n`\n\nconst json = `\n{\n  <div class=\"ml20\">\n  \"keyframe\": {\n    <div class=\"ml20\">\n    \"cube\": {\n      <div class=\"ml20\">\n      \"0\": {\n        <div class=\"ml20\">\n        \"position\": [-3, 0, 2]\n        </div>\n      },<br>\n      \"50\": {\n        <div class=\"ml20\">\n        \"rotation\": [0, 0, 0],\n        \"scale\": [1, 1, 1]\n        </div>\n      },<br>\n      \"100\": {\n        <div class=\"ml20\">\n        \"position\": [3, 0, 2],\n        \"rotation\": [0, 3.14, 0],\n        \"scale\": [1.4, 1.4, 1.4]\n        </div>\n      }\n      </div>\n    }\n    </div>\n    ...<br>\n  },<br>\n  \"animation\": {\n    <div class=\"ml20\">\n    \"default\": {\n      <div class=\"ml20\">\n      \"keyframe\": \"cube\",<br>\n      \"duration\": 1,<br>\n      \"ease\": \"ease-in-out\",<br>\n      \"loop\": 400000,<br>\n      \"delay\": 1,<br>\n      \"direction\": \"both\"<br>\n      </div>\n    }\n    </div>\n    ...<br>\n  }\n  </div>\n\n}`\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    json\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-animation/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic-animation\": \"../../../components/xr-basic-animation/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-animation/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"动画案例\"\n  intro=\"keyframe动画案例，包含三个图形的旋转位移缩放动画，底层平面的颜色变化动画，以及一个聚光的位移动画。具体动画结构可以拉到底部查看。\"\n  code=\"{{xmlCode}}\"\n  json=\"{{json}}\"\n>\n  <xr-basic-animation\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    a=\"123\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-animation/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-envData/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-envData/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic-envData\": \"../../../components/xr-basic-envData/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-envData/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"环境数据案例\"\n  intro=\"案例包含四个基础小球，分别为光滑金属与粗糙非金属。分别为，对应全局环境信息的两个反光小球，与定制局部环境数据的两个发光小球\"\n>\n  <xr-basic-envData\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-envData/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-light/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = `&lt;xr-scene id=&quot;xr-scene&quot;&gt;\n&lt;xr-assets bind:progress=&quot;handleAssetsProgress&quot; bind:loaded=&quot;handleAssetsLoaded&quot;&gt;\n  &lt;xr-asset-material asset-id=&quot;standard-mat&quot; effect=&quot;standard&quot; /&gt;\n&lt;/xr-assets&gt;\n&lt;xr-node&gt;\n  &lt;xr-node node-id=&quot;camera-target&quot; position=&quot;0 0 0&quot;&gt;&lt;/xr-node&gt;\n  &lt;xr-mesh node-id=&quot;mesh-cube-floor&quot; position=&quot;2 -1.01 0&quot; rotation=&quot;0 0 0&quot; scale=&quot;10 1 10&quot; geometry=&quot;cube&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:0.2 0.2 0.2 1&quot;&gt;&lt;/xr-mesh&gt;\n  &lt;xr-mesh node-id=&quot;mesh-cube&quot; position=&quot;0.6 -0.25 0.8&quot; rotation=&quot;0 30 0&quot; scale=&quot;0.5 0.5 0.5&quot; geometry=&quot;cube&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:1 1 1 1&quot;&gt;&lt;/xr-mesh&gt;\n  &lt;xr-mesh node-id=&quot;mesh-sphere&quot; position=&quot;2 -0.15 -1&quot; scale=&quot;0.4 0.4 0.4&quot; geometry=&quot;sphere&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:1 1 1 1&quot;&gt;&lt;/xr-mesh&gt;\n  &lt;xr-mesh node-id=&quot;mesh-cylinder&quot; position=&quot;-0.2 -0.2 -0.8&quot; scale=&quot;0.5 0.4 0.5&quot; geometry=&quot;cylinder&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:1 1 1 1&quot;&gt;&lt;/xr-mesh&gt;\n  &lt;xr-mesh node-id=&quot;mesh-cube-far&quot; position=&quot;3 -0.25 1&quot; rotation=&quot;0 -30 0&quot; scale=&quot;0.5 0.5 0.5&quot; geometry=&quot;cube&quot; material=&quot;standard-mat&quot; uniforms=&quot;u_baseColorFactor:1 1 1 1&quot;&gt;&lt;/xr-mesh&gt;\n&lt;xr-camera\n    id=&quot;camera&quot; node-id=&quot;camera&quot; position=&quot;-2 1 0&quot; clear-color=&quot;0 0 0 1&quot;\n    target=&quot;camera-target&quot;\n    camera-orbit-control=&quot;&quot;\n  &gt;&lt;/xr-camera&gt;\n&lt;/xr-node&gt;\n&lt;xr-node node-id=&quot;lights&quot;&gt;\n  &lt;xr-light type=&quot;ambient&quot; color=&quot;1 1 1&quot; intensity=&quot;0.1&quot; /&gt;\n  &lt;xr-light type=&quot;directional&quot; rotation=&quot;40 170 0&quot; color=&quot;1 1 1&quot; intensity=&quot;0.2&quot; /&gt;\n  &lt;xr-light type=&quot;point&quot; position=&quot;0 0 0&quot; color=&quot;1 0 0&quot; range=&quot;3&quot; intensity=&quot;3&quot; /&gt;\n  &lt;xr-light type=&quot;point&quot; position=&quot;2 0 1&quot; color=&quot;0 1 0&quot; range=&quot;3&quot; intensity=&quot;3&quot; /&gt;\n  &lt;xr-light type=&quot;spot&quot; position=&quot;0 0 0&quot; color=&quot;0 0 1&quot; range=&quot;12&quot; intensity=&quot;12&quot; rotation=&quot;0 120 0&quot; inner-cone-angle=&quot;30&quot; outer-cone-angle=&quot;35&quot; /&gt;\n&lt;/xr-node&gt;\n&lt;/xr-scene&gt;\n`\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-light/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic-light\": \"../../../components/xr-basic-light/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-light/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"灯光案例\"\n  intro=\"蓝色的聚光，绿色、红色的点光及少量白色平行、环境光作用下的，默认材质的四个白色图形。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-basic-light\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    a=\"123\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-light/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-particle/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ';'\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n    capacity: 0,\n    emitRate: 0,\n    lifeTime: 0,\n  },\n\n  calc(variable, add = true, number = 1) {\n    let temp = variable\n    let result = temp\n    let count = 1\n    while (Math.floor(temp / 10)) {\n      count++\n      temp = Math.floor(temp / 10)\n    }\n    if (add) {\n      result += number * 10 ** (count - 1)\n    } else {\n      if (result <= number * 10 ** (count - 1)) {\n        count--\n        if (count < 1) {\n          count = 1\n        }\n      }\n      result -= number * 10 ** (count - 1)\n      if (result < 0) {\n        result = 0\n      }\n    }\n    return Number(result.toFixed(1))\n  },\n  handleAdd() {\n    this.setData({ capacity: this.calc(this.data.capacity, true) })\n  },\n  handleSub() {\n    this.setData({ capacity: this.calc(this.data.capacity, false) })\n  },\n  handleRateAdd() {\n    this.setData({ emitRate: this.calc(this.data.emitRate, true) })\n  },\n  handleRateSub() {\n    this.setData({ emitRate: this.calc(this.data.emitRate, false) })\n  },\n  handleTimeAdd() {\n    this.setData({ lifeTime: this.calc(this.data.lifeTime, true, 0.1) })\n  },\n  handleTimeSub() {\n    this.setData({ lifeTime: this.calc(this.data.lifeTime, false, 0.1) })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-particle/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic-particle\": \"../../../components/xr-basic-particle/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-particle/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"基础案例\"\n  intro=\"使用`xr-particle`，控制粒子系统的显示。从远到近，从左到右依次是：案例1：球形发射器与颜色过渡效果的粒子展示 案例2：闪电球效果的粒子展示 案例3：光环效果展示 案例4：传送门效果展示 案例5： 《戴珍珠耳环的少女》人像效果展示\"\n  code=\"{{xmlCode}}\"\n>\n\n<xr-basic-particle\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    capacity=\"{{capacity}}\"\n    emitRate=\"{{emitRate}}\"\n    lifeTime=\"{{lifeTime}}\"\n/>\n\n<view class=\"env-words\">\n  <!-- <span class=\"tips\">粒子上限: </span><span class=\"content\">{{capacity}}</span><text>\\n</text>\n  <span class=\"tips\">粒子速率: </span><span class=\"content\">{{emitRate}}</span><text>\\n</text>\n  <span class=\"tips\">粒子生命周期: </span><span class=\"content\">{{lifeTime}}</span><text>\\n</text> -->\n</view>\n<view class=\"button-wrap\">\n  <!-- <view class=\"change-button\" bindtap=\"handleAdd\">增加粒子</view>\n  <view class=\"change-button\" bindtap=\"handleSub\">减少粒子</view>\n  <view class=\"change-button\" bindtap=\"handleRateAdd\">增加粒子速率</view>\n  <view class=\"change-button\" bindtap=\"handleRateSub\">减少粒子速率</view>\n  <view class=\"change-button\" bindtap=\"handleTimeAdd\">增加粒子生命周期</view>\n  <view class=\"change-button\" bindtap=\"handleTimeSub\">减少粒子生命周期</view> -->\n</view>\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-particle/index.wxss",
    "content": ".button-wrap {\n  line-height: 60rpx;\n  text-align: center;\n  vertical-align: middle;\n}\n\n.change-button {\n  display: inline-block;\n  background-color: #000;\n  color: #fff;\n  font-size: 22rpx;\n  margin: 10rpx;\n  padding: 5rpx 24rpx;\n  border-radius: 6rpx;\n}\n\n.env-words {\n  text-align: center;\n  vertical-align: baseline;\n  margin: 10rpx 0;\n}\n\n.env-words .tips {\n    font-size: 20rpx;\n}\n\n.env-words .content {\n  font-size: 28rpx;\n  font-weight: bold;\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-postprocessing/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n    type: 0,\n\n    blurRadius: 16,\n    bloomRadius: 16,\n    bloomIntensity: 2,\n    bloomThreshold: 0.5,\n    vignetteIntensity: 1,\n    vignetteSmoothness: 2,\n    vignetteRoundness: 1,\n    fxaaEnabled: false\n  },\n  handleProgress({ detail }) {\n    this.setData({ progressInfo: `${~~(detail.progress * 100)} %\\n\\n${detail.asset.assetId}(${detail.asset.type}): ${detail.asset.src}` })\n  },\n  handleLoaded({ detail }) {\n    this.setData({ loaded: true })\n  },\n  changeType(e) {\n    const type = e.detail.value\n    if (type === 'blur') {\n      this.setData({\n        type: 0\n      })\n    } else if (type === 'bloom') {\n      this.setData({\n        type: 1\n      })\n    } else if (type === 'vignette') {\n      this.setData({\n        type: 2\n      })\n    } else if (type === 'fxaa') {\n      this.setData({\n        type: 3\n      })\n    }\n  },\n  changeBlurRadius(e) {\n    this.setData({\n      blurRadius: e.detail.value\n    })\n  },\n  changeBloomRadius(e) {\n    this.setData({\n      bloomRadius: e.detail.value\n    })\n  },\n  changeBloomIntensity(e) {\n    this.setData({\n      bloomIntensity: e.detail.value\n    })\n  },\n  changeBloomThreshold(e) {\n    this.setData({\n      bloomThreshold: e.detail.value\n    })\n  },\n  changeVignetteIntensity(e) {\n    this.setData({\n      vignetteIntensity: e.detail.value\n    })\n  },\n  changeVignetteSmoothness(e) {\n    this.setData({\n      vignetteSmoothness: e.detail.value\n    })\n  },\n  changeVignetteRoundness(e) {\n    this.setData({\n      vignetteRoundness: e.detail.value\n    })\n  },\n  switchFXAA(e) {\n    this.setData({\n      fxaaEnabled: !this.data.fxaaEnabled\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-postprocessing/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-gltf-postprocessing\": \"../../../components/xr-basic-postprocessing/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-postprocessing/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"后处理效果案例\"\n  intro=\"展示了xrFrame内置的几种后处理效果。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-gltf-postprocessing\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n\n    type=\"{{type}}\"\n    blurRadius=\"{{blurRadius}}\"\n    bloomRadius=\"{{bloomRadius}}\"\n    bloomIntensity=\"{{bloomIntensity}}\"\n    bloomThreshold=\"{{bloomThreshold}}\"\n    vignetteIntensity=\"{{vignetteIntensity}}\"\n    vignetteSmoothness=\"{{vignetteSmoothness}}\"\n    vignetteRoundness=\"{{vignetteRoundness}}\"\n    fxaaEnabled=\"{{fxaaEnabled}}\"\n    bind:assetsProgress=\"handleProgress\"\n    bind:assetsLoaded=\"handleLoaded\"\n    loaded=\"{{loaded}}\"\n  />\n  <view wx:if=\"{{!loaded}}\" style=\"position: absolute;display: flex; justify-content: center; align-items: center; left: 0;top: 0;width: {{width}}px;height: {{height}}px;background-color: #6aa; text-align: center;line-height: 24px;\">\n    <text style=\"color: white;font-size: 18px;\">{{progressInfo}}</text>\n  </view>\n  <view class=\"form-entry\">\n    <view class=\"form-entry-title\">后处理类型</view>\n    <radio-group name=\"pp-type\" bindchange=\"changeType\">\n      <label class=\"radio-item\"><radio value=\"blur\" checked/>模糊</label>\n      <label class=\"radio-item\"><radio value=\"vignette\"/>渐晕</label>\n      <label class=\"radio-item\"><radio value=\"bloom\"/>泛光</label>\n      <label class=\"radio-item\"><radio value=\"fxaa\"/>抗锯齿</label>\n    </radio-group>\n  </view>\n  <!-- <view class=\"divider\"></view> -->\n  <view wx:if=\"{{type == 0}}\" class=\"form-entry\">\n    <view class=\"form-entry-title\">模糊半径</view>\n    <slider bindchange=\"changeBlurRadius\" value=\"{{blurRadius}}\"></slider>\n  </view>\n  <view wx:if=\"{{type == 2}}\" class=\"form-entry\">\n    <view class=\"form-entry-title\">渐晕强度</view>\n    <slider bindchange=\"changeVignetteIntensity\" value=\"{{vignetteIntensity}}\" min=\"{{0}}\" max=\"{{8}}\" step=\"{{0.1}}\"></slider>\n  </view>\n  <view wx:if=\"{{type == 2}}\" class=\"form-entry\">\n    <view class=\"form-entry-title\">渐晕平滑</view>\n    <slider bindchange=\"changeVignetteSmoothness\" value=\"{{vignetteSmoothness}}\" min=\"{{0}}\" max=\"{{8}}\" step=\"{{0.1}}\"></slider>\n  </view>\n  <view wx:if=\"{{type == 2}}\" class=\"form-entry\">\n    <view class=\"form-entry-title\">渐晕圆度</view>\n    <slider bindchange=\"changeVignetteRoundness\" value=\"{{vignetteRoundness}}\"  min=\"{{0}}\" max=\"{{1}}\" step=\"{{0.1}}\"></slider>\n  </view>\n  <view wx:if=\"{{type == 1}}\" class=\"form-entry\">\n    <view class=\"form-entry-title\">泛光半径</view>\n    <slider bindchange=\"changeBloomRadius\" value=\"{{bloomRadius}}\"></slider>\n  </view>\n  <view wx:if=\"{{type == 1}}\" class=\"form-entry\">\n    <view class=\"form-entry-title\">泛光强度</view>\n    <slider bindchange=\"changeBloomIntensity\" max=\"5\" value=\"2\" step=\"0.1\" value=\"{{bloomIntensity}}\"></slider>\n  </view>\n  <view wx:if=\"{{type == 1}}\" class=\"form-entry\">\n    <view class=\"form-entry-title\">泛光阈值</view>\n    <slider bindchange=\"changeBloomThreshold\" max=\"2\" value=\"0.5\" step=\"0.1\" value=\"{{bloomThreshold}}\"></slider>\n  </view>\n  <view wx:if=\"{{type == 3}}\" class=\"form-entry\">\n    <view class=\"form-entry-title\">开启FXAA</view>\n    <switch checked=\"{{fxaaEnabled}}\" bindchange=\"switchFXAA\"/>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-postprocessing/index.wxss",
    "content": ".form-entry {\n    margin: 15px;\n}\n\n.radio-item {\n  margin-right: 3%;\n}\n\n.form-entry-title {\n    margin-bottom: 10px;\n}\n\n.divider {\n  width: 20%;\n  height: 2px;\n  background-color: rgb(230, 230, 230);\n  /* margin-left: 15px; */\n  margin: 0 auto 0 auto;\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-render-texture/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-render-texture/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic-render-texture\": \"../../../components/xr-basic-render-texture/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-render-texture/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"RenderTexture案例\"\n  intro=\"使用`xr-asset-render-texture`生成渲染目标。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-basic-render-texture\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-render-texture/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-shadow/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\nconst escapeMarkup = require('../../behavior-scene/util').escapeMarkup\n\nconst xmlCode = escapeMarkup(`<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\" bind:tick=\"handleTick\">\n<xr-shadow id=\"shadow-root\"></xr-shadow>\n</xr-scene>`)\nconst jsCode = `\n...<br>\naddOne() {\n  <div class=\"ml20\">\n  const xrFrameSystem = wx.getXrFrameSystem();<br>\n  const pos = [Math.random(), Math.random(), Math.random()].map(v => (v * 2 - 1) * 6);<br>\n\n  const gltfElement = this.scene.createElement(xrFrameSystem.XRGLTF);<br>\n  this.shadowRoot.addChild(gltfElement);<br>\n  gltfElement.getComponent(xrFrameSystem.Transform).position.setArray(pos);<br>\n  gltfElement.getComponent(xrFrameSystem.GLTF).setData({model: this.gltfModle});<br>\n\n  this.meshList.push(gltfElement);<br>\n  </div>\n},\nremoveOne() {\n  <div class=\"ml20\">\n  const element = this.meshList.pop();<br>\n  if (element) {<br>\n    this.shadowRoot.removeChild(element);\n  }\n  </div>\n},\nhandleTick: function({detail}) {\n  <div class=\"ml20\">\n  const {el, value} = detail;\n  </div>\n},<br>\n...\n`\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    jsCode,\n    meshCount: 0\n  },\n  handleIncMeshCount() {\n    if (this.data.meshCount > 16) {\n      return\n    }\n\n    this.setData({ meshCount: this.data.meshCount + 1 })\n  },\n  handleDecMeshCount() {\n    if (this.data.meshCount <= 0) {\n      return\n    }\n\n    this.setData({ meshCount: this.data.meshCount - 1 })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-shadow/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic-shadow\": \"../../../components/xr-basic-shadow/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-shadow/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"ShadowNode案例\"\n  intro=\"可以使用xml中的xr-shadow节点，来动态在其下添加节点，以及用代码加载资源\"\n  code=\"{{xmlCode}}\"\n  js=\"{{jsCode}}\"\n>\n  <xr-basic-shadow\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    meshCount=\"{{meshCount}}\"\n  />\n\n  <view class=\"button-wrap\">\n    <button class=\"change-button\" bindtap=\"handleIncMeshCount\">增加一个模型</button>\n    <button class=\"change-button\" bindtap=\"handleDecMeshCount\">减少一个模型</button>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-shadow/index.wxss",
    "content": ".button-wrap {\n  display: flex;\n}\n\n.change-button {\n  background-color: #000;\n  color: #fff;\n  font-size: 26rpx;\n  margin-top: 20rpx;\n  padding: 20rpx 0;\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-share/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    captureState: 0,\n    recordState: 0,\n    captureQuality: 0.8,\n    captureType: 'jpg',\n    recordFPS: 30,\n    recordScale: 1,\n    recordWidth: 0,\n    recordHeight: 0,\n    recordBPS: 1000,\n    sceneWidth: 0,\n    sceneHeight: 0\n  },\n  handleReady({ detail }) {\n    this.setData({\n      sceneWidth: detail.width,\n      sceneHeight: detail.height,\n      recordWidth: detail.width,\n      recordHeight: detail.height,\n    })\n  },\n  changeCaptureState(e) {\n    if (this.data.recordState) {\n      wx.showToast({\n        title: '录屏中不允许！',\n      })\n      return\n    }\n\n    if (this.data.captureState) {\n      wx.showToast({\n        title: '等待上次完成！',\n      })\n      return\n    }\n\n    this.setData({ captureState: 1 })\n    // hack，其实应该等待异步方法完成\n    setTimeout(() => {\n      this.setData({ captureState: 0 })\n    }, 1000)\n  },\n  changeRecordState(e) {\n    this.setData({ recordState: this.data.recordState ? 0 : 1 })\n  },\n  changeCaptureType(e) {\n    this.setData({ captureType: e.detail.value })\n  },\n  changeCaptureQuality(e) {\n    this.setData({\n      captureQuality: e.detail.value\n    })\n  },\n  changeRecordFPS(e) {\n    this.setData({\n      recordFPS: e.detail.value\n    })\n  },\n  changeRecordBPS(e) {\n    this.setData({\n      recordBPS: e.detail.value\n    })\n  },\n  changeRecordScale(e) {\n    const scale = e.detail.value\n    this.setData({\n      recordScale: scale,\n      recordWidth: ~~(this.data.sceneWidth * scale),\n      recordHeight: ~~(this.data.sceneHeight * scale),\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-share/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic-share\": \"../../../components/xr-basic-share/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-share/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"录屏和截屏\"\n  intro=\"展示了如何配置并截屏/录屏。\"\n  code=\"\"\n>\n  <xr-basic-share\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:sceneReady=\"handleReady\"\n\n    captureState=\"{{captureState}}\"\n    recordState=\"{{recordState}}\"\n    captureType=\"{{captureType}}\"\n    captureQuality=\"{{captureQuality}}\"\n    recordFPS=\"{{recordFPS}}\"\n    recordBPS=\"{{recordBPS}}\"\n    recordWidth=\"{{recordWidth}}\"\n    recordHeight=\"{{recordHeight}}\"\n  />\n  <view class=\"button-wrap\">\n    <button class=\"action-button\" bindtap=\"changeCaptureState\">截屏分享</button>\n    <button class=\"action-button\" bindtap=\"changeRecordState\">{{recordState == 1 ? '停止录屏' : '启动录屏'}}</button>\n  </view>\n\n  <view class=\"form-entry\">\n    <view class=\"form-entry-title\">截频格式</view>\n    <radio-group name=\"pp-type\" bindchange=\"changeCaptureType\">\n      <label class=\"radio-item\"><radio value=\"jpg\" checked />JPG</label>\n      <label class=\"radio-item\"><radio value=\"png\"/>PNG</label>\n    </radio-group>\n  </view>\n  <view class=\"form-entry\">\n    <view class=\"form-entry-title\">截频质量</view>\n    <slider show-value bindchange=\"changeCaptureQuality\" value=\"{{captureQuality}}\" min=\"{{0.5}}\" max=\"{{1}}\" step=\"{{0.1}}\"></slider>\n  </view>\n\n  <view class=\"form-entry\">\n    <view class=\"form-entry-title\">录屏FPS</view>\n    <slider show-value bindchange=\"changeRecordFPS\" value=\"{{recordFPS}}\" min=\"{{10}}\" max=\"{{60}}\" step=\"{{10}}\"></slider>\n  </view>\n\n  <view class=\"form-entry\">\n    <view class=\"form-entry-title\">录屏尺寸系数</view>\n    <slider show-value bindchange=\"changeRecordScale\" value=\"{{recordScale}}\" min=\"{{0.5}}\" max=\"{{1}}\" step=\"{{0.1}}\"></slider>\n  </view>\n\n  <view class=\"form-entry\">\n    <view class=\"form-entry-title\">录屏BPS</view>\n    <slider show-value bindchange=\"changeRecordBPS\" value=\"{{recordBPS}}\" min=\"{{500}}\" max=\"{{2000}}\" step=\"{{100}}\"></slider>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-share/index.wxss",
    "content": ".form-entry {\n    margin: 15px;\n}\n\n.radio-item {\n  margin-right: 3%;\n}\n\n.form-entry-title {\n    margin-bottom: 10px;\n}\n\n.button-wrap {\n  display: flex;\n}\n\n.action-button {\n  background-color: #000;\n  color: #fff;\n  font-size: 26rpx;\n  margin-top: 20rpx;\n  padding: 20rpx 0;\n}\n\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-touch/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\nconst escapeMarkup = require('../../behavior-scene/util').escapeMarkup\n\nconst xmlCode = escapeMarkup(`<xr-scene id=\"xr-scene\" bind:tick=\"handleTick\" bind:ready=\"handleReady\">\n<xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n  <xr-asset-load type=\"texture\" asset-id=\"earth-texture\" src=\"...\" />\n  <xr-asset-load type=\"texture\" asset-id=\"moon-texture\" src=\"...\" />\n  <xr-asset-material asset-id=\"standard-mat\" effect=\"standard\" />\n</xr-assets>\n<xr-node>\n  <xr-mesh node-id=\"mesh-earth\" position=\"0 0 0\" scale=\"8 8 8\" geometry=\"sphere\" material=\"standard-mat\" uniforms=\"u_baseColorMap: earth-texture\" bind:dragShape=\"handleEarthRotation\" sphere-shape></xr-mesh>\n  <xr-mesh node-id=\"mesh-moon\" position=\"10 0 0\" scale=\"1.5 1.5 1.5\" rotation=\"0 90 0\" geometry=\"sphere\" material=\"standard-mat\" uniforms=\"u_baseColorMap: moon-texture\" bind:dragShape=\"handleDragMoon\" bind:touchShape=\"handleTouchMoon\" bind:untouchShape=\"handleUntouchMoon\" sphere-shape=\"radius: 1.5\">\n  </xr-mesh>\n  <xr-camera\n    id=\"camera\" node-id=\"camera\" position=\"0 20 -35\" clear-color=\"0 0 0 1\"\n    target=\"mesh-earth\"\n  ></xr-camera>\n</xr-node>\n<xr-node node-id=\"lights\">\n  <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"0.1\" />\n  <xr-light id=\"directional-light\" type=\"directional\" rotation=\"0 60 0\" color=\"1 1 1\" intensity=\"5\" />\n</xr-node>\n</xr-scene>`)\n\nconst jsCode = 'not implemented'\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    jsCode\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-touch/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic-touch\": \"../../../components/xr-basic-touch/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-touch/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"交互案例\"\n  intro=\"简易地月模型。拖拽地球可使其旋转；拖拽月球可使其移动。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-basic-touch\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    a=\"123\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-touch/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-video/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-video/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic-video\": \"../../../components/xr-basic-video/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-video/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"视频纹理案例\"\n  intro=\"使用视频纹理，开始播放后，点击立方体可以暂停/唤醒播放。作为uniform使用，也可用于天空盒，注意使用时id为`video-${asset-id}`\"\n  hint=\"正式版本以及`pause`/`resume`方法，在基础库 v2.32.0 及以上支持。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-basic-video\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-video/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-visible-layer/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n    visibleIndex: 1,\n    cullMask: 0b011\n  },\n  handleChangeVisible() {\n    this.setData({\n      visibleIndex: 3 - this.data.visibleIndex\n    })\n  },\n  handleChangeCullMask() {\n    this.setData({\n      cullMask: ((this.data.cullMask ^ (((this.data.cullMask & 0b100) >> 2) * 0b111)) << 1) | 0b1\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-visible-layer/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic-visible-layer\": \"../../../components/xr-basic-visible-layer/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-visible-layer/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"显示和图层\"\n  intro=\"使用`xr-node`以及派生节点上的`visible`和`layer`，配合`camera`的`cull-mask`，控制节点树的显示。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-basic-visible-layer\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    visibleIndex=\"{{visibleIndex}}\"\n    cullMask=\"{{cullMask}}\"\n  />\n\n  <view class=\"btn-strap\">\n    <button class=\"btn\" bind:tap=\"handleChangeVisible\" style=\"background-color: rgb(237, 211, 231)\">通过visible属性控制</button>\n    <button class=\"btn\" bind:tap=\"handleChangeCullMask\" style=\"background-color: rgb(214, 226, 243)\">通过layer和cullmask控制</button>\n  </view>\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/basic/scene-basic-visible-layer/index.wxss",
    "content": ".btn-strap {\n    /* background-color: white; */\n}\n.btn {\n    display: inline-block;\n    font-size: 80%;\n    padding:  5px 0;\n    margin: 5px 1% !important;\n    width: 48% !important;\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/behavior-scene/scene-ready.js",
    "content": "module.exports = Behavior({\n  behaviors: [],\n  properties: {\n  },\n  data: {\n    left: 0,\n    top: 0,\n    width: 0,\n    height: 0,\n    renderWidth: 0,\n    renderHeight: 0,\n    windowHeight: 1000,\n    heightScale: 0.75,\n    dpiScale: 1,\n    showBackBtn: false,\n    activeValues: [1],\n    arTrackerShow: false,\n    arTrackerState: 'Init',\n    arTrackerError: ''\n  },\n  attached() {},\n  ready() {\n    const info = wx.getSystemInfoSync()\n    const width = info.windowWidth\n    const windowHeight = info.windowHeight\n    const height = windowHeight * this.data.heightScale\n    const dpi = info.pixelRatio\n    this.setData({\n      width,\n      height,\n      renderWidth: width * dpi * this.data.dpiScale,\n      renderHeight: height * dpi * this.data.dpiScale,\n      windowHeight\n    })\n  },\n  methods: {\n    onLoad(options) {\n      wx.reportEvent('xr_frame', {\n        xr_page_path: options.path\n      })\n    },\n    onShareAppMessage() {\n      try {\n        if (wx.xrScene) {\n          const buffer = wx.xrScene.share.captureToArrayBuffer({ quality: 0.5 })\n          const fp = `${wx.env.USER_DATA_PATH}/xr-frame-share.jpg`\n          wx.getFileSystemManager().writeFileSync(fp, buffer, 'binary')\n          return {\n            title: this.getTitle(),\n            imageUrl: fp\n          }\n        }\n      } catch (e) {\n        return {\n          title: this.getTitle()\n        }\n      }\n    },\n    onShareTimeline() {\n      try {\n        if (wx.xrScene) {\n          const buffer = wx.xrScene.share.captureToArrayBuffer({ quality: 0.5 })\n          const fp = `${wx.env.USER_DATA_PATH}/xr-frame-share.jpg`\n          wx.getFileSystemManager().writeFileSync(fp, buffer, 'binary')\n          return {\n            title: this.getTitle(),\n            imageUrl: fp\n          }\n        }\n      } catch (e) {\n        return {\n          title: this.getTitle()\n        }\n      }\n    },\n    getTitle() {\n      return wx.xrTitle ? `XR - ${wx.xrTitle}` : 'XR-FRAME官方示例'\n    },\n    handleARTrackerState({ detail }) {\n      const { state, error } = detail\n      this.setData({\n        arTrackerShow: true,\n        arTrackerState: wx.getXrFrameSystem().EARTrackerState[state],\n        arTrackerError: error\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/behavior-scene/util.js",
    "content": "const handleDecodedXML = function (decodedXml) {\n  let rerurnXml = ''\n\n  const blockArr = decodedXml.split('&lt;')\n\n  for (let i = 0; i < blockArr.length; i++) {\n    const blockStr = blockArr[i]\n    let handleBlockStr = ''\n    let returnBlockStr = ''\n\n    const sliceBlockStr = blockStr.split(' ')\n\n    for (let j = 0; j < sliceBlockStr.length; j++) {\n      const subBlockStr = sliceBlockStr[j]\n\n      const eIndex = subBlockStr.indexOf('=')\n      if (eIndex !== -1) {\n        handleBlockStr += ' <span class=\"attr-name\">' + subBlockStr.slice(0, eIndex) + '</span>' + subBlockStr.slice(eIndex)\n      } else {\n        handleBlockStr += subBlockStr\n      }\n    }\n    // console.log(sliceBlockStr);\n\n    const blockEndIndexB = handleBlockStr.indexOf(' ')\n    const blockEndIndexR = handleBlockStr.indexOf('&gt;')\n    // Handle XMLTag\n    if (blockEndIndexB === -1 && blockEndIndexR === -1) {\n      continue\n    }\n    const endBlockFlag = handleBlockStr[0] === '/'\n\n    if (blockEndIndexR !== -1) {\n      handleBlockStr += '<br>'\n    }\n    if (blockEndIndexR < blockEndIndexB) {\n      returnBlockStr = '&lt;' + (endBlockFlag ? '/' : '') + '<span class=\"block-name\">' + handleBlockStr.slice(endBlockFlag ? 1 : 0, blockEndIndexR) + '</span>' + handleBlockStr.slice(blockEndIndexR)\n    } else if (blockEndIndexB !== -1) {\n      returnBlockStr = '&lt;' + (endBlockFlag ? '/' : '') + '<span class=\"block-name\">' + handleBlockStr.slice(endBlockFlag ? 1 : 0, blockEndIndexB) + '</span>' + handleBlockStr.slice(blockEndIndexB)\n    } else if (blockEndIndexR !== -1) {\n      returnBlockStr = '&lt;' + (endBlockFlag ? '/' : '') + '<span class=\"block-name\">' + handleBlockStr.slice(endBlockFlag ? 1 : 0, blockEndIndexR) + '</span>' + handleBlockStr.slice(blockEndIndexR)\n    }\n    rerurnXml += returnBlockStr\n  }\n  return rerurnXml\n}\n\nconst escapeMarkup = function (dangerousInput) {\n  const dangerousString = String(dangerousInput)\n  const matchHtmlRegExp = /[\"'&<>]/\n  const match = matchHtmlRegExp.exec(dangerousString)\n  if (!match) {\n    return dangerousInput\n  }\n\n  const encodedSymbolMap = {\n    '\"': '&quot;',\n    '\\'': '&#39;',\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;'\n  }\n  const dangerousCharacters = dangerousString.split('')\n  const safeCharacters = dangerousCharacters.map(function (character) {\n    return encodedSymbolMap[character] || character\n  })\n  const safeString = safeCharacters.join('')\n  return safeString\n}\n\nmodule.exports = {\n  handleDecodedXML,\n  escapeMarkup\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/custom/scene-custom-logic/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/custom/scene-custom-logic/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-custom-logic\": \"../../../components/xr-custom-logic/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/custom/scene-custom-logic/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"定制组件和元素\"\n  intro=\"使用xrFrameSystem定制组件和元素，并使用。点击左侧头盔可以更改旋转方向，按住拖动可以更改旋转速度。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-custom-logic\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/custom/scene-custom-logic/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/custom/scene-custom-render/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/custom/scene-custom-render/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-custom-render\": \"../../../components/xr-custom-render/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/custom/scene-custom-render/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"定制渲染资源\"\n  intro=\"使用xrFrameSystem定制Effect和Geometry，并使用。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-custom-render\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/custom/scene-custom-render/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-firework/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-firework/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-customParticle-firework\": \"../../../components/xr-customParticle-firework/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-firework/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"喷射烟火案例\"\n  intro=\"自定义粒子系统烟火特效的实现\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-customParticle-firework\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-firework/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-meshEmitter/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-meshEmitter/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-customParticle-meshEmitter\": \"../../../components/xr-customParticle-meshEmitter/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-meshEmitter/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"网格发射器用例\"\n  intro=\"展示网格发射器的用法\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-customParticle-meshEmitter\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-meshEmitter/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-orb/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-orb/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-customParticle-orb\": \"../../../components/xr-customParticle-orb/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-orb/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"闪电光球\"\n  intro=\"自定义粒子系统实现光球特效\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-customParticle-orb\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-orb/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-portal/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-portal/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-customParticle-portal\": \"../../../components/xr-customParticle-portal/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-portal/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"传送门案例\"\n  intro=\"传送门的自定义粒子实现\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-customParticle-portal\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-portal/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-shapeEmitter/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-shapeEmitter/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-customParticle-shapeEmitter\": \"../../../components/xr-customParticle-shapeEmitter/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n} "
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-shapeEmitter/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"球形发射器用例\"\n  intro=\"球形发射器的自定义粒子系统实现\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-customParticle-shapeEmitter\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/customParticle/scene-customParticle-shapeEmitter/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-animation/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = `&lt;xr-scene id=&quot;xr-scene&quot;&gt;\n&lt;xr-assets bind:progress=&quot;handleAssetsProgress&quot; bind:loaded=&quot;handleAssetsLoaded&quot;&gt;\n  &lt;xr-asset-load type=&quot;gltf&quot; asset-id=&quot;gltf-damageHelmet&quot; src=&quot;https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/DamagedHelmet.gltf&quot; /&gt;\n  &lt;xr-asset-load\n    type=&quot;env-data&quot; asset-id=&quot;env1&quot; src=&quot;cloud://test-3gdnb38cf6add475.7465-test-3gdnb38cf6add475-1308124549/env-footprint/data.json&quot;\n  /&gt;\n&lt;/xr-assets&gt;\n&lt;xr-env env-data=&quot;env1&quot; /&gt;\n&lt;xr-node&gt;\n  &lt;xr-gltf node-id=&quot;gltf-damageHelmet&quot; position=&quot;0 0 0&quot; rotation=&quot;0 0 0&quot; scale=&quot;1.2 1.2 1.2&quot; model=&quot;gltf-damageHelmet&quot;&gt;&lt;/xr-gltf&gt;\n  &lt;xr-camera\n    id=&quot;camera&quot; node-id=&quot;camera&quot; position=&quot;0 0 3&quot; clear-color=&quot;0.925 0.925 0.925 1&quot;\n    target=&quot;gltf-damageHelmet&quot;\n    camera-orbit-control=&quot;&quot;\n  &gt;&lt;/xr-camera&gt;\n&lt;/xr-node&gt;\n&lt;xr-node node-id=&quot;lights&quot;&gt;\n  &lt;xr-light type=&quot;ambient&quot; color=&quot;1 1 1&quot; intensity=&quot;0.3&quot; /&gt;\n  &lt;xr-light type=&quot;directional&quot; rotation=&quot;40 180 0&quot; color=&quot;1 1 1&quot; intensity=&quot;2&quot; /&gt;\n&lt;/xr-node&gt;\n&lt;/xr-scene&gt;\n`\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-animation/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-gltf-animation\": \"../../../components/xr-gltf-animation/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-animation/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"gltf动画案例\"\n  intro=\"包含gltf动画，以及和keyframe动画的协作（为什么会这里会出现Miku？因为很可爱啊（笑\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-gltf-animation\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-animation/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-compressTextures/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-compressTextures/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-gltf-compressTextures\": \"../../../components/xr-gltf-compressTextures/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-compressTextures/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"glTF压缩纹理案例\"\n  intro=\"应用 WX_compress_textures 扩展的glTF案例，压缩纹理生成可用xr-frame-toolkit。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-gltf-compressTextures\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-compressTextures/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-damageHelmet/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-damageHelmet/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-gltf-damageHelmet\": \"../../../components/xr-gltf-damageHelmet/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-damageHelmet/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"金属头盔案例\"\n  intro=\"包含完整MetalRougnessMap、EmissiveMap、NormalMap、OcclusionTexture以及各类因子的glTF。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-gltf-damageHelmet\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    a=\"123\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-damageHelmet/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-light-loading/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = `&lt;xr-scene id=&quot;xr-scene&quot;&gt;\n&lt;xr-assets bind:progress=&quot;handleAssetsProgress&quot; bind:loaded=&quot;handleAssetsLoaded&quot;&gt;\n  &lt;xr-asset-load type=&quot;gltf&quot; asset-id=&quot;gltf-Sponza&quot; src=&quot;https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/Sponza/gltf/Sponza.gltf&quot; /&gt;\n&lt;/xr-assets&gt;\n&lt;xr-node&gt;\n  &lt;xr-node node-id=&quot;camera-target&quot; position=&quot;0 5 0&quot;&gt;&lt;/xr-node&gt;\n  &lt;xr-gltf node-id=&quot;mesh-gltf-Sponza&quot; position=&quot;0 -2 0.3&quot; rotation=&quot;0 0 0&quot; scale=&quot;2 2 2&quot; model=&quot;gltf-Sponza&quot;&gt;&lt;/xr-gltf&gt;\n  &lt;xr-camera\n    id=&quot;camera&quot; node-id=&quot;camera&quot; position=&quot;-1 5 0&quot; clear-color=&quot;0.925 0.925 0.925 1&quot;\n    target=&quot;camera-target&quot;\n    camera-orbit-control=&quot;&quot;\n  &gt;&lt;/xr-camera&gt;\n&lt;/xr-node&gt;\n&lt;xr-node node-id=&quot;lights&quot;&gt;\n  &lt;xr-light type=&quot;ambient&quot; color=&quot;1 1 1&quot; intensity=&quot;0.4&quot; /&gt;\n  &lt;xr-light\n    type=&quot;directional&quot; rotation=&quot;200 155 0&quot; color=&quot;1 1 1&quot; intensity=&quot;3&quot;\n    anim-keyframe=&quot;gltf-anim&quot; anim-clipmap=&quot;default:directionalLight&quot; anim-autoplay=&quot;clip:directionalLight, speed:1&quot;\n  /&gt;\n  &lt;xr-light\n    type=&quot;point&quot; position=&quot;10 0 0&quot; color=&quot;1 1 1&quot; range=&quot;10&quot; intensity=&quot;30&quot;\n    anim-keyframe=&quot;gltf-anim&quot; anim-autoplay=&quot;clip:pointLight, speed:1&quot;\n    /&gt;\n  &lt;xr-light\n    type=&quot;spot&quot; color=&quot;1 0 0&quot; position=&quot;0 8 0&quot; range=&quot;30&quot; intensity=&quot;60&quot; rotation=&quot;0 90 0&quot; inner-cone-angle=&quot;18&quot; outer-cone-angle=&quot;24&quot;\n    anim-keyframe=&quot;gltf-anim&quot; anim-autoplay=&quot;clip:spotLight, speed:1&quot;\n  /&gt;\n&lt;/xr-node&gt;\n&lt;/xr-scene&gt;\n`\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    progressInfo: '',\n    loaded: false\n  },\n  handleProgress({ detail }) {\n    console.log('assets progress', detail)\n\n    this.setData({ progressInfo: `${~~(detail.progress * 100)} %\\n\\n${detail.asset.assetId}(${detail.asset.type}): ${detail.asset.src}` })\n  },\n  handleLoaded({ detail }) {\n    console.log('assets loaded', detail)\n\n    this.setData({ loaded: true })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-light-loading/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-gltf-light-loading\": \"../../../components/xr-gltf-light-loading/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-light-loading/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"多光源glTF案例\"\n  intro=\"组件和页面通信实现资源加载时覆盖加载界面，以及多个进行动画光源(红色spotLight、白色点光源、白色平行光)，于glTF光照测试场景中的渲染效果。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-gltf-light-loading\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    loaded=\"{{loaded}}\"\n    bind:assetsProgress=\"handleProgress\"\n    bind:assetsLoaded=\"handleLoaded\"\n  />\n\n  <view wx:if=\"{{!loaded}}\" style=\"position: absolute;display: flex; justify-content: center; align-items: center; left: 0;top: 0;width: {{width}}px;height: {{height}}px;background-color: #6aa; text-align: center;line-height: 24px;\">\n    <text style=\"color: white;font-size: 18px;\">{{progressInfo}}</text>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-light-loading/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-lightsPunctual/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-lightsPunctual/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-gltf-lightsPunctual\": \"../../../components/xr-gltf-lightsPunctual/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-lightsPunctual/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"KHR_lights_punctual\"\n  intro=\"glTF Punctual Light 支持。Copyright 2021 DGG. CC BY 4.0 International https://creativecommons.org/licenses/by/4.0/\"\n>\n  <xr-gltf-lightsPunctual\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    a=\"123\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-lightsPunctual/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-morph/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-morph/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-gltf-morph\": \"../../../components/xr-gltf-morph/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-morph/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"gltf morph案例\"\n  intro=\"gltf morph targets的使用。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-gltf-morph\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-morph/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-sheen/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-sheen/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-gltf-sheen\": \"../../../components/xr-gltf-sheen/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-sheen/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"KHR_materials_sheen\"\n  intro=\"glTF Sheen 扩展，主要用于布料与织物材质的模拟。基础库 2.32.1 支持。model Copyright 2020 Wayfair LLC, CC-BY 4.0\"\n>\n  <xr-gltf-sheen\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    a=\"123\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-sheen/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-specularGlossiness/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-specularGlossiness/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-gltf-specularGlossiness\": \"../../../components/xr-gltf-specularGlossiness/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-specularGlossiness/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"KHR_materials_pbrSpecularGlossiness\"\n  intro=\"glTF 高光光泽度扩展。model From SketchFab @Willy Decarpentrie\"\n>\n  <xr-gltf-specularGlossiness\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    a=\"123\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-specularGlossiness/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-textureTransform/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-textureTransform/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-gltf-textureTransform\": \"../../../components/xr-gltf-textureTransform/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-textureTransform/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"KHR_texture_transform\"\n  intro=\"glTF 贴图矩阵变换支持（需基础库2.31.0）。Copyright 2020 Analytical Graphics, Inc. CC-BY 4.0 Model and textures by Ed Mackey\"\n>\n  <xr-gltf-textureTransform\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    a=\"123\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-textureTransform/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-transmission/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-transmission/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-gltf-transmission\": \"../../../components/xr-gltf-transmission/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-transmission/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"KHR_materials_transmission\"\n  intro=\"glTF Transimission 扩展，主要用于模拟薄片渲染。\"\n>\n  <xr-gltf-transmission\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    a=\"123\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-transmission/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-unlit/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = `&lt;xr-scene id=&quot;xr-scene&quot;&gt;\n&lt;xr-assets bind:progress=&quot;handleAssetsProgress&quot; bind:loaded=&quot;handleAssetsLoaded&quot;&gt;\n  &lt;xr-asset-load type=&quot;gltf&quot; asset-id=&quot;gltf-just_a_girl&quot; src=&quot;https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/just_a_girl/scene.gltf&quot; /&gt;\n&lt;/xr-assets&gt;\n&lt;xr-node&gt;\n  &lt;xr-node node-id=&quot;camera-target&quot; position=&quot;0 0 0&quot;&gt;&lt;/xr-node&gt;\n  &lt;xr-gltf node-id=&quot;gltf-just_a_girl&quot; position=&quot;0 -0.5 0&quot; rotation=&quot;0 0 0&quot; scale=&quot;0.01 0.01 0.01&quot; model=&quot;gltf-just_a_girl&quot;&gt;&lt;/xr-gltf&gt;\n  &lt;xr-camera\n    id=&quot;camera&quot; node-id=&quot;camera&quot; position=&quot;0 0.4 1.6&quot; clear-color=&quot;0.9 0.9 0.9 1&quot;\n    target=&quot;camera-target&quot;\n    camera-orbit-control=&quot;&quot;\n  &gt;&lt;/xr-camera&gt;\n&lt;/xr-node&gt;\n&lt;xr-node node-id=&quot;lights&quot;&gt;\n  &lt;xr-light type=&quot;ambient&quot; color=&quot;1 1 1&quot; intensity=&quot;0.3&quot; /&gt;\n  &lt;xr-light type=&quot;directional&quot; rotation=&quot;180 0 0&quot; color=&quot;1 1 1&quot; intensity=&quot;2&quot; /&gt;\n&lt;/xr-node&gt;\n&lt;/xr-scene&gt;\n`\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-unlit/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-gltf-unlit\": \"../../../components/xr-gltf-unlit/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-unlit/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"无光照glTF案例\"\n  intro=\"应用 KHR_materials_unlit 材质的glTF案例，常见于已烘焙光照到贴图与卡通渲染模型\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-gltf-unlit\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    a=\"123\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/gltf/scene-gltf-unlit/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/index/data/index.js",
    "content": "const base = {\n  name: '基础能力',\n  tag: 'func',\n  childArr: [\n    {\n      name: 'Geometry',\n      label: '基础图形',\n      path: '/pages/basic/scene-basic/index',\n    },\n    {\n      name: 'Alpha',\n      label: '透明画布',\n      path: '/pages/basic/scene-basic-alpha/index',\n    },\n    {\n      name: 'Light',\n      label: '多光源',\n      path: '/pages/basic/scene-basic-light/index',\n    },\n    {\n      name: 'Animation',\n      label: '动画',\n      path: '/pages/basic/scene-basic-animation/index',\n    },\n    {\n      name: 'Video',\n      label: '视频纹理',\n      path: '/pages/basic/scene-basic-video/index',\n    },\n    {\n      name: 'Interaction',\n      label: '交互',\n      path: '/pages/basic/scene-basic-touch/index',\n    },\n    {\n      name: 'Share',\n      label: '录屏和截频',\n      path: '/pages/basic/scene-basic-share/index',\n    },\n    {\n      name: 'VisibleLayer',\n      label: '显示和图层',\n      path: '/pages/basic/scene-basic-visible-layer/index',\n    },\n    {\n      name: 'Shadow',\n      label: '动态节点',\n      path: '/pages/basic/scene-basic-shadow/index',\n    },\n    {\n      name: 'RenderTexture',\n      label: '渲染目标',\n      path: '/pages/basic/scene-basic-render-texture/index',\n    },\n    {\n      name: 'PostProcessing',\n      label: '后处理效果',\n      path: '/pages/basic/scene-basic-postprocessing/index'\n    },\n    {\n      name: 'EnvData',\n      label: '全局环境数据与局部环境数据',\n      path: '/pages/basic/scene-basic-envData/index',\n    },\n  ],\n}\nconst gltf = {\n  name: 'glTF能力',\n  tag: 'func',\n  childArr: [{\n    name: 'Standard',\n    label: '标准金属头盔',\n    path: '/pages/gltf/scene-gltf-damageHelmet/index',\n  },\n  {\n    name: 'Unlit',\n    label: '无光照材质卡通模型',\n    path: '/pages/gltf/scene-gltf-unlit/index',\n  },\n  {\n    name: 'Loading',\n    label: '加载界面与多光源场景',\n    path: '/pages/gltf/scene-gltf-light-loading/index',\n  },\n  {\n    name: 'Animation',\n    label: 'gltf动画',\n    path: '/pages/gltf/scene-gltf-animation/index',\n  },\n  {\n    name: 'Morph',\n    label: 'gltf morph',\n    path: '/pages/gltf/scene-gltf-morph/index',\n  },\n  {\n    name: '扩展',\n    label: '压缩纹理',\n    path: '/pages/gltf/scene-gltf-compressTextures/index',\n  },\n  {\n    name: '扩展',\n    label: 'KHR_texture_transform',\n    path: '/pages/gltf/scene-gltf-textureTransform/index',\n  },\n  {\n    name: '扩展',\n    label: 'KHR_materials_pbrSpecularGlossiness',\n    path: '/pages/gltf/scene-gltf-specularGlossiness/index',\n  },\n  {\n    name: '扩展',\n    label: 'KHR_materials_sheen',\n    path: '/pages/gltf/scene-gltf-sheen/index',\n  },\n  {\n    name: '扩展',\n    label: 'KHR_materials_transmission',\n    path: '/pages/gltf/scene-gltf-transmission/index',\n  },\n  {\n    name: '扩展',\n    label: 'KHR_lights_punctual',\n    path: '/pages/gltf/scene-gltf-lightsPunctual/index',\n  },\n  ],\n}\n\nconst ar = {\n  name: 'AR能力',\n  tag: 'func',\n  childArr: [{\n    name: 'Camera',\n    label: 'AR 相机渲染',\n    path: '/pages/ar/scene-ar-camera/index',\n  },\n  {\n    name: 'Basic',\n    label: 'AR 平面识别',\n    path: '/pages/ar/scene-ar-basic/index',\n  },\n  {\n    name: 'ThreeDof',\n    label: 'AR 相机旋转',\n    path: '/pages/ar/scene-ar-threeDof/index',\n  },\n  {\n    name: '2DMarker',\n    label: 'AR 2DMarker',\n    path: '/pages/ar/scene-ar-2dmarker/index',\n  },\n  {\n    name: 'OSDMarker',\n    label: 'AR OSDMarker',\n    path: '/pages/ar/scene-ar-osdmarker/index',\n  },\n  {\n    name: 'Face',\n    label: 'AR 人脸',\n    path: '/pages/ar/scene-ar-face/index',\n  },\n  {\n    name: 'Face',\n    label: 'AR 三维人脸',\n    path: '/pages/ar/scene-ar-face-3d/index',\n  },\n  {\n    name: 'Hand',\n    label: 'AR 人手',\n    path: '/pages/ar/scene-ar-hand/index',\n  },\n  {\n    name: 'Hand',\n    label: 'AR 三维人手',\n    path: '/pages/ar/scene-ar-hand-3d/index',\n  },\n  {\n    name: 'Body',\n    label: 'AR 人体',\n    path: '/pages/ar/scene-ar-body/index',\n  },\n  {\n    name: 'Body',\n    label: 'AR 三维人体',\n    path: '/pages/ar/scene-ar-body-3d/index',\n  },\n  {\n    name: 'Shoe',\n    label: 'AR 试鞋',\n    path: '/pages/ar/scene-ar-shoe/index',\n  },\n  {\n    name: 'Plane+Marker',\n    label: 'AR 平面 Marker融合',\n    path: '/pages/ar/scene-ar-vio-marker/index',\n  },\n  {\n    name: 'Plane+Depth',\n    label: 'AR 平面深度剔除',\n    path: '/pages/ar/scene-ar-vio-depth/index',\n  },\n  ],\n}\n\nconst physics = {\n  name: '物理能力',\n  tag: 'func',\n  childArr: [\n    {\n      name: 'Shoot',\n      label: '射击积木',\n      path: '/pages/physics/scene-physics-shoot/index'\n    },\n    {\n      name: 'Throw',\n      label: '投球入筐',\n      path: '/pages/physics/scene-physics-throw/index'\n    }\n  ]\n}\n\nconst particle = {\n  name: '粒子能力',\n  tag: 'func',\n  childArr: [\n    {\n      name: 'Firework',\n      label: '喷射烟火',\n      path: '/pages/particle/scene-particle-firework/index'\n    },\n    {\n      name: 'Portal',\n      label: '传送门',\n      path: '/pages/particle/scene-particle-portal/index'\n    },\n    {\n      name: 'Orb',\n      label: '闪电光球',\n      path: '/pages/particle/scene-particle-orb/index'\n    },\n    {\n      name: 'ShapeEmitter',\n      label: '球形发射器',\n      path: '/pages/particle/scene-particle-shapeEmitter/index'\n    },\n    {\n      name: 'MeshEmitter',\n      label: '网格发射器',\n      path: '/pages/particle/scene-particle-meshEmitter/index'\n    },\n    {\n      name: 'HumanFace',\n      label: '自定义粒子系统',\n      path: '/pages/particle/scene-particle-custom/index'\n    },\n  ]\n}\n\nconst customParticle = {\n  name: '粒子定制能力',\n  tag: 'func',\n  childArr: [\n    {\n      name: 'Firework',\n      label: '喷射烟火',\n      path: '/pages/customParticle/scene-customParticle-firework/index'\n    },\n    {\n      name: 'Portal',\n      label: '传送门',\n      path: '/pages/customParticle/scene-customParticle-portal/index'\n    },\n    {\n      name: 'Orb',\n      label: '闪电光球',\n      path: '/pages/customParticle/scene-customParticle-orb/index'\n    },\n    {\n      name: 'ShapeEmitter',\n      label: '球形发射器',\n      path: '/pages/customParticle/scene-customParticle-shapeEmitter/index'\n    },\n    {\n      name: 'MeshEmitter',\n      label: '网格发射器',\n      path: '/pages/customParticle/scene-customParticle-meshEmitter/index'\n    }\n  ]\n}\n\nconst custom = {\n  name: '高级定制',\n  tag: 'func',\n  childArr: [\n    {\n      name: 'Logic',\n      label: '定制组件和元素',\n      path: '/pages/custom/scene-custom-logic/index',\n    },\n    {\n      name: 'Render',\n      label: '定制渲染资源',\n      path: '/pages/custom/scene-custom-render/index',\n    }\n  ]\n}\n\nconst messageTemplate = {\n  name: '混合通信、资源加载、互动',\n  tag: 'template',\n  childArr: [\n    {\n      name: 'Message',\n      label: '小程序混合通信',\n      path: '/pages/template/xr-template-message/index',\n    },\n    {\n      name: 'Loading',\n      label: '动态资源加载与使用',\n      path: '/pages/template/xr-template-loading/index',\n    },\n    {\n      name: 'Controller',\n      label: '第一人称漫游',\n      path: '/pages/template/xr-template-control/index',\n    },\n    {\n      name: 'Touch',\n      label: '点选物体与动画控制',\n      path: '/pages/template/xr-template-select/index',\n    },\n  ],\n}\n\nconst arTemplate = {\n  name: '常用AR定制能力',\n  tag: 'template',\n  childArr: [\n    {\n      name: 'Marker',\n      label: '动态多Tracker切换（图片识别）',\n      path: '/pages/template/xr-template-tracker/index',\n    },\n    {\n      name: 'Marker',\n      label: '识别后固定模型，在屏幕中间',\n      path: '/pages/template/xr-template-markerCenter/index',\n    },\n    {\n      name: 'Plane+Marker',\n      label: '识别后固定模型，在世界空间',\n      path: '/pages/template/xr-template-markerLock/index',\n    },\n    {\n      name: 'Plane',\n      label: '世界空间，动态创建连线',\n      path: '/pages/template/xr-template-arLine/index',\n    },\n    {\n      name: 'Plane',\n      label: '模型摆放与手势控制',\n      path: '/pages/template/xr-template-arPreview/index',\n    },\n    {\n      name: 'AR',\n      label: '人脸试戴眼镜（带遮挡）',\n      path: '/pages/template/xr-template-arGlasses/index',\n    },\n    {\n      name: 'AR',\n      label: '模型控制朝向(面向屏幕的面片与模型)',\n      path: '/pages/template/xr-template-lookat/index',\n    },\n    {\n      name: 'AR',\n      label: '平面模式下的 UI 面板',\n      path: '/pages/template/xr-template-arui/index',\n    },\n  ],\n}\n\nconst customTemplate = {\n  name: '常用定制（材质、几何体、流程）',\n  tag: 'template',\n  childArr: [\n    {\n      name: 'Geometry',\n      label: '定制每帧变化的Geometry',\n      path: '/pages/template/xr-template-geometry/index',\n    },\n    {\n      name: 'Effect',\n      label: '模型切换为卡通渲染(自定义多pass)',\n      path: '/pages/template/xr-template-toon/index',\n    },\n    {\n      name: 'Effect',\n      label: '自定义PBR渲染',\n      path: '/pages/template/xr-template-pbr/index',\n    },\n    {\n      name: 'Effect',\n      label: '透明平面阴影',\n      path: '/pages/template/xr-template-planeShadow/index',\n    },\n    {\n      name: 'Effect',\n      label: '序列帧动画（雪碧图、GIF）',\n      path: '/pages/template/xr-template-frameEffect/index',\n    },\n    {\n      name: 'Video',\n      label: '过滤黑色背景视频',\n      path: '/pages/template/xr-template-removeBlack/index',\n    },\n  ],\n}\n\nconst gltfEditTemplate = {\n  name: 'glTF动态修改',\n  tag: 'template',\n  childArr: [\n    {\n      name: 'glTF',\n      label: '模型更换贴图',\n      path: '/pages/template/xr-template-gltfEdit/index',\n    },\n    {\n      name: 'glTF',\n      label: '模型动画（脚本、骨骼）',\n      path: '/pages/template/xr-template-gltfAnimation/index',\n    },\n    {\n      name: 'glTF',\n      label: '设置 glTF 为遮挡模型',\n      path: '/pages/template/xr-template-gltfOcclusion/index',\n    },\n    {\n      name: 'glTF',\n      label: '添加模型内UV动画',\n      path: '/pages/template/xr-template-gltfUVAnimation/index',\n    },\n    {\n      name: 'glTF',\n      label: '双面半透明模型渲染',\n      path: '/pages/template/xr-template-blendDouble/index',\n    },\n  ],\n}\n\nconst toolTemplate = {\n  name: '通用基础能力',\n  tag: 'template',\n  childArr: [\n    {\n      name: 'Share',\n      label: '截图与分享',\n      path: '/pages/template/xr-template-share/index',\n    },\n    {\n      name: 'Text',\n      label: '自定义文本',\n      path: '/pages/template/xr-template-textEdit/index',\n    },\n    // {\n    //     name: 'volumeVideo',\n    //     label: '体积视频渲染',\n    //     path: '/pages/template/xr-template-volumeVideo/index',\n    // },\n    {\n      name: 'Dissolve',\n      label: '消融特效',\n      path: '/pages/template/xr-template-dissolve/index',\n    }\n    // {\n    //   name: 'Video',\n    //   label: '滤色视频（定制化渲染流程）',\n    //   path: '/pages/scene-custom-render/index',\n    // },\n    // {\n    //   name: 'Video',\n    //   label: '视频羽化（自定义材质）',\n    //   path: '/pages/template/xr-template-featherVideo/index',\n    // },\n  ]\n}\n\nconst classic = {\n  name: 'AR典型案例',\n  tag: 'case',\n  childArr: [\n    {\n      name: 'Perspect',\n      label: '扫描透视模型',\n      path: '/pages/ar-classic/scene-classic-perspect/index',\n    },\n    {\n      name: 'Portal',\n      label: '平面传送门',\n      path: '/pages/ar-classic/scene-classic-portal/index',\n    },\n    {\n      name: 'Video',\n      label: '扫描图片视频',\n      path: '/pages/ar-classic/scene-classic-video/index',\n    },\n    {\n      name: 'OSD',\n      label: '扫描物体查看信息',\n      path: '/pages/ar-classic/scene-classic-osd/index',\n    },\n    {\n      name: 'Face',\n      label: '人脸穿戴案例',\n      path: '/pages/ar-classic/scene-classic-face/index',\n    },\n    {\n      name: 'Ball',\n      label: '扫描微信球',\n      path: '/pages/ar-classic/scene-classic-wxball/index',\n    }\n  ],\n}\n\nconst scan = {\n  name: '扫描还原案例',\n  tag: 'case',\n  childArr: [\n    {\n      name: 'Render',\n      label: '扫描渲染案例(全景、模型)',\n      path: '/pages/scan/scene-scan-render/index',\n    },\n    {\n      name: 'XRFrameTeam',\n      label: '卡其脱离太',\n      path: '/pages/scan/scene-scan-team/index',\n    }\n  ],\n}\n\nconst production = {\n  name: '产品级案例',\n  tag: 'case',\n  childArr: [\n    {\n      name: 'Beside Edge',\n      label: '边缘迷走',\n      path: '/pages/scene-beside-edge/index'\n    },\n    {\n      name: '',\n      label: '■■■■',\n      path: '/pages/scene-last-record/index'\n    }\n  ]\n}\n\nexport default [base, ar, gltf, physics, particle, customParticle, custom, messageTemplate, arTemplate, customTemplate, gltfEditTemplate, toolTemplate, classic, scan, production]\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/index/index.js",
    "content": "// 自定义组件\nimport '../../xr-custom/components/AutoRotate'\nimport '../../xr-custom/components/Particle/SystemProperty/BasicParticle'\nimport '../../xr-custom/components/Particle/index'\nimport '../../xr-custom/elements/xr-auto-rotate-touchable-gltf'\nimport '../../xr-custom/elements/xr-custom-particle'\n// 自定义Geometry\nimport '../../xr-custom/assets/geometry-star'\nimport '../../xr-custom/assets/geometry-specialCylinder'\n// 自定义材质\nimport '../../xr-custom/elements/xr-shining-star'\n// 自定义effect\nimport '../../xr-custom/assets/effect-shining'\nimport '../../xr-custom/assets/effect-last-record-final'\n\nimport list from './data/index'\n\nlet first = true\n\nPage({\n  data: {\n    list,\n    root: '/packageXRFrame'\n  },\n  onLoad() {\n    if (first) {\n      console.log('Entry xr-frame index page')\n      wx.reportEvent('xr_frame', {\n        xr_page_path: '/pages/index/index'\n      })\n      first = false\n    }\n  },\n  onShareAppMessage() {\n    return {\n      title: 'XR-FRAME官方示例'\n    }\n  },\n  onShareTimeline() {\n    return {\n      title: 'XR-FRAME官方示例'\n    }\n  },\n  clickHandle(e) {\n    const root = this.data.root\n    const { name, path } = e.detail.item\n\n    if (!path) {\n      return\n    }\n\n    if (path === '/pages/scene-last-record/index') {\n      return\n    }\n\n    if (path) {\n      wx.navigateTo({\n        url: root + path + `?path=${path}`,\n        success: () => {\n        },\n        fail: () => {\n        },\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/index/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"pull-down-list\": \"../../components/pull-down-list/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/index/index.wxml",
    "content": "\n<scroll-view class=\"main\" scroll-y=\"{{true}}\">\n  <view class=\"slogen-wrap\">\n    <view class=\"slogen\">XR<view class=\"special\">Frame</view></view>\n    <view class=\"intro\">\n      小程序低成本高性能XR解决方案\n    </view>\n  </view>\n\n  <pull-down-list\n    wx:for=\"{{list}}\"\n    name=\"{{item.name}}\"\n    tag=\"{{item.tag}}\"\n    root=\"{{root}}\"\n    wx:key=\"name\"\n    childArr=\"{{item.childArr}}\"\n    bind:click=\"clickHandle\"\n  />\n</scroll-view>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/index/index.wxss",
    "content": "\n.main {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  box-sizing: border-box;\n  padding-left: 32rpx;\n  padding-right: 32rpx;\n  padding-top: 48rpx;\n  padding-bottom: 80rpx;\n}\n.slogen-wrap {\n  padding-top: 100rpx;\n  padding-left: 16rpx;\n  padding-right: 16rpx;\n  margin-bottom: 48rpx;\n}\n.slogen {\n  text-align: left;\n  font-size: 70rpx;\n  font-weight: bold;\n  color: rgb(115, 239, 43);\n  line-height: 80rpx;\n}\n.slogen .special {\n  display: inline-block;\n  font-size: 80rpx;\n  font-weight: 300;\n  color: #000;\n}\n\n.intro {\n  text-align: left;\n  font-size: 28rpx;\n  color: rgba(0, 0, 0, 0.4);\n}\n\n.nav-btn {\n  text-align: center;\n  background: #eeeeee;\n  margin: 20rpx 0;\n  padding: 30rpx;\n  border-radius: 5px;\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-custom/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-custom/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-particle-custom\": \"../../../components/xr-particle-custom/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-custom/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"带耳环的少女案例\"\n  intro=\"这里展示自定义粒子流程的特性\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-particle-custom\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-custom/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-firework/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-firework/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-particle-firework\": \"../../../components/xr-particle-firework/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-firework/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"喷射烟火案例\"\n  intro=\"这里展示烟火特效的实现\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-particle-firework\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-firework/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-meshEmitter/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-meshEmitter/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-particle-meshEmitter\": \"../../../components/xr-particle-meshEmitter/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-meshEmitter/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"网格发射器用例\"\n  intro=\"展示网格发射器的用法\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-particle-meshEmitter\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-meshEmitter/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-orb/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-orb/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-particle-orb\": \"../../../components/xr-particle-orb/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-orb/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"闪电光球\"\n  intro=\"有关闪电光球的粒子特效\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-particle-orb\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-orb/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-portal/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-portal/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-particle-portal\": \"../../../components/xr-particle-portal/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-portal/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"传送门案例\"\n  intro=\"传送门的粒子实现\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-particle-portal\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-portal/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-shapeEmitter/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-shapeEmitter/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-particle-shapeEmitter\": \"../../../components/xr-particle-shapeEmitter/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n} "
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-shapeEmitter/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"球形发射器用例\"\n  intro=\"展示球形发射器的用法\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-particle-shapeEmitter\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/particle/scene-particle-shapeEmitter/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/physics/scene-physics-shoot/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/physics/scene-physics-shoot/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic\": \"../../../components/xr-physics-shoot/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/physics/scene-physics-shoot/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"射击积木案例\"\n  intro=\"扫描绿底的微信logo(如下所示)，出现积木。点击屏幕射出小球。\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-basic\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n  <view slot=\"intro\"><image src=\"/components/xr-physics-shoot/weixin.png\" style=\"height: 100px; width: 100px\"></image></view>\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/physics/scene-physics-shoot/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/physics/scene-physics-throw/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    arDetected: false,\n    throwing: false\n  },\n  handleARDetected() {\n    this.setData({\n      arDetected: true\n    })\n  },\n  handleThrowStart() {\n    this.setData({\n      throwing: true\n    })\n  },\n  handleThrowEnd() {\n    this.setData({\n      throwing: false\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/physics/scene-physics-throw/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-basic\": \"../../../components/xr-physics-throw/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/physics/scene-physics-throw/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"投球小游戏Demo\"\n  intro=\"等待AR平面识别完成，然后在较远的地面上放置篮筐。按住右侧按钮准备投球，然后挥动手机并放开按钮将球投出。(该demo目前在安卓上可能表现不佳，受限于安卓的平面识别功能。)\"\n  code=\"{{xmlCode}}\"\n>\n  <view class=\"overlay button\" style=\"right: 50px; bottom: 300px;\" \n  wx:if=\"{{arDetected}}\"\n  bindtouchstart=\"handleThrowStart\" bindtouchend=\"handleThrowEnd\">\n  <text>按住\\n投球</text>\n  </view>\n  <xr-basic\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    throwing=\"{{throwing}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:ar_detected=\"handleARDetected\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/physics/scene-physics-throw/index.wxss",
    "content": ".overlay {\n  display: block;\n  position: absolute;\n  z-index: 10;\n}\n\n.button {\n  width: 50px;\n  height: 50px;\n  background-color: rgba(0, 140, 255, 0.5);\n  text-align: center;\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scan/scene-scan-render/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\n\nconst envWords = [\n  'TiT创意园白天',\n  'TiT创意园晚上',\n  '海边夕阳',\n]\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>',\n    envIndex: 0,\n    envWord: 'TiT创意园白天',\n  },\n  handleEnv0() {\n    this.setData({ envIndex: 0, envWord: envWords[0] })\n  },\n  handleEnv1() {\n    this.setData({ envIndex: 1, envWord: envWords[1] })\n  },\n  handleEnv2() {\n    this.setData({ envIndex: 2, envWord: envWords[2] })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scan/scene-scan-render/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-scan-render\": \"../../../components/xr-scan-render/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scan/scene-scan-render/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"扫描渲染案例\"\n  intro=\"根据三维重建模型与扫描全景图还原的案例，仅使用IBL作为光源，可切换天空盒\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-scan-render\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    envIndex=\"{{envIndex}}\"\n  />\n  <view class=\"env-words\"><span class=\"tips\">目前使用: </span><span class=\"content\">{{envWord}}</span></view>\n  <view class=\"button-wrap\">\n    <view class=\"change-button\" bindtap=\"handleEnv0\">TiT创意园白天</view>\n    <view class=\"change-button\" bindtap=\"handleEnv1\">TiT创意园晚上</view>\n    <view class=\"change-button\" bindtap=\"handleEnv2\">海滩天空盒</view>\n  </view>\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scan/scene-scan-render/index.wxss",
    "content": ".button-wrap {\n  line-height: 60rpx;\n  text-align: center;\n  vertical-align: middle;\n}\n\n.change-button {\n  display: inline-block;\n  background-color: #000;\n  color: #fff;\n  font-size: 22rpx;\n  margin: 10rpx;\n  padding: 5rpx 24rpx;\n  border-radius: 6rpx;\n}\n\n.env-words {\n  text-align: center;\n  vertical-align: baseline;\n  margin: 10rpx 0;\n}\n\n.env-words .tips {\n    font-size: 20rpx;\n}\n\n.env-words .content {\n  font-size: 28rpx;\n  font-weight: bold;\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scan/scene-scan-team/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n    loaded: false,\n    run: false,\n    positions: [[0, 0, '瞬光'], [0, 0, 'roam'], [0, 0, 'xinyi']],\n  },\n  handleLoaded({ detail }) {\n    console.log('assets loaded', detail)\n\n    this.setData({ loaded: true })\n  },\n  handleSyncPositions({ detail }) {\n    const info = detail\n    this.setData({ positions: info })\n  },\n  handleRun() {\n    if (this.data.loaded && !this.data.run) {\n      this.setData({ run: true })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scan/scene-scan-team/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-scan-team\": \"../../../components/xr-scan-team/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scan/scene-scan-team/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"卡 其 脱 离 太\"\n  intro=\"xr-frame团队的办公区和成员三维重建，以及与小程序音频系统、2dview协作的例子。点击`卡其脱离太`开始奔跑，奔跑之后点击成员可以跳跃（建议打开声音（不是\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-scan-team\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    loaded=\"{{loaded}}\"\n    run=\"{{run}}\"\n    bind:assetsLoaded=\"handleLoaded\"\n    bind:syncPositions=\"handleSyncPositions\"\n  />\n\n  <block wx:if=\"{{loaded}}\" wx:for=\"{{positions}}\" wx:for-item=\"pos\" wx:key=\"*this\">\n    <view style=\"display: block; position: absolute;left: {{pos[0]}}px;top: {{pos[1]}}px;background: rgba(44, 44, 44, 0.5);transform: translate(-50%, -50%);\">\n      <view style=\"text-align: center;color: white;font-size: 16px;padding: 8px;\">{{pos[2]}}</view>\n    </view>\n  </block>\n\n  <view wx:if=\"{{!loaded}}\" style=\"text-align: center;\">等待加载完成...</view>\n  <button wx:if=\"{{loaded}}\" bindtap=\"handleRun\" style=\"margin-top: 12px; padding: 8px; font-size: 20px; background: #f22; color: white; text-align: center;\">卡 其 脱 离 太！</button>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scan/scene-scan-team/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scene-beside-edge/index.js",
    "content": "Page({\n  data: {\n    width: 300,\n    height: 300,\n    renderWidth: 300,\n    renderHeight: 300,\n    showDialog: false,\n    name: '',\n    text: '',\n    bg: 'rgba(0, 0, 0, 0)',\n    start: '',\n    hint: '',\n    end: '',\n    showLightButton: false,\n    lightButtonDisable: true,\n    lightProgress: 1,\n    nextAction: ''\n  },\n  onShow() {\n    wx.hideHomeButton()\n  },\n  onHide() {\n    wx.showHomeButton()\n  },\n  onLoad() {\n    const info = wx.getSystemInfoSync()\n    const width = info.windowWidth\n    const height = info.windowHeight\n    const dpi = info.pixelRatio\n    this.setData({\n      width,\n      height,\n      renderWidth: width * dpi,\n      renderHeight: height * dpi\n    })\n  },\n  handleRequireLight({ detail }) {\n    const { state, wait } = detail\n    console.log('light', state, wait)\n    if (state === 'hide') {\n      this.setData({ showLightButton: false })\n      return\n    }\n\n    this.setData({\n      showLightButton: true,\n      lightButtonDisable: state === 'cd',\n      nextAction: '',\n      lightProgress: state === 'cd' ? 1 - wait : 1\n    })\n  },\n  handleRequireDialog({ detail }) {\n    const { texts, name, from } = detail\n    this.texts = texts\n    this.textIndex = 0\n    this.from = from\n    this.setData({\n      name: name || '',\n      text: texts[0],\n      showDialog: true,\n      bg: from === 'step' ? '#000' : 'rgba(0, 0, 0, 0)'\n    })\n  },\n  handleClickDialog() {\n    this.textIndex += 1\n    if (this.textIndex > this.texts.length) {\n      return\n    }\n\n    if (this.textIndex === this.texts.length) {\n      this.setData({ text: '', name: '', bg: '#000' })\n      setTimeout(() => {\n        this.textIndex = 0\n        this.setData({ showDialog: false, nextAction: this.from })\n      }, 1000)\n      return\n    }\n\n    const text = this.texts[this.textIndex]\n    const tmp = /[\\s\\S]+?\\{\\{([\\s\\S]+?)\\}\\}[\\s\\S]+?/.exec(text)\n    if (tmp) {\n      const hint = tmp[1]\n      const [start, end] = text.split('{{' + hint + '}}')\n      console.log({ start, hint, end })\n      this.setData({ start, hint, end })\n    } else {\n      this.setData({ text: this.texts[this.textIndex], hint: '' })\n    }\n  },\n  handleTriggerLight() {\n    if (this.data.lightButtonDisable) {\n      return\n    }\n\n    this.setData({ nextAction: 'light' })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scene-beside-edge/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-beside-edge\": \"../../components/xr-beside-edge/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scene-beside-edge/index.wxml",
    "content": "<view>\n  <xr-beside-edge\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    nextAction=\"{{nextAction}}\"\n    bind:requireLight=\"handleRequireLight\"\n    bind:requireDialog=\"handleRequireDialog\"\n  />\n\n  <view\n    wx:if=\"{{showLightButton}}\"\n    bindtap=\"handleTriggerLight\"\n    style=\"position: absolute;width: 4rem;height: 4rem;background:rgba(140, 140, 140, 0.4);bottom: 4rem;left: 50%;transform: translateX(-50%);border-radius: 50%;\"\n  >\n  <view style=\"position: absolute; left: 0; top: 0;width: 100%;height: 100%;background:rgba(227, 230, 66, {{lightProgress * 0.8}});border-radius: 50%;color: white; text-align: center;line-height: 4rem;font-size: 2rem;\">\n    {{lightProgress === 1 ? '○' : ''}}\n  </view>\n  </view>\n\n  <view\n    wx:if=\"{{showDialog}}\"\n    style=\"position: absolute; left: 0; top: 0;background:{{bg}};width: 100vw;height: 100vh;\"\n  >\n    <view\n      bindtap=\"handleClickDialog\" wx:if=\"{{text != ''}}\"\n      style=\"position: absolute; left: 5%; bottom: 5%;background:rgba(44, 44, 44, 0.5);width: 90%;height: 25vh;word-break: break-all;color:white;border-radius: 1rem;\"\n    >\n      <view style=\"position: absolute;left: 1rem;top: 1rem;font-size: 1.4rem;text-align: center;\">{{name}}</view>\n      <view style=\"position: absolute;left: 5%;top: 4rem;font-size: 1.2rem;width: 90%;height: 100%;\">\n        <text wx:if=\"{{hint == ''}}\">{{text}}</text>\n        <view wx:if=\"{{hint != ''}}\">{{start}}<span style=\"color:red\">{{hint}}</span>{{end}}</view>\n      </view>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scene-beside-edge/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scene-last-record/index.js",
    "content": "Page({\n  data: {\n    width: 300,\n    height: 300,\n    renderWidth: 300,\n    renderHeight: 300,\n    texts: []\n  },\n  onShow() {\n    wx.hideHomeButton()\n  },\n  onHide() {\n    wx.showHomeButton()\n  },\n  onLoad() {\n    const info = wx.getSystemInfoSync()\n    const width = info.windowWidth\n    const height = info.windowHeight\n    const dpi = info.pixelRatio\n    this.setData({\n      width,\n      height,\n      renderWidth: width * dpi,\n      renderHeight: height * dpi\n    })\n  },\n  handleChangeTexts({ detail }) {\n    this.setData({ texts: detail })\n  },\n  handleShowNote({ detail }) {\n    wx.showModal({\n      title: '最后的记录',\n      content: detail,\n      showCancel: false,\n      confirmText: '放下记录'\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scene-last-record/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../components/xr-demo-viewer/index\",\n    \"xr-last-record\": \"../../components/xr-last-record/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scene-last-record/index.wxml",
    "content": "<view>\n  <xr-last-record\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:changeTexts=\"handleChangeTexts\"\n    bind:showNote=\"handleShowNote\"\n  />\n\n  <block wx:for=\"{{texts}}\" wx:for-item=\"text\" wx:key=\"id\">\n    <view style=\"display: block; width: 218px; position: absolute;left: {{text.x}}px;top: {{text.y}}px;transform: translate(-50%, -50%);\">\n      <view style=\"display: inlin-block;background: rgba(44, 44, 44, 0.5);text-align: center;color: white;font-size: 16px;padding: 8px;word-break: break-all;\">{{text.content}}</view>\n    </view>\n  </block>\n</view>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/scene-last-record/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arGlasses/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nconst xmlCode = ''\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '<div class=\"codeWrap\">' + handleDecodedXML(xmlCode) + '</div>'\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arGlasses/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-arGlasses\": \"../../../components/template/xr-template-arGlasses/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arGlasses/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR 眼镜试戴案例\"\n  intro=\"眼镜试戴案例。人脸识别成功后，会摆放眼镜到对应的位置，眼镜脚会通过透明的标准头模进行深度遮挡。眼镜模型可以根据标准头模模型进行大小的适配制作。\"\n  hint=\"3d Face 目前在xr-frame的处理存在问题，预计基础库 3.3.2 修复\"\n>\n  <xr-template-arGlasses\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n  <view wx:if=\"{{arTrackerShow}}\" style=\"text-align: center;padding: 12px;\">\n    <view>Tracker识别状态：{{arTrackerState}}</view>\n    <view>错误信息：{{arTrackerError}}</view>\n  </view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arGlasses/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arLine/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  moveTimes: 0,\n  data: {\n    // 内置\n    height: 600,\n    heightScale: 0.85,\n    showBackBtn: true,\n  },\n  onLoad() {\n  },\n\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arLine/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-arLine\": \"../../../components/template/xr-template-arLine/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arLine/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"Plane 世界空间，动态创建连线\"\n  intro=\"在 Plane 模式中，通过点击屏幕，记录摄像机中的蓝色方块位置。确定不同连线的起点和终点，并在世界空间中创建对应Mesh连线。\"\n  code=\"\"\n  showBackBtn=\"{{showBackBtn}}\"\n>\n  <xr-template-arLine\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arLine/index.wxss",
    "content": "\n.xr-control {\n  position: absolute;\n  left: 50%;\n  width: 720rpx;\n  height: 200rpx;\n  margin-left: -360rpx;\n  margin-top: -220rpx;\n  text-align: center;\n}\n\n.control-item {\n  display: inline-block;\n  vertical-align: middle;\n  width: 160rpx;\n  margin: 0 10rpx;\n  height: 100%;\n  border-radius: 10rpx;\n  text-align: center;\n}\n\n.control-item.active .item-title {\n  color: #fff;\n  background-color: forestgreen;\n  border: 4rpx solid #fff;\n}\n\n\n.item-title {\n  font-size: 18rpx;\n  line-height: 60rpx;\n  border-radius: 10rpx;\n  border: 4rpx solid #000;\n  background-color: #fff;\n  transition: all 0.3s;\n}\n\n.img-wrap {\n  display: inline-block;\n  width: 80rpx;\n  height: 80rpx;\n  border-radius: 50rpx;\n  margin: 10rpx 5rpx;\n  overflow: hidden;\n  border: 4rpx solid #fff;\n}\n\n.hint-img {\n  width: 100%;\n  height: 100%;\n}\n\n.hint-img.lh {\n  height: 110%;\n  padding-top: -5%;\n}\n\n.hint-img.lw {\n  width: 130%;\n  margin-left: -15%;\n}\n\n.marker-wrap {\n  position: absolute;\n  left: -50%;\n  top: 50%;\n  transition: left 0.1s, top 0.1s, width 0.1s, height 0.1s;\n}\n\n.marker-img-lt {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 34px;\n  height: 34px;\n}\n.marker-img-rt {\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 34px;\n  height: 34px;\n  transform: scaleX(-1);\n}\n.marker-img-lb {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  width: 34px;\n  height: 34px;\n  transform: scaleY(-1);\n}\n.marker-img-rb {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  width: 34px;\n  height: 34px;\n  transform: scale(-1, -1);\n}\n\n\n.border-lt {\n  position: absolute;\n  left: 0;\n  top: 0;\n}\n.border-rt {\n  position: absolute;\n  right: 0;\n  top: 0;\n  transform: rotate(90deg);\n}\n.border-lb {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  transform: rotate(270deg);\n}\n.border-rb {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  transform: rotate(180deg);\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arPreview/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  moveTimes: 0,\n  data: {\n    // 内置\n    height: 600,\n    heightScale: 0.85,\n    showBackBtn: true,\n  },\n  onLoad() {\n  },\n\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arPreview/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-arPreview\": \"../../../components/template/xr-template-arPreview/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arPreview/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"模型摆放与手势控制\"\n  intro=\"点击屏幕摆放，然后单指拖动屏幕进行旋转，双指拖动进行放大缩小\"\n  code=\"\"\n  showBackBtn=\"{{showBackBtn}}\"\n>\n  <xr-template-arPreview\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arPreview/index.wxss",
    "content": "\n.xr-control {\n  position: absolute;\n  left: 50%;\n  width: 720rpx;\n  height: 200rpx;\n  margin-left: -360rpx;\n  margin-top: -220rpx;\n  text-align: center;\n}\n\n.control-item {\n  display: inline-block;\n  vertical-align: middle;\n  width: 160rpx;\n  margin: 0 10rpx;\n  height: 100%;\n  border-radius: 10rpx;\n  text-align: center;\n}\n\n.control-item.active .item-title {\n  color: #fff;\n  background-color: forestgreen;\n  border: 4rpx solid #fff;\n}\n\n\n.item-title {\n  font-size: 18rpx;\n  line-height: 60rpx;\n  border-radius: 10rpx;\n  border: 4rpx solid #000;\n  background-color: #fff;\n  transition: all 0.3s;\n}\n\n.img-wrap {\n  display: inline-block;\n  width: 80rpx;\n  height: 80rpx;\n  border-radius: 50rpx;\n  margin: 10rpx 5rpx;\n  overflow: hidden;\n  border: 4rpx solid #fff;\n}\n\n.hint-img {\n  width: 100%;\n  height: 100%;\n}\n\n.hint-img.lh {\n  height: 110%;\n  padding-top: -5%;\n}\n\n.hint-img.lw {\n  width: 130%;\n  margin-left: -15%;\n}\n\n.marker-wrap {\n  position: absolute;\n  left: -50%;\n  top: 50%;\n  transition: left 0.1s, top 0.1s, width 0.1s, height 0.1s;\n}\n\n.marker-img-lt {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 34px;\n  height: 34px;\n}\n.marker-img-rt {\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 34px;\n  height: 34px;\n  transform: scaleX(-1);\n}\n.marker-img-lb {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  width: 34px;\n  height: 34px;\n  transform: scaleY(-1);\n}\n.marker-img-rb {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  width: 34px;\n  height: 34px;\n  transform: scale(-1, -1);\n}\n\n\n.border-lt {\n  position: absolute;\n  left: 0;\n  top: 0;\n}\n.border-rt {\n  position: absolute;\n  right: 0;\n  top: 0;\n  transform: rotate(90deg);\n}\n.border-lb {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  transform: rotate(270deg);\n}\n.border-rb {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  transform: rotate(180deg);\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arui/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  moveTimes: 0,\n  data: {\n    // 内置\n    height: 600,\n    heightScale: 0.85,\n    showBackBtn: true,\n  },\n  onLoad() {\n  },\n\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arui/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-arui\": \"../../../components/template/xr-template-arui/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arui/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR环境下的UI面片\"\n  intro=\"\"\n  code=\"\"\n  showBackBtn=\"{{showBackBtn}}\"\n>\n  <xr-template-arui\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-arui/index.wxss",
    "content": "\n.xr-control {\n  position: absolute;\n  left: 50%;\n  width: 720rpx;\n  height: 200rpx;\n  margin-left: -360rpx;\n  margin-top: -220rpx;\n  text-align: center;\n}\n\n.control-item {\n  display: inline-block;\n  vertical-align: middle;\n  width: 160rpx;\n  margin: 0 10rpx;\n  height: 100%;\n  border-radius: 10rpx;\n  text-align: center;\n}\n\n.control-item.active .item-title {\n  color: #fff;\n  background-color: forestgreen;\n  border: 4rpx solid #fff;\n}\n\n\n.item-title {\n  font-size: 18rpx;\n  line-height: 60rpx;\n  border-radius: 10rpx;\n  border: 4rpx solid #000;\n  background-color: #fff;\n  transition: all 0.3s;\n}\n\n.img-wrap {\n  display: inline-block;\n  width: 80rpx;\n  height: 80rpx;\n  border-radius: 50rpx;\n  margin: 10rpx 5rpx;\n  overflow: hidden;\n  border: 4rpx solid #fff;\n}\n\n.hint-img {\n  width: 100%;\n  height: 100%;\n}\n\n.hint-img.lh {\n  height: 110%;\n  padding-top: -5%;\n}\n\n.hint-img.lw {\n  width: 130%;\n  margin-left: -15%;\n}\n\n.marker-wrap {\n  position: absolute;\n  left: -50%;\n  top: 50%;\n  transition: left 0.1s, top 0.1s, width 0.1s, height 0.1s;\n}\n\n.marker-img-lt {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 34px;\n  height: 34px;\n}\n.marker-img-rt {\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 34px;\n  height: 34px;\n  transform: scaleX(-1);\n}\n.marker-img-lb {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  width: 34px;\n  height: 34px;\n  transform: scaleY(-1);\n}\n.marker-img-rb {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  width: 34px;\n  height: 34px;\n  transform: scale(-1, -1);\n}\n\n\n.border-lt {\n  position: absolute;\n  left: 0;\n  top: 0;\n}\n.border-rt {\n  position: absolute;\n  right: 0;\n  top: 0;\n  transform: rotate(90deg);\n}\n.border-lb {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  transform: rotate(270deg);\n}\n.border-rb {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  transform: rotate(180deg);\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-blendDouble/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-blendDouble/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-blendDouble\": \"../../../components/template/xr-template-blendDouble/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-blendDouble/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"双面半透明模型\"\n  intro=\"加载模型后，手动设置双面渲染状态\"\n>\n  <xr-template-blendDouble\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-blendDouble/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-control/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\n// 当前触摸点位置\nlet currentTouchX = 0\nlet currentTouchY = 0\n\n// 触摸点序号\nlet rotateIdx = -1\nlet moveIdx = -1\n\n// 摇杆所处中心\nconst centerX = 50\nconst centerY = 50\n// 摇杆宽高\nconst hWidth = 40\nconst hHeight = 40\n// 摇杆盘半径\nconst radius = 50\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    height: 600,\n    heightScale: 0.8,\n    // 重置初始位置的标记\n    reset: 0,\n    // 相对背景偏移，命名 h=handle 摇杆\n    hTop: 30,\n    hLeft: 30,\n    transferData: {\n      // 相对摇杆中心的偏移\n      biasX: 0,\n      biasY: 0,\n\n      // 开始旋转时的基准点\n      initRotX: 0,\n      initRotY: 0,\n      // 旋转时的触摸点位置\n      biasRotX: 0,\n      biasRotY: 0,\n    }\n  },\n  reset() {\n    this.setData({\n      reset: this.data.reset + 1\n    })\n  },\n  touchStart(e) {},\n  touchMove(e) {\n    // 无旋转触摸点触屏时，保证移动触摸点为第一触摸点\n    if (rotateIdx == -1) {\n      moveIdx = 0\n    } else {\n      // 当两点触屏时，保证移动触摸点与旋转触摸点对应的点序列互斥\n      moveIdx = ~rotateIdx & 0x01\n    }\n    const touchX = e.touches[moveIdx].clientX - 30\n    const touchY = e.touches[moveIdx].clientY - (this.data.height - 100)\n    const posInfo = this.limitPosition(touchX, touchY)\n    this.setData({\n      hLeft: centerX - hWidth / 2 + posInfo.posX,\n      hTop: centerY - hHeight / 2 + posInfo.posY,\n      transferData: {\n        biasX: posInfo.posX,\n        biasY: posInfo.posY,\n      }\n    })\n  },\n  touchEnd(e) {\n    moveIdx = -1\n    // 当位移触摸点松开时，保证旋转触摸点取的为第一接触点\n    if (rotateIdx == 1) rotateIdx = 0\n    this.setData({\n      hLeft: centerX - hWidth / 2,\n      hTop: centerY - hHeight / 2,\n      transferData: {\n        biasX: 0,\n        biasY: 0,\n      }\n    })\n  },\n\n  touchRotateStart(e) {\n    if (moveIdx == -1) {\n      rotateIdx = 0\n    } else {\n      rotateIdx = ~moveIdx & 0x01\n    }\n    currentTouchX = e.touches[rotateIdx].clientX\n    currentTouchY = e.touches[rotateIdx].clientY\n    this.setData({\n      transferData: {\n        initRotX: currentTouchX,\n        initRotY: currentTouchY,\n      }\n    })\n  },\n\n  touchRotateMove(e) {\n    if (moveIdx == -1) {\n      rotateIdx = 0\n    } else {\n      rotateIdx = ~moveIdx & 0x01\n    }\n    currentTouchX = e.touches[rotateIdx].clientX\n    currentTouchY = e.touches[rotateIdx].clientY\n    this.setData({\n      transferData: {\n        biasRotX: currentTouchX,\n        biasRotY: currentTouchY,\n      }\n    })\n  },\n\n  touchRotateEnd(e) {\n    rotateIdx = -1\n    // 当旋转触摸点松开时，保证位移触摸点取的为第一接触点\n    if (moveIdx == 1) moveIdx = 0\n    this.setData({\n      transferData: {\n        biasRotX: 0,\n        biasRotY: 0,\n      }\n    })\n  },\n\n  // 将位移强度限制在摇杆盘的范围中\n  limitPosition(touchX, touchY) {\n    let x = touchX - centerX\n    let y = touchY - centerY\n    const z = Math.sqrt(x * x + y * y)\n    // 位移未超出摇杆盘范围时\n    if (z <= radius) {\n      x = Math.round(x)\n      y = Math.round(y)\n      return {\n        posX: x,\n        posY: y\n      }\n    } else {\n      // 位移超出摇杆盘范围，需要对应限制位移强度\n      const ratio = radius / z\n      x *= ratio\n      y *= ratio\n      x = Math.round(x)\n      y = Math.round(y)\n      return {\n        posX: x,\n        posY: y\n      }\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-control/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-control\": \"../../../components/template/xr-template-control/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-control/index.wxml",
    "content": "<xr-demo-viewer\n\ttitle=\"第一人称控制器\"\n\tintro=\"左下角的虚拟摇杆区域进行操纵位移，右下角对摄像头进行位置重置，其它区域为影响旋转视角的区域\"\n  hint=\"要求基础库 v2.30.3 及以上\"\n\tshowBackBtn=\"{{true}}\"\n>\n\n\t<xr-template-control\n\t\tdisable-scroll\n\t\tid=\"main-frame\"\n\t\twidth=\"{{renderWidth}}\"\n\t\theight=\"{{renderHeight}}\"\n    reset=\"{{reset}}\"\n    transferData=\"{{transferData}}\"\n\t\tstyle=\"width:{{width}}px; height:{{height}}px; top:{{top}}px; left:{{left}}px; display:block;\"\n\t  bindinfoListener=\"handleInfoListener\" \n  />\n\n\t<!-- 旋转区域 -->\n\t<view class=\"rt-area\"\n\t\tstyle=\"height: {{height}}px\"\n\t\tcatchtouchstart='touchRotateStart'\n\t\tcatchtouchmove='touchRotateMove'\n\t\tbindtouchend='touchRotateEnd'>\n  </view>\n\n\t<!-- 摇杆区域 -->\n  <view class=\"mv-area\" \n\t\tstyle=\"top: {{height - 100}}px;\"\n\t\tcatchtouchstart='touchStart'\n\t\tcatchtouchmove='touchMove'\n\t\tbindtouchend='touchEnd'>\n\t\t<image class=\"mv-bg\" src=\"/assets/image/background.png\" />\n\t\t<image class=\"mv-handle\" style=\"left:{{hLeft}}px; top:{{hTop}}px;\" src=\"/assets/image/handle.png\" />\n  </view>\n\n\t<view class=\"reset-btn\" style=\"top: {{height}}px;\">\n\t\t<button bindtap=\"reset\">位置重置</button>\n\t</view>\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-control/index.wxss",
    "content": ".rt-area{\n  left:0;\n  top:0;\n  width: 100%;\n  position:absolute;\n}\n\n.rt-bg{\n  width: 100px; \n  height: 100px; \n  position: absolute;\n}\n\n.mv-area{\n  left:30px; \n  position:absolute;\n}\n\n.mv-bg{\n  width: 100px; \n  height: 100px; \n}\n\n.mv-handle{\n  width: 40px;\n  height: 40px;\n  position: absolute;\n}\n\n.reset-btn {\n  position: absolute;\n  left: 50%;\n  width: 30rpx;\n  height: 80rpx;\n  margin-top: -100rpx;\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-dissolve/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    thresHold: 0,\n    autoPlay: false,\n  },\n  changeThresHold(e) {\n    this.setData({\n      autoPlay: false\n    })\n    this.setData({\n      thresHold: e.detail.value\n    })\n  },\n  openAutoPlay(e) {\n    if (this.data.autoPlay == false) {\n      this.setData({\n        autoPlay: true\n      })\n    } else {\n      this.setData({\n        autoPlay: false\n      })\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-dissolve/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-dissolve\": \"../../../components/template/xr-template-dissolve/index\"\n  },\n  \"disableScroll\": true\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-dissolve/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"消融特效\"\n  intro=\"两张纹理进行消融特效的切换\"\n>\n  <xr-template-dissolve\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    thresHold = \"{{thresHold / 100}}\"\n    autoPlay = \"{{autoPlay}}\"\n  />\n\n  <view>\n    <button class=\"changeButton\" bindtap=\"openAutoPlay\">循环播放</button>\n    <view>消融阈值</view>\n    <slider bindchange=\"changeThresHold\" value=\"{{thresHold}}\"></slider>\n  </view>\n\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-dissolve/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-featherVideo/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    showBackBtn: true,\n    resourceData: {\n    },\n    onFlags: false,\n    gltfList: [],\n    imageList: [],\n    videoList: [],\n  },\n  onLoad() {\n    // 准备加载数据\n  },\n  tapResBtn(event) {\n    const dataSet = event.target.dataset\n    const src = dataSet.src\n    const index = dataSet.index\n    let onFlags = this.data.onFlags\n    onFlags = !onFlags\n    let videoListNew\n    if (onFlags) {\n      videoListNew = this.data.videoList\n      videoListNew.push({\n        id: index,\n        src\n      })\n    } else {\n      let matchIndex = -1\n      for (let i = 0; i < this.data.videoList.length; i++) {\n        if (this.data.videoList[i] && src === this.data.videoList[i].src) {\n          matchIndex = i\n          break\n        }\n      }\n      this.data.videoList.splice(matchIndex, 1)\n      videoListNew = this.data.videoList\n    }\n\n    this.setData({\n      videoList: videoListNew,\n      onFlags\n    })\n  },\n  handleInfoListener(cur) {\n    const detail = cur.detail\n\n    this.setData({\n    })\n  }\n\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-featherVideo/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-featherVideo\": \"../../../components/template/xr-template-featherVideo/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-featherVideo/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"加载案例\"\n  intro=\"点击按钮进行对应资源的加载与使用。（目前视频纹理属于beta状态，真机情况下，多张视频纹理不可以同时加载与渲染，但是可以取消一份后渲染另外一份）\"\n  code=\"\"\n  showBackBtn=\"{{showBackBtn}}\"\n>\n  <xr-template-featherVideo\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    gltfListRaw=\"{{gltfList}}\"\n    imageListRaw=\"{{imageList}}\"\n    videoListRaw=\"{{videoList}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  /> \n  <view class=\"xr-res-panel\">\n    <view class=\"res-row\">\n    </view>\n    <view class=\"res-row\">\n      <view class=\"res-btn {{onFlags ? 'on': ''}}\"\n        bindtap=\"tapResBtn\"\n        data-index=\"0\"\n        data-type=\"video\"\n        data-src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/videos/paris.mp4\"\n      >巴黎路边</view>\n    </view>\n  </view>\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-featherVideo/index.wxss",
    "content": ".xr-info {\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 300rpx;\n  height: 100rpx;\n  padding: 20rpx;\n  background-color: #000;\n  border-radius: 5px 0 0 5px;\n}\n.info-text {\n  font-size: 20rpx;\n  line-height: 30rpx;\n  padding: 0;\n  color: #fff;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.info-text.title {\n  font-size: 24rpx;\n  line-height: 40rpx;\n  font-weight: bold;\n}\n\n.info-process {\n  position: relative;\n  margin-top: 10rpx;\n  background-color: #fff;\n  height: 16rpx;\n  border-radius: 5rpx;\n}\n\n.info-process .info-bar {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 0%;\n  height: 100%;\n  background-color: green;\n  border-radius: 5rpx;\n}\n\n.xr-res-panel {\n  margin: 10rpx 20rpx;\n}\n\n.res-row {\n  padding: 10rpx;\n  vertical-align: middle;\n  text-align: center;\n}\n.res-name, .res-btn {\n  display: inline-block;\n  margin-right: 20rpx;\n  border-radius: 10rpx;\n}\n\n.res-name {\n  font-size: 22rpx;\n  background-color: #000;\n  padding: 0 20rpx;\n  line-height: 60rpx;\n  color: #fff;\n}\n\n.res-btn {\n  font-size: 26rpx;\n  background-color: #fff;\n  padding: 0 30rpx;\n  line-height: 70rpx;\n  border: 1px solid #000;\n}\n\n.res-btn.on {\n  background-color: forestgreen;\n  color: #fff;\n  transition: all 0.2s;\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-frameEffect/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-frameEffect/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-frameEffect\": \"../../../components/template/xr-template-frameEffect/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-frameEffect/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"序列帧动画（雪碧图、GIF）\"\n  intro=\"使用自定义材质实现的序列帧动画案例。序列帧来源为雪碧图切片，通过 columCount、rowCount、during 控制播放。如需使用GIF，可以使用工具将GIF转化为特定格式的雪碧图。本案例由 “一二侠” 提供。\"\n>\n  <xr-template-frameEffect\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-frameEffect/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-geometry/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    dpiScale: 1\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-geometry/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-geometry\": \"../../../components/template/xr-template-geometry/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-geometry/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"定制每帧变化的Geometry\"\n  intro=\"\"\n>\n  <xr-template-geometry\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-geometry/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfAnimation/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfAnimation/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-gltfAnimation\": \"../../../components/template/xr-template-gltfAnimation/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfAnimation/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"glTF动画案例\"\n  intro=\"（资源较大，请稍候）\"\n>\n  <xr-template-gltfAnimation\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfAnimation/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfEdit/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfEdit/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-gltfEdit\": \"../../../components/template/xr-template-gltfEdit/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfEdit/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"glTF更改\"\n  intro=\"加载 glTF 模型，调整 glTF 的材质的贴图\"\n>\n  <xr-template-gltfEdit\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfEdit/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfOcclusion/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfOcclusion/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-gltfOcclusion\": \"../../../components/template/xr-template-gltfOcclusion/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfOcclusion/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"遮挡模型案例\"\n  intro=\"使用模型做遮挡剔除，让该模型剔除其他物体\"\n>\n  <xr-template-gltfOcclusion\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfOcclusion/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfUVAnimation/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfUVAnimation/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-gltfUVAnimation\": \"../../../components/template/xr-template-gltfUVAnimation/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfUVAnimation/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"glTF 添加模型内UV动画\"\n  intro=\"加载 glTF 模型，给模型内部材质添加UV动画\"\n>\n  <xr-template-gltfUVAnimation\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-gltfUVAnimation/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-loading/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    showBackBtn: true,\n    resourceData: {\n    },\n    onFlags: [\n      false, false, // gltf\n      false, false, // image\n      false, false, false // video\n    ],\n    gltfList: [],\n    imageList: [],\n    videoList: [],\n  },\n  onLoad() {\n    // 准备加载数据\n  },\n  tapResBtn(event) {\n    const dataSet = event.target.dataset\n    // console.log(event);\n\n    const onFlags = this.data.onFlags\n\n    const src = dataSet.src\n    const index = parseInt(dataSet.index)\n\n    onFlags[index] = !onFlags[index]\n\n    switch (dataSet.type) {\n      case 'gltf':\n        let gltfListNew\n        if (onFlags[index]) {\n          gltfListNew = this.data.gltfList\n          gltfListNew.push({\n            id: index,\n            src\n          })\n        } else {\n          let matchIndex = -1\n          for (let i = 0; i < this.data.gltfList.length; i++) {\n            if (this.data.gltfList[i] && src === this.data.gltfList[i].src) {\n              matchIndex = i\n              break\n            }\n          }\n          this.data.gltfList.splice(matchIndex, 1)\n          gltfListNew = this.data.gltfList\n        }\n        this.setData({\n          gltfList: gltfListNew,\n          onFlags\n        })\n        break\n      case 'image':\n        let imageListNew\n        if (onFlags[index]) {\n          imageListNew = this.data.imageList\n          imageListNew.push({\n            id: index,\n            src\n          })\n        } else {\n          let matchIndex = -1\n          for (let i = 0; i < this.data.imageList.length; i++) {\n            if (this.data.imageList[i] && src === this.data.imageList[i].src) {\n              matchIndex = i\n              break\n            }\n          }\n          this.data.imageList.splice(matchIndex, 1)\n          imageListNew = this.data.imageList\n        }\n        this.setData({\n          imageList: imageListNew,\n          onFlags\n        })\n        break\n      case 'video':\n        let videoListNew\n        if (onFlags[index]) {\n          videoListNew = this.data.videoList\n          videoListNew.push({\n            id: index,\n            src\n          })\n        } else {\n          let matchIndex = -1\n          for (let i = 0; i < this.data.videoList.length; i++) {\n            if (this.data.videoList[i] && src === this.data.videoList[i].src) {\n              matchIndex = i\n              break\n            }\n          }\n          this.data.videoList.splice(matchIndex, 1)\n          videoListNew = this.data.videoList\n        }\n        this.setData({\n          videoList: videoListNew,\n          onFlags\n        })\n        break\n      default:\n        break\n    }\n  },\n  handleInfoListener(cur) {\n    const detail = cur.detail\n\n    this.setData({\n    })\n  }\n\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-loading/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-loading\": \"../../../components/template/xr-template-loading/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-loading/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"加载案例\"\n  intro=\"点击按钮进行对应资源的加载与使用。（目前视频纹理属于beta状态，真机情况下，多张视频纹理不可以同时加载与渲染，但是可以取消一份后渲染另外一份）\"\n  code=\"\"\n  showBackBtn=\"{{showBackBtn}}\"\n>\n  <xr-template-loading\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    gltfListRaw=\"{{gltfList}}\"\n    imageListRaw=\"{{imageList}}\"\n    videoListRaw=\"{{videoList}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n  <!-- <view class=\"xr-info\">\n    <view class=\"info-text title\">加载列表</view>\n    <view class=\"info-text\">加载进度:</view>\n    <view class=\"info-process\">\n      <view class=\"info-bar\" style=\"width: {{0}}%\"></view>\n    </view>\n  </view> -->\n  <view class=\"xr-res-panel\">\n    <view class=\"res-row\">\n      <view class=\"res-name\">glTF</view>\n      <view class=\"res-btn {{onFlags[0] ? 'on': ''}}\"\n        bindtap=\"tapResBtn\"\n        data-type=\"gltf\"\n        data-src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/index.gltf\"\n        data-index=\"0\"\n      >头盔</view>\n      <view class=\"res-btn {{onFlags[1] ? 'on': ''}}\"\n        bindtap=\"tapResBtn\"\n        data-type=\"gltf\"\n        data-src=\"/assets/gltf/Fox.glb\"\n        data-index=\"1\"\n      >狐狸</view>\n      <view class=\"res-name\">图片</view>\n      <view class=\"res-btn {{onFlags[2] ? 'on': ''}}\"\n        bindtap=\"tapResBtn\"\n        data-type=\"image\"\n        data-src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/Default_albedo.jpg\"\n        data-index=\"2\"\n      >头盔基础色</view>\n      <view class=\"res-btn {{onFlags[3] ? 'on': ''}}\"\n        bindtap=\"tapResBtn\"\n        data-type=\"image\"\n        data-src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/damage-helmet/Default_AO.jpg\"\n        data-index=\"3\"\n      >头盔AO</view>\n    </view>\n    <view class=\"res-row\">\n      <view class=\"res-name\">视频纹理</view>\n      <view class=\"res-btn {{onFlags[4] ? 'on': ''}}\"\n        bindtap=\"tapResBtn\"\n        data-type=\"video\"\n        data-src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/videos/paris.mp4\"\n        data-index=\"4\"\n      >巴黎路边</view>\n      <view class=\"res-btn {{onFlags[5] ? 'on': ''}}\"\n        bindtap=\"tapResBtn\"\n        data-type=\"video\"\n        data-src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/videos/cat.mp4\"\n        data-index=\"5\"\n      >猫咪视频</view>\n      <view class=\"res-btn {{onFlags[6] ? 'on': ''}}\"\n        bindtap=\"tapResBtn\"\n        data-type=\"video\"\n        data-src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/videos/yulong.mp4\"\n        data-index=\"6\"\n      >玉龙山顶</view>\n    </view>\n  </view>\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-loading/index.wxss",
    "content": ".xr-info {\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 300rpx;\n  height: 100rpx;\n  padding: 20rpx;\n  background-color: #000;\n  border-radius: 5px 0 0 5px;\n}\n.info-text {\n  font-size: 20rpx;\n  line-height: 30rpx;\n  padding: 0;\n  color: #fff;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.info-text.title {\n  font-size: 24rpx;\n  line-height: 40rpx;\n  font-weight: bold;\n}\n\n.info-process {\n  position: relative;\n  margin-top: 10rpx;\n  background-color: #fff;\n  height: 16rpx;\n  border-radius: 5rpx;\n}\n\n.info-process .info-bar {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 0%;\n  height: 100%;\n  background-color: green;\n  border-radius: 5rpx;\n}\n\n.xr-res-panel {\n  margin: 10rpx 20rpx;\n}\n\n.res-row {\n  padding: 10rpx;\n  vertical-align: middle;\n  text-align: center;\n}\n.res-name, .res-btn {\n  display: inline-block;\n  margin-right: 20rpx;\n  border-radius: 10rpx;\n}\n\n.res-name {\n  font-size: 22rpx;\n  background-color: #000;\n  padding: 0 10rpx;\n  line-height: 60rpx;\n  color: #fff;\n}\n\n.res-btn {\n  font-size: 26rpx;\n  background-color: #fff;\n  padding: 0 10rpx;\n  line-height: 70rpx;\n  border: 1px solid #000;\n}\n\n.res-btn.on {\n  background-color: forestgreen;\n  color: #fff;\n  transition: all 0.2s;\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-lookat/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  moveTimes: 0,\n  data: {\n    // 内置\n    height: 600,\n    heightScale: 0.85,\n    showBackBtn: true,\n  },\n  onLoad() {\n  },\n\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-lookat/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-lookat\": \"../../../components/template/xr-template-lookat/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-lookat/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"AR面向屏幕的平面\"\n  intro=\"通过脚本控制的，四个方向各有一个面向屏幕的平面\"\n  code=\"\"\n  showBackBtn=\"{{showBackBtn}}\"\n>\n  <xr-template-lookat\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-lookat/index.wxss",
    "content": "\n.xr-control {\n  position: absolute;\n  left: 50%;\n  width: 720rpx;\n  height: 200rpx;\n  margin-left: -360rpx;\n  margin-top: -220rpx;\n  text-align: center;\n}\n\n.control-item {\n  display: inline-block;\n  vertical-align: middle;\n  width: 160rpx;\n  margin: 0 10rpx;\n  height: 100%;\n  border-radius: 10rpx;\n  text-align: center;\n}\n\n.control-item.active .item-title {\n  color: #fff;\n  background-color: forestgreen;\n  border: 4rpx solid #fff;\n}\n\n\n.item-title {\n  font-size: 18rpx;\n  line-height: 60rpx;\n  border-radius: 10rpx;\n  border: 4rpx solid #000;\n  background-color: #fff;\n  transition: all 0.3s;\n}\n\n.img-wrap {\n  display: inline-block;\n  width: 80rpx;\n  height: 80rpx;\n  border-radius: 50rpx;\n  margin: 10rpx 5rpx;\n  overflow: hidden;\n  border: 4rpx solid #fff;\n}\n\n.hint-img {\n  width: 100%;\n  height: 100%;\n}\n\n.hint-img.lh {\n  height: 110%;\n  padding-top: -5%;\n}\n\n.hint-img.lw {\n  width: 130%;\n  margin-left: -15%;\n}\n\n.marker-wrap {\n  position: absolute;\n  left: -50%;\n  top: 50%;\n  transition: left 0.1s, top 0.1s, width 0.1s, height 0.1s;\n}\n\n.marker-img-lt {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 34px;\n  height: 34px;\n}\n.marker-img-rt {\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 34px;\n  height: 34px;\n  transform: scaleX(-1);\n}\n.marker-img-lb {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  width: 34px;\n  height: 34px;\n  transform: scaleY(-1);\n}\n.marker-img-rb {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  width: 34px;\n  height: 34px;\n  transform: scale(-1, -1);\n}\n\n\n.border-lt {\n  position: absolute;\n  left: 0;\n  top: 0;\n}\n.border-rt {\n  position: absolute;\n  right: 0;\n  top: 0;\n  transform: rotate(90deg);\n}\n.border-lb {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  transform: rotate(270deg);\n}\n.border-rb {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  transform: rotate(180deg);\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-markerCenter/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-markerCenter/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../..//components/xr-demo-viewer/index\",\n    \"xr-template-markerCenter\": \"../../../components/template/xr-template-markerCenter/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-markerCenter/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"识别后模型固定于屏幕中间\"\n  intro=\"扫描识别图片成功后，模型会固定于屏幕中央\"\n  hint=\"扫描图片见官网开发文档\\n组件 -> xr-frame -> 示例 \\n( AR案例 -> 2DMarker )\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-template-markerCenter\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-markerCenter/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-markerLock/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    xmlCode: '',\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-markerLock/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../..//components/xr-demo-viewer/index\",\n    \"xr-template-markerLock\": \"../../../components/template/xr-template-markerLock/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-markerLock/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"识别后模型固定，在世界空间\"\n  intro=\"扫描识别图片成功后，模型会固定于平面模式的世界空间坐标中\"\n  hint=\"扫描图片见官网开发文档\\n组件 -> xr-frame -> 示例 \\n( AR案例 -> 2DMarker )\"\n  code=\"{{xmlCode}}\"\n>\n  <xr-template-markerLock\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    bind:arTrackerState=\"handleARTrackerState\"\n  />\n\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-markerLock/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-message/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    messageData: {\n      moveX: 0,\n      moveZ: 0,\n    },\n    speedX: '0.00',\n    speedZ: '0.00',\n    posX: '0.00',\n    posZ: '0.00',\n    showXRFrame: true,\n  },\n  tapPlusX() {\n    this.setData({\n      messageData: {\n        moveX: this.data.messageData.moveX + 1,\n        moveZ: this.data.messageData.moveZ\n      }\n    })\n  },\n  tapSubX() {\n    this.setData({\n      messageData: {\n        moveX: this.data.messageData.moveX - 1,\n        moveZ: this.data.messageData.moveZ\n      }\n    })\n  },\n  tapPlusZ() {\n    this.setData({\n      messageData: {\n        moveX: this.data.messageData.moveX,\n        moveZ: this.data.messageData.moveZ + 1,\n      }\n    })\n  },\n  tapSubZ() {\n    this.setData({\n      messageData: {\n        moveX: this.data.messageData.moveX,\n        moveZ: this.data.messageData.moveZ - 1,\n      }\n    })\n  },\n  tapClose() {\n    this.setData({\n      showXRFrame: !this.data.showXRFrame\n    })\n  },\n  handleInfoListener(cur) {\n    const detail = cur.detail\n\n    this.setData({\n      speedX: detail.speedX,\n      speedZ: detail.speedZ,\n      posX: detail.posX,\n      posZ: detail.posZ\n    })\n  }\n\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-message/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-message\": \"../../../components/template/xr-template-message/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-message/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"小程序通信模版\"\n  intro=\"通过小程序按钮事件，传递速度变量到 xr-Frame 控制小球移动，并将小球状态同步到小程序侧显示。（工具存在同层渲染问题，请于真机体验）\"\n>\n  <view class=\"xr-holder\" style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\">\n    <xr-template-message\n      disable-scroll\n      wx:if=\"{{showXRFrame}}\"\n      id=\"main-frame\"\n      width=\"{{renderWidth}}\"\n      height=\"{{renderHeight}}\"\n      messageData=\"{{messageData}}\"\n      bindinfoListener=\"handleInfoListener\"\n      style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n    />\n  </view>\n  <view class=\"xr-info\">\n    <view class=\"info-text title\">监听列表</view>\n    <view class=\"info-text\">小球速度:</view>\n    <view class=\"info-text\">X: {{speedX}}  Z: {{speedZ}}</view>\n    <view class=\"info-text\">小球位置:</view>\n    <view class=\"info-text\">X: {{posX}}  Z: {{posZ}}</view>\n  </view>\n  <view class=\"xr-control\" style=\"top: {{height}}px;\">\n    <button bindtap=\"tapPlusX\">X轴加速</button>\n    <button bindtap=\"tapSubX\">X轴减速</button>\n    <button bindtap=\"tapPlusZ\">Z轴加速</button>\n    <button bindtap=\"tapSubZ\">Z轴减速</button>\n  </view>\n  <view class=\"xr-block\">\n    <button bindtap=\"tapClose\">开启与关闭 xrframe 组件</button>\n  </view>\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-message/index.wxss",
    "content": ".xr-info {\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 200rpx;\n  height: 160rpx;\n  padding: 20rpx;\n  background-color: #000;\n  border-radius: 5px 0 0 5px;\n}\n.info-text {\n  font-size: 20rpx;\n  line-height: 30rpx;\n  padding: 0;\n  color: #fff;\n}\n.info-text.title {\n  font-size: 24rpx;\n  line-height: 40rpx;\n  font-weight: bold;\n}\n\n.xr-control {\n  position: absolute;\n  left: 20rpx;\n  width: 700rpx;\n  height: 80rpx;\n  margin-top: -100rpx;\n  text-align: left;\n}\n\n.xr-control button {\n  display: inline-block;\n  font-size: 24rpx;\n  background-color: #fff;\n  border-radius: 10rpx; \n  width: 160rpx;\n  height: 80rpx;\n  line-height: 80rpx;\n  padding: 0;\n  margin-right: 10rpx;\n  border: 1px solid #000;\n}\n\n.xr-block {\n  text-align: center;\n  margin: 20rpx;\n}\n\n.xr-block button {\n  display: inline-block;\n  font-size: 30rpx;\n  background-color: #fff;\n  border-radius: 10rpx; \n  width: 90%;\n  height: 80rpx;\n  line-height: 80rpx;\n  padding: 0;\n  margin-right: 10rpx;\n  border: 1px solid #000;\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-pbr/index.js",
    "content": "// 加载toonEffect\nimport '../../../xr-custom/assets/standard-shader/customPBR'\n\nconst sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    dpiScale: 1\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-pbr/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-pbr\": \"../../../components/template/xr-template-pbr/index\"\n  },\n  \"disableScroll\": true\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-pbr/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"定制化PBR模型渲染\"\n  intro=\"PBR材质的复现，可高度定制。\"\n>\n\n<xr-template-pbr\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-pbr/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-planeShadow/index.js",
    "content": "// 加载 planeShadow Effect\nimport '../../../xr-custom/assets/effect-planeShadow'\n\nconst sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    dpiScale: 1\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-planeShadow/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-planeShadow\": \"../../../components/template/xr-template-planeShadow/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-planeShadow/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"平面阴影\"\n  intro=\"自定义透明阴影材质（模型较大，请耐心等待）\"\n>\n  <xr-template-planeShadow\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-planeShadow/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-removeBlack/index.js",
    "content": "import '../../../xr-custom/assets/effect-removeBlack'\n\nconst sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-removeBlack/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-removeBlack\": \"../../../components/template/xr-template-removeBlack/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-removeBlack/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"过滤黑色视频\"\n  intro=\"通过自定义材质，过滤掉视频黑色部分的案例。（无法处理次像素）\"\n>\n  <xr-template-removeBlack\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-removeBlack/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-select/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    menu: [],\n    radius: 80\n  },\n  touchEnd(e) {\n    moveIdx = -1\n    // 当位移触摸点松开时，保证旋转触摸点取的为第一接触点\n    if (rotateIdx == 1) rotateIdx = 0\n    this.setData({\n      hLeft: centerX - hWidth / 2,\n      hTop: centerY - hHeight / 2,\n      transferData: {\n        biasX: 0,\n        biasY: 0,\n      }\n    })\n  },\n  animateChoose(e) {\n    console.log('choose:', e.currentTarget.dataset.index)\n    this.setData({\n      itemIndex: e.currentTarget.dataset.index\n    })\n  },\n  processMenu() {\n    const positionX = (this.data.touchPos.x + 1) / 2 * this.data.width\n    const positionY = (1 - (this.data.touchPos.y + 1) / 2) * this.data.height\n    const radius = this.data.radius * this.data.len\n    const item = []\n    const animLength = this.data.clipName.length\n    let offsetAngle\n    if (animLength > 6) {\n      offsetAngle = 2 * Math.PI / animLength\n    } else {\n      offsetAngle = Math.PI / animLength\n    }\n\n    const originAngle = -Math.PI / 2\n\n    for (let i = 0; i < animLength; i++) {\n      const x = radius * Math.cos(originAngle + i * offsetAngle)\n      const y = radius * Math.sin(originAngle + i * offsetAngle)\n\n      var text\n      switch (i) {\n        case 0:\n          text = '暂停'\n          break\n        case 1:\n          text = '继续'\n          break\n        default:\n          text = this.data.clipName[i - 2]\n          break\n      }\n      item.push({\n        index: i, x: positionX, y: positionY, biasX: x, biasY: y, text\n      })\n    }\n    this.setData({\n      menu: item\n    })\n  },\n  handleInfoListener(cur) {\n    const detail = cur.detail\n    //  console.log(\"receive:\", detail)\n    if (detail.clipName) {\n      this.setData({\n        clipName: detail.clipName\n      })\n    }\n\n    if (detail.position) {\n      this.setData({\n        touchPos: detail.position,\n        len: detail.len\n      })\n      this.processMenu()\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-select/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-select\": \"../../../components/template/xr-template-select/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-select/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"点选物体与动画控制\"\n  intro=\"\"\n>\n  <xr-template-select\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    itemIndex=\"{{itemIndex}}\"\n    bindinfoListener = \"handleInfoListener\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px; display:block;\"\n  />\n\n  <!-- <view style=\"position: absolute; top: 0%; left:0%; width:100%; height:100%;\" bind:touchstart='touchStart'></view> -->\n\n  <view wx:for=\"{{menu}}\">\n    <view class=\"hexagon_container{{itemIndex==item.index?'_selected':''}}\" hover-class=\"hexagon_container_active\" catchtouchstart='animateChoose' data-index=\"{{item.index}}\" style=\"left:{{item.x}}px; top:{{item.y}}px; --biasX:{{item.biasX}}px; --biasY:{{item.biasY}}px; --delay:{{item.index * 200 }}\">\n      <view class=\"rect_text\">{{item.text}}</view>\n          <view class=\"container\">\n              <view class=\"middle\">\n                  <view class=\"item\">\n                      <view class=\"item_partone\"></view>\n                      <view class=\"item_parttwo\"></view>\n                  </view>\n              </view>\n          </view>\n      </view>\n  </view>\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-select/index.wxss",
    "content": "page {\n  --color: 222, 228, 222;\n  --shadowColor: 0px 0px 17px 2px rgba(var(--color), 0.6) inset;\n}\n\n.hexagon_container {\n  position: absolute;\n  animation: move 2s ease;\n  animation-iteration-count: 1; \n  animation-fill-mode: forwards;\n  animation-delay: calc(var(--delay) * 1ms);\n  opacity: 0;\n  transition: all 1s ease-out;\n}\n\n.hexagon_container_selected {\n  --shadowColor: 0px 0px 17px 2px rgba(50, 241, 76, 0.6) inset;\n  position: absolute;\n  animation: move 1s ease;\n  animation-iteration-count: 1; \n  animation-fill-mode: forwards;\n  animation-delay: calc(var(--delay) * 1ms);\n  opacity: 0;\n  transition: all 1s ease-out;\n}\n\n/* .hexagon_container_active {\n  --shadowColor: 0px 0px 17px 2px rgba(50, 241, 76, 0.6) inset;\n} */\n\n\n@keyframes move {\n  0% {\n    transform: translate(0px, 0px) scale(0);\n    opacity: 1;\n  }\n  100% {\n    transform: translate(var(--biasX), var(--biasY)) scale(1);\n    opacity: 1;\n  }\n}\n\n.hexagon_container,\n.container,\n.middle,\n.item,\n.item_partone,\n.item_parttwo {\n  width: 50px;\n  height: 40px;\n}\n\n.container,\n.middle,\n.item {\n  overflow: hidden;\n}\n\n.middle {\n  transform: rotate(-60deg);\n}\n\n.item,\n.item_partone,\n.item_parttwo {\n  box-shadow: var(--shadowColor);\n  border: var(--borderColor);\n}\n\n.item {\n  position: relative;\n  background: no-repeat 50% center;\n  background-size: 125% auto;\n  transform: rotate(-60deg);\n}\n\n.item_partone {\n  position: absolute;\n  left: 0;\n  top: 0;\n  transform: rotateZ(-60deg);\n}\n\n.item_parttwo {\n  position: absolute;\n  left: 0;\n  top: 0;\n  transform: rotateZ(-120deg);\n}\n\n.rect_text {\n  display: flex;\n  flex-direction: column;\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -50%);\n  color: rgb(43, 216, 247);\n  font-size: 50%;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: \"\";\n}\n\n\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-share/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-share/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-share\": \"../../../components/template/xr-template-share/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-share/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"分享截屏案例\"\n  intro=\"通过分享系统截屏分享，点击画布右下角1/3区域触发。\"\n>\n  <xr-template-share\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-share/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-textEdit/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-textEdit/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-textEdit\": \"../../../components/template/xr-template-textEdit/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-textEdit/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"自定义文字案例\"\n  intro=\"文本显示与排版示例\"\n  hint=\"要求基础库 v3.3.3 及以上\"\n>\n  <xr-template-textEdit\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-textEdit/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-toon/index.js",
    "content": "// 加载toonEffect\nimport '../../../xr-custom/assets/effect-toon'\n\nconst sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n    dpiScale: 1\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-toon/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-toon\": \"../../../components/template/xr-template-toon/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-toon/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"Toon 模型渲染\"\n  intro=\"卡通渲染案例，动态将 glTF 模型的材质切换为 基于基础卡通渲染规范编写的，自定义多 Pass 材质。\"\n>\n  <xr-template-toon\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-toon/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-tracker/index.js",
    "content": "const sceneReadyBehavior = require('../../behavior-scene/scene-ready')\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  moveTimes: 0,\n  data: {\n    // 内置\n    height: 600,\n    heightScale: 0.85,\n    showBackBtn: true,\n    // 页面\n    useScan: true,\n    useGLTF: false,\n    useVideo1: false,\n    useVideo2: false,\n    markerList: [],\n    // scan 相关\n    showMarkerWrap: false,\n    markerLeft: -50,\n    markerTop: 50,\n    markerWidth: 0,\n    markerHeight: 0,\n    // 全局状态\n    dataReady: false,\n    // Debug\n    debugMsg: 'Defalut Words',\n  },\n  onLoad() {\n    this.refreshData()\n  },\n  resetData() {\n    this.setData({\n      dataReady: false,\n      showMarkerWrap: false,\n      markerLeft: -50,\n      markerTop: 50,\n      markerWidth: 0,\n      markerHeight: 0,\n    })\n  },\n  refreshData() {\n    this.resetData()\n    // 模拟用的数据集合，可以跟进需要切换为后端接口\n    const mockDataList = []\n\n    // 识别框\n    if (this.data.useScan) {\n      mockDataList.push({\n        name: '微信球',\n        markerImg: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/wxball.jpg',\n        type: 'scan',\n        src: '',\n      })\n    }\n\n    // glTF模型\n    if (this.data.useGLTF) {\n      mockDataList.push({\n        name: '扫描画',\n        markerImg: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/portalImage.jpg',\n        type: 'gltf',\n        src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/fiesta_tea/scene.gltf',\n      })\n    }\n\n    // 视频\n    if (this.data.useVideo1) {\n      mockDataList.push({\n        name: '2Dmarker',\n        markerImg: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/2dmarker-test.jpg',\n        type: 'video',\n        src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/videos/cat.mp4',\n      })\n    }\n\n    if (this.data.useVideo2) {\n      mockDataList.push({\n        name: '虎年企鹅',\n        markerImg: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/osdmarker-test.jpg',\n        type: 'video',\n        src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/videos/paris.mp4',\n      })\n    }\n\n    // 需要使用的marker\n    const markerList = []\n\n    let scanIndex = 0\n    let videoIndex = 0\n    let gltfIndex = 0\n\n    for (let i = 0; i < mockDataList.length; i++) {\n      const mockItem = mockDataList[i]\n      switch (mockItem.type) {\n        case 'scan': // scan\n          const scanId = 'scan' + scanIndex\n          markerList.push({\n            id: scanId,\n            name: mockItem.name,\n            renderType: mockItem.type,\n            markerImage: mockItem.markerImg,\n            src: mockItem.src,\n          })\n          scanIndex++\n          break\n        case 'video': // video\n          const videoId = 'video' + videoIndex\n          markerList.push({\n            id: videoId,\n            name: mockItem.name,\n            renderType: mockItem.type,\n            markerImage: mockItem.markerImg,\n            src: mockItem.src,\n          })\n          videoIndex++\n          break\n        case 'gltf': // gltf\n          const gltfId = 'gltf' + gltfIndex\n          markerList.push({\n            id: gltfId,\n            name: mockItem.name,\n            renderType: mockItem.type,\n            markerImage: mockItem.markerImg,\n            src: mockItem.src,\n          })\n          gltfIndex++\n          break\n      }\n    }\n\n    console.log('markerList', markerList)\n\n    this.setData({\n      dataReady: true,\n      markerList\n    })\n\n    this.setData({\n      debugMsg: 'markerList:' + markerList.length\n    })\n  },\n  tapScan() {\n    this.setData({\n      useScan: !this.data.useScan\n    })\n\n    this.refreshData()\n  },\n  tapGLTF() {\n    this.setData({\n      useGLTF: !this.data.useGLTF\n    })\n\n    this.refreshData()\n  },\n  tapVideo1() {\n    this.setData({\n      useVideo1: !this.data.useVideo1\n    })\n\n    this.refreshData()\n  },\n  tapVideo2() {\n    this.setData({\n      useVideo2: !this.data.useVideo2\n    })\n\n    this.refreshData()\n  },\n  handleTrackerChange(cur) {\n    const item = cur.detail\n    this.setData({\n      debugMsg: 'handleTrackerChange:' + item.name\n    })\n  },\n  handleTrackerMove(cur) {\n    const detail = cur.detail\n    const trackerInfo = detail.trackerInfo\n\n    this.moveTimes++\n\n    if (detail.type === 'scan') {\n      if (detail.active) {\n        this.setData({\n          showMarkerWrap: true,\n          markerLeft: Math.floor((trackerInfo.x) * 100),\n          markerTop: Math.floor((trackerInfo.y) * 100) * this.data.heightScale,\n          markerWidth: Math.floor(trackerInfo.halfWidth * 2 * this.data.width),\n          markerHeight: Math.floor(trackerInfo.halfWidth * 2 * this.data.width / trackerInfo.widthDivideHeight),\n          // debugMsg: 'pos:' + trackerInfo.x + '\\n' + trackerInfo.y + '\\n halfWidth:' + trackerInfo.halfWidth + '\\nmoveTimes:' + this.moveTimes\n        })\n      } else {\n        this.setData({\n          showMarkerWrap: false,\n        })\n      }\n    }\n  },\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-tracker/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-tracker\": \"../../../components/template/xr-template-tracker/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\",\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-tracker/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"多Tracker案例\"\n  intro=\"点击按钮，对应不同识别效果 Marker 的添加与删除。视频纹理加载过程会有白色透明层，加载完成后直接播放。视频目前属于beta阶段，存在加载失败超时的情况，为了避免目前版本的Crash问题，每次扫描会重新拉取视频。\"\n  code=\"\"\n  showBackBtn=\"{{showBackBtn}}\"\n>\n  <view wx:if=\"{{dataReady}}\">\n    <xr-template-tracker\n      disable-scroll\n      id=\"main-frame\"\n      width=\"{{renderWidth}}\"\n      height=\"{{renderHeight}}\"\n      style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n      markerListRaw=\"{{markerList}}\"\n      bindtrackerchange=\"handleTrackerChange\"\n      bindtrackermove=\"handleTrackerMove\"\n    />\n  </view>\n\n  <!-- Marker控制 -->\n  <view class=\"xr-control\" style=\"top: {{height}}px;\">\n    <view class=\"control-item {{useScan? 'active' : ''}}\" bind:tap=\"tapScan\">\n      <view class=\"item-title\">扫描显示识别框</view>\n      <view class=\"img-wrap\">\n        <image class=\"hint-img\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/wxball.jpg\" />\n      </view>\n    </view>\n    <view class=\"control-item {{useGLTF? 'active' : ''}}\" bind:tap=\"tapGLTF\">\n      <view class=\"item-title\">扫描显示glTF</view>\n      <view class=\"img-wrap\">\n        <image class=\"hint-img\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/portalImage.jpg\" />\n      </view>\n    </view>\n\n    <view class=\"control-item {{useVideo1? 'active' : ''}}\" bind:tap=\"tapVideo1\">\n      <view class=\"item-title\">扫描显示视频1</view>\n      <view class=\"img-wrap\">\n        <image class=\"hint-img\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/2dmarker-test.jpg\" />\n      </view>\n    </view>\n    <view class=\"control-item {{useVideo2? 'active' : ''}}\" bind:tap=\"tapVideo2\">\n      <view class=\"item-title\">扫描显示视频2</view>\n      <view class=\"img-wrap\">\n        <image class=\"hint-img lh\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/osdmarker-test.jpg\" />\n      </view>\n    </view>\n  </view>\n\n  <!-- scan 提示框 -->\n  <view class=\"marker-wrap\" wx:if=\"{{showMarkerWrap}}\" style=\"left: {{markerLeft}}%; top: {{markerTop}}%; width: {{markerWidth}}px; height: {{markerHeight}}px; margin-left: -{{markerWidth / 2}}px; margin-top: -{{markerHeight / 2}}px;\">\n    <image class=\"marker-img-lt\" src=\"/assets/image/ar-box-border.png\"></image>\n    <image class=\"marker-img-lb\" src=\"/assets/image/ar-box-border.png\"></image>\n    <image class=\"marker-img-rt\" src=\"/assets/image/ar-box-border.png\"></image>\n    <image class=\"marker-img-rb\" src=\"/assets/image/ar-box-border.png\"></image>\n  </view>\n\n</xr-demo-viewer>"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-tracker/index.wxss",
    "content": "\n.xr-control {\n  position: absolute;\n  left: 50%;\n  width: 720rpx;\n  height: 200rpx;\n  margin-left: -360rpx;\n  margin-top: -220rpx;\n  text-align: center;\n}\n\n.control-item {\n  display: inline-block;\n  vertical-align: middle;\n  width: 160rpx;\n  margin: 0 10rpx;\n  height: 100%;\n  border-radius: 10rpx;\n  text-align: center;\n}\n\n.control-item.active .item-title {\n  color: #fff;\n  background-color: forestgreen;\n  border: 4rpx solid #fff;\n}\n\n\n.item-title {\n  font-size: 18rpx;\n  line-height: 60rpx;\n  border-radius: 10rpx;\n  border: 4rpx solid #000;\n  background-color: #fff;\n  transition: all 0.3s;\n}\n\n.img-wrap {\n  display: inline-block;\n  width: 80rpx;\n  height: 80rpx;\n  border-radius: 50rpx;\n  margin: 10rpx 5rpx;\n  overflow: hidden;\n  border: 4rpx solid #fff;\n}\n\n.hint-img {\n  width: 100%;\n  height: 100%;\n}\n\n.hint-img.lh {\n  height: 110%;\n  padding-top: -5%;\n}\n\n.hint-img.lw {\n  width: 130%;\n  margin-left: -15%;\n}\n\n.marker-wrap {\n  position: absolute;\n  left: -50%;\n  top: 50%;\n  transition: left 0.1s, top 0.1s, width 0.1s, height 0.1s;\n}\n\n.marker-img-lt {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 34px;\n  height: 34px;\n}\n.marker-img-rt {\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 34px;\n  height: 34px;\n  transform: scaleX(-1);\n}\n.marker-img-lb {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  width: 34px;\n  height: 34px;\n  transform: scaleY(-1);\n}\n.marker-img-rb {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  width: 34px;\n  height: 34px;\n  transform: scale(-1, -1);\n}\n\n\n.border-lt {\n  position: absolute;\n  left: 0;\n  top: 0;\n}\n.border-rt {\n  position: absolute;\n  right: 0;\n  top: 0;\n  transform: rotate(90deg);\n}\n.border-lb {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  transform: rotate(270deg);\n}\n.border-rb {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  transform: rotate(180deg);\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-volumeVideo/index.js",
    "content": "import './planeShadow'\n\nconst sceneReadyBehavior = require('../../behavior-scene/scene-ready')\nconst handleDecodedXML = require('../../behavior-scene/util').handleDecodedXML\n\nPage({\n  behaviors: [sceneReadyBehavior],\n  data: {\n  }\n})\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-volumeVideo/index.json",
    "content": "{\n  \"usingComponents\": {\n    \"xr-demo-viewer\": \"../../../components/xr-demo-viewer/index\",\n    \"xr-template-volumeVideo\": \"../../../components/template/xr-template-volumeVideo/index\"\n  },\n  \"disableScroll\": true, \"renderer\": \"webview\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-volumeVideo/index.wxml",
    "content": "<xr-demo-viewer\n  title=\"体积视频渲染\"\n  intro=\"根据体积视频进行三维模型渲染\"\n>\n  <xr-template-volumeVideo\n    disable-scroll\n    id=\"main-frame\"\n    width=\"{{renderWidth}}\"\n    height=\"{{renderHeight}}\"\n    style=\"width:{{width}}px;height:{{height}}px;top:{{top}}px;left:{{left}}px;display:block;\"\n  />\n</xr-demo-viewer>\n"
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-volumeVideo/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/packageXRFrame/pages/template/xr-template-volumeVideo/planeShadow.js",
    "content": "const xrFrameSystem = wx.getXrFrameSystem()\n\nxrFrameSystem.registerEffect('plane-shadow', scene => scene.createEffect({\n  name: 'plane-shadow',\n  properties: [\n    // 需保证，至少存在一个properties用于创建effect共享内存\n    {\n      key: 'u_holder',\n      type: xrFrameSystem.EUniformType.FLOAT4,\n      default: [1, 1, 1, 1]\n    }\n  ],\n  images: [],\n  defaultRenderQueue: 3000,\n  passes: [{\n    renderStates: {\n      cullOn: false,\n      blendOn: true,\n    },\n    lightMode: 'ForwardBase',\n    useMaterialRenderStates: true,\n    shaders: [0, 1]\n  }],\n  shaders: [\n    // Vertex\n    `#version 100\nuniform highp mat4 u_view;\nuniform highp mat4 u_viewInverse;\nuniform highp mat4 u_vp;\nuniform highp mat4 u_projection;\nuniform highp mat4 u_world;\nattribute vec3 a_position;\nattribute highp vec2 a_texCoord;\nvarying highp vec2 v_UV;\n#ifdef WX_RECEIVE_SHADOW\n    varying highp vec3 v_WorldPosition;\n#endif\nvoid main()\n{\n  v_UV = a_texCoord;\n  vec4 worldPosition = u_world * vec4(a_position, 1.0);\n  #ifdef WX_RECEIVE_SHADOW\n      v_WorldPosition = worldPosition.xyz;\n  #endif\n  gl_Position = u_projection * u_view * worldPosition;\n}`,\n    // Fragemenet\n    `#version 100\nprecision mediump float;\nprecision highp int;\nvarying highp vec2 v_UV;\nuniform vec4 u_ambientLightColorIns;\nuniform vec3 u_mainLightDir;\nuniform vec4 u_mainLightColorIns;\n#ifdef WX_RECEIVE_SHADOW\n    varying highp vec3 v_WorldPosition;\n    uniform float u_shadowStrength;\n    uniform float u_shadowBias;\n    uniform vec3 u_shadowColor;\n    uniform sampler2D u_shadowMap;\n    uniform mat4 u_csmLightSpaceMatrices[4];\n    uniform vec4 u_csmFarBounds;\n    uniform vec4 u_shadowTilingOffsets[4];\n#endif\n\nfloat unpackDepth(const in vec4 rgbaDepth)\n{\n  vec4 bitShift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n  float depth = dot(rgbaDepth, bitShift);\n  return depth;\n}\n\nfloat shadowCalculation(vec3 posWorld) {\n  float srcShadow = 1.0;\n  vec4 shadowCoord = u_csmLightSpaceMatrices[0] * vec4(posWorld, 1.0);\n  shadowCoord.xyz = shadowCoord.xyz / shadowCoord.w;\n  shadowCoord = shadowCoord * 0.5 + 0.5;\n  shadowCoord.z = shadowCoord.z + step(shadowCoord.x, 0.001) + step(shadowCoord.y, 0.001) + step(0.999, shadowCoord.x) + step(0.999, shadowCoord.y);\n  shadowCoord.xy = shadowCoord.xy * u_shadowTilingOffsets[0].xy + u_shadowTilingOffsets[0].zw;\n  if (shadowCoord.z > 1.0)\n  {\n    shadowCoord.z = 1.0;\n  }\n  float currentDepth = shadowCoord.z;\n  float bias = u_shadowBias;\n  float zRef = currentDepth - bias;\n  float sourceVal = float(zRef < unpackDepth(texture2D(u_shadowMap, shadowCoord.xy)));\n  srcShadow = sourceVal;\n  return srcShadow;\n  }\nvoid main()\n{\n  vec4 result = vec4(0.0);\n  \n  // MainLights\n  #ifdef WX_USE_MAIN_DIR_LIGHT\n        vec3 mainLightColor = u_mainLightColorIns.rgb * u_mainLightColorIns.a;\n      #ifdef WX_RECEIVE_SHADOW\n          float shadowScale = shadowCalculation(v_WorldPosition);\n          result = vec4(mainLightColor * shadowScale, 1.0 - shadowScale);\n      #endif\n  #endif\n\n  gl_FragData[0] = result; \n}\n`],\n}))\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/animations/XrTeamCameraAnimation.ts",
    "content": "import XrFrame from 'XrFrame';\nconst xrFrameSystem = wx.getXrFrameSystem();\n\ninterface IXrTeamCameraAnimtionData {\n  targets: {\n    hikari: XrFrame.Vector3;\n    roam: XrFrame.Vector3;\n    xinyi: XrFrame.Vector3;\n    final: XrFrame.Vector3;\n    [key: string]: XrFrame.Vector3;\n  },\n  startY: number;\n  finalY: number;\n}\n\ninterface IXrTeamCameraAnimationOptions {\n\n}\n\nexport default class XrTeamCameraAnimation extends xrFrameSystem.Animation<\n  IXrTeamCameraAnimtionData,\n  IXrTeamCameraAnimationOptions\n> {\n  private _camera: XrFrame.Transform | undefined;\n  private _target: XrFrame.Transform | undefined;\n  private _targets: IXrTeamCameraAnimtionData['targets'] | undefined;\n  private _startY: number | undefined;\n  private _finalY: number | undefined;\n  private _startC: XrFrame.Vector3 = new xrFrameSystem.Vector3();\n  private _endC: XrFrame.Vector3 = new xrFrameSystem.Vector3();\n  private _startT: XrFrame.Vector3 = new xrFrameSystem.Vector3();\n  private _endT: XrFrame.Vector3 = new xrFrameSystem.Vector3();\n\n  public onInit(data: IXrTeamCameraAnimtionData) {\n    console.log('anim data', data);\n    this._targets = data.targets;\n    this._startY = data.startY;\n    this._finalY = data.finalY;\n\n    this.clipNames = [\n      'hikari',\n      'roam',\n      'xinyi',\n      'final'\n    ];\n  }\n\n  public onPlay(el: XrFrame.Element, clipName: string, options: IXrTeamCameraAnimationOptions): {\n    duration: number,\n    loop?: number,\n    delay?: number,\n    direction?: XrFrame.TDirection\n  } {\n    const isFinal = clipName === 'final';\n    this._camera = this._camera || el.getComponent(xrFrameSystem.Transform);\n    this._target = el.getComponent(xrFrameSystem.Camera).target;\n    this._startT.set(this._target.position);\n    this._endT.setValue(this._targets![clipName].x, isFinal ? this._finalY! : this._startY!, this._targets![clipName].z);\n    this._startC.set(this._camera.position);\n    this._endC.set(this._endT);\n    this._endC.z += isFinal ? 3 : 1;\n\n    return {duration: isFinal ? 4 : 2};\n  }\n\n  /**\n   * @param progress 0~1\n   */\n  public onUpdate(el: XrFrame.Element, progress: number, reverse: boolean) {\n    progress = xrFrameSystem.noneParamsEaseFuncs['ease-in-out'](progress);\n    this._startT?.lerp(this._endT, progress, this._target?.position);\n    this._startC?.lerp(this._endC, progress, this._camera?.position);\n  }\n\n  public onPause(el: XrFrame.Element) {\n\n  }\n\n  public onResume(el: XrFrame.Element) {\n\n  }\n\n  public onStop(el: XrFrame.Element) {\n\n  }\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/effect-last-record-final.ts",
    "content": "import XrFrame from 'XrFrame';\nconst xrFrameSystem = wx.getXrFrameSystem();\n\nxrFrameSystem.registerEffect('last-record-final', scene => scene.createEffect({\n  name: \"last-record-final\",\n  properties: [],\n  images: [\n    {\n      key: 'u_arBg',\n      default: 'white'\n    },\n    {\n      key: 'u_main',\n      default: 'white'\n    }\n  ],\n  defaultRenderQueue: 2000,\n  passes: [{\n    \"renderStates\": {\n      cullOn: false,\n      blendOn: false,\n      depthWrite: false,\n      depthTestOn: false\n    },\n    lightMode: \"ForwardBase\",\n    useMaterialRenderStates: false,\n    shaders: [0, 1]\n  }],\n  shaders: [`#version 100\n  attribute vec3 a_position;\n  attribute vec2 a_texCoord;\n  varying vec2 v_texCoord;\n\n  void main() {\n    v_texCoord = a_texCoord;\n    gl_Position = vec4(a_position.xy, 1.0, 1.0);\n  }\n  `,\n    `#version 100\nprecision mediump float;\nprecision highp int;\nvarying highp vec2 v_texCoord;\n\nuniform sampler2D u_arBg;\nuniform sampler2D u_main;\n\nvoid main()\n{\n  vec2 uv = v_texCoord.xy;\n  vec4 bgColor = texture2D(u_arBg, uv);\n  vec4 mainColor = texture2D(u_main, uv);\n  gl_FragData[0] = vec4(bgColor.rgb * (1. - mainColor.a) + mainColor.rgb * mainColor.a, 1.);\n  // gl_FragData[0] = vec4(pow(mainColor.a, 1. / 2.2), 0., 0., 1.);\n  // gl_FragData[0] = mainColor;\n} \n    `],\n}));\n\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/effect-planeShadow.ts",
    "content": "\nimport XrFrame from 'XrFrame';\nconst xrFrameSystem = wx.getXrFrameSystem();\n\nxrFrameSystem.registerEffect('plane-shadow', scene => scene.createEffect({\n  name: \"plane-shadow\",\n  properties: [\n    // 需保证，至少存在一个properties用于创建effect共享内存\n    {\n      key: 'u_holder',\n      type: xrFrameSystem.EUniformType.FLOAT4,\n      default: [1, 1, 1, 1]\n    }\n  ],\n  images: [],\n  defaultRenderQueue: 3000,\n  passes: [{\n    \"renderStates\": {\n      cullOn: false,\n      blendOn: true,\n    },\n    lightMode: \"ForwardBase\",\n    useMaterialRenderStates: true,\n    shaders: [0, 1]\n  }],\n  shaders: [\n// Vertex\n`#version 100\n\nuniform highp mat4 u_view;\nuniform highp mat4 u_viewInverse;\nuniform highp mat4 u_vp;\nuniform highp mat4 u_projection;\nuniform highp mat4 u_world;\n\nattribute vec3 a_position;\nattribute highp vec2 a_texCoord;\n\nvarying highp vec2 v_UV;\n\n#ifdef WX_RECEIVE_SHADOW\n    varying highp vec3 v_WorldPosition;\n#endif\n\nvoid main()\n{\n  v_UV = a_texCoord;\n  vec4 worldPosition = u_world * vec4(a_position, 1.0);\n\n  #ifdef WX_RECEIVE_SHADOW\n      v_WorldPosition = worldPosition.xyz;\n  #endif\n\n  gl_Position = u_projection * u_view * worldPosition;\n}`,\n// Fragemenet\n`#version 100\n\nprecision mediump float;\nprecision highp int;\nvarying highp vec2 v_UV;\n\nuniform vec4 u_ambientLightColorIns;\nuniform vec3 u_mainLightDir;\nuniform vec4 u_mainLightColorIns;\n\n\n#ifdef WX_RECEIVE_SHADOW\n    varying highp vec3 v_WorldPosition;\n\n    uniform float u_shadowStrength;\n    uniform float u_shadowBias;\n    uniform vec3 u_shadowColor;\n    uniform sampler2D u_shadowMap;\n\n    uniform mat4 u_csmLightSpaceMatrices[4];\n    uniform vec4 u_csmFarBounds;\n    uniform vec4 u_shadowTilingOffsets[4];\n#endif\n\nfloat unpackDepth(const in vec4 rgbaDepth)\n{\n  vec4 bitShift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n  float depth = dot(rgbaDepth, bitShift);\n  return depth;\n}\n\nfloat shadowCalculation(vec3 posWorld) {\n  float srcShadow = 1.0;\n\n  vec4 shadowCoord = u_csmLightSpaceMatrices[0] * vec4(posWorld, 1.0);\n  shadowCoord.xyz = shadowCoord.xyz / shadowCoord.w;\n  shadowCoord = shadowCoord * 0.5 + 0.5;\n  shadowCoord.z = shadowCoord.z + step(shadowCoord.x, 0.001) + step(shadowCoord.y, 0.001) + step(0.999, shadowCoord.x) + step(0.999, shadowCoord.y);\n  shadowCoord.xy = shadowCoord.xy * u_shadowTilingOffsets[0].xy + u_shadowTilingOffsets[0].zw;\n\n  if (shadowCoord.z > 1.0)\n  {\n    shadowCoord.z = 1.0;\n  }\n\n  float currentDepth = shadowCoord.z;\n\n  float bias = u_shadowBias;\n  float zRef = currentDepth - bias;\n\n  float sourceVal = float(zRef < unpackDepth(texture2D(u_shadowMap, shadowCoord.xy)));\n  srcShadow = sourceVal;\n\n  return srcShadow;\n  }\n\nvoid main()\n{\n  vec4 result = vec4(0.0);\n  \n  // MainLights\n  #ifdef WX_USE_MAIN_DIR_LIGHT\n        vec3 mainLightColor = u_mainLightColorIns.rgb * u_mainLightColorIns.a;\n\n      #ifdef WX_RECEIVE_SHADOW\n          float shadowScale = shadowCalculation(v_WorldPosition);\n          result = vec4(mainLightColor * shadowScale, 1.0 - shadowScale);\n      #endif\n  #endif\n\n  gl_FragData[0] = result;\n\n\n}\n`],\n}));"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/effect-removeBlack.ts",
    "content": "const xrFrameSystem = wx.getXrFrameSystem();\n\nxrFrameSystem.registerEffect('removeBlack', scene => scene.createEffect({\n  name: \"removeBlack\",\n  images: [{\n    key: 'u_videoMap',\n    default: 'white',\n    macro: 'WX_USE_VIDEOMAP'\n  }],\n  defaultRenderQueue: 2000,\n  passes: [{\n    \"renderStates\": {\n      cullOn: false,\n      blendOn: true,\n      blendSrc: xrFrameSystem.EBlendFactor.SRC_ALPHA,\n      blendDst: xrFrameSystem.EBlendFactor.ONE_MINUS_SRC_ALPHA,\n      cullFace: xrFrameSystem.ECullMode.BACK,\n    },\n    lightMode: \"ForwardBase\",\n    useMaterialRenderStates: true,\n    shaders: [0, 1]\n  }],\n  shaders: [\n`#version 100\n\nuniform highp mat4 u_view;\nuniform highp mat4 u_viewInverse;\nuniform highp mat4 u_vp;\nuniform highp mat4 u_projection;\nuniform highp mat4 u_world;\n\nattribute vec3 a_position;\nattribute highp vec2 a_texCoord;\n\nvarying highp vec2 v_UV;\n\nvoid main()\n{\n  v_UV = a_texCoord;\n  vec4 worldPosition = u_world * vec4(a_position, 1.0);\n  gl_Position = u_projection * u_view * worldPosition;\n  }`,\n`#version 100\n\nprecision mediump float;\nprecision highp int;\nvarying highp vec2 v_UV;\n\n#ifdef WX_USE_VIDEOMAP\n  uniform sampler2D u_videoMap;\n#endif\n\nvoid main()\n{\n#ifdef WX_USE_VIDEOMAP\n  vec4 baseColor = texture2D(u_videoMap, v_UV);\n#else\n  vec4 baseColor = vec4(1.0, 1.0, 1.0, 1.0);\n#endif\n  float rgbSum = baseColor.r + baseColor.g + baseColor.b;\n  // 设定阈值避免异常情况\n  if (rgbSum < 0.1) {\n    gl_FragData[0] = vec4(1.0, 1.0, 1.0, 0.0);\n  } else {\n    gl_FragData[0] = vec4(pow(baseColor.rgb, vec3(2.2)), 1.0);\n  }\n}\n`],\n}));"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/effect-shining.ts",
    "content": "import XrFrame from 'XrFrame';\nconst xrFrameSystem = wx.getXrFrameSystem();\n\nxrFrameSystem.registerEffect('shining', scene => scene.createEffect({\n  name: \"shining\",\n  properties: [\n    {\n      key: 'u_color',\n      type: xrFrameSystem.EUniformType.FLOAT4,\n      default: [1, 1, 1, 1]\n    },\n    {\n      key: 'u_range',\n      type: xrFrameSystem.EUniformType.FLOAT2,\n      default: [0.5, 1]\n    },\n    {\n      key: 'u_speed',\n      type: xrFrameSystem.EUniformType.FLOAT,\n      default: [1]\n    },\n  ],\n  images: [\n    {\n      key: 'u_reflection',\n      default: 'white',\n      macro: 'WX_USE_REFLECTION'\n    }\n  ],\n  defaultRenderQueue: 2000,\n  passes: [{\n    \"renderStates\": {\n      cullOn: false,\n      blendOn: false,\n      depthWrite: true,\n    },\n    lightMode: \"ForwardBase\",\n    useMaterialRenderStates: true,\n    shaders: [0, 1]\n  }],\n  shaders: [`#version 100\nuniform mat4 u_world;\nuniform mat4 u_view;\nuniform mat4 u_projection;\nuniform mat4 u_viewInverse;\n\nattribute vec3 a_position;\nattribute vec3 a_normal;\n\n#ifdef WX_USE_NORMAL\nvarying highp vec3 v_normal;\nvarying highp vec3 v_viewDir;\n#endif\n\nvoid main()\n{\n  vec4 worldP = u_world * vec4(a_position, 1.0);\n  #ifdef WX_USE_NORMAL\n  v_normal = normalize(mat3(u_world) * a_normal);\n  v_viewDir = normalize(worldP.xyz - u_viewInverse[3].xyz);\n  #endif\n  gl_Position = u_projection * u_view * worldP;\n}\n  `,\n    `#version 100\n#define RECIPROCAL_PI 0.3183098861837907\nprecision highp float;\nprecision highp int;\n\n#ifdef WX_USE_NORMAL\nvarying highp vec3 v_normal;\nvarying highp vec3 v_viewDir;\n#endif\n\nuniform float u_gameTime;\nuniform vec4 u_color;\nuniform vec2 u_range;\nuniform float u_speed;\nuniform sampler2D u_reflection;\n\nvec4 textureBilinearEnvMap(sampler2D texture, vec3 direction){\n  float uvX = (atan(direction.x, direction.z) ) * RECIPROCAL_PI * 0.5 + 0.5;\n  float uvY = acos(direction.y) * RECIPROCAL_PI;\n  vec2 uv = vec2(uvX, uvY);\n  vec4 envmap = texture2D(texture, uv);\n\n  return envmap;\n}\n\nvoid main()\n{\n  vec4 color;\n#if defined(WX_USE_REFLECTION) && defined(WX_USE_NORMAL)\n  vec3 reflectVec = reflect(-v_viewDir, v_normal);\n  color = textureBilinearEnvMap(u_reflection, reflectVec) * u_color;\n#else\n  color = u_color;\n#endif\n  gl_FragData[0] = (u_range.x + sin(mod(u_gameTime * u_speed, 3.14)) * (u_range.y - u_range.x)) * color;\n} \n    `],\n}));\n\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/effect-toon.js",
    "content": "import outlineVert from './toon-shader/outlineVert'\nimport outlineFrag from './toon-shader/outlineFrag'\nimport toonVert from './toon-shader/toonVert'\nimport toonFrag from './toon-shader/toonFrag'\n\nconst xrFrameSystem = wx.getXrFrameSystem()\n\nxrFrameSystem.registerEffect('toon-user', scene => scene.createEffect(\n  {\n    name: 'toon',\n    defaultRenderQueue: 2000,\n    passes: [\n      // Outline\n      {\n        renderStates: {\n          blendOn: false,\n          depthWrite: true,\n          // Default FrontFace is CW\n          cullOn: true,\n          cullFace: xrFrameSystem.ECullMode.BACK,\n        },\n        lightMode: 'ForwardBase',\n        useMaterialRenderStates: false,\n        shaders: [0, 1]\n      },\n      // ForwardBase\n      {\n        renderStates: {\n          blendOn: false,\n          depthWrite: true,\n          // Default FrontFace is CW\n          cullOn: false,\n          cullFace: xrFrameSystem.ECullMode.NONE,\n        },\n        lightMode: 'ForwardBase',\n        useMaterialRenderStates: true,\n        shaders: [2, 3]\n      },\n      {\n        renderStates: {\n          cullOn: true,\n          blendOn: false,\n          depthWrite: true,\n          cullFace: xrFrameSystem.ECullMode.FRONT,\n        },\n        lightMode: 'ShadowCaster',\n        useMaterialRenderStates: false,\n        shaders: [4, 5]\n      },\n    ],\n    properties: [\n      { key: 'u_baseColorFactor', type: xrFrameSystem.EUniformType.FLOAT4, default: [1, 1, 1, 1] },\n      { key: 'u_outlineColor', type: xrFrameSystem.EUniformType.FLOAT4, default: [0.0, 0.0, 0.0, 0.0] },\n      // { key: 'u_outlineWidth', type: xrFrameSystem.EUniformType.FLOAT, default: [0.3]},\n      { key: 'u_outlineWidth', type: xrFrameSystem.EUniformType.FLOAT, default: [1.0] },\n      { key: 'u_farthestDistance', type: xrFrameSystem.EUniformType.FLOAT, default: [100] },\n      { key: 'u_nearestDistance', type: xrFrameSystem.EUniformType.FLOAT, default: [0.5] },\n      { key: 'u_offsetZ', type: xrFrameSystem.EUniformType.FLOAT, default: [2.0] }\n    ],\n    images: [\n      { key: 'u_baseColorMap', default: 'white', macro: 'WX_USE_BASECOLORMAP' },\n      { key: 'u_gradientMap', default: 'white' }\n    ],\n    shaders: [\n      // === Outline ===\n      // Vertex Shader Outline\n      outlineVert,\n      // Fragment Shader Outline\n      outlineFrag,\n      // === Toon ===\n      // Vertex Shader Toon\n      toonVert,\n      // Fragment Shader Toon\n      toonFrag,\n      `#version 100\n  uniform highp mat4 u_world;\n  uniform highp mat4 u_lightSpaceMatrix;\n\n  \n  attribute vec3 a_position;\n  attribute highp vec2 a_texCoord;\n  varying highp vec2 v_uv;\n  varying highp float v_z;\n  \n  void main()\n  {\n      v_uv = a_texCoord;\n\n      vec4 worldPosition = u_world * vec4(a_position, 1.0);\n      vec4 lightPos = u_lightSpaceMatrix * worldPosition;\n      v_z = lightPos.z / lightPos.w;\n      v_z = lightPos.z / lightPos.w;\n\n      gl_Position = lightPos;\n  }`,\n      `#version 100\n  precision mediump float;\n  precision highp int;\n  varying highp vec2 v_uv;\n  varying highp float v_z;\n  \n  uniform highp vec4 u_baseColorFactor;\n  uniform sampler2D u_baseColorMap;\n\n  vec4 packDepth(float depth)\n  {\n    vec4 bitShift = vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);\n    vec4 bitMask = vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);\n    vec4 res = mod(\n      depth * bitShift * vec4(255.0, 255.0, 255.0, 255.0),\n      vec4(256.0, 256.0, 256.0, 256.0)) / vec4(255.0, 255.0, 255.0, 255.0);\n    res -= res.xxyz * bitMask;\n    return res;\n  }\n\n  void main()\n  {\n\n    gl_FragData[0] = packDepth(v_z * 0.5 + 0.5);\n\n    // gl_FragData[0] = vec4(v_z * 0.5 + 0.5, 0.0, 0.0, 1.0);\n\n  }  \n    `\n    ]\n  }\n))\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/geometry-specialCylinder.js",
    "content": "const vBufferSpecialCylinder = new Float32Array([-5.678913339579594e-9, -0.10497161746025085, -1, -0.08775380253791809, 0.44548818469047546, -0.8909766674041748, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -5.678913339579594e-9, -0.10497161746025085, -1, 0.08775380253791809, 0.44548821449279785, -0.8909766674041748, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.19509032368659973, -0.10497161746025085, -0.9807852506637573, 0.08775380253791809, 0.44548821449279785, -0.8909766674041748, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.19509032368659973, -0.10497161746025085, -0.9807852506637573, 0.25988829135894775, 0.44548869132995605, -0.8567367792129517, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.3826834261417389, -0.10497161746025085, -0.9238795042037964, 0.25988829135894775, 0.44548869132995605, -0.8567367792129517, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.3826834261417389, -0.10497161746025085, -0.9238795042037964, 0.42203545570373535, 0.44548848271369934, -0.7895733714103699, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.5555702447891235, -0.10497161746025085, -0.8314695954322815, 0.42203545570373535, 0.44548848271369934, -0.7895733714103699, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.5555702447891235, -0.10497161746025085, -0.8314695954322815, 0.5679646134376526, 0.44548842310905457, -0.6920666098594666, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.7071067690849304, -0.10497161746025085, -0.7071067690849304, 0.5679646134376526, 0.44548842310905457, -0.6920666098594666, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.7071067690849304, -0.10497161746025085, -0.7071067690849304, 0.6920667886734009, 0.4454883933067322, -0.5679644346237183, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.8314695954322815, -0.10497161746025085, -0.5555702447891235, 0.6920667886734009, 0.4454883933067322, -0.5679644346237183, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.8314695954322815, -0.10497161746025085, -0.5555702447891235, 0.7895731925964355, 0.4454883635044098, -0.42203593254089355, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.9238795042037964, -0.10497161746025085, -0.3826834261417389, 0.7895731925964355, 0.4454883635044098, -0.42203593254089355, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.9238795042037964, -0.10497161746025085, -0.3826834261417389, 0.856736958026886, 0.4454883933067322, -0.2598881423473358, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.9807852506637573, -0.10497161746025085, -0.19509030878543854, 0.856736958026886, 0.4454883933067322, -0.2598881423473358, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.9807852506637573, -0.10497161746025085, -0.19509030878543854, 0.8909766674041748, 0.4454883337020874, -0.0877537727355957, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 1, -0.10497161746025085, 1.955777406692505e-8, 0.8909766674041748, 0.4454883337020874, -0.0877537727355957, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 1, -0.10497161746025085, 1.955777406692505e-8, 0.8909766674041748, 0.4454883337020874, 0.0877537727355957, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.9807852506637573, -0.10497161746025085, 0.19509033858776093, 0.856736958026886, 0.44548842310905457, 0.2598881423473358, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.9807852506637573, -0.10497161746025085, 0.19509033858776093, 0.8909766674041748, 0.4454883337020874, 0.0877537727355957, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.9238795042037964, -0.10497161746025085, 0.38268348574638367, 0.7895732522010803, 0.44548821449279785, 0.4220360517501831, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.9238795042037964, -0.10497161746025085, 0.38268348574638367, 0.856736958026886, 0.44548842310905457, 0.2598881423473358, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.8314695954322815, -0.10497161746025085, 0.5555702447891235, 0.6920667886734009, 0.4454882740974426, 0.5679645538330078, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.8314695954322815, -0.10497161746025085, 0.5555702447891235, 0.7895732522010803, 0.44548821449279785, 0.4220360517501831, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.7071067690849304, -0.10497161746025085, 0.7071067690849304, 0.5679647326469421, 0.4454883635044098, 0.6920666694641113, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.7071067690849304, -0.10497161746025085, 0.7071067690849304, 0.6920667886734009, 0.4454882740974426, 0.5679645538330078, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.5555702447891235, -0.10497161746025085, 0.8314695954322815, 0.4220355749130249, 0.4454882740974426, 0.7895734310150146, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.5555702447891235, -0.10497161746025085, 0.8314695954322815, 0.5679647326469421, 0.4454883635044098, 0.6920666694641113, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.3826834261417389, -0.10497161746025085, 0.9238795042037964, 0.25988829135894775, 0.44548851251602173, 0.8567368388175964, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.3826834261417389, -0.10497161746025085, 0.9238795042037964, 0.4220355749130249, 0.4454882740974426, 0.7895734310150146, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, 0.19509032368659973, -0.10497161746025085, 0.9807852506637573, 0.08775380253791809, 0.44548818469047546, 0.8909766674041748, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, 0.19509032368659973, -0.10497161746025085, 0.9807852506637573, 0.25988829135894775, 0.44548851251602173, 0.8567368388175964, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -5.678913339579594e-9, -0.10497161746025085, 1, -0.08775380253791809, 0.44548821449279785, 0.8909766674041748, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -5.678913339579594e-9, -0.10497161746025085, 1, 0.08775380253791809, 0.44548818469047546, 0.8909766674041748, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.19509032368659973, -0.10497161746025085, 0.9807852506637573, -0.25988826155662537, 0.445488303899765, 0.8567370772361755, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.19509032368659973, -0.10497161746025085, 0.9807852506637573, -0.08775380253791809, 0.44548821449279785, 0.8909766674041748, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.38268348574638367, -0.10497161746025085, 0.9238795042037964, -0.4220356345176697, 0.44548842310905457, 0.7895733118057251, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.38268348574638367, -0.10497161746025085, 0.9238795042037964, -0.25988826155662537, 0.445488303899765, 0.8567370772361755, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.5555702447891235, -0.10497161746025085, 0.8314695954322815, -0.5679647326469421, 0.4454881548881531, 0.6920667290687561, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.5555702447891235, -0.10497161746025085, 0.8314695954322815, -0.4220356345176697, 0.44548842310905457, 0.7895733118057251, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.7071067690849304, -0.10497161746025085, 0.7071067690849304, -0.6920667290687561, 0.44548842310905457, 0.567964494228363, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.7071067690849304, -0.10497161746025085, 0.7071067690849304, -0.5679647326469421, 0.4454881548881531, 0.6920667290687561, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.8314695954322815, -0.10497161746025085, 0.5555702447891235, -0.7895732522010803, 0.44548821449279785, 0.4220360517501831, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.8314695954322815, -0.10497161746025085, 0.5555702447891235, -0.6920667290687561, 0.44548842310905457, 0.567964494228363, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.9238795042037964, -0.10497161746025085, 0.38268348574638367, -0.856736958026886, 0.4454883933067322, 0.2598881125450134, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.9238795042037964, -0.10497161746025085, 0.38268348574638367, -0.7895732522010803, 0.44548821449279785, 0.4220360517501831, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.9807852506637573, -0.10497161746025085, 0.19509033858776093, -0.8909767866134644, 0.44548824429512024, 0.08775343745946884, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.9807852506637573, -0.10497161746025085, 0.19509033858776093, -0.856736958026886, 0.4454883933067322, 0.2598881125450134, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.9999999403953552, -0.10497161746025085, 1.955777406692505e-8, -0.8909767866134644, 0.44548824429512024, -0.08775343745946884, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.9999999403953552, -0.10497161746025085, 1.955777406692505e-8, -0.8909767866134644, 0.44548824429512024, 0.08775343745946884, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.9807852506637573, -0.10497161746025085, -0.19509030878543854, -0.8909767866134644, 0.44548824429512024, -0.08775343745946884, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.9807852506637573, -0.10497161746025085, -0.19509030878543854, -0.856736958026886, 0.4454883933067322, -0.2598881721496582, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.9238795042037964, -0.10497161746025085, -0.3826834261417389, -0.856736958026886, 0.4454883933067322, -0.2598881721496582, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.9238795042037964, -0.10497161746025085, -0.3826834261417389, -0.7895731925964355, 0.4454882740974426, -0.42203593254089355, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.8314695954322815, -0.10497161746025085, -0.5555702447891235, -0.7895731925964355, 0.4454882740974426, -0.42203593254089355, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.8314695954322815, -0.10497161746025085, -0.5555702447891235, -0.6920668482780457, 0.44548824429512024, -0.567964494228363, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.7071067690849304, -0.10497161746025085, -0.7071067690849304, -0.6920668482780457, 0.44548824429512024, -0.567964494228363, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.7071067690849304, -0.10497161746025085, -0.7071067690849304, -0.5679647326469421, 0.4454882740974426, -0.6920666694641113, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.5555702447891235, -0.10497161746025085, -0.8314695954322815, -0.5679647326469421, 0.4454882740974426, -0.6920666694641113, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.5555702447891235, -0.10497161746025085, -0.8314695954322815, -0.42203566431999207, 0.44548851251602173, -0.7895731925964355, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.38268348574638367, -0.10497161746025085, -0.9238795042037964, -0.42203566431999207, 0.44548851251602173, -0.7895731925964355, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.38268348574638367, -0.10497161746025085, -0.9238795042037964, -0.259888231754303, 0.4454883933067322, -0.856736958026886, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -0.19509032368659973, -0.10497161746025085, -0.9807852506637573, -0.259888231754303, 0.4454883933067322, -0.856736958026886, 1.0009496212005615, 0.0009514093399047852, 0, 0, 0, 0, -0.19509032368659973, -0.10497161746025085, -0.9807852506637573, -0.08775380253791809, 0.44548818469047546, -0.8909766674041748, 0.0009514391422271729, -0.0009496212005615234, 0, 0, 0, 0, -5.678913339579594e-9, 0.10497245192527771, -0.8950279951095581, -0.08775380253791809, 0.44548818469047546, -0.8909766674041748, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -5.678913339579594e-9, 0.10497245192527771, -0.8950279951095581, 0.08775380253791809, 0.44548821449279785, -0.8909766674041748, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.17461130023002625, 0.10497245192527771, -0.8778302073478699, 0.08775380253791809, 0.44548821449279785, -0.8909766674041748, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.17461130023002625, 0.10497245192527771, -0.8778302073478699, 0.25988829135894775, 0.44548869132995605, -0.8567367792129517, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.3425123393535614, 0.10497245192527771, -0.8268979787826538, 0.25988829135894775, 0.44548869132995605, -0.8567367792129517, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.3425123393535614, 0.10497245192527771, -0.8268979787826538, 0.42203545570373535, 0.44548848271369934, -0.7895733714103699, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.49725088477134705, 0.10497245192527771, -0.7441885471343994, 0.42203545570373535, 0.44548848271369934, -0.7895733714103699, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.49725088477134705, 0.10497245192527771, -0.7441885471343994, 0.5679646134376526, 0.44548842310905457, -0.6920666098594666, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.6328803300857544, 0.10497245192527771, -0.6328803300857544, 0.5679646134376526, 0.44548842310905457, -0.6920666098594666, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.6328803300857544, 0.10497245192527771, -0.6328803300857544, 0.6920667886734009, 0.4454883933067322, -0.5679644346237183, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.7441885471343994, 0.10497245192527771, -0.49725088477134705, 0.6920667886734009, 0.4454883933067322, -0.5679644346237183, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.7441885471343994, 0.10497245192527771, -0.49725088477134705, 0.7895731925964355, 0.4454883635044098, -0.42203593254089355, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.8268979787826538, 0.10497245192527771, -0.3425123393535614, 0.7895731925964355, 0.4454883635044098, -0.42203593254089355, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.8268979787826538, 0.10497245192527771, -0.3425123393535614, 0.856736958026886, 0.4454883933067322, -0.2598881423473358, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.8778302073478699, 0.10497245192527771, -0.17461128532886505, 0.856736958026886, 0.4454883933067322, -0.2598881423473358, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.8778302073478699, 0.10497245192527771, -0.17461128532886505, 0.8909766674041748, 0.4454883337020874, -0.0877537727355957, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.8950279951095581, 0.10497245192527771, 1.955777406692505e-8, 0.8909766674041748, 0.4454883337020874, -0.0877537727355957, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.8950279951095581, 0.10497245192527771, 1.955777406692505e-8, 0.8909766674041748, 0.4454883337020874, 0.0877537727355957, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.8778302073478699, 0.10497245192527771, 0.17461131513118744, 0.856736958026886, 0.44548842310905457, 0.2598881423473358, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.8778302073478699, 0.10497245192527771, 0.17461131513118744, 0.8909766674041748, 0.4454883337020874, 0.0877537727355957, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.8268979787826538, 0.10497245192527771, 0.3425123989582062, 0.7895732522010803, 0.44548821449279785, 0.4220360517501831, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.8268979787826538, 0.10497245192527771, 0.3425123989582062, 0.856736958026886, 0.44548842310905457, 0.2598881423473358, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.7441885471343994, 0.10497245192527771, 0.4972509443759918, 0.6920667886734009, 0.4454882740974426, 0.5679645538330078, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.7441885471343994, 0.10497245192527771, 0.4972509443759918, 0.7895732522010803, 0.44548821449279785, 0.4220360517501831, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.6328803300857544, 0.10497245192527771, 0.6328803300857544, 0.5679647326469421, 0.4454883635044098, 0.6920666694641113, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.6328803300857544, 0.10497245192527771, 0.6328803300857544, 0.6920667886734009, 0.4454882740974426, 0.5679645538330078, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.49725088477134705, 0.10497245192527771, 0.7441885471343994, 0.4220355749130249, 0.4454882740974426, 0.7895734310150146, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.49725088477134705, 0.10497245192527771, 0.7441885471343994, 0.5679647326469421, 0.4454883635044098, 0.6920666694641113, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.3425123393535614, 0.10497245192527771, 0.8268979787826538, 0.25988829135894775, 0.44548851251602173, 0.8567368388175964, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.3425123393535614, 0.10497245192527771, 0.8268979787826538, 0.4220355749130249, 0.4454882740974426, 0.7895734310150146, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, 0.17461130023002625, 0.10497245192527771, 0.8778302073478699, 0.08775380253791809, 0.44548818469047546, 0.8909766674041748, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, 0.17461130023002625, 0.10497245192527771, 0.8778302073478699, 0.25988829135894775, 0.44548851251602173, 0.8567368388175964, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -5.678913339579594e-9, 0.10497245192527771, 0.8950279951095581, -0.08775380253791809, 0.44548821449279785, 0.8909766674041748, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -5.678913339579594e-9, 0.10497245192527771, 0.8950279951095581, 0.08775380253791809, 0.44548818469047546, 0.8909766674041748, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.17461130023002625, 0.10497245192527771, 0.8778302073478699, -0.25988826155662537, 0.445488303899765, 0.8567370772361755, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.17461130023002625, 0.10497245192527771, 0.8778302073478699, -0.08775380253791809, 0.44548821449279785, 0.8909766674041748, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.3425123989582062, 0.10497245192527771, 0.8268979787826538, -0.4220356345176697, 0.44548842310905457, 0.7895733118057251, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.3425123989582062, 0.10497245192527771, 0.8268979787826538, -0.25988826155662537, 0.445488303899765, 0.8567370772361755, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.4972509443759918, 0.10497245192527771, 0.7441885471343994, -0.5679647326469421, 0.4454881548881531, 0.6920667290687561, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.4972509443759918, 0.10497245192527771, 0.7441885471343994, -0.4220356345176697, 0.44548842310905457, 0.7895733118057251, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.6328803300857544, 0.10497245192527771, 0.6328803300857544, -0.6920667290687561, 0.44548842310905457, 0.567964494228363, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.6328803300857544, 0.10497245192527771, 0.6328803300857544, -0.5679647326469421, 0.4454881548881531, 0.6920667290687561, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.7441885471343994, 0.10497245192527771, 0.4972509443759918, -0.7895732522010803, 0.44548821449279785, 0.4220360517501831, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.7441885471343994, 0.10497245192527771, 0.4972509443759918, -0.6920667290687561, 0.44548842310905457, 0.567964494228363, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.8268979787826538, 0.10497245192527771, 0.3425123989582062, -0.856736958026886, 0.4454883933067322, 0.2598881125450134, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.8268979787826538, 0.10497245192527771, 0.3425123989582062, -0.7895732522010803, 0.44548821449279785, 0.4220360517501831, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.8778302073478699, 0.10497245192527771, 0.17461131513118744, -0.8909767866134644, 0.44548824429512024, 0.08775343745946884, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.8778302073478699, 0.10497245192527771, 0.17461131513118744, -0.856736958026886, 0.4454883933067322, 0.2598881125450134, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.8950279951095581, 0.10497245192527771, 1.955777406692505e-8, -0.8909767866134644, 0.44548824429512024, -0.08775343745946884, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.8950279951095581, 0.10497245192527771, 1.955777406692505e-8, -0.8909767866134644, 0.44548824429512024, 0.08775343745946884, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.8778302073478699, 0.10497245192527771, -0.17461128532886505, -0.8909767866134644, 0.44548824429512024, -0.08775343745946884, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.8778302073478699, 0.10497245192527771, -0.17461128532886505, -0.856736958026886, 0.4454883933067322, -0.2598881721496582, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.8268979787826538, 0.10497245192527771, -0.3425123393535614, -0.856736958026886, 0.4454883933067322, -0.2598881721496582, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.8268979787826538, 0.10497245192527771, -0.3425123393535614, -0.7895731925964355, 0.4454882740974426, -0.42203593254089355, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.7441885471343994, 0.10497245192527771, -0.49725088477134705, -0.7895731925964355, 0.4454882740974426, -0.42203593254089355, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.7441885471343994, 0.10497245192527771, -0.49725088477134705, -0.6920668482780457, 0.44548824429512024, -0.567964494228363, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.6328803300857544, 0.10497245192527771, -0.6328803300857544, -0.6920668482780457, 0.44548824429512024, -0.567964494228363, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.6328803300857544, 0.10497245192527771, -0.6328803300857544, -0.5679647326469421, 0.4454882740974426, -0.6920666694641113, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.4972509443759918, 0.10497245192527771, -0.7441885471343994, -0.5679647326469421, 0.4454882740974426, -0.6920666694641113, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.4972509443759918, 0.10497245192527771, -0.7441885471343994, -0.42203566431999207, 0.44548851251602173, -0.7895731925964355, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.3425123989582062, 0.10497245192527771, -0.8268979787826538, -0.42203566431999207, 0.44548851251602173, -0.7895731925964355, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.3425123989582062, 0.10497245192527771, -0.8268979787826538, -0.259888231754303, 0.4454883933067322, -0.856736958026886, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0, -0.17461130023002625, 0.10497245192527771, -0.8778302073478699, -0.259888231754303, 0.4454883933067322, -0.856736958026886, 0.9990485906600952, 1.0009496212005615, 0, 0, 0, 0, -0.17461130023002625, 0.10497245192527771, -0.8778302073478699, -0.08775380253791809, 0.44548818469047546, -0.8909766674041748, -0.0009496510028839111, 0.9990485906600952, 0, 0, 0, 0])\nconst iBufferSpecialCylinder = new Uint16Array([63, 127, 64, 63, 64, 0, 61, 125, 126, 61, 126, 62, 59, 123, 124, 59, 124, 60, 57, 121, 122, 57, 122, 58, 55, 119, 120, 55, 120, 56, 53, 117, 118, 53, 118, 54, 51, 115, 116, 51, 116, 52, 48, 112, 114, 48, 114, 50, 46, 110, 113, 46, 113, 49, 44, 108, 111, 44, 111, 47, 42, 106, 109, 42, 109, 45, 40, 104, 107, 40, 107, 43, 38, 102, 105, 38, 105, 41, 36, 100, 103, 36, 103, 39, 34, 98, 101, 34, 101, 37, 32, 96, 99, 32, 99, 35, 30, 94, 97, 30, 97, 33, 28, 92, 95, 28, 95, 31, 26, 90, 93, 26, 93, 29, 24, 88, 91, 24, 91, 27, 22, 86, 89, 22, 89, 25, 20, 84, 87, 20, 87, 23, 18, 82, 85, 18, 85, 21, 17, 81, 83, 17, 83, 19, 15, 79, 80, 15, 80, 16, 13, 77, 78, 13, 78, 14, 11, 75, 76, 11, 76, 12, 9, 73, 74, 9, 74, 10, 7, 71, 72, 7, 72, 8, 5, 69, 70, 5, 70, 6, 3, 67, 68, 3, 68, 4, 1, 65, 66, 1, 66, 2])\n\nconst xrFrameSystem = wx.getXrFrameSystem()\nconst boundCenter = xrFrameSystem.Vector3.createFromNumber(0, 0, 0)\nconst boundSize = xrFrameSystem.Vector3.createFromNumber(1, 1, 1)\nconst defaultSubMeshLength = iBufferSpecialCylinder.length\n\nxrFrameSystem.registerGeometry('specialCylinderCustom', scene => {\n  const geo = scene.createGeometry(getSpecialVertexLayout(scene), vBufferSpecialCylinder, iBufferSpecialCylinder)\n\n  geo.setBoundBox(boundCenter, boundSize)\n  geo.addSubMesh(defaultSubMeshLength, 0, 0)\n\n  return geo\n})\n\nconst defaultAttributes = [\n  {\n    name: 'a_normal',\n    format: 2,\n    offset: 12,\n    usage: 2\n  },\n  {\n    name: 'a_position',\n    format: 2,\n    offset: 0,\n    usage: 1\n  },\n  {\n    name: 'a_tangent',\n    format: 3,\n    offset: 40,\n    usage: 3\n  },\n  {\n    name: 'a_texCoord',\n    format: 1,\n    offset: 24,\n    usage: 4\n  }\n]\nconst defaultStride = 48\n\nfunction getSpecialVertexLayout(scene) {\n  return scene.createVertexLayout({\n    attributes: defaultAttributes,\n    stride: defaultStride\n  })\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/geometry-star.ts",
    "content": "import XrFrame from 'XrFrame';\nconst xrFrameSystem = wx.getXrFrameSystem();\n\nxrFrameSystem.registerGeometry('star', scene => {\n  const vl = scene.createVertexLayout({\n    attributes: [\n      {\n        name: \"a_position\",\n        format: xrFrameSystem.EVertexFormat.FLOAT3,\n        offset: 0,\n        usage: xrFrameSystem.EVertexLayoutUsage.POSITION\n      },\n      {\n        name: \"a_normal\",\n        format: xrFrameSystem.EVertexFormat.FLOAT3,\n        offset: 12,\n        usage: xrFrameSystem.EVertexLayoutUsage.NORMAL\n      }\n    ],\n    stride: 24\n  });\n\n  const vb = new Float32Array([0.0010823551565408707,3.630120509745538e-12,0.0013188635930418968,0.27796244621276855,0.8805698752403259,0.3838407099246979,0.00009323284029960632,2.8082874567458838e-12,0.0020351484417915344,0.27796244621276855,0.8805698752403259,0.3838407099246979,0.24488118290901184,-0.1113351583480835,0.08018352836370468,0.27796244621276855,0.8805698752403259,0.3838407099246979,0.6436620354652405,-0.1113351583480835,-0.20859801769256592,0.27796244621276855,0.8805698752403259,0.3838407099246979,-0.0005219941376708448,2.297113887994584e-12,0.002493109554052353,0.27153608202934265,0.8849542140960693,0.3783177137374878,-0.0015015341341495514,1.4832429989092288e-12,0.0031961705535650253,0.27153608202934265,0.8849542140960693,0.3783177137374878,-0.3980743885040283,-0.1113351583480835,0.5482680201530457,0.27153608202934265,0.8849542140960693,0.3783177137374878,-0.0031573032028973103,-0.1113351583480835,0.26481786370277405,0.27153608202934265,0.8849542140960693,0.3783177137374878,-0.0021115075796842575,9.764139366832958e-13,0.0013188640587031841,0.002885879948735237,0.8797516226768494,-0.47542497515678406,-0.000895695760846138,1.9866035899651635e-12,0.0013262443244457245,0.002885879948735237,0.8797516226768494,-0.47542497515678406,-0.1538211703300476,-0.1113351583480835,-0.20562252402305603,0.002885879948735237,0.8797516226768494,-0.47542497515678406,-0.6439951062202454,-0.1113351583480835,-0.20859791338443756,0.002885879948735237,0.8797516226768494,-0.47542497515678406,-0.00013963831588625908,2.6147942318310857e-12,0.001320062205195427,-0.0004604102286975831,0.8828508257865906,-0.4696534276008606,0.0010823551565408707,3.630120509745538e-12,0.0013188635930418968,-0.0004604102286975831,0.8828508257865906,-0.4696534276008606,0.6436620354652405,-0.1113351583480835,-0.20859801769256592,-0.0004604102286975831,0.8828508257865906,-0.4696534276008606,0.15099558234214783,-0.1113351583480835,-0.20811505615711212,-0.0004604102286975831,0.8828508257865906,-0.4696534276008606,0.00047238264232873917,3.1233242988454313e-12,0.003196168690919876,-0.2647762894630432,0.8886240720748901,0.3744874894618988,-0.0005219941376708448,2.297113887994584e-12,0.002493109554052353,-0.2647762894630432,0.8886240720748901,0.3744874894618988,-0.0031573032028973103,-0.1113351583480835,0.26481786370277405,-0.2647762894630432,0.8886240720748901,0.3744874894618988,0.39774152636528015,-0.1113351583480835,0.5482679009437561,-0.2647762894630432,0.8886240720748901,0.3744874894618988,-0.0011174380779266357,1.8023693431831744e-12,0.002045039553195238,-0.27720320224761963,0.8827025294303894,0.3794664740562439,-0.0021115075796842575,9.764139366832958e-13,0.0013188640587031841,-0.27720320224761963,0.8827025294303894,0.3794664740562439,-0.6439951062202454,-0.1113351583480835,-0.20859791338443756,-0.27720320224761963,0.8827025294303894,0.3794664740562439,-0.24322021007537842,-0.1113351583480835,0.08417129516601562,-0.27720320224761963,0.8827025294303894,0.3794664740562439,-0.0005145758623257279,2.303252640695197e-12,0.00015862658619880676,0.4488120377063751,0.8818025588989258,-0.1448865383863449,-0.00013963831588625908,2.6147942318310857e-12,0.001320062205195427,0.4488120377063751,0.8818025588989258,-0.1448865383863449,0.15099558234214783,-0.1113351583480835,-0.20811505615711212,0.4488120377063751,0.8818025588989258,-0.1448865383863449,-0.00016650545876473188,-0.1113351583480835,-0.6763667464256287,0.4488120377063751,0.8818025588989258,-0.1448865383863449,0.00009323284029960632,2.8082874567458838e-12,0.0020351484417915344,0.447871595621109,0.8820540308952332,-0.14625956118106842,0.00047238264232873917,3.1233242988454313e-12,0.003196168690919876,0.447871595621109,0.8820540308952332,-0.14625956118106842,0.39774152636528015,-0.1113351583480835,0.5482679009437561,0.447871595621109,0.8820540308952332,-0.14625956118106842,0.24488118290901184,-0.1113351583480835,0.08018352836370468,0.447871595621109,0.8820540308952332,-0.14625956118106842,-0.0015015341341495514,1.4832429989092288e-12,0.0031961705535650253,-0.4550110101699829,0.8774480223655701,-0.1518225520849228,-0.0011174380779266357,1.8023693431831744e-12,0.002045039553195238,-0.4550110101699829,0.8774480223655701,-0.1518225520849228,-0.24322021007537842,-0.1113351583480835,0.08417129516601562,-0.4550110101699829,0.8774480223655701,-0.1518225520849228,-0.3980743885040283,-0.1113351583480835,0.5482680201530457,-0.4550110101699829,0.8774480223655701,-0.1518225520849228,-0.000895695760846138,1.9866035899651635e-12,0.0013262443244457245,-0.4459637701511383,0.8831347227096558,-0.14556612074375153,-0.0005145758623257279,2.303252640695197e-12,0.00015862658619880676,-0.4459637701511383,0.8831347227096558,-0.14556612074375153,-0.00016650545876473188,-0.1113351583480835,-0.6763667464256287,-0.4459637701511383,0.8831347227096558,-0.14556612074375153,-0.1538211703300476,-0.1113351583480835,-0.20562252402305603,-0.4459637701511383,0.8831347227096558,-0.14556612074375153,-0.000895695760846138,1.9866035899651635e-12,0.0013262443244457245,-8.308768117970544e-10,1,-9.243900946347833e-15,-0.0021115075796842575,9.764139366832958e-13,0.0013188640587031841,-8.308768117970544e-10,1,-9.243900946347833e-15,-0.0011174380779266357,1.8023693431831744e-12,0.002045039553195238,-8.308768117970544e-10,1,-9.243900946347833e-15,-0.0015015341341495514,1.4832429989092288e-12,0.0031961705535650253,-8.308768117970544e-10,1,-9.243900946347833e-15,-0.0005219941376708448,2.297113887994584e-12,0.002493109554052353,-8.308768117970544e-10,1,-9.243900946347833e-15,0.00047238264232873917,3.1233242988454313e-12,0.003196168690919876,-8.308768117970544e-10,1,-9.243900946347833e-15,0.00009323284029960632,2.8082874567458838e-12,0.0020351484417915344,-8.308768117970544e-10,1,-9.243900946347833e-15,0.0010823551565408707,3.630120509745538e-12,0.0013188635930418968,-8.308768117970544e-10,1,-9.243900946347833e-15,-0.00013963831588625908,2.6147942318310857e-12,0.001320062205195427,-8.308768117970544e-10,1,-9.243900946347833e-15,-0.0005145758623257279,2.303252640695197e-12,0.00015862658619880676,-8.308768117970544e-10,1,-9.243900946347833e-15,0.0011354610323905945,4.1467661304750436e-8,0.0013015158474445343,0.27798038721084595,0.8805534839630127,0.38386544585227966,0.00011346209794282913,4.1467661304750436e-8,0.0020416071638464928,0.27798038721084595,0.8805534839630127,0.38386544585227966,0.24488118290901184,-0.1113351583480835,0.08018352836370468,0.27798038721084595,0.8805534839630127,0.38386544585227966,0.6436620354652405,-0.1113351583480835,-0.20859801769256592,0.27798038721084595,0.8805534839630127,0.38386544585227966,-0.0005222122417762876,4.1467661304750436e-8,0.002514788880944252,0.27155372500419617,0.8849382996559143,0.3783423602581024,-0.0015343083068728447,4.1467661304750436e-8,0.003241216763854027,0.27155372500419617,0.8849382996559143,0.3783423602581024,-0.3980743885040283,-0.1113351583480835,0.5482680201530457,0.27155372500419617,0.8849382996559143,0.3783423602581024,-0.0031573032028973103,-0.1113351583480835,0.26481786370277405,0.27155372500419617,0.8849382996559143,0.3783423602581024,-0.002164555713534355,4.1467661304750436e-8,0.0013015158474445343,0.0028860531747341156,0.8797350525856018,-0.47545552253723145,-0.0009083347395062447,4.1467661304750436e-8,0.0013091415166854858,0.0028860531747341156,0.8797350525856018,-0.47545552253723145,-0.1538211703300476,-0.1113351583480835,-0.20562252402305603,0.0028860531747341156,0.8797350525856018,-0.47545552253723145,-0.6439951062202454,-0.1113351583480835,-0.20859791338443756,0.0028860531747341156,0.8797350525856018,-0.47545552253723145,-0.0001271483488380909,4.1467661304750436e-8,0.0013027535751461983,-0.0004604338319040835,0.8828346729278564,-0.46968385577201843,0.0011354610323905945,4.1467661304750436e-8,0.0013015158474445343,-0.0004604338319040835,0.8828346729278564,-0.46968385577201843,0.6436620354652405,-0.1113351583480835,-0.20859801769256592,-0.0004604338319040835,0.8828346729278564,-0.46968385577201843,0.15099558234214783,-0.1113351583480835,-0.20811505615711212,-0.0004604338319040835,0.8828346729278564,-0.46968385577201843,0.000505213625729084,4.1467661304750436e-8,0.003241216763854027,-0.26479363441467285,0.8886085748672485,0.3745120167732239,-0.0005222122417762876,4.1467661304750436e-8,0.002514788880944252,-0.26479363441467285,0.8886085748672485,0.3745120167732239,-0.0031573032028973103,-0.1113351583480835,0.26481786370277405,-0.26479363441467285,0.8886085748672485,0.3745120167732239,0.39774152636528015,-0.1113351583480835,0.5482679009437561,-0.26479363441467285,0.8886085748672485,0.3745120167732239,-0.0011374466121196747,4.1467661304750436e-8,0.0020518270321190357,-0.277221143245697,0.8826862573623657,0.3794909715652466,-0.002164555713534355,4.1467661304750436e-8,0.0013015158474445343,-0.277221143245697,0.8826862573623657,0.3794909715652466,-0.6439951062202454,-0.1113351583480835,-0.20859791338443756,-0.277221143245697,0.8826862573623657,0.3794909715652466,-0.24322021007537842,-0.1113351583480835,0.08417129516601562,-0.277221143245697,0.8826862573623657,0.3794909715652466,-0.0005145473987795413,4.1467661304750436e-8,0.00010271556675434113,0.44884100556373596,0.8817862868309021,-0.14489588141441345,-0.0001271483488380909,4.1467661304750436e-8,0.0013027535751461983,0.44884100556373596,0.8817862868309021,-0.14489588141441345,0.15099558234214783,-0.1113351583480835,-0.20811505615711212,0.44884100556373596,0.8817862868309021,-0.14489588141441345,-0.00016650545876473188,-0.1113351583480835,-0.6763667464256287,0.44884100556373596,0.8817862868309021,-0.14489588141441345,0.00011346209794282913,4.1467661304750436e-8,0.0020416071638464928,0.4479005038738251,0.8820376992225647,-0.14626897871494293,0.000505213625729084,4.1467661304750436e-8,0.003241216763854027,0.4479005038738251,0.8820376992225647,-0.14626897871494293,0.39774152636528015,-0.1113351583480835,0.5482679009437561,0.4479005038738251,0.8820376992225647,-0.14626897871494293,0.24488118290901184,-0.1113351583480835,0.08018352836370468,0.4479005038738251,0.8820376992225647,-0.14626897871494293,-0.0015343083068728447,4.1467661304750436e-8,0.003241216763854027,-0.4550401568412781,0.8774312734603882,-0.15183229744434357,-0.0011374466121196747,4.1467661304750436e-8,0.0020518270321190357,-0.4550401568412781,0.8774312734603882,-0.15183229744434357,-0.24322021007537842,-0.1113351583480835,0.08417129516601562,-0.4550401568412781,0.8774312734603882,-0.15183229744434357,-0.3980743885040283,-0.1113351583480835,0.5482680201530457,-0.4550401568412781,0.8774312734603882,-0.15183229744434357,-0.0009083347395062447,4.1467661304750436e-8,0.0013091415166854858,-0.4459926187992096,0.8831185698509216,-0.14557553827762604,-0.0005145473987795413,4.1467661304750436e-8,0.00010271556675434113,-0.4459926187992096,0.8831185698509216,-0.14557553827762604,-0.00016650545876473188,-0.1113351583480835,-0.6763667464256287,-0.4459926187992096,0.8831185698509216,-0.14557553827762604,-0.1538211703300476,-0.1113351583480835,-0.20562252402305603,-0.4459926187992096,0.8831185698509216,-0.14557553827762604,-0.0009083347395062447,4.1467661304750436e-8,0.0013091415166854858,3.0784483035645183e-12,1,0,-0.002164555713534355,4.1467661304750436e-8,0.0013015158474445343,3.0784483035645183e-12,1,0,-0.0011374466121196747,4.1467661304750436e-8,0.0020518270321190357,3.0784483035645183e-12,1,0,-0.0015343083068728447,4.1467661304750436e-8,0.003241216763854027,3.0784483035645183e-12,1,0,-0.0005222122417762876,4.1467661304750436e-8,0.002514788880944252,3.0784483035645183e-12,1,0,0.000505213625729084,4.1467661304750436e-8,0.003241216763854027,3.0784483035645183e-12,1,0,0.00011346209794282913,4.1467661304750436e-8,0.0020416071638464928,3.0784483035645183e-12,1,0,0.0011354610323905945,4.1467661304750436e-8,0.0013015158474445343,3.0784483035645183e-12,1,0,-0.0001271483488380909,4.1467661304750436e-8,0.0013027535751461983,3.0784483035645183e-12,1,0,-0.0005145473987795413,4.1467661304750436e-8,0.00010271556675434113,3.0784483035645183e-12,1,0]);\n  const ib = new Uint16Array([0,1,2,0,2,3,4,5,6,4,6,7,8,9,10,8,10,11,12,13,14,12,14,15,16,17,18,16,18,19,20,21,22,20,22,23,24,25,26,24,26,27,28,29,30,28,30,31,32,33,34,32,34,35,36,37,38,36,38,39,40,48,49,43,44,42,42,40,41,40,42,46,46,42,45,45,42,44,48,46,47,46,48,40,50,51,52,50,52,53,54,55,56,54,56,57,58,59,60,58,60,61,62,63,64,62,64,65,66,67,68,66,68,69,70,71,72,70,72,73,74,75,76,74,76,77,78,79,80,78,80,81,82,83,84,82,84,85,86,87,88,86,88,89,90,98,99,93,94,92,92,90,91,90,92,96,96,92,95,95,92,94,98,96,97,96,98,90]);\n\n  const geo = scene.createGeometry(vl, vb, ib);\n\n  geo.setBoundBall(new xrFrameSystem.Vector3(), 1);\n  geo.addSubMesh(ib.length, 0, 0);\n\n  return geo;\n});\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/standard-shader/bsdfs.js",
    "content": "export default /* glsl */`\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\n\treturn RECIPROCAL_PI * diffuseColor;\n\n} // validated\n\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\n\t// Original approximation by Christophe Schlick '94\n\t// float fresnel = pow( 1.0 - dotVH, 5.0 );\n\n\t// Optimized variant (presented by Epic at SIGGRAPH '13)\n\t// https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n\n} // validated\n\n// Moving Frostbite to Physically Based Rendering 3.0 - page 12, listing 2\n// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\n\tfloat a2 = pow2( alpha );\n\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\n\treturn 0.5 / max( gv + gl, EPSILON );\n\n}\n\n// Microfacet Models for Refraction through Rough Surfaces - equation (33)\n// http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html\n// alpha is \"roughness squared\" in Disney’s reparameterization\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\n\tfloat a2 = pow2( alpha );\n\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0; // avoid alpha = 0 with dotNH = 1\n\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n\n}\n\n// GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\n\n\tfloat alpha = pow2( roughness ); // UE4's roughness\n\t// float alpha = roughness;\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\n\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\n\tfloat D = D_GGX( alpha, dotNH );\n\n\t// Debug List\n\t// return vec3(alpha, alpha, alpha);\n\t// return f0;\n\t// return vec3(f90, f90, f90);\n\t// return F;\n\t// return vec3(V, V, V);\n\t// return vec3(D, D, D);\n\t// return vec3(( V * D ), ( V * D ), ( V * D ));\n\n\t// return F * V;\n\t// return F * D;\n\n\treturn F * ( V * D );\n}\n\n// Analytical approximation of the DFG LUT, one half of the\n// split-sum approximation used in indirect specular lighting.\n// via 'environmentBRDF' from \"Physically Based Shading on Mobile\"\n// https://www.unrealengine.com/blog/physically-based-shading-on-mobile\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\n\tvec4 r = roughness * c0 + c1;\n\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\n\treturn fab;\n\n}\n\n// Fdez-Agüera's \"Multiple-Scattering Microfacet Model for Real-Time Image Based Lighting\"\n// Approximates multiscattering in order to preserve energy.\n// http://www.jcgt.org/published/0008/01/03/\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\n\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\n\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619; // 1/21\n\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/standard-shader/commonFrag.js",
    "content": "export default /* glsl */`\n#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#define EPSILON_ATAN 1e-2\n\n#define WX_MANUAL_SRGB true\n#define WX_SRGB_FAST_APPROXIMATION true\n\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\n\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n\tvec3 clearcoatNormal;\n};\n\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\n\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n\nuniform vec4 u_ambientLightColorIns;\nuniform vec3 u_mainLightDir;\nuniform vec4 u_mainLightColorIns;\n\nuniform vec3 u_addLightsPos[4];\nuniform vec3 u_addLightsDir[4];\nuniform vec4 u_addLightsColorIns[4];\nuniform vec4 u_addLightsInfo[4];\n\n\nvec4 SRGBtoLINEAR(vec4 srgbIn)\n{\n#ifdef WX_MANUAL_SRGB\n\n    #ifdef WX_SRGB_FAST_APPROXIMATION\n        vec3 linOut = pow(srgbIn.xyz,vec3(2.2));\n    #else //SRGB_FAST_APPROXIMATION\n        vec3 bLess = step(vec3(0.04045),srgbIn.xyz);\n        vec3 linOut = mix( srgbIn.xyz/vec3(12.92), pow((srgbIn.xyz+vec3(0.055))/vec3(1.055),vec3(2.4)), bLess );\n    #endif //SRGB_FAST_APPROXIMATION\n\n    return vec4(linOut, srgbIn.w);;\n\n#else //MANUAL_SRGB\n    \n    return srgbIn;\n\n#endif //MANUAL_SRGB\n}\n\nvec3 gammaCorrection(vec3 color) {\n  return pow(color, vec3(1.0 / 2.2));\n}\n\nvec3 removeGammaCorrection(vec3 color) {\n  return pow(color, vec3(2.2));\n}\n\nmat3 rotationMatY3(float angle) {\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\n\treturn mat3(\n\t\tc, 0.0, -s,\n\t\t0.0, 1.0, 0.0,\n\t\ts, 0.0, c\n\t);\n}\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Vendor/EXT_lights_image_based/README.md#rgbd\nvec3 decodeRGBD(in vec4 color){\n\t\treturn color.rgb / color.a;\n}\n\nfloat getFace( vec3 direction ) {\n\tvec3 absDirection = abs( direction );\n\tfloat face = - 1.0;\n\tif ( absDirection.x > absDirection.z ) {\n\t\tif ( absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t} else {\n\t\tif ( absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t}\n\treturn face;\n}\nvec2 getUV( vec3 direction, float face ) {\n\tvec2 uv;\n\tif ( face == 0.0 ) {\n\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x ); // pos x\n\t} else if ( face == 1.0 ) {\n\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y ); // pos y\n\t} else if ( face == 2.0 ) {\n\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z ); // pos z\n\t} else if ( face == 3.0 ) {\n\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x ); // neg x\n\t} else if ( face == 4.0 ) {\n\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y ); // neg y\n\t} else {\n\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z ); // neg z\n\t}\n\treturn 0.5 * ( uv + 1.0 );\n}\n\n\nvec4 textureEnvMap(sampler2D texture, vec3 position){\n\treturn texture2D(texture, vec2(atan(position.x, position.z) * RECIPROCAL_PI * 0.5+0.5,  acos(position.y) * RECIPROCAL_PI));\n}\n\nvec4 textureEnvMapIncludeMipmapsLod(sampler2D texture, vec3 position, float lod){\n\tlod = floor(lod);\n\n\tif (lod > 7.0) {\n\t\tlod = 7.0;\n\t}\n\n\tfloat posZ = abs(position.z) < EPSILON_ATAN ? EPSILON_ATAN : position.z;\n\n\tvec2 uv = vec2(atan(position.x, posZ) * RECIPROCAL_PI * 0.5 + 0.5, acos(position.y) * RECIPROCAL_PI);\n\n\tfloat scale = pow(2.0, lod);\n\n\treturn texture2D(texture, vec2(uv.x / scale, (uv.y / scale / 2.0) + 1.0 - 1.0/pow(2.0, lod)));\n\n\treturn vec4( position, 0.0);\n}\n\nvec4 textureBilinearEnvMap(sampler2D texture, vec3 direction, float roughness){\n\n\tfloat uvX = (atan(direction.x, direction.z) ) * RECIPROCAL_PI * 0.5 + 0.5;\n\tfloat uvY = acos(direction.y) * RECIPROCAL_PI;\n\tvec2 uv = vec2(uvX, uvY);\n\tvec4 envmap = texture2D(texture, uv);\n\n\treturn envmap;\n\n}\n\n\nvec3 computeDiffuseSHLight(vec3 normal, in vec3 sh[9]) {\n\treturn sh[0] +\n\t\tsh[1] * (normal.y) +\n\t\tsh[2] * (normal.z) +\n\t\tsh[3] * (normal.x) +\n\t\tsh[4] * (normal.y * normal.x) +\n\t\tsh[5] * (normal.y * normal.z) +\n\t\tsh[6] * ((3.0 * normal.z * normal.z) - 1.0) +\n\t\tsh[7] * (normal.z * normal.x) +\n\t\tsh[8] * (normal.x * normal.x - (normal.y * normal.y));\n}\n\n\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\t// dir can be either a direction vector or a normal vector\n\t// upper-left 3x3 of matrix is assumed to be orthogonal\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\n\n\n\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/standard-shader/commonVert.js",
    "content": "export default /* glsl */`\nvec4 ObjectToWorldPosition(vec4 point1)\n{\n    return u_world * point1;\n}\n\nmat4 rotation3dY(float angle) {\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\n\treturn mat4(\n\t\tc, 0.0, -s, 0.0,\n\t\t0.0, 1.0, 0.0, 0.0,\n\t\ts, 0.0, c, 0.0,\n    0.0, 0.0, 0.0, 1.0\n\t);\n}\n\n\nmat4 rotation3dX(float angle) {\n\tfloat s = sin(angle);\n\tfloat c = cos(angle);\n\n\treturn mat4(\n\t\t1.0, 0.0, 0.0, 0.0,\n\t\t0.0, c, s, 0.0,\n\t\t0.0, -s, c, 0.0,\n    0.0, 0.0, 0.0, 1.0\n\t);\n}\n\nmat4 BuildTranslation(vec3 delta)\n{\n    mat4 m;\n    m[0][0] = 1.0;\n    m[1][1] = 1.0;\n    m[2][2] = 1.0;\n    m[3] = vec4(delta, 1.0);\n    return m;\n}\n\nmat3 transpose(mat3 m) {\n    return mat3(m[0][0], m[1][0], m[2][0],\n            m[0][1], m[1][1], m[2][1],\n            m[0][2], m[1][2], m[2][2]);\n}\n\nmat4 transpose4(mat4 m) {\n    return mat4(m[0][0], m[1][0], m[2][0], m[3][0],\n                m[0][1], m[1][1], m[2][1], m[3][1],\n                m[0][2], m[1][2], m[2][2], m[3][2],\n                m[0][3], m[1][3], m[2][3], m[3][3]);\n  }\n\nmat3 inverse(mat3 m) {\n    float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];\n    float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];\n    float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];\n\n    float b01 = a22 * a11 - a12 * a21;\n    float b11 = -a22 * a10 + a12 * a20;\n    float b21 = a21 * a10 - a11 * a20;\n\n    float det = a00 * b01 + a01 * b11 + a02 * b21;\n\n    return mat3(b01, (-a22 * a01 + a02 * a21), (a12 * a01 - a02 * a11),\n                b11, (a22 * a00 - a02 * a20), (-a12 * a00 + a02 * a10),\n                b21, (-a21 * a00 + a01 * a20), (a11 * a00 - a01 * a10)) / det;\n}\n\nmat4 inverse4(mat4 m) {\n    float\n        a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n        a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n        a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n        a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],\n  \n        b00 = a00 * a11 - a01 * a10,\n        b01 = a00 * a12 - a02 * a10,\n        b02 = a00 * a13 - a03 * a10,\n        b03 = a01 * a12 - a02 * a11,\n        b04 = a01 * a13 - a03 * a11,\n        b05 = a02 * a13 - a03 * a12,\n        b06 = a20 * a31 - a21 * a30,\n        b07 = a20 * a32 - a22 * a30,\n        b08 = a20 * a33 - a23 * a30,\n        b09 = a21 * a32 - a22 * a31,\n        b10 = a21 * a33 - a23 * a31,\n        b11 = a22 * a33 - a23 * a32,\n  \n        det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n  \n    return mat4(\n        a11 * b11 - a12 * b10 + a13 * b09,\n        a02 * b10 - a01 * b11 - a03 * b09,\n        a31 * b05 - a32 * b04 + a33 * b03,\n        a22 * b04 - a21 * b05 - a23 * b03,\n        a12 * b08 - a10 * b11 - a13 * b07,\n        a00 * b11 - a02 * b08 + a03 * b07,\n        a32 * b02 - a30 * b05 - a33 * b01,\n        a20 * b05 - a22 * b02 + a23 * b01,\n        a10 * b10 - a11 * b08 + a13 * b06,\n        a01 * b08 - a00 * b10 - a03 * b06,\n        a30 * b04 - a31 * b02 + a33 * b00,\n        a21 * b02 - a20 * b04 - a23 * b00,\n        a11 * b07 - a10 * b09 - a12 * b06,\n        a00 * b09 - a01 * b07 + a02 * b06,\n        a31 * b01 - a30 * b03 - a32 * b00,\n        a20 * b03 - a21 * b01 + a22 * b00) / det;\n  }\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/standard-shader/customPBR.js",
    "content": "import pbr from './pbr'\nimport bsdfs from './bsdfs'\nimport commonFrag from './commonFrag'\nimport commonVert from './commonVert'\n\nconst xrFrameSystem = wx.getXrFrameSystem()\n\nxrFrameSystem.registerEffect('custom-pbr', scene => scene.createEffect({\n  name: 'custom-pbr',\n  defaultRenderQueue: 2000,\n  passes: [{\n    renderStates: {\n      blendOn: false,\n      depthWrite: true,\n      cullOn: true,\n      cullFace: xrFrameSystem.ECullMode.FRONT,\n    },\n    lightMode: 'ForwardBase',\n    useMaterialRenderStates: true,\n    shaders: [0, 1]\n  }],\n  properties: [\n    { key: 'u_baseColorFactor', type: xrFrameSystem.EUniformType.FLOAT4, default: [1, 1, 1, 1] },\n    { key: 'u_metallicRoughnessValues', type: xrFrameSystem.EUniformType.FLOAT2, default: [0, 1] },\n    { key: 'u_normalScale', type: xrFrameSystem.EUniformType.FLOAT, default: [1] },\n    { key: 'u_emissiveFactor', type: xrFrameSystem.EUniformType.FLOAT3, default: [0, 0, 0] },\n    { key: 'u_occlusionStrength', type: xrFrameSystem.EUniformType.FLOAT, default: [1] },\n    { key: 'u_specularFactor', type: xrFrameSystem.EUniformType.FLOAT3, default: [1, 1, 1] },\n    { key: 'u_glossinessFactor', type: xrFrameSystem.EUniformType.FLOAT, default: [1] },\n    { key: 'u_ior', type: xrFrameSystem.EUniformType.FLOAT, default: [1.5] },\n    { key: 'u_clearcoatFactor', type: xrFrameSystem.EUniformType.FLOAT, default: [0] },\n    { key: 'u_clearcoatRoughnessFactor', type: xrFrameSystem.EUniformType.FLOAT, default: [0] },\n    { key: 'u_clearcoatNormalScale', type: xrFrameSystem.EUniformType.FLOAT, default: [1] },\n    { key: 'u_alphaCutoff', type: xrFrameSystem.EUniformType.FLOAT, default: [0.5] },\n    {\n      key: 'u_diffuseSHMat', type: xrFrameSystem.EUniformType.FLOAT3, num: 9, default: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n    },\n    { key: 'u_transmissionFactor', type: xrFrameSystem.EUniformType.FLOAT, default: [1] },\n    { key: 'u_sheenColorFactor', type: xrFrameSystem.EUniformType.FLOAT3, default: [0.0, 0.0, 0.0] },\n    { key: 'u_sheenRoughnessFactor', type: xrFrameSystem.EUniformType.FLOAT, default: [0.0] },\n    /** uvTransform */\n    { key: 'u_uvTransform', type: xrFrameSystem.EUniformType.MAT4, default: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] },\n    { key: 'u_normalMapTransform', type: xrFrameSystem.EUniformType.MAT4, default: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] },\n  ],\n  images: [\n    { key: 'u_brdfLUT', default: 'brdf-lut' },\n    { key: 'u_baseColorMap', default: 'white', macro: 'WX_USE_BASECOLORMAP' },\n    { key: 'u_metallicRoughnessMap', default: 'green', macro: 'WX_USE_METALROUGHNESSMAP' },\n    { key: 'u_normalMap', default: 'white', macro: 'WX_USE_NORMALMAP' },\n    { key: 'u_emissiveMap', default: 'white', macro: 'WX_USE_EMISSIVEMAP' },\n    { key: 'u_occlusionMap', default: 'white', macro: 'WX_USE_OCCLUSIONMAP' },\n    { key: 'u_clearcoatMap', default: 'white', macro: 'WX_USE_CLEARCOATMAP' },\n    { key: 'u_specularGlossinessMap', default: 'white', macro: 'WX_USE_SPECULARGLOSSINESSMAP' },\n    { key: 'u_transmissionMap', default: 'white', macro: 'WX_USE_TRANSMISSIONMAP' },\n    { key: 'u_sheenColorMap', default: 'white', macro: 'WX_USE_SHEENCOLORMAP' },\n    { key: 'u_metallicMap', default: 'black', macro: 'WX_USE_METALMAP' },\n    { key: 'u_roughnessMap', default: 'white', macro: 'WX_USE_ROUGHNESSMAP' },\n    { key: 'u_clearcoatRoughnessMap', default: 'white', macro: 'WX_USE_CLEARCOATROUGHNESSMAP' },\n    { key: 'u_clearcoatNormalMap', default: 'white', macro: 'WX_USE_CLEARCOATNORMALMAP' },\n    { key: 'u_sheenRoughnessMap', default: 'white', macro: 'WX_USE_SHEENROUGHNESSMAP' },\n    { key: 'u_specularEnvMapMat', default: 'white' },\n  ],\n  shaders: [\n    `#version 100\n\nprecision highp float;\nprecision highp int;\n\nuniform highp mat4 u_world;\nuniform highp mat4 u_view;\nuniform highp mat4 u_viewInverse;\nuniform highp mat4 u_projection;\n\nattribute vec3 a_position;\nattribute highp vec2 a_texCoord;\n#ifdef WX_USE_UV1\nattribute highp vec2 a_texCoord_1;\n#endif\n#ifdef WX_USE_UV2\nattribute highp vec2 a_texCoord_2;\n#endif\n#ifdef WX_USE_UV3\nattribute highp vec2 a_texCoord_3;\n#endif\n#ifdef WX_USE_NORMAL\n  attribute highp vec3 a_normal;\n  #ifdef WX_USE_TANGENT\n    attribute highp vec4 a_tangent;\n  #endif\n#endif\n\nvarying highp vec2 v_UV;\n#ifdef WX_USE_UV1\nvarying highp vec2 v_UV1;\n#endif\n#ifdef WX_USE_UV2\nvarying highp vec2 v_UV2;\n#endif\n#ifdef WX_USE_UV3\nvarying highp vec2 v_UV3;\n#endif\nvarying highp vec3 v_ViewPosition;\n\n#ifdef WX_USE_COLOR_0\n    attribute vec3 a_color;\n    varying highp vec3 v_Color;\n#endif\n\n#ifdef WX_USE_NORMAL\n  varying highp vec3 v_Normal;\n  #ifdef WX_USE_TANGENT\n    varying highp vec3 v_Tangent;\n    varying highp vec3 v_BitTangent;\n  #endif\n#endif\n\n#ifdef WX_USE_TRANSMISSION\n  varying highp vec3 v_WorldPosition;\n#else\n  #ifdef WX_RECEIVE_SHADOW\n    varying highp vec3 v_WorldPosition;\n  #endif\n#endif\n\n#ifdef WX_USE_MAIN_DIR_LIGHT\n  uniform vec3 u_mainLightDir;\n\n  varying highp vec3 v_MainLightDir;\n#endif\n\n#ifdef WX_USE_ADD_LIGHTS\n  uniform vec4 u_addLightsInfo[4];\n  uniform vec3 u_addLightsPos[4];\n  uniform vec3 u_addLightsDir[4];\n\n  varying highp vec3 v_AddLightsDir[WX_ADD_LIGHTS_COUNT];\n  varying highp vec3 v_AddLightsPos[WX_ADD_LIGHTS_COUNT];\n#endif\n` +\ncommonVert +\n`\nvoid main()\n{\n#ifdef WX_SKINNED\n    mat4 boneMat = getBoneMat();\n    mat4 modelViewMatrix = u_view * boneMat;\n#else\n    mat4 modelViewMatrix = u_view * u_world;\n#endif\n    mat3 viewMatrixMat3 = mat3(u_view);\n    mat3 normalMatrix = mat3(modelViewMatrix);\n    // TODO ModleViewMatrix Inverse TransposeMatrix\n    // mat3 normalMatrix = transpose(inverse(mat3(modelViewMatrix)));\n\n    vec4 mvPosition = modelViewMatrix * vec4(a_position, 1.0);\n\n    // varing\n    v_UV = a_texCoord;\n#ifdef WX_USE_UV1\n    v_UV1 = a_texCoord_1;\n#endif\n#ifdef WX_USE_UV2\n    v_UV2 = a_texCoord_2;\n#endif\n#ifdef WX_USE_UV3\n    v_UV3 = a_texCoord_3;\n#endif\n    v_ViewPosition = mvPosition.xyz;\n\n#ifdef WX_USE_COLOR_0\n    v_Color = a_color;\n#endif\n\n#ifdef WX_USE_TRANSMISSION\n    v_WorldPosition = (u_world * vec4(a_position, 1.0)).xyz;\n#else\n    #ifdef WX_RECEIVE_SHADOW\n        v_WorldPosition = (u_world * vec4(a_position, 1.0)).xyz;\n    #endif\n#endif\n\n#ifdef WX_USE_NORMAL\n    v_Normal = normalize(vec3(normalMatrix * a_normal));\n    #ifdef WX_USE_TANGENT\n        vec3 transformedTangent = (modelViewMatrix * vec4(a_tangent.xyz, 0.0)).xyz;\n        v_Tangent = normalize( transformedTangent );\n        v_BitTangent = normalize(cross(v_Normal, v_Tangent) * a_tangent.w);\n    #endif\n#endif\n\n#ifdef WX_USE_MAIN_DIR_LIGHT\n    // TransformDirection\n    vec3 lightDir = u_mainLightDir;\n\n    v_MainLightDir = normalize(viewMatrixMat3 * lightDir);\n#endif\n\n#ifdef WX_USE_ADD_LIGHTS\n    for(int i = 0; i < WX_ADD_LIGHTS_COUNT; ++i)\n    {\n      vec4 addLightInfo = u_addLightsInfo[i];\n      if (addLightInfo.x == 0.0) {\n        // TransformDirection\n        vec3 addLightDir = u_addLightsDir[i];\n        v_AddLightsDir[i] = normalize(viewMatrixMat3 * addLightDir);\n      } else if (addLightInfo.x == 1.0) {\n        vec3 addlightPos = u_addLightsPos[i];\n\n        // ApplyMatrix\n        v_AddLightsPos[i] = (u_view * vec4(addlightPos, 1.0)).xyz;\n      } else if (addLightInfo.x == 2.0) {\n        vec3 addLightDir = u_addLightsDir[i];\n\n        // TransformDirection\n        v_AddLightsDir[i] = normalize(viewMatrixMat3 * addLightDir);\n        // ApplyMatrix\n        v_AddLightsPos[i] = (u_view * vec4(u_addLightsPos[i], 1.0)).xyz;\n      }\n    }\n#endif\n\n    gl_Position = u_projection * mvPosition;\n\n}`,\n    // Fragment Shader\n    `#version 100\n\n// Temp fix Uniform limit, remove lut\n#define WX_USE_BRDFLUT true\n\nprecision highp float;\nprecision highp int;\n\nuniform float u_gameTime;\nuniform highp mat4 u_world;\nuniform highp mat4 u_view;\nuniform highp mat4 u_projection;\nuniform highp mat4 u_viewInverse;\n\nvarying highp vec2 v_UV;\nvarying highp vec2 v_UV1;\nvarying highp vec3 v_ViewPosition;\n\n#ifdef WX_USE_COLOR_0\n    varying highp vec3 v_Color;\n#endif\n\n#ifdef WX_USE_NORMAL\n  varying highp vec3 v_Normal;\n\n  #ifdef WX_USE_TANGENT\n      varying highp vec3 v_Tangent;\n      varying highp vec3 v_BitTangent;\n  #endif\n#endif\n\n#ifdef WX_USE_TRANSMISSION\n  varying highp vec3 v_WorldPosition;\n#else\n  #ifdef WX_RECEIVE_SHADOW\n    varying highp vec3 v_WorldPosition;\n  #endif\n#endif\n\n#ifdef WX_USE_MAIN_DIR_LIGHT\n  varying highp vec3 v_MainLightDir;\n#endif\n\n#ifdef WX_USE_ADD_LIGHTS\n  varying highp vec3 v_AddLightsDir[WX_ADD_LIGHTS_COUNT];\n  varying highp vec3 v_AddLightsPos[WX_ADD_LIGHTS_COUNT];\n#endif\n` +\ncommonFrag +\nbsdfs +\n// PBR Material Info\npbr +\n`\nvoid main()\n{\n    vec4 diffuseColor = vec4 (diffuse, opacity);\n\n    // ReflectedLight\n    ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n    \n    // Emissive\n    vec3 totalEmissiveRadiance = vec3(0.0);\n    // Transmission\n    vec3 transmissionAll = vec3(0.0);\n    float transmissionFactor = 0.0;\n\n#ifdef WX_USE_BASECOLORMAP\n    #ifdef WX_BASECOLORMAP_USE_UV1\n        vec2 uvBaseColor = v_UV1;\n    #elif defined(WX_BASECOLORMAP_USE_UV2)\n        vec2 uvBaseColor = v_UV2;\n    #elif defined(WX_BASECOLORMAP_USE_UV3)\n        vec2 uvBaseColor = v_UV3;\n    #else\n        vec2 uvBaseColor = v_UV;\n    #endif\n\n    #ifdef WX_USE_UVTRANSFORM_BASECOLOR\n        uvBaseColor = (u_uvTransform * vec4( uvBaseColor, 1.0, 1.0 ) ).xy;\n    #endif\n\n    vec4 baseColor = SRGBtoLINEAR(texture2D(u_baseColorMap, uvBaseColor));\n#else\n    vec4 baseColor = vec4(1.0, 1.0, 1.0, 1.0);\n#endif\n\n#ifdef WX_MANUAL_LINEAR_BASECOLORFACTOR\n    baseColor *= u_baseColorFactor;\n#else\n    baseColor *= SRGBtoLINEAR(u_baseColorFactor);\n#endif\n\n#ifdef WX_USE_ALPHA_CUTOFF\n    if (baseColor.a < u_alphaCutoff) {\n        discard;\n    } else {\n        #ifndef WX_USE_GLTF\n            baseColor.a = 1.0;\n        #endif\n    }\n#endif\n\n    diffuseColor *= baseColor;\n\n#ifdef WX_USE_COLOR_0\n    diffuseColor *= vec4(v_Color, 1.0);\n#endif\n\n    // metallic roughness\n    float roughness = u_metallicRoughnessValues.y;\n    float metallic = u_metallicRoughnessValues.x;\n#ifdef WX_USE_METALROUGHNESSMAP\n    #ifdef WX_METALLICROUGHNESSMAP_USE_UV1\n        vec2 uvMetalRougness = v_UV1;\n    #elif defined(WX_METALLICROUGHNESSMAP_USE_UV2)\n        vec2 uvMetalRougness = v_UV2;\n    #elif defined(WX_METALLICROUGHNESSMAP_USE_UV3)\n        vec2 uvMetalRougness = v_UV3;\n    #else\n        vec2 uvMetalRougness = v_UV;\n    #endif\n\n    #ifdef WX_USE_UVTRANSFORM_METALROUGHNESS\n        uvMetalRougness = (u_uvTransform * vec4( uvMetalRougness, 1.0, 1.0 ) ).xy;\n    #endif\n\n    // Roughness is stored in the 'g' channel, metallic is stored in the 'b' channel.\n    // This layout intentionally reserves the 'r' channel for (optional) occlusion map data\n    vec4 mrSample = texture2D(u_metallicRoughnessMap, uvMetalRougness);\n    roughness *= mrSample.g;\n    metallic *= mrSample.b;\n#else\n    #ifdef WX_USE_ROUGHNESSMAP\n        roughness *= texture2D(u_roughnessMap, v_UV).r;\n    #endif\n    #ifdef WX_USE_METALMAP\n        metallic *= texture2D(u_metallicMap, v_UV).r;\n    #endif\n#endif\n\n    // Normal\n#ifdef WX_USE_NORMAL\n    vec3 normal = normalize(v_Normal);\n\n    #ifndef WX_USE_CULLON\n      #ifndef WX_USE_GLTF\n        float facing = gl_FrontFacing ? -1.0 : 1.0;\n        normal *= facing;\n      #endif\n    #endif\n\n    #ifdef WX_USE_TANGENT\n        vec3 tangent = normalize(v_Tangent);\n\n        #ifdef WX_USE_NORMALMAP\n            #ifdef WX_NORMALMAP_USE_UV1\n                vec2 uvNormal = v_UV1;\n            #elif defined(WX_NORMALMAP_USE_UV2)\n                vec2 uvNormal = v_UV2;\n            #elif defined(WX_NORMALMAP_USE_UV3)\n                vec2 uvNormal = v_UV3;\n            #else\n                vec2 uvNormal = v_UV;\n            #endif\n\n            #ifdef WX_USE_UVTRANSFORM_NORMAL\n                uvNormal = (u_normalMapTransform * vec4( uvNormal, 1.0, 1.0 ) ).xy;\n            #endif\n\n            vec3 normalSample = texture2D(u_normalMap, uvNormal).xyz * 2.0 - 1.0;\n            normalSample *= u_normalScale;\n\n            vec3 bitangent = normalize( v_BitTangent );\n            mat3 vTBN = mat3( tangent, bitangent, normal );\n            normal = normalize( vTBN * normalSample );\n        #endif\n    #else\n        vec3 tangent = vec3(0.0, 0.0, 0.0);\n    #endif\n#else\n    vec3 normal = vec3(0.0, 0.0, 1.0);\n#endif\n\n    // Emissivemap\n    totalEmissiveRadiance = u_emissiveFactor;\n#ifdef WX_USE_EMISSIVEMAP\n    #ifdef WX_EMISSIVEMAP_USE_UV1\n        vec2 uvEmissive = v_UV1;\n    #elif defined(WX_EMISSIVEMAP_USE_UV2)\n        vec2 uvEmissive = v_UV2;\n    #elif defined(WX_EMISSIVEMAP_USE_UV3)\n        vec2 uvEmissive = v_UV3;\n    #else\n        vec2 uvEmissive = v_UV;\n    #endif\n\n    #ifdef WX_USE_UVTRANSFORM_EMISSIVE\n        uvEmissive = (u_uvTransform * vec4( uvEmissive, 1.0, 1.0 ) ).xy;\n    #endif\n\n  //  vec4 emissiveColor = SRGBtoLINEAR(texture2D(u_emissiveMap, uvEmissive));\n    vec4 emissiveColor  = vec4(1.0, 0.0, 0.0, 1.0);\n    totalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n      \n    // Accumulation\n    // ----------- start -------------\n    PhysicalMaterial material;\n\n#ifdef WX_USE_SPECULARGLOSSINESS\n    vec3 specularFactor = u_specularFactor;\n    float glossinessFactor = u_glossinessFactor;\n    #ifdef WX_USE_SPECULARGLOSSINESSMAP\n        #ifdef WX_SPECULARGLOSSINESSMAP_USE_UV1\n            vec2 uvSpecularGlossiness = v_UV1;\n        #elif defined(WX_EMISSIVEMAP_USE_UV2)\n            vec2 uvSpecularGlossiness = v_UV2;\n        #elif defined(WX_EMISSIVEMAP_USE_UV3)\n            vec2 uvSpecularGlossiness = v_UV3;\n        #else\n            vec2 uvSpecularGlossiness = v_UV;\n        #endif\n\n        #ifdef WX_USE_UVTRANSFORM_SPECULARGLOSSINESS\n            uvSpecularGlossiness = (u_uvTransform * vec4( uvSpecularGlossiness, 1.0, 1.0 ) ).xy;\n        #endif\n\n        vec4 specularGlossinessSample = texture2D(u_specularGlossinessMap, uvSpecularGlossiness);\n        specularFactor *= SRGBtoLINEAR(specularGlossinessSample).rgb;\n        glossinessFactor *= specularGlossinessSample.a;\n    #endif\n\n    material.diffuseColor = diffuseColor.rgb * ( 1.0 - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );\n    material.specularColor = specularFactor;\n    material.specularF90 = 1.0;\n\n    roughness = 1.0 - glossinessFactor;\n#else\n    material.diffuseColor = diffuseColor.rgb * ( 1.0 - metallic );\n    float specularIntensityFactor = 1.0;\n    vec3 specularColorFactor = vec3( 1.0 );\n    material.specularColor = mix( min( pow2( ( u_ior - 1.0 ) / ( u_ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metallic );\n\n    material.specularF90 = 1.0;\n#endif\n\n    material.roughness = max( roughness, 0.0525 );// 0.0525 corresponds to the base mip of a 256 cubemap.\n    material.roughness = min( material.roughness, 1.0 );\n\n    GeometricContext geometry;\n\n    geometry.position = v_ViewPosition;\n    geometry.normal = normal;\n    geometry.viewDir = normalize( vec3(0.0) - v_ViewPosition );\n\n    IncidentLight directLight;\n\n    vec3 iblIrradiance = vec3( 0.0 );\n    vec3 irradiance = vec3( 0.0 );\n    vec3 radiance = vec3( 0.0 );\n    vec3 clearcoatRadiance = vec3( 0.0 );\n\n    // env Rotation\n    #ifdef WX_USE_MAT_ENV\n        mat3 envRotationY = rotationMatY3(0.0);\n    #else\n        mat3 envRotationY = rotationMatY3(u_envRotation);\n    #endif\n\n#ifdef WX_USE_CLEARCOAT\n    #ifdef WX_USE_CLEARCOATMAP\n        #ifdef WX_CLEARCOATMAP_USE_UV1\n            vec2 uvClearCoat = v_UV1;\n        #elif defined(WX_CLEARCOATMAP_USE_UV2)\n            vec2 uvClearCoat = v_UV2;\n        #elif defined(WX_CLEARCOATMAP_USE_UV3)\n            vec2 uvClearCoat = v_UV3;\n        #else\n            vec2 uvClearCoat = v_UV;\n        #endif\n\n        #ifdef WX_USE_UVTRANSFORM_CLEARCOAT\n            uvClearCoat = (u_uvTransform * vec4( uvClearCoat, 1.0, 1.0 ) ).xy;\n        #endif\n\n        vec4 clearCoatSample = texture2D(u_clearcoatMap, uvClearCoat);\n    #else\n        vec4 clearCoatSample = vec4(1.0, 1.0, 1.0, 1.0);\n    #endif\n\n    #ifdef WX_USE_CLEARCOATROUGHNESSMAP\n        #ifdef WX_CLEARCOATROUGHNESSMAP_USE_UV1\n            vec2 uvClearCoatRoughness = v_UV1;\n        #elif defined(WX_CLEARCOATROUGHNESSMAP_USE_UV2)\n            vec2 uvClearCoatRoughness = v_UV2;\n        #elif defined(WX_CLEARCOATROUGHNESSMAPP_USE_UV3)\n            vec2 uvClearCoatRoughness = v_UV3;\n        #else\n            vec2 uvClearCoatRoughness = v_UV;\n        #endif\n\n        #ifdef WX_USE_UVTRANSFORM_CLEARCOATROUGHNESS\n            uvClearCoatRoughness = (u_uvTransform * vec4( uvClearCoatRoughness, 1.0, 1.0 ) ).xy;\n        #endif\n\n        vec4 clearCoatRoughnessSample = texture2D(u_clearcoatRoughnessMap, uvClearCoatRoughness);\n    #else\n        vec4 clearCoatRoughnessSample = vec4(1.0, 1.0, 1.0, 1.0);\n    #endif\n\n    #ifdef WX_USE_CLEARCOATNORMALMAP\n        #ifdef WX_CLEARCOATNORMALMAP_USE_UV1\n            vec2 uvClearCoatNormal = v_UV1;\n        #elif defined(WX_CLEARCOATNORMALMAP_USE_UV2)\n            vec2 uvClearCoatNormal = v_UV2;\n        #elif defined(WX_CLEARCOATNORMALMAP_USE_UV3)\n            vec2 uvClearCoatNormal = v_UV3;\n        #else\n            vec2 uvClearCoatNormal = v_UV;\n        #endif\n\n        #ifdef WX_USE_UVTRANSFORM_CLEARCOATNORMAL\n            uvClearCoatNormal = (u_uvTransform * vec4( uvClearCoatNormal, 1.0, 1.0 ) ).xy;\n        #endif\n\n        vec4 clearCoatNormalSample = texture2D(u_clearcoatNormalMap, uvClearCoatNormal);\n    #else\n        vec4 clearCoatNormalSample = vec4(1.0, 1.0, 1.0, 1.0);\n    #endif\n\n    geometry.clearcoatNormal = geometry.normal;\n\n    material.clearcoat = u_clearcoatFactor * clearCoatSample.r;\n    material.clearcoat = saturate( material.clearcoat ); // Burley clearcoat model\n\n    material.clearcoatRoughness = u_clearcoatRoughnessFactor * clearCoatRoughnessSample.g;\n    material.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n    material.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n\n    material.clearcoatF0 = vec3( 0.04 );\n\t  material.clearcoatF90 = 1.0;\n\n    clearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, envRotationY);\n#endif\n\n#ifdef WX_USE_SHEEN\n    material.sheenColor = u_sheenColorFactor;\n\n    #ifdef WX_USE_SHEENCOLORMAP\n        #ifdef WX_SHEENCOLORMAP_USE_UV1\n            vec2 uvSheenColor = v_UV1;\n        #elif defined(WX_SHEENCOLORMAP_USE_UV2)\n            vec2 uvSheenColor = v_UV2;\n        #elif defined(WX_SHEENCOLORMAP_USE_UV3)\n            vec2 uvSheenColor = v_UV3;\n        #else\n            vec2 uvSheenColor = v_UV;\n        #endif\n        material.sheenColor *= SRGBtoLINEAR(texture2D( u_sheenColorMap, uvSheenColor )).rgb;\n\t#endif\n\n    material.sheenRoughness = clamp( u_sheenRoughnessFactor, 0.07, 1.0 );\n\n\t#ifdef WX_USE_SHEENROUGHNESSMAP\n        #ifdef WX_SHEENROUGHNESSMAP_USE_UV1\n            vec2 uvSheenRoughness = v_UV1;\n        #elif defined(WX_SHEENROUGHNESSMAP_USE_UV2)\n            vec2 uvSheenRoughness = v_UV2;\n        #elif defined(WX_SHEENROUGHNESSMAP_USE_UV3)\n            vec2 uvSheenRoughness = v_UV3;\n        #else\n            vec2 uvSheenRoughness = v_UV;\n        #endif\n        material.sheenRoughness *= texture2D( u_sheenRoughnessMap, uvSheenRoughness ).a;\n\t#endif\n#endif\n    // ----------- end -------------\n    \n    // MainLights\n#ifdef WX_USE_MAIN_DIR_LIGHT\n    vec3 lightDir = v_MainLightDir;\n\n    vec3 mainLightColor = u_mainLightColorIns.rgb * u_mainLightColorIns.a;\n    directLight.color = mainLightColor;\n\n    #ifdef WX_RECEIVE_SHADOW\n        directLight.color = directLight.color * shadowCalculation(v_WorldPosition);\n    #endif\n    directLight.direction = lightDir;\n    directLight.visible = true;\n    Direct_Physical( directLight, geometry, material, reflectedLight );\n#endif\n  \n    // AddLights\n#ifdef WX_USE_ADD_LIGHTS\n\n    for(int i = 0; i < WX_ADD_LIGHTS_COUNT; ++i)\n    {\n      vec4 addLightInfo = u_addLightsInfo[i];\n      vec3 addLightColor = u_addLightsColorIns[i].rgb * u_addLightsColorIns[i].a;\n\n      if (addLightInfo.x == 0.0) {\n        // Directional Light\n        directLight.direction = v_AddLightsDir[i];\n        Direct_Physical( directLight, geometry, material, reflectedLight );\n      } else if (addLightInfo.x == 1.0) {\n        // Point Light\n        float range = addLightInfo.y;\n        vec3 pointLightPos = v_AddLightsPos[i];\n        vec3 lVector = pointLightPos - geometry.position;\n        \n        float lightDistance = length( lVector );\n        float attenuation = getDistanceAttenuation(lightDistance, range, 2.0);\n\n        directLight.color = addLightColor * attenuation;\n        directLight.direction = normalize( lVector );\n        directLight.visible = ( directLight.color != vec3( 0.0 ) );\n\n        Direct_Physical( directLight, geometry, material, reflectedLight );\n      } else if (addLightInfo.x == 2.0) {\n        // Spot Light\n        float range = addLightInfo.y;\n        vec3 spotLightPos = v_AddLightsPos[i];\n        vec3 spotLightDir = v_AddLightsDir[i];\n        vec3 lVector = spotLightPos - geometry.position;\n\n        directLight.direction = normalize( lVector );\n\n        float angleCos = dot( directLight.direction, spotLightDir );\n        // Use Basic Clamp\n        // float spotAttenuation = clamp((angleCos - addLightInfo.w) / (addLightInfo.z - addLightInfo.w), 0.0, 1.0);\n\n        // Use smoothstep\n        float spotAttenuation = smoothstep( addLightInfo.w, addLightInfo.z, angleCos );\n\n        if ( spotAttenuation > 0.0 ) {\n          float lightDistance = length( lVector );\n    \n          directLight.color = addLightColor * spotAttenuation;\n          directLight.color *= getDistanceAttenuation( lightDistance, range, 1.0 );\n          directLight.visible = ( directLight.color != vec3( 0.0 ) );\n        } else {\n          directLight.color = vec3( 0.0 );\n          directLight.visible = false;\n        }\n\n        Direct_Physical( directLight, geometry, material, reflectedLight );\n      }\n\n      #ifdef WX_USE_TRANSMISSION\n        transmissionFactor = u_transmissionFactor;\n\n        #ifdef WX_USE_TRANSMISSIONMAP\n            transmissionFactor *= texture2D( u_transmissionMap, v_UV ).r;\n        #endif\n\n        vec3 pos = v_WorldPosition;\n        vec3 cameraPos = vec3(u_viewInverse[3][0], u_viewInverse[3][1], u_viewInverse[3][2]);\n\n        vec3 v = normalize( cameraPos - pos );\n        // vec3 n = inverseTransformDirection( normal, u_view );\n        vec3 n = geometry.normal;\n\n        vec3 transmissionVec = getIBLVolumeRefractionVec(n, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, pos, u_world);\n        vec3 pointToLight = directLight.direction;\n        pointToLight -= transmissionVec;\n        vec3 lightDir = normalize(pointToLight);\n        vec3 intensity =  getLightIntensity(addLightInfo, pointToLight, directLight.color, directLight.direction, u_addLightsColorIns[i].a);\n        transmissionAll += intensity * getPunctualTransmissionIntensity(lightDir, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness, material.diffuseColor, u_ior);\n      #endif\n      \n    }\n#endif\n\n    // AmbientLight\n#ifdef WX_USE_AMBIENT_LIGHT\n    vec3 ambientLightColor = u_ambientLightColorIns.rgb * u_ambientLightColorIns.a;\n    irradiance = getAmbientLightIrradiance( ambientLightColor );\n#endif\n\n#ifdef WX_USE_IBL_DIFFUSE\n\n    // vec3 shNormal = geometry.normal;\n    vec3 shNormal = inverseTransformDirection( geometry.normal, u_view );\n    shNormal = shNormal * envRotationY;\n    \n    #ifdef WX_USE_MAT_ENV\n      vec3 diffuseLight = computeDiffuseSHLight(shNormal, u_diffuseSHMat);\n      iblIrradiance += diffuseLight;\n\n    #else\n      vec3 diffuseLight = computeDiffuseSHLight(shNormal, u_diffuseSH);\n      iblIrradiance += diffuseLight * u_diffuseExp;\n\n    #endif\n\n    // iblIrradiance += diffuseLight * material.diffuseColor * u_diffuseExp;\n    // iblIrradiance += diffuseLight * u_diffuseExp;\n\n#endif\n\n#ifdef WX_USE_IBL_SPECULAR\n    #ifdef WX_USE_MAT_ENV\n        radiance += getIBLRadiance(geometry.viewDir, geometry.normal, material.roughness, envRotationY);\n    #else\n        radiance += getIBLRadiance(geometry.viewDir, geometry.normal, material.roughness, envRotationY) * u_specularExp;\n    #endif\n#endif\n\n    // IndirectDiffuse\n    IndirectDiffuse_Physical( irradiance, geometry, material, reflectedLight );\n    \n    // IndirectSpecular\n    IndirectSpecular_Physical( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n  \n    // AO\n    float ao = 1.0;\n#ifdef WX_USE_OCCLUSIONMAP\n    #ifdef WX_OCCLUSIONMAP_USE_UV1\n      vec2 uvOcclusion = v_UV1;\n    #elif defined(WX_OCCLUSIONMAP_USE_UV2)\n      vec2 uvOcclusion = v_UV2;\n    #elif defined(WX_OCCLUSIONMAP_USE_UV3)\n      vec2 uvOcclusion = v_UV3;\n    #else\n      vec2 uvOcclusion = v_UV;\n    #endif\n\n    #ifdef WX_USE_UVTRANSFORM_OCCLUSION\n        uvOcclusion = (u_uvTransform * vec4( uvOcclusion, 1.0, 1.0 ) ).xy;\n    #endif\n\n    ao = texture2D(u_occlusionMap, uvOcclusion).r;\n    ao *= u_occlusionStrength;\n\n    // Diffuse\n    reflectedLight.indirectDiffuse *= ao;\n\n    // SPECULAR\n    #ifdef WX_USE_IBL_SPECULAR\n        float dotNV = saturate( dot(geometry.normal, geometry.viewDir ) );\n        reflectedLight.indirectSpecular *= saturate( pow( dotNV + ao, exp2( - 16.0 * material.roughness - 1.0 ) ) - 1.0 + ao );\n    #endif\n#endif\n\n    vec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n    vec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n    totalDiffuse = mix( totalDiffuse, transmissionAll.rgb, transmissionFactor );\n\n    vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\n#ifdef WX_USE_SHEEN\n    // Sheen energy compensation approximation calculation can be found at the end of\n    // https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\n    float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n    outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\n#endif\n\n#ifdef WX_USE_CLEARCOAT\n    float dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\n    vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\n    outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\n#endif\n\n    vec3 color = outgoingLight;\n\n    // gamma correct\n#ifndef WX_PP_ACTIVE\n    color = gammaCorrection(color);\n#endif\n    #ifndef WX_USE_BLEND\n      diffuseColor.a = 1.0;\n    #endif\n    gl_FragData[0] = vec4(color, diffuseColor.a);\n}\n`\n  ],\n}))\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/standard-shader/pbr.js",
    "content": "export default /* glsl */`\n// temporary\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec3 sheenSpecular = vec3( 0.0 );\n\nvec3 diffuse = vec3( 1.0 );\nfloat opacity = 1.0;\n\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat roughness;\n\tfloat specularF90;\n\n\t#ifdef WX_USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef WX_USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n};\n\nuniform sampler2D u_brdfLUT;\nuniform float u_envRotation;\n\nuniform vec2 u_metallicRoughnessValues;\nuniform vec4 u_baseColorFactor;\nuniform vec3 u_emissiveFactor;\n\nuniform float u_ior;\n\n#ifdef WX_USE_ALPHA_CUTOFF\n\tuniform float u_alphaCutoff;\n#endif\n\n#ifdef WX_USE_CLEARCOAT\n\tuniform float u_clearcoatFactor;\n\tuniform float u_clearcoatRoughnessFactor;\n\tuniform float u_clearcoatNormalScale;\n#endif\n\n#ifdef WX_USE_BASECOLORMAP\n\tuniform sampler2D u_baseColorMap;\n\t// uniform mat3 u_baseColorMapTransform;\n#endif\n#ifdef WX_USE_NORMALMAP\n\tuniform sampler2D u_normalMap;\n\tuniform float u_normalScale;\n\tuniform mat4 u_normalMapTransform;\n#endif\n#ifdef WX_USE_EMISSIVEMAP\n\tuniform sampler2D u_emissiveMap;\n\t// uniform mat3 u_emissiveMapTransform;\n#endif\n#ifdef WX_USE_METALMAP\n\tuniform sampler2D u_metallicMap;\n#endif\n#ifdef WX_USE_ROUGHNESSMAP\n\tuniform sampler2D u_roughnessMap;\n#endif\n#ifdef WX_USE_METALROUGHNESSMAP\n\tuniform sampler2D u_metallicRoughnessMap;\n\t// uniform mat3 u_metallicRoughnessMapTransform;\n#endif\n#ifdef WX_USE_OCCLUSIONMAP\n\tuniform sampler2D u_occlusionMap;\n\tuniform float u_occlusionStrength;\n\t// uniform mat3 u_occlusionMapTransform;\n#endif\n#ifdef WX_USE_CLEARCOATMAP\n\tuniform sampler2D u_clearcoatMap;\n\t// uniform mat3 u_clearcoatMapTransform;\n#endif\n#ifdef WX_USE_CLEARCOATROUGHNESSMAP\n\tuniform sampler2D u_clearcoatRoughnessMap;\n\t// uniform mat3 u_clearcoatRoughnessMapTransform;\n#endif\n#ifdef WX_USE_CLEARCOATNORMALMAP\n\tuniform sampler2D u_clearcoatNormalMap;\n\t// uniform mat3 u_clearcoatNormalMapTransform;\n#endif\n#ifdef WX_USE_SPECULARGLOSSINESS\n\tuniform vec3 u_specularFactor;\n\tuniform float u_glossinessFactor;\n\n\t#ifdef WX_USE_SPECULARGLOSSINESSMAP\n\t\tuniform sampler2D u_specularGlossinessMap;\n\t\t// uniform mat3 u_specularGlossinessMapTransform;\n\t#endif\n#endif\n#ifdef WX_USE_TRANSMISSION\n\tuniform float u_transmissionFactor;\n\n\t#ifdef WX_USE_TRANSMISSIONMAP\n\t\tuniform sampler2D u_transmissionMap;\n\t\t// uniform mat3 u_transmissionMapTransform;\n\t#endif\n#endif\n\n#ifdef WX_USE_SHEEN\n\tuniform vec3 u_sheenColorFactor;\n\tuniform float u_sheenRoughnessFactor;\n\n\t#ifdef WX_USE_SHEENCOLORMAP\n\t\t\tuniform sampler2D u_sheenColorMap;\n\t#endif\n\n\t#ifdef WX_USE_SHEENROUGHNESSMAP\n\t\t\tuniform sampler2D u_sheenRoughnessMap;\n\t#endif\n#endif\n\n#ifdef WX_USE_UVTRANSFORM\n\tuniform mat4 u_uvTransform;\n#endif\n\n#ifdef WX_USE_MAT_ENV\n\tuniform vec3 u_diffuseSHMat[9];\n\tuniform float u_diffuseExpMat;\n\tuniform sampler2D u_specularEnvMapMat;\n\tuniform float u_specularExpMat;\n\tuniform float u_specularEnvMapMipCountMat;\n#else\n\tuniform vec3 u_diffuseSH[9];\n\tuniform float u_diffuseExp;\n\tuniform sampler2D u_specularEnvMap;\n\tuniform float u_specularExp;\n\tuniform float u_specularEnvMapMipCount;\n#endif\n\n\n#ifdef WX_RECEIVE_SHADOW\n\tuniform float u_shadowStrength;\n\tuniform float u_shadowBias;\n\tuniform vec3 u_shadowColor;\n\tuniform sampler2D u_shadowMap;\n\n\tuniform mat4 u_csmLightSpaceMatrices[4];\n\tuniform vec4 u_csmFarBounds;\n\tuniform vec4 u_shadowTilingOffsets[4];\n#endif\n\n// ----- Start Func -----\n\n#ifdef WX_USE_SHEEN\n\t// https://github.com/google/filament/blob/master/shaders/src/brdf.fs\n\tfloat D_Charlie( float roughness, float dotNH ) {\n\n\t\tfloat alpha = pow2( roughness );\n\n\t\t// Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\"\n\t\tfloat invAlpha = 1.0 / alpha;\n\t\tfloat cos2h = dotNH * dotNH;\n\t\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 ); // 2^(-14/2), so sin2h^2 > 0 in fp16\n\n\t\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n\n\t}\n\n\t// https://github.com/google/filament/blob/master/shaders/src/brdf.fs\n\tfloat V_Neubelt( float dotNV, float dotNL ) {\n\n\t\t// Neubelt and Pettineo 2013, \"Crafting a Next-gen Material Pipeline for The Order: 1886\"\n\t\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n\n\t}\n\n\tvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\n\t\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\t\tfloat V = V_Neubelt( dotNV, dotNL );\n\n\t\treturn sheenColor * ( D * V );\n\n\t}\n\n\t// This is a curve-fit approxmation to the \"Charlie sheen\" BRDF integrated over the hemisphere from \n\t// Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\". The analysis can be found\n\t// in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing\n\tfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\n\t\tfloat r2 = roughness * roughness;\n\n\t\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\n\t\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\n\t\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\n\t\treturn saturate( DG * RECIPROCAL_PI );\n\n\t}\n\n#endif\n\n#ifdef WX_USE_TRANSMISSION\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior,  mat4 modelMatrix ) {\n\t\t// Direction of refracted light.\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length(vec3(modelMatrix[0].xyz));\n\t\tmodelScale.y = length(vec3(modelMatrix[1].xyz));\n\t\tmodelScale.z = length(vec3(modelMatrix[2].xyz));\n\n\t\t// The thickness is specified in local space.\n\t\treturn normalize( refractionVector ) * modelScale * thickness;\n\t}\n\n\tvec3 getIBLVolumeRefractionVec (const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position,  mat4 modelMatrix) {\n\t\t\t\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay(n, v, 1.0, 1.0, modelMatrix);\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\n\t\t\treturn refractedRayExit;\n\t}\n\n\tfloat getRangeAttenuation(float range, float distance)\n\t{\n\t\t// negative range means infinite\n\t\t\tif (range <= 0.0)\n\t\t\t{\n\t\t\t\t\treturn 1.0 / pow(distance, 2.0);\n\t\t\t}\n\t\t\treturn max(min(1.0 - pow(distance / range, 4.0), 1.0), 0.0) / pow(distance, 2.0);\n\t}\n\n\tfloat getSpotAttenuation(vec3 pointToLight, vec3 spotDirection, float outerConeCos, float innerConeCos)\n\t{\n\t\t\tfloat actualCos = dot(normalize(spotDirection), normalize(-pointToLight));\n\t\t\tif (actualCos > outerConeCos)\n\t\t\t{\n\t\t\t\t\tif (actualCos < innerConeCos)\n\t\t\t\t\t{\n\t\t\t\t\t\t\treturn smoothstep(outerConeCos, innerConeCos, actualCos);\n\t\t\t\t\t}\n\t\t\t\t\treturn 1.0;\n\t\t\t}\n\t\t\treturn 0.0;\n\t}\n\n\tvec3 getLightIntensity(vec4 sourceLight, vec3 pointToLight, vec3 color, vec3 direction, float intensity)\n\t{\n\t\tfloat rangeAttenuation = 1.0;\n\t\t\tfloat spotAttenuation = 1.0;\n\t\t\tif (sourceLight.x != 0.0)\n\t\t\t{\n\t\t\t\t\trangeAttenuation = getRangeAttenuation(sourceLight.y, length(pointToLight));\n\t\t\t}\n\t\t\tif (sourceLight.x == 2.0)\n\t\t\t{\n\t\t\t\t\tspotAttenuation = getSpotAttenuation(pointToLight, direction, sourceLight.w, sourceLight.z);\n\t\t\t}\n\t\t\treturn rangeAttenuation * spotAttenuation * color * intensity;\n\t\t//return sourceLight.color;\n\t}\n\n\tfloat iorToRoughness(float roughness, float ior)\n\t{\n\t\t\t// an IOR of 1.0 results in no microfacet refraction\n\t\t\t// an IOR of 1.5 results in the default amount of microfacet refraction.\n\t\t\treturn roughness * clamp(ior * 2.0 - 2.0, 0.0, 1.0);\n\t}\n\n\tvec3 getPunctualTransmissionIntensity( const in vec3 lightDir, const in vec3 view, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness, const in vec3 baseColor, const in float ior )\n\t{\n\n\t\tfloat alphaRoughness = pow2( roughness ); \n\t\tfloat tranmissionRoughness = iorToRoughness(alphaRoughness, ior);\n\t\tvec3 normalDir = normalize( normal );\n\t\tvec3 viewDir = normalize( view );\n\t\tvec3 lightDirMirror = normalize(lightDir + 2.0 * normalDir * dot(-lightDir, normalDir));\n\t\tvec3 halfDir = normalize( lightDirMirror + viewDir );\n\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\n\t\tfloat V = V_GGX_SmithCorrelated( alphaRoughness, dotNL, dotNV );\n\n\t\tfloat D = D_GGX( alphaRoughness, dotNH );\n\n\t\treturn (1.0 - F) * baseColor * D * V;\n\t}\n#endif\n// ----- end Func -----\n\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\n\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t// based upon Frostbite 3 Moving to Physically-based Rendering\n\t// page 32, equation 26: E[window1]\n\t// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n}\n\nvoid Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\n\tvec3 irradiance = dotNL * directLight.color;\n\n\tvec3 brdf = BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\n\tvec3 irradianceBRDF = irradiance * brdf;\n\n\t// TODO fix brdf too big or too small\n\tirradianceBRDF = vec3(saturate(irradianceBRDF.x), saturate(irradianceBRDF.y), saturate(irradianceBRDF.z));\n\n\t#ifdef WX_USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\n\t#ifdef WX_USE_SHEEN\n\t\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\n\treflectedLight.directSpecular += irradianceBRDF;\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\t\n\t// reflectedLight.directDiffuse += irradiance;\n\t// reflectedLight.directDiffuse += vec3(dotNL, dotNL, dotNL);\n\t// reflectedLight.directDiffuse += geometry.normal;\n\t// reflectedLight.directDiffuse += directLight.direction;\n}\n\nvoid IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n\nvoid IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef WX_USE_BRDFLUT\n\t\tfloat dotNV = clamp( dot(geometry.normal, geometry.viewDir), 0.001, 0.999);\n\t\t// @Fix change (1.0 - material.roughness) to (material.roughness), for using u_brdfLUT that is Y filp.\n\t\t// @Fix texture2D(u_brdfLUT, vec2(0.0, 1.0)) has Wrong Return. g is 65.\n\t\tvec3 brdf = texture2D(u_brdfLUT, vec2(dotNV, clamp(material.roughness, 0.001, 0.999))).rgb;\n\t\treflectedLight.indirectSpecular += radiance * (material.specularColor * brdf.x + brdf.y);\n\t\treflectedLight.indirectDiffuse += irradiance * material.diffuseColor;\n\n\t\t#ifdef WX_USE_CLEARCOAT\n\t\t\t\tclearcoatSpecular += clearcoatRadiance * (material.specularColor * brdf.x + brdf.y);\n\t\t#endif\n\n\t\t#ifdef WX_USE_SHEEN\n\t\t\t\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\n\t\t\t\t// sheenSpecular += irradiance;\n\t\t#endif\n\t#else\n\t\t// Both indirect specular and indirect diffuse light accumulate here\n\t\tvec3 singleScattering = vec3( 0.0 );\n\t\tvec3 multiScattering = vec3( 0.0 );\n\t\tvec3 cosineWeightedIrradiance = irradiance;\n\n\t\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\n\t\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\n\t\treflectedLight.indirectSpecular += radiance * singleScattering;\n\t\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\n\t\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n\n\t\t#ifdef WX_USE_CLEARCOAT\n\t\t\t\tclearcoatSpecular += clearcoatRadiance * singleScattering;\n\t\t#endif\n\n\t\t#ifdef WX_USE_SHEEN\n\t\t\t\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\n\t\t#endif\n\n\t#endif\n}\n\nvec3 getIBLRadiance(vec3 viewDir, vec3 normal, float roughness, mat3 envRotationY) {\n\tfloat u_specularEnvIntensity = 1.0;\n\n    vec3 reflectVec = reflect( - viewDir, normal );\n\n    // Mixing the reflection with the normal is more accurate and keeps rough objects from gathering light from behind their tangent plane.\n    reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\n    reflectVec = inverseTransformDirection( reflectVec, u_view );\n\n\treflectVec = reflectVec * envRotationY;\n\n    #ifdef WX_USE_SPECULAR_MIPMAPS\n        float mipCount = 7.0;\n\n        float mip = clamp(roughness * mipCount * 1.5, 0.0, mipCount);\n        float mipF = fract( mip );\n\t\t    float mipInt = floor( mip );\n        float mipBig = clamp(mipInt + 1.0, 0.0, mipCount);\n\n\t\t\t\t#ifdef WX_USE_MAT_ENV\n\t\t\t\t\tvec4 specularEnvMapInt = textureEnvMapIncludeMipmapsLod(u_specularEnvMapMat, reflectVec, mipInt);\n\t\t\t\t\tvec4 specularEnvMapBig = textureEnvMapIncludeMipmapsLod(u_specularEnvMapMat, reflectVec, mipBig);\n\t\t\t\t#else\n\t\t\t\t\tvec4 specularEnvMapInt = textureEnvMapIncludeMipmapsLod(u_specularEnvMap, reflectVec, mipInt);\n\t\t\t\t\tvec4 specularEnvMapBig = textureEnvMapIncludeMipmapsLod(u_specularEnvMap, reflectVec, mipBig);\n\t\t\t\t#endif\n\n        vec4 specularEnvMap = mix(specularEnvMapInt, specularEnvMapBig, mipF);\n\n    #else\n\t\t\t\t#ifdef WX_USE_MAT_ENV\n\t\t\t\t\tvec4 specularEnvMap = textureBilinearEnvMap(u_specularEnvMapMat, reflectVec, roughness);\n\t\t\t\t#else\n\t\t\t\t\tvec4 specularEnvMap = textureBilinearEnvMap(u_specularEnvMap, reflectVec, roughness);\n\t\t\t\t#endif\n    #endif\n\n    #ifdef WX_USE_SPECULAR_RGBD\n        vec3 specularLight = decodeRGBD(specularEnvMap);\n    #else\n        vec3 specularLight = specularEnvMap.rgb;\n        specularLight = removeGammaCorrection(specularLight);\n    #endif\n\n    return specularLight * u_specularEnvIntensity;\n}\n\n#ifdef WX_RECEIVE_SHADOW\n\tfloat unpackDepth(const in vec4 rgbaDepth)\n\t{\n\t\tvec4 bitShift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n\t\tfloat depth = dot(rgbaDepth, bitShift);\n\t\treturn depth;\n\t}\n\n\tfloat shadowCalculation(vec3 posWorld) {\n\t\tfloat srcShadow = 1.0;\n\n\t\tvec4 shadowCoord = u_csmLightSpaceMatrices[0] * vec4(posWorld, 1.0);\n\t\tshadowCoord.xyz = shadowCoord.xyz / shadowCoord.w;\n\t\tshadowCoord = shadowCoord * 0.5 + 0.5;\n\t\tshadowCoord.z = shadowCoord.z + step(shadowCoord.x, 0.001) + step(shadowCoord.y, 0.001) + step(0.999, shadowCoord.x) + step(0.999, shadowCoord.y);\n\t\tshadowCoord.xy = shadowCoord.xy * u_shadowTilingOffsets[0].xy + u_shadowTilingOffsets[0].zw;\n\n\t\tif (shadowCoord.z > 1.0)\n\t\t{\n\t\t\tshadowCoord.z = 1.0;\n\t\t}\n\n\t\tfloat currentDepth = shadowCoord.z;\n\n\t\tfloat bias = u_shadowBias;\n\t\tfloat zRef = currentDepth - bias;\n\n\t\tfloat sourceVal = float(zRef < unpackDepth(texture2D(u_shadowMap, shadowCoord.xy)));\n\t\tsrcShadow = sourceVal;\n\n\t\treturn srcShadow;\n\t\t\n\t\t// return unpackDepth(texture2D(u_shadowMap, shadowCoord.xy));\n\t}\n#endif\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/toon-shader/common.js",
    "content": "export default\n/* glsl */\n`\n#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#define EPSILON_ATAN 1e-2\n\n#define WX_MANUAL_SRGB true\n#define WX_SRGB_FAST_APPROXIMATION true\n\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\n\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n\tvec3 clearcoatNormal;\n};\n\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\n\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n\nuniform vec4 u_ambientLightColorIns;\nuniform vec3 u_mainLightDir;\nuniform vec4 u_mainLightColorIns;\n\nuniform vec3 u_addLightsPos[4];\nuniform vec3 u_addLightsDir[4];\nuniform vec4 u_addLightsColorIns[4];\nuniform vec4 u_addLightsInfo[4];\n\n\nvec4 SRGBtoLINEAR(vec4 srgbIn)\n{\n#ifdef WX_MANUAL_SRGB\n\n    #ifdef WX_SRGB_FAST_APPROXIMATION\n        vec3 linOut = pow(srgbIn.xyz,vec3(2.2));\n    #else //SRGB_FAST_APPROXIMATION\n        vec3 bLess = step(vec3(0.04045),srgbIn.xyz);\n        vec3 linOut = mix( srgbIn.xyz/vec3(12.92), pow((srgbIn.xyz+vec3(0.055))/vec3(1.055),vec3(2.4)), bLess );\n    #endif //SRGB_FAST_APPROXIMATION\n\n    return vec4(linOut, srgbIn.w);;\n\n#else //MANUAL_SRGB\n    \n    return srgbIn;\n\n#endif //MANUAL_SRGB\n}\n\nvec3 gammaCorrection(vec3 color) {\n  return pow(color, vec3(1.0 / 2.2));\n}\n\nvec3 removeGammaCorrection(vec3 color) {\n  return pow(color, vec3(2.2));\n}\n\n\n// https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Vendor/EXT_lights_image_based/README.md#rgbd\nvec3 decodeRGBD(in vec4 color){\n\t\treturn color.rgb / color.a;\n}\n\nfloat getFace( vec3 direction ) {\n\tvec3 absDirection = abs( direction );\n\tfloat face = - 1.0;\n\tif ( absDirection.x > absDirection.z ) {\n\t\tif ( absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t} else {\n\t\tif ( absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t}\n\treturn face;\n}\nvec2 getUV( vec3 direction, float face ) {\n\tvec2 uv;\n\tif ( face == 0.0 ) {\n\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x ); // pos x\n\t} else if ( face == 1.0 ) {\n\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y ); // pos y\n\t} else if ( face == 2.0 ) {\n\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z ); // pos z\n\t} else if ( face == 3.0 ) {\n\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x ); // neg x\n\t} else if ( face == 4.0 ) {\n\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y ); // neg y\n\t} else {\n\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z ); // neg z\n\t}\n\treturn 0.5 * ( uv + 1.0 );\n}\n\n\nvec4 textureEnvMap(sampler2D texture, vec3 position){\n\treturn texture2D(texture, vec2(atan(position.x, position.z) * RECIPROCAL_PI * 0.5+0.5,  acos(position.y) * RECIPROCAL_PI));\n}\n\nvec4 textureEnvMapIncludeMipmapsLod(sampler2D texture, vec3 position, float lod){\n\tlod = floor(lod);\n\n\tif (lod > 7.0) {\n\t\tlod = 7.0;\n\t}\n\n\tfloat posZ = abs(position.z) < EPSILON_ATAN ? EPSILON_ATAN : position.z;\n\n\tvec2 uv = vec2(atan(position.x, posZ) * RECIPROCAL_PI * 0.5 + 0.5, acos(position.y) * RECIPROCAL_PI);\n\n\tfloat scale = pow(2.0, lod);\n\n\treturn texture2D(texture, vec2(uv.x / scale, (uv.y / scale / 2.0) + 1.0 - 1.0/pow(2.0, lod)));\n\n\treturn vec4( position, 0.0);\n}\n\nvec4 textureBilinearEnvMap(sampler2D texture, vec3 direction, float roughness){\n\n\tfloat uvX = (atan(direction.x, direction.z) ) * RECIPROCAL_PI * 0.5 + 0.5;\n\tfloat uvY = acos(direction.y) * RECIPROCAL_PI;\n\tvec2 uv = vec2(uvX, uvY);\n\tvec4 envmap = texture2D(texture, uv);\n\n\treturn envmap;\n\n}\n\n\nvec3 computeDiffuseSHLight(vec3 normal, in vec3 sh[9]) {\n\treturn sh[0] +\n\t\tsh[1] * (normal.y) +\n\t\tsh[2] * (normal.z) +\n\t\tsh[3] * (normal.x) +\n\t\tsh[4] * (normal.y * normal.x) +\n\t\tsh[5] * (normal.y * normal.z) +\n\t\tsh[6] * ((3.0 * normal.z * normal.z) - 1.0) +\n\t\tsh[7] * (normal.z * normal.x) +\n\t\tsh[8] * (normal.x * normal.x - (normal.y * normal.y));\n}\n\n\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\t// dir can be either a direction vector or a normal vector\n\t// upper-left 3x3 of matrix is assumed to be orthogonal\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\n\n\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/toon-shader/outlineFrag.js",
    "content": "export default\n/* glsl */\n`#version 100\n\nprecision highp float;\nprecision highp int;\n\nuniform float u_gameTime;\nuniform highp mat4 u_world;\nuniform highp mat4 u_view;\nuniform highp mat4 u_projection;\nuniform highp mat4 u_viewInverse;\n\nuniform vec4 u_outlineColor;\n\nvoid main()\n{\n    gl_FragData[0] = u_outlineColor;\n}\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/toon-shader/outlineVert.js",
    "content": "import skinningDefines from './skinningDefine'\n\nexport default\n/* glsl */\n`#version 100\n\nuniform highp mat4 u_view;\nuniform highp mat4 u_viewInverse;\nuniform highp mat4 u_vp;\nuniform highp mat4 u_projection;\nuniform mat4 u_lightSpaceMatrix;\nuniform vec4 u_fogInfos;\nuniform vec3 u_fogColor;\nuniform float u_gameTime;\nuniform float u_aspect;\nuniform vec3 u_ambientLight;\nuniform vec3 u_lightDir;\nuniform vec3 u_lightColor;\nuniform vec3 u_shadowColor;\nuniform float u_shadowStrength;\nuniform float u_shadowBias;\nuniform float u_lightWidthPCSS;\nuniform float u_blockSizePCSS;\nuniform vec4 u_csmFarBounds;\nuniform vec4 u_shadowTilingOffsets[4];\nuniform mat4 u_csmLightSpaceMatrices[4];\nuniform vec3 u_SH[9];\n\nuniform highp mat4 u_world;\n\nuniform float u_outlineWidth;\nuniform float u_farthestDistance;\nuniform float u_nearestDistance;\nuniform float u_offsetZ;\n\n${skinningDefines}\n\nattribute vec3 a_position;\n\n#ifdef WX_USE_NORMAL\n  attribute highp vec3 a_normal;\n#endif\n\nvoid main()\n{\n  #ifdef WX_SKINNED\n      mat4 boneMat = getBoneMat();\n      mat4 modelViewMatrix = u_view * boneMat;\n  #else\n      mat4 modelViewMatrix = u_view * u_world;\n  #endif\n\n  vec4 worldPosition = getSkinningWorldPosition(vec4(a_position, 1.0));\n  vec3 cameraPosWS = vec3(u_viewInverse[3][0], u_viewInverse[3][1], u_viewInverse[3][2]);\n\n  vec4 posCS = u_projection *  u_view * worldPosition;\n\n  vec3 zeroWS = (u_projection * u_view * getSkinningWorldPosition(vec4(0, 0, 0, 1))).xyz;\n\n  float objectDistanceToCamera = distance(zeroWS, cameraPosWS);\n  float outlineWidth = 0.01 * u_outlineWidth * smoothstep(u_farthestDistance, u_nearestDistance, objectDistanceToCamera);\n  \n  vec3 normalCS = mat3(u_projection) * (mat3(u_view) * (mat3(u_world) * a_normal));\n\n  gl_Position = vec4(posCS.xy + outlineWidth * normalCS.xy, posCS.zw);\n\n  float offsetZ = u_offsetZ * (- 0.01);\n  vec4 cameraPosCS = u_projection * u_view * vec4(cameraPosWS.xyz, 1);\n\n  gl_Position.z = gl_Position.z + offsetZ * cameraPosCS.z;\n}\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/toon-shader/skinningDefine.js",
    "content": "export default\n/* glsl */\n`\n#ifdef WX_SKINNED\nattribute highp vec4 a_boneIndices;\nattribute highp vec4 a_weights;\n  #ifdef WX_USE_BONE_MATRIX_TEXTURE\n    // #ifndef WX_BONE_SAMPLER_HELPER\n    // 请不要这样写，在部分安卓机上会出错，比如MTK、麒麟的设备很容易出现\n    // #define WX_BONE_SAMPLER_HELPER(row, col) \\\n    //   texture2D(u_boneMatrixTexture, vec2((col) / 4.0, (row) / float(WX_BONE_NUM)))\n    // #endif\n  uniform sampler2D u_boneMatrixTexture;\n  mat4 sampleFromBoneMatrixTexture(float index) {\n    float row = index + 0.5;\n    float col = 0.5;\n    return mat4(\n      texture2D(u_boneMatrixTexture, vec2((col + .0) / 4.0, (row) / float(WX_BONE_NUM))),\n      texture2D(u_boneMatrixTexture, vec2((col + 1.0) / 4.0, (row) / float(WX_BONE_NUM))),\n      texture2D(u_boneMatrixTexture, vec2((col + 2.0) / 4.0, (row) / float(WX_BONE_NUM))),\n      texture2D(u_boneMatrixTexture, vec2((col + 3.0) / 4.0, (row) / float(WX_BONE_NUM)))\n    );\n  }\n  #else\n  uniform mat4 u_boneOffsetMatrix[WX_BONE_NUM];\n  #endif // WX_USE_BONE_MATRIX_TEXTURE\n#endif // WX_SKINNED\n\n#ifdef WX_SKINNED\nmat4 getBoneMat() {\n  #ifdef WX_USE_BONE_MATRIX_TEXTURE\n  mat4 boneMatX = sampleFromBoneMatrixTexture(a_boneIndices.x);\n  mat4 boneMatY = sampleFromBoneMatrixTexture(a_boneIndices.y);\n  mat4 boneMatZ = sampleFromBoneMatrixTexture(a_boneIndices.z);\n  mat4 boneMatW = sampleFromBoneMatrixTexture(a_boneIndices.w);\n  #else\n  mat4 boneMatX = u_boneOffsetMatrix[int(a_boneIndices.x)];\n  mat4 boneMatY = u_boneOffsetMatrix[int(a_boneIndices.y)];\n  mat4 boneMatZ = u_boneOffsetMatrix[int(a_boneIndices.z)];\n  mat4 boneMatW = u_boneOffsetMatrix[int(a_boneIndices.w)];\n  #endif // WX_USE_BONE_MATRIX_TEXTURE\n  mat4 boneMat = a_weights.x * boneMatX + a_weights.y * boneMatY + a_weights.z * boneMatZ + a_weights.w * boneMatW;\n  return boneMat;\n}\n#endif // WX_SKINNED\n\nvec4 getSkinningWorldPosition(vec4 origin) {\n#ifdef WX_SKINNED\n    return getBoneMat() * origin;\n#else\n    return u_world * origin;\n#endif // WX_SKINNED\n}\n\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/toon-shader/toonFrag.js",
    "content": "import common from './common'\n\nconst toonInfo = `\nuniform highp vec4 u_baseColorFactor;\n\nuniform sampler2D u_baseColorMap;\n\nuniform sampler2D u_gradientMap;\n\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\n\nvec3 diffuse = vec3( 1.0 );\nfloat opacity = 1.0;\n\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\n\treturn RECIPROCAL_PI * diffuseColor;\n\n} // validated\n\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t// dotNL will be from -1.0 to 1.0\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\n\treturn vec3( texture2D( u_gradientMap, coord ).r );\n}\n\nvoid Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\n    vec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n\nvoid IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\n}\n`\n\nexport default\n/* glsl */\n`#version 100\n\nprecision highp float;\nprecision highp int;\n\nuniform float u_gameTime;\nuniform highp mat4 u_world;\nuniform highp mat4 u_view;\nuniform highp mat4 u_projection;\nuniform highp mat4 u_viewInverse;\n\nvarying highp vec2 v_UV;\nvarying highp vec2 v_UV1;\nvarying highp vec3 v_ViewPosition;\n\n#ifdef WX_USE_NORMAL\n  varying highp vec3 v_Normal;\n#endif\n\n${common}\n\n${toonInfo}\n\nvoid main()\n{\n    vec4 diffuseColor = vec4( diffuse, opacity );\n\n    // ReflectedLight\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n    \n    // Emissive\n    vec3 totalEmissiveRadiance = vec3(0.0);\n\n#ifdef WX_USE_BASECOLORMAP\n    #ifdef WX_BASECOLORMAP_USE_UV1\n      vec2 uvBaseColor = v_UV1;\n    #elif defined(WX_BASECOLORMAP_USE_UV2)\n      vec2 uvBaseColor = v_UV2;\n    #elif defined(WX_BASECOLORMAP_USE_UV3)\n      vec2 uvBaseColor = v_UV3;\n    #else\n      vec2 uvBaseColor = v_UV;\n    #endif\n\n    vec4 baseColor = texture2D(u_baseColorMap, uvBaseColor) * u_baseColorFactor;\n#else\n    vec4 baseColor = u_baseColorFactor;\n#endif\n\n// Normal\n#ifdef WX_USE_NORMAL\n    vec3 normal = normalize(v_Normal);\n#else\n    vec3 normal = vec3(0.0, 0.0, 1.0);\n#endif\n\n    // Accumulation\n    ToonMaterial material;\n    material.diffuseColor = diffuseColor.rgb;\n\n    GeometricContext geometry;\n\n    geometry.position = v_ViewPosition;\n    geometry.normal = normal;\n    geometry.viewDir = normalize( vec3(0.0) - v_ViewPosition );\n\n    // AddLights\n#ifdef WX_USE_ADD_LIGHTS\n    for(int i = 0; i < WX_ADD_LIGHTS_COUNT; ++i)\n    {\n    }\n#endif\n\n    vec3 color = baseColor.rgb;\n\n    \n    // color = (v_Normal + vec3(1.0, 1.0, 1.0)) / 2.0;\n\n    gl_FragData[0] = vec4(color, 1.0);\n}\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/assets/toon-shader/toonVert.js",
    "content": "import skinningDefines from './skinningDefine'\n\nexport default\n/* glsl */\n`#version 100\n\nuniform highp mat4 u_view;\nuniform highp mat4 u_viewInverse;\nuniform highp mat4 u_vp;\nuniform highp mat4 u_projection;\nuniform mat4 u_lightSpaceMatrix;\nuniform vec4 u_fogInfos;\nuniform vec3 u_fogColor;\nuniform float u_gameTime;\nuniform float u_aspect;\nuniform vec3 u_ambientLight;\nuniform vec3 u_lightDir;\nuniform vec3 u_lightColor;\nuniform vec3 u_shadowColor;\nuniform float u_shadowStrength;\nuniform float u_shadowBias;\nuniform float u_lightWidthPCSS;\nuniform float u_blockSizePCSS;\nuniform vec4 u_csmFarBounds;\nuniform vec4 u_shadowTilingOffsets[4];\nuniform mat4 u_csmLightSpaceMatrices[4];\nuniform vec3 u_SH[9];\n\nuniform highp mat4 u_world;\n\n${skinningDefines}\n\nattribute vec3 a_position;\nattribute highp vec2 a_texCoord;\nattribute highp vec2 a_texCoord_1;\n\nvarying highp vec2 v_UV;\nvarying highp vec2 v_UV1;\nvarying highp vec3 v_ViewPosition;\n\n#ifdef WX_USE_COLOR_0\n    attribute vec3 a_color;\n    varying highp vec3 v_Color;\n#endif\n\n#ifdef WX_USE_NORMAL\n    attribute highp vec3 a_normal;\n    varying highp vec3 v_Normal;\n#endif\n\nvoid main()\n{\n#ifdef WX_SKINNED\n    mat4 boneMat = getBoneMat();\n    mat4 modelViewMatrix = u_view * boneMat;\n#else\n    mat4 modelViewMatrix = u_view * u_world;\n#endif\n    mat3 normalMatrix = mat3(modelViewMatrix);\n    vec4 mvPosition = modelViewMatrix * vec4(a_position, 1.0);\n\n    v_UV = a_texCoord;\n    v_UV1 = a_texCoord_1;\n\n#ifdef WX_USE_COLOR_0\n    v_Color = a_color;\n#endif\n\n#ifdef WX_USE_NORMAL\n    // v_Normal = normalize(vec3(normalMatrix * a_normal));\n    v_Normal = normalize(a_normal);\n\n#endif\n\n    v_ViewPosition = mvPosition.xyz;\n\n    gl_Position = u_projection * mvPosition;\n}\n`\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/AutoRotate.ts",
    "content": "import XrFrame from 'XrFrame';\nconst xrFrameSystem = wx.getXrFrameSystem();\n\nexport interface IAutoRotateData {\n  speed: number[];\n}\n\nconst AutoRotateSchema: XrFrame.IComponentSchema = {\n  speed: {type: 'number-array', defaultValue: [1, 1, 1]}\n}\n\nxrFrameSystem.registerComponent('auto-rotate', class AutoRotate extends xrFrameSystem.Component<IAutoRotateData> {\n  public readonly schema: XrFrame.IComponentSchema = AutoRotateSchema;\n\n  private _speedX: number = 1;\n  private _speedY: number = 1;\n  private _speedZ: number = 1;\n\n  public onAdd(parent: XrFrame.Element, data: IAutoRotateData): void {\n    this._processData(data);\n  }\n\n  public onUpdate(data: IAutoRotateData, preData: IAutoRotateData): void {\n    this._processData(data);\n  }\n\n  public onTick(delta: number, data: IAutoRotateData) {\n    const trs = this.el.getComponent(xrFrameSystem.Transform);\n    if (!trs) {\n      return;\n    }\n\n    trs.rotation.x += this._speedX * 0.1;\n    trs.rotation.y += this._speedY * 0.1;\n    trs.rotation.z += this._speedZ * 0.1;\n  }\n\n  public onRemove(parent: XrFrame.Element, data: IAutoRotateData): void {\n\n  }\n\n  private _processData(data: IAutoRotateData) {\n    this._speedX = data.speed?.[0] !== undefined ? data.speed[0] : 1;\n    this._speedY = data.speed?.[1] !== undefined ? data.speed[1] : 1;\n    this._speedZ = data.speed?.[2] !== undefined ? data.speed[2] : 1;\n  }\n});\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/Shape/BasicShapeEmitter.ts",
    "content": "import XrFrame from 'XrFrame';\nconst xrFrameSystem = wx.getXrFrameSystem();\n\n// 控制发射器形态的基础类\nexport abstract class BasicShapeEmitter {\n    /**\n     * keep normalized length\n     */\n    direction?: XrFrame.Vector3;\n    /**\n     * keep normalized length\n     */\n    direction2?: XrFrame.Vector3;\n    // 继承实现后，获取粒子初始的发射方向\n    abstract startDirection(worldMatrix: XrFrame.Matrix4, direction: XrFrame.Vector3, ...args: any[]): void;\n    // 继承实现后，获取粒子初始的发射位置\n    abstract startPosition(worldMatrix: XrFrame.Matrix4, position: XrFrame.Vector3, ...args: any[]): void;\n    // 继承后，用于自行定制粒子轨迹的变化规律\n    processInstance?(instance: ParticleInstance, deltaTime: number): void;\n    // 设置该形态发射器的各项属性\n    setProperty(properties) {\n        properties?.forEach(([key, v]) => {\n            switch (typeof (this[key])) {\n                case \"number\":\n                    this[key] = parseFloat(v);\n                    break;\n                //一般为vector3\n                case \"object\":\n                    var stringArray = v.split(' ')\n                    this[key] = xrFrameSystem.Vector3.createFromNumber(parseFloat(stringArray[0]), parseFloat(stringArray[1]), parseFloat(stringArray[2]))\n                    break;\n            }\n        })\n    }\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/Shape/BoxShapeEmitter.ts",
    "content": "\nimport { BasicShapeEmitter } from './BasicShapeEmitter'\n\nconst xrFrameSystem = wx.getXrFrameSystem();\n\n// 返回v1到v2间的随机值\nfunction randomBetween(v1, v2, randomSeed = Math.random()) {\n    if (v1 === v2) {\n        return v1;\n    } else {\n        return randomSeed * Math.abs(v1 - v2) + Math.min(v1, v2);\n    }\n};\n\n// 控制粒子在箱型区域内进行发射\nexport default class BoxShapeEmitter extends BasicShapeEmitter {\n    public direction: xrFrameSystem.Vector3;\n    public direction2: xrFrameSystem.Vector3;\n    // 箱型区域的坐标起始点\n    public minEmitBox: xrFrameSystem.Vector3;\n    // 箱型区域的坐标终点\n    public maxEmitBox: xrFrameSystem.Vector3;\n\n    constructor() {\n        super();\n        this.direction = xrFrameSystem.Vector3.createFromNumber(0, 1.0, 0);\n        this.direction2 = xrFrameSystem.Vector3.createFromNumber(0, 1.0, 0);\n        this.minEmitBox = xrFrameSystem.Vector3.createFromNumber(-0.5, -0.5, -0.5);\n        this.maxEmitBox = xrFrameSystem.Vector3.createFromNumber(0.5, 0.5, 0.5);\n    }\n\n    // 决定粒子起始的运动方向\n    public startDirection(worldMatrix, direction) {\n        var randX = randomBetween(this.direction.x, this.direction2.x);\n        var randY = randomBetween(this.direction.y, this.direction2.y);\n        var randZ = randomBetween(this.direction.z, this.direction2.z);\n        var temp = xrFrameSystem.Vector3.createFromNumber(randX, randY, randZ);\n        direction.set(temp.normalize().transformDirection(worldMatrix));\n    }\n\n    // 决定粒子起始的运动位置\n    public startPosition(worldMatrix, position: xrFrameSystem.Vector3) {\n        var randX = randomBetween(this.minEmitBox.x, this.maxEmitBox.x);\n        var randY = randomBetween(this.minEmitBox.y, this.maxEmitBox.y);\n        var randZ = randomBetween(this.minEmitBox.z, this.maxEmitBox.z);\n        var temp = xrFrameSystem.Vector3.createFromNumber(randX, randY, randZ);\n        position.set(temp.applyMatrix4(worldMatrix));\n    }\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/Shape/PointShapeEmitter.ts",
    "content": "import { BasicShapeEmitter } from './BasicShapeEmitter'\n\nconst xrFrameSystem = wx.getXrFrameSystem();\n\nfunction randomBetween(v1, v2, randomSeed = Math.random()) {\n    if (v1 === v2) {\n        return v1;\n    } else {\n        return randomSeed * Math.abs(v1 - v2) + Math.min(v1, v2);\n    }\n};\n\n// 控制粒子以原点为中心向外发射\nexport default class PointShapeEmitter extends BasicShapeEmitter {\n\n    /**\n     * 粒子运动方向左区间。\n     */\n    public direction: xrFrameSystem.Vector3;\n\n    /**\n   * 粒子运动方向右区间。\n   */\n    public direction2: xrFrameSystem.Vector3;\n\n    constructor() {\n        super();\n        this.direction = xrFrameSystem.Vector3.createFromNumber(0, 1.0, 0);\n        this.direction2 = xrFrameSystem.Vector3.createFromNumber(0, 1.0, 0);\n    }\n\n    // 粒子起始发射方向\n    public startDirection(worldMatrix: xrFrameSystem.Matrix4, direction: xrFrameSystem.Vector3) {\n        var randX = randomBetween(this.direction.x, this.direction2.x);\n        var randY = randomBetween(this.direction.y, this.direction2.y);\n        var randZ = randomBetween(this.direction.z, this.direction2.z);\n        var temp = xrFrameSystem.Vector3.createFromNumber(randX, randY, randZ);\n        direction.set(temp.normalize().transformDirection(worldMatrix));\n    }\n\n    // 粒子起始发射位置\n    public startPosition(worldMatrix: xrFrameSystem.Matrix4, position: xrFrameSystem.Vector3) {\n        position.set(xrFrameSystem.Vector3.createFromNumber(0, 0, 0).applyMatrix4(worldMatrix));\n    }\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/Shape/SphereShapeEmitter.ts",
    "content": "import { BasicShapeEmitter } from './BasicShapeEmitter'\n\nconst xrFrameSystem = wx.getXrFrameSystem();\n\nfunction randomBetween(v1, v2, randomSeed = Math.random()) {\n    if (v1 === v2) {\n        return v1;\n    } else {\n        return randomSeed * Math.abs(v1 - v2) + Math.min(v1, v2);\n    }\n};\n\n// 控制粒子以球型区域向外发射\nexport default class SphereShapeEmitter extends BasicShapeEmitter {\n    /**\n    * 球形半径\n    */\n    public radius: number;\n    /**\n     * 球形区域覆盖范围[0-1]\n     */\n    public radiusRange: number;\n    /**\n     * 粒子在球形内生成的角度区间[0-360]\n     */\n    public arc: number;\n    /**\n     * 粒子运动方向偏离程度[0-1]\n     */\n    public randomizeDirection: number;\n\n    constructor() {\n        super();\n        this.radius = 3;\n        this.radiusRange = 0;\n        this.arc = 360;\n        this.randomizeDirection = 0;\n    }\n\n    public startDirection(worldMatrix: xrFrameSystem.Matrix4, direction: xrFrameSystem.Vector3, position: xrFrameSystem.Vector3) {\n        var centerVec = xrFrameSystem.Vector3.createFromNumber(worldMatrix.getValue(3, 0), worldMatrix.getValue(3, 1), worldMatrix.getValue(3, 2));\n        var tempDirection = position.sub(centerVec).normalize();\n        var randX = randomBetween(0, this.randomizeDirection);\n        var randY = randomBetween(0, this.randomizeDirection);\n        var randZ = randomBetween(0, this.randomizeDirection);\n        var temp = xrFrameSystem.Vector3.createFromNumber(randX, randY, randZ);\n        direction.set(tempDirection.add(temp).normalize().transformDirection(worldMatrix));\n    }\n\n\n    public startPosition(worldMatrix: xrFrameSystem.Matrix4, position: xrFrameSystem.Vector3) {\n        var randRadius = this.radius - randomBetween(0, this.radius * this.radiusRange);\n        var cosV = randomBetween(0, 1);\n        var phi = randomBetween(0, this.arc / 360 * 2 * Math.PI);\n        var theta = Math.acos(2 * cosV - 1);\n        var randX = randRadius * Math.cos(phi) * Math.sin(theta);\n        var randY = randRadius * Math.cos(theta);\n        var randZ = randRadius * Math.sin(phi) * Math.sin(theta);\n        var temp = xrFrameSystem.Vector3.createFromNumber(randX, randY, randZ);\n        position.set(temp.applyMatrix4(worldMatrix));\n    }\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/Shape/emitter.ts",
    "content": "import PointShapeEmitter from './PointShapeEmitter'\nimport SphereShapeEmitter from './SphereShapeEmitter'\nimport BoxShapeEmitter from './BoxShapeEmitter'\nexport { PointShapeEmitter, SphereShapeEmitter, BoxShapeEmitter }"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/SystemProperty/BasicParticle.ts",
    "content": "\nimport { PointShapeEmitter, SphereShapeEmitter, BoxShapeEmitter } from '../Shape/emitter'\nimport { FactorGradient, BasicGradientMethod, ColorGradient } from '../Util/Gradient'\nimport { IParticleData, ParticleSchema } from './ParticleInterface'\n\nconst xrFrameSystem = wx.getXrFrameSystem();\n\n// 注册粒子系统的effect\nxrFrameSystem.registerEffect('custom-particle-effect', scene => scene.createEffect({\n    name: \"custom-particle-effect\",\n    properties: [{\n        \"key\": 'u_baseColorFactor',\n        \"type\": 3,\n        \"default\": [1, 1, 1, 1]\n    }],\n    images: [{\n        key: 'u_baseColorMap',\n        default: 'white',\n        macro: 'WX_USE_BASECOLORMAP'\n    }, {\n        key: 'u_rampColorMap',\n        default: 'white',\n        macro: 'WX_USE_RAMPCOLORMAP'\n    }],\n    defaultRenderQueue: 3000,\n    passes: [{\n        \"renderStates\": {\n            cullOn: false,\n            blendOn: true,\n            depthWrite: false\n        },\n        lightMode: \"ForwardBase\",\n        useMaterialRenderStates: true,\n        shaders: [0, 1]\n    }],\n    shaders: [`#version 100\n    precision mediump float;\n    uniform highp mat4 u_view;\n    uniform highp mat4 u_projection;\n    uniform highp mat4 u_world;\n    \n    attribute vec3 a_position;\n    attribute highp vec2 a_texCoord;\n    attribute vec3 a_offset;\n    attribute vec4 a_color;\n    attribute float a_angle;\n    \n    #ifdef WX_BILLBOARDMODE_STRETCHED\n        attribute vec3 a_direction;\n        attribute float a_lengthScale;\n    #endif\n    \n    #ifdef WX_USE_RAMPCOLORMAP\n        attribute vec4 a_rampPos;\n    #endif\n    \n    #ifdef WX_SPRITESHEET\n        attribute vec4 a_cellPosition;\n    #endif\n    \n    varying highp vec2 v_Uv;\n    varying highp vec4 v_Color;\n    \n    #ifdef WX_USE_RAMPCOLORMAP\n        varying highp vec4 v_rampData;\n    #endif\n    \n    uniform mat4 u_viewInverse;\n    \n    #ifdef WX_BILLBOARDMODE_Y\n    vec3 rotate(vec3 yaxis,vec3 rotatedOffset) {\n        vec3 xaxis=normalize(cross(vec3(0.,1.0,0.),yaxis));\n        vec3 zaxis=normalize(cross(yaxis,xaxis));\n        vec3 row0=vec3(xaxis.x,xaxis.y,xaxis.z);\n        vec3 row1=vec3(yaxis.x,yaxis.y,yaxis.z);\n        vec3 row2=vec3(zaxis.x,zaxis.y,zaxis.z);\n        mat3 rotMatrix= mat3(row0,row1,row2);\n        vec3 alignedOffset=rotMatrix*rotatedOffset;\n        return alignedOffset;\n    }\n    #endif\n    \n    #ifdef WX_BILLBOARDMODE_STRETCHED\n    vec3 rotateAlign(vec3 toCamera, vec3 rotatedOffset) {\n        vec3 normalizedToCamera = normalize(toCamera);\n        vec3 normalizedCrossVec = normalize(cross(normalize(a_direction), normalizedToCamera));\n        vec3 normalizedCrossResult = normalize(cross(normalizedToCamera, normalizedCrossVec)) * a_lengthScale;\n        vec3 row0 = normalizedCrossVec;\n        vec3 row1 = normalizedCrossResult;\n        vec3 row2 = normalizedToCamera;\n        mat3 rotMatrix = mat3(row0, row1, row2);\n        vec3 alignedOffset = rotMatrix * rotatedOffset;\n        return alignedOffset; \n    }\n    #endif\n    \n    vec3 extractScale(mat4 matrix){\n        vec3 scale;\n        scale.x = length(vec4(matrix[0][0],matrix[0][1],matrix[0][2],matrix[0][3]));\n        scale.y = length(vec4(matrix[1][0],matrix[1][1],matrix[1][2],matrix[1][3]));\n        scale.z = length(vec4(matrix[2][0],matrix[2][1],matrix[2][2],matrix[2][3]));\n        return scale;\n    }\n    \n    void main()\n    {\n    #ifdef WX_SPRITESHEET\n        vec2 uvOffset = vec2(a_texCoord.x * a_cellPosition.z ,a_texCoord.y * a_cellPosition.w);\n        v_Uv = vec2(a_cellPosition.x, a_cellPosition.y) + uvOffset;\n    #else\n        v_Uv = a_texCoord;\n    #endif \n        vec4 localPosition = vec4(a_position, 1.0);\n    \n        vec4 cameraPosition;\n        vec3 rotatedOffset;\n        vec3 viewPos;\n        v_Color = a_color;\n    \n    #ifdef WX_BILLBOARDMODE_Y\n        rotatedOffset.x = a_offset.x * cos(a_angle) - a_offset.y * sin(a_angle);\n        rotatedOffset.z = a_offset.x * sin(a_angle) + a_offset.y * cos(a_angle);\n        rotatedOffset.y = 0.0;\n        vec3 yaxis = a_position - vec3(u_viewInverse[3][0], u_viewInverse[3][1], u_viewInverse[3][2]);\n        yaxis.y = 0.0;\n        vec3 alignedOffset = rotate(yaxis, rotatedOffset);\n        cameraPosition = u_view * u_world * vec4(localPosition.xyz + alignedOffset.xyz, 1.0);\n        viewPos = cameraPosition.xyz;\n    #elif defined(WX_BILLBOARDMODE_STRETCHED)\n        rotatedOffset.x = a_offset.x * cos(a_angle) - a_offset.y * sin(a_angle);\n        rotatedOffset.y = a_offset.x * sin(a_angle) + a_offset.y * cos(a_angle);\n        rotatedOffset.z = 0.0;\n        vec3 toCamera = a_position - vec3(u_viewInverse[3][0], u_viewInverse[3][1], u_viewInverse[3][2]);\n        vec3 alignedOffset = rotateAlign(toCamera, rotatedOffset);\n        cameraPosition = u_view * u_world * vec4(localPosition.xyz + alignedOffset.xyz, 1.0);\n        viewPos = cameraPosition.xyz;\n    #elif defined(WX_BILLBOARD)\n        vec3 scale = extractScale(u_world);\n        rotatedOffset.x = (a_offset.x * cos(a_angle) - a_offset.y * sin(a_angle)) * scale.x;\n        rotatedOffset.y = (a_offset.x * sin(a_angle) + a_offset.y * cos(a_angle)) * scale.y;\n        rotatedOffset.z = 0.0;\n        cameraPosition = u_view * u_world * localPosition + vec4(rotatedOffset, 1.0);\n        viewPos = cameraPosition.xyz;\n    #elif defined(WX_RENDERMESH)\n        rotatedOffset.x = a_offset.x * cos(a_angle) - a_offset.z * sin(a_angle);\n        rotatedOffset.z = a_offset.x * sin(a_angle) + a_offset.z * cos(a_angle);\n        rotatedOffset.y = a_offset.y;\n        cameraPosition = u_view * u_world * vec4(localPosition.xyz + rotatedOffset.xyz, 1.0);\n        viewPos = cameraPosition.xyz;\n    #else\n        rotatedOffset.x = a_offset.x * cos(a_angle) - a_offset.y * sin(a_angle);\n        rotatedOffset.y = a_offset.x * sin(a_angle) + a_offset.y * cos(a_angle);\n        rotatedOffset.z = 0.0;\n        cameraPosition = u_view * u_world * vec4(localPosition.xyz + rotatedOffset.xyz, 1.0);\n        viewPos = cameraPosition.xyz;\n    #endif\n    \n    #ifdef WX_USE_RAMPCOLORMAP\n        v_rampData = a_rampPos;\n    #endif\n        gl_Position = u_projection * vec4(viewPos, 1.0);\n    }`,\n        `#version 100\n    precision mediump float;\n    precision highp int;\n    varying highp vec2 v_Uv;\n    varying highp vec4 v_Color;\n    #ifdef WX_USE_RAMPCOLORMAP\n        varying highp vec4 v_rampData;\n        uniform sampler2D u_rampColorMap;\n    #endif\n    \n    uniform highp vec4 u_baseColorFactor;\n    \n    #ifdef WX_USE_BASECOLORMAP\n        uniform sampler2D u_baseColorMap;\n    #endif\n    \n    void main()\n    {\n        vec4 baseColor;\n        #ifdef WX_USE_BASECOLORMAP\n        vec4 textureColor = texture2D(u_baseColorMap, v_Uv) * u_baseColorFactor;\n        baseColor = textureColor * v_Color;\n        #else\n        baseColor = v_Color;\n        #endif\n    \n        #ifdef WX_USE_RAMPCOLORMAP\n        float alpha=baseColor.a;\n        float remappedIndex=clamp((alpha-v_rampData.x)/v_rampData.y,0.0,1.0);\n        vec4 rampColor = texture2D(u_rampColorMap,vec2(1.0-remappedIndex,0.));\n        baseColor.rgb *= rampColor.rgb;\n        baseColor.a=clamp((alpha*rampColor.a-v_rampData.z)/v_rampData.w,0.0,1.0);\n        #endif\n    \n        #ifdef WX_PP_ACTIVE\n            // removeGammaCorrection\n            gl_FragData[0] = vec4(pow(baseColor.rgb, vec3(2.2)), baseColor.a);\n        #else\n            gl_FragData[0] = baseColor;\n        #endif\n    \n        gl_FragData[0] = baseColor;\n    }  \n        `],\n}));\n\n/**\n * BillBoard渲染模式。\n */\nexport const enum BillBoardMode {\n    BILLBOARDMODE_DEFAULT = 0,\n    BILLBOARDMODE_Y = 1,\n    BILLBOARDMODE_STRETCHED = 2\n}\n\nexport default class BasicParticle extends xrFrameSystem.Component<IParticleData> {\n    public readonly schema: xrFrameSystem.IComponentSchema = ParticleSchema;\n\n    protected _data: IParticleData;\n    // 当前粒子系统所在场景\n    protected particleScene: xrFrameSystem.Scene;\n    // 当前粒子系统的元素\n    protected particleEl: xrFrameSystem.Element;\n    // 现有粒子对象池\n    protected _instances: ParticleInstance[] = new Array<ParticleInstance>();\n    // 粒子对象池\n    protected _stockInstances: ParticleInstance[] = new Array<ParticleInstance>();\n\n    // 粒子总容量\n    protected _capacity: number = 1;\n    // 粒子延时启动的时间\n    protected _delay: number = 0;\n    // 粒子生命周期的更新速率\n    protected _updateSpeed: number = 0.01;\n    // 粒子系统的生命周期\n    protected _stopDuration: number = 0;\n    // 粒子发射速率\n    protected _emitRate: number = 10;\n    // 重力大小\n    protected _gravity: number = 0;\n    protected _preWarmCycles: number = 0;\n    protected _preWarmStepOffset: number = 5;\n    protected _particleEmitterType: string;\n    protected _particleEmitter: BasicShapeEmitter = null;\n    protected _particleEmitterProperties;\n\n    protected particleStride: number;\n    protected particleVertexSize: number;\n    protected byteStride: number;\n    protected ParticleAttributes;\n\n    protected _burstCount: number = 0;\n    protected _burstTime: number = 0;\n    // -1 = Infinity\n    protected _burstCycle: number = -1;\n    // -1 = invalid\n    protected _burstInterval: number = 1;\n\n    protected _burstCountTime: number = 0;\n    protected _burstCountCycle: number = 0;\n    protected _burstCountInterval: number = 0;\n\n    protected _minLifeTime: number = 1;\n    protected _maxLifeTime: number = 1;\n    protected _minScaleX: number = 1;\n    protected _maxScaleX: number = 1;\n    protected _minScaleY: number = 1;\n    protected _maxScaleY: number = 1;\n    protected _minSize: number = 0.3;\n    protected _maxSize: number = 0.3;\n    protected _minSpeed: number = 1;\n    protected _maxSpeed: number = 1;\n    protected _particleLengthScale: number = 1;\n    // the left edge of color at the begin of particle's life cycle\n    protected _startColor: number[] = [1, 1, 1, 1];\n    // the right edge of color at the begin of particle's life cycle\n    protected _startColor2: number[] = null;\n    // the color at the end of particle's life cycle\n    protected _endColor: number[] = null;\n    protected _sizeGradients;\n    protected _alphaGradients;\n    protected _colorRemapGradients;\n    protected _speedScaleGradients;\n    protected _limitSpeedGradients;\n    protected _speedDampenFactor: number;\n    protected _dragGradients;\n\n    protected _useSpriteSheet: boolean = false;\n    protected _startSpriteCellIndex: number = 0;\n    protected _endSpriteCellIndex: number = 0;\n    protected _useRandomSpriteCellIndex: boolean = false;\n    protected _useSpriteCellLoop: boolean = true;\n    protected _spriteChangeSpeed: number = 1;\n    protected _spriteFrameInfo: xrFrameSystem.Vector4[];\n    protected _spriteNameToCellIndex: Map<string, number>;\n\n    protected _textureData: xrFrameSystem.Texture = null;\n    protected _atlasObj: xrFrameSystem.Atlas = null;\n    protected _atlasTexture: xrFrameSystem.Texture;\n\n    protected _mesh: xrFrameSystem.MeshRendererComponent;\n    protected _sourceMaterial: xrFrameSystem.Material;\n    protected _material: xrFrameSystem.Material;\n    protected _trs: xrFrameSystem.Transform;\n\n    protected _renderMesh: Geometry = null;\n    protected _vertexCount: number;\n    protected _vertexData: Float32Array;\n    protected _indexData: UInt32Array;\n    protected _eachIndexSize: number;\n    protected _indexSize: number = 0;\n    protected _vertexSize: number = 0;\n\n    // 默认，粒子使用billboard， 始终面向相机\n    protected _useBillboard: boolean = true;\n    protected _useRenderMesh: boolean = false;\n    protected _billboardMode: number = BillBoardMode.BILLBOARDMODE_DEFAULT;\n    protected _useRampGradients: boolean = false;\n    protected _rampGradients;\n    protected _rampGradientsTexture: xrFrameSystem.Texture;\n    protected _colorGradients;\n    protected _vertexLayoutDirty: boolean = false;\n\n    protected _startAngle: number = 0;\n    protected _startAngle2: number = 0;\n    protected _minAngularSpeed: number = 0;\n    protected _maxAngularSpeed: number = 0;\n\n    protected _subEmitters: any[] = null;\n\n    protected _emitterPosition: xrFrameSystem.Vector3 = xrFrameSystem.Vector3.createFromNumber(0, 0, 0);\n\n    get material() {\n        return this._material;\n    }\n\n    get useBillboard() {\n        return this._useBillboard;\n    }\n\n    set useBillboard(value) {\n        if (this.useBillboard != value) {\n            this._useBillboard = value;\n            this._vertexLayoutDirty = true;\n        }\n    }\n\n    get useRampGradients() {\n        return this._useRampGradients;\n    }\n\n    set useRampGradients(value) {\n        if (this._useRampGradients != value) {\n            this._useRampGradients = value;\n            this._vertexLayoutDirty = true;\n        }\n    }\n\n    get billboardMode() {\n        return this._billboardMode;\n    }\n\n    set billboardMode(value) {\n        if (this._billboardMode != value) {\n            this._billboardMode = value;\n            this._vertexLayoutDirty = true;\n        }\n    }\n\n    get useSpriteSheet() {\n        return this._useSpriteSheet;\n    }\n\n    set useSpriteSheet(value) {\n        if (this._useSpriteSheet != value) {\n            this._useSpriteSheet = value;\n            this._vertexLayoutDirty = true;\n        }\n    }\n\n    get useRandomSpriteCellIndex() {\n        return this._useRandomSpriteCellIndex;\n    }\n\n    get useSpriteCellLoop() {\n        return this._useSpriteCellLoop;\n    }\n\n    get spriteChangeSpeed() {\n        return this._spriteChangeSpeed;\n    }\n\n    get emitterPosition() {\n        return this._emitterPosition;\n    }\n\n    set emitterPosition(value) {\n        this._emitterPosition = value;\n    }\n\n    /**\n     * 设置粒子的顶点属性数据\n     */\n    protected _parseAttribute() {\n        this.ParticleAttributes = [];\n        this.ParticleAttributes.push(\n            {\n                name: \"a_position\",\n                format: xrFrameSystem.EVertexFormat.FLOAT3,\n                offset: 0,\n                usage: xrFrameSystem.EVertexLayoutUsage.POSITION\n            },\n            {\n                name: \"a_texCoord\",\n                format: xrFrameSystem.EVertexFormat.FLOAT2,\n                offset: 12,\n                usage: xrFrameSystem.EVertexLayoutUsage.UV0\n            },\n            {\n                name: \"a_offset\",\n                format: xrFrameSystem.EVertexFormat.FLOAT3,\n                offset: 20,\n                // 自定义用途此处可指定为xrFrameSystem.EVertexLayoutUsage.CUSTOM\n                usage: xrFrameSystem.EVertexLayoutUsage.CUSTOM\n            },\n            {\n                name: \"a_color\",\n                format: xrFrameSystem.EVertexFormat.FLOAT4,\n                offset: 32,\n                usage: xrFrameSystem.EVertexLayoutUsage.COLOR\n            },\n            {\n                name: \"a_angle\",\n                format: xrFrameSystem.EVertexFormat.FLOAT,\n                offset: 48,\n                usage: xrFrameSystem.EVertexLayoutUsage.CUSTOM\n            }\n        );\n\n        var count = 52;\n\n        // 根据是否使用billboard，动态增添属性\n        if (this._useBillboard && this._billboardMode == BillBoardMode.BILLBOARDMODE_STRETCHED) {\n            this.ParticleAttributes.push({\n                name: \"a_direction\",\n                format: xrFrameSystem.EVertexFormat.FLOAT3,\n                offset: count,\n                usage: xrFrameSystem.EVertexLayoutUsage.CUSTOM\n            })\n            count += 3 * 4;\n            this.ParticleAttributes.push({\n                name: \"a_lengthScale\",\n                format: xrFrameSystem.EVertexFormat.FLOAT,\n                offset: count,\n                usage: xrFrameSystem.EVertexLayoutUsage.CUSTOM\n            })\n            count += 4;\n        }\n\n        if (this._useRampGradients) {\n            this.ParticleAttributes.push({\n                name: \"a_rampPos\",\n                format: xrFrameSystem.EVertexFormat.FLOAT4,\n                offset: count,\n                usage: xrFrameSystem.EVertexLayoutUsage.CUSTOM\n            })\n            count += 4 * 4;\n        }\n\n        if (this.useSpriteSheet) {\n            this.ParticleAttributes.push({\n                name: \"a_cellPosition\",\n                format: xrFrameSystem.EVertexFormat.FLOAT4,\n                offset: count,\n                usage: xrFrameSystem.EVertexLayoutUsage.CUSTOM\n            })\n            count += 4 * 4;\n        }\n\n        // 每一个粒子的顶点属性偏移量\n        this.particleStride = count;\n        // 每一个属性大小背后的字节偏移量\n        this.byteStride = 4;\n        // 每一个粒子使用的顶点元素偏移量\n        this.particleVertexSize = this.particleStride / this.byteStride;\n    }\n\n    /**\n     * 设置粒子系统的内置粒子effect。\n     */\n    protected createMaterial() {\n        let newMaterial = null;\n        newMaterial = new xrFrameSystem.Material(this.particleScene);\n        // 此处初始化指定的custom-particle-effect，因为前面有注册过对应名字的effect\n        newMaterial.initByEffect(this.particleScene.assets.getAsset(\"effect\", 'custom-particle-effect'));\n        return newMaterial;\n    }\n\n    // 注册 Geometry 信息\n    public _registerGeometry() {\n        // 构建顶点属性布局\n        const vl = this.particleScene.createVertexLayout({\n            attributes: this.ParticleAttributes,\n            stride: this.particleStride\n        });\n        const vb = new Float32Array(this._vertexData);\n        const ib = new Uint16Array(this._indexData);\n\n        this._geometry = this.particleScene.createGeometry(vl, vb, ib);\n        // 指定为子网格0号\n        this._geometry.addSubMesh(ib.length, 0, 0);\n    }\n\n    /**\n    * 创建一个点发射器。\n    * @param {Vector3} direction1 粒子运动方向左区间\n    * @param {Vector3} direction2 粒子运动方向右区间\n    * @return {PointShapeEmitter} 点发射器 \n    */\n    public createPointEmitter(direction1: Vector3, direction2: Vector3) {\n        var particleEmitter = new PointShapeEmitter();\n        particleEmitter.direction = direction1;\n        particleEmitter.direction2 = direction2;\n        this._particleEmitter = particleEmitter;\n        this._particleEmitterType = \"PointShape\";\n        return particleEmitter;\n    };\n\n    /**\n     * 创建一个箱形发射器。\n     * @param {Vector3} direction1 粒子运动方向左区间\n     * @param {Vector3} direction2 粒子运动方向右区间\n     * @param {Vector3} minEmitBox 粒子生成位置最小允许坐标\n     * @param {Vector3} maxEmitBox 粒子生成位置最大允许坐标\n     * @return {BoxShapeEmitter} 箱形发射器 \n     */\n    public createBoxEmitter(direction1: Vector3, direction2: Vector3, minEmitBox: Vector3, maxEmitBox: Vector3) {\n        var particleEmitter = new BoxShapeEmitter();\n        particleEmitter.direction = direction1;\n        particleEmitter.direction2 = direction2;\n        particleEmitter.minEmitBox = minEmitBox;\n        particleEmitter.maxEmitBox = maxEmitBox;\n        this._particleEmitter = particleEmitter;\n        this._particleEmitterType = \"BoxShape\";\n        return particleEmitter;\n    };\n\n    /**\n   * 创建一个球形发射器。\n   * @param {number} radius 球形半径\n   * @param {number} radiusRange 球形区域内的覆盖范围[0-1]\n   * @param {number} arc 粒子在球形内生成的角度区间[0-360]\n   * @param {number} randomizeDirection 粒子运动方向偏离程度[0-1]\n   * @return {SphereShapeEmitter} 球形发射器 \n   */\n    public createSphereEmitter(radius: number, radiusRange: number, arc: number, randomizeDirection: number) {\n        var particleEmitter = new SphereShapeEmitter();\n        particleEmitter.radius = radius;\n        particleEmitter.radiusRange = radiusRange;\n        particleEmitter.arc = arc;\n        particleEmitter.randomizeDirection = randomizeDirection;\n        this._particleEmitter = particleEmitter;\n        this._particleEmitterType = \"SphereShape\";\n        return particleEmitter;\n    };\n\n\n    protected _parseProperties(data: IParticleData) {\n\n        var useNoise: boolean = false;\n        var useAtlasFrame: boolean = false;\n        var atlasFrameArray: string[];\n\n        for (var k in data) {\n            var v = data[k]\n            switch (k) {\n                case 'capacity':\n                    this._capacity = v;\n                    break;\n                case 'renderMode':\n                    switch (v) {\n                        case 'off':\n                            this.useBillboard = false;\n                            break;\n                        case 'default':\n                            this.useBillboard = true;\n                            this.billboardMode = BillBoardMode.BILLBOARDMODE_DEFAULT;\n                            break;\n                        case 'y':\n                            this.useBillboard = true;\n                            this.billboardMode = BillBoardMode.BILLBOARDMODE_Y;\n                            break;\n                        case 'stretched':\n                            this.useBillboard = true;\n                            this.billboardMode = BillBoardMode.BILLBOARDMODE_STRETCHED;\n                            break;\n                        case 'mesh':\n                            this.useBillboard = false;\n                            this._useRenderMesh = true;\n                            break;\n                        default:\n                            break;\n                    }\n                    break;\n                case 'mesh':\n                    if (v == undefined)\n                        break;\n                    this._renderMesh = v;\n                    break;\n                case 'renderModel':\n                    if (v == undefined)\n                        break;\n                    this.processRenderModel(v);\n                    break;\n                case 'delay':\n                    this._delay = v;\n                    break;\n                case 'burstCount':\n                    this._burstCount = v;\n                    break;\n                case 'burstTime':\n                    this._burstTime = v;\n                    break;\n                case 'burstCycle':\n                    this._burstCycle = v;\n                    break;\n                case 'burstInterval':\n                    this._burstInterval = v;\n                    break;\n                case 'stopDuration':\n                    this._stopDuration = v;\n                    break;\n                case 'updateSpeed':\n                    this._updateSpeed = v;\n                    break;\n                case 'emitRate':\n                    this._emitRate = v;\n                    break;\n                case 'gravity':\n                    this._gravity = v;\n                    break;\n                case 'prewarmCycles':\n                    this._preWarmCycles = v;\n                    break;\n                case 'particleLengthScale':\n                    this._particleLengthScale = v;\n                    break;\n                case \"speedDampen\":\n                    this._speedDampenFactor = v;\n                    break;\n                case \"texture\":\n                    if (v == undefined)\n                        break;\n                    if (typeof v == 'string') {\n                        this._textureData = this.particleScene.assets.getAsset<Texture>('texture', v);\n                    } else {\n                        this._textureData = v;\n                    }\n                    break;\n                case \"useNoise\":\n                    if (v == undefined)\n                        break;\n                    useNoise = v;\n                    break;\n                case 'atlas':\n                    if (v == undefined)\n                        break;\n                    this._useSpriteSheet = true;\n                    this._startSpriteCellIndex = 0;\n                    var count = 0;\n                    this._spriteFrameInfo = new Array();\n                    this._spriteNameToCellIndex = new Map();\n                    var value: Atlas = v;\n                    this._atlasObj = value;\n                    this._atlasTexture = value.texture;\n                    for (var k in value.frames) {\n                        this._spriteNameToCellIndex.set(k, count);\n                        this._spriteFrameInfo.push(value.getUVST(k));\n                        count++;\n                    }\n                    this._endSpriteCellIndex = count;\n                    break;\n                case 'atlasFrames':\n                    useAtlasFrame = true;\n                    atlasFrameArray = v;\n                    break;\n                case \"atlasLoop\":\n                    this._useSpriteCellLoop = v;\n                    break;\n                case \"atlasSpeed\":\n                    this._spriteChangeSpeed = v;\n                    break;\n                case 'atlasRandom':\n                    this._useRandomSpriteCellIndex = v;\n                    break;\n                case \"angle\":\n                    this._startAngle = this._startAngle2 = v[0];\n                    if (v[1])\n                        this._startAngle2 = v[1];\n                    break;\n                case 'lifeTime':\n                    this._minLifeTime = this._maxLifeTime = v[0];\n                    if (v[1])\n                        this._maxLifeTime = v[1];\n                    break;\n                case 'scaleX':\n                    this._minScaleX = this._maxScaleX = v[0];\n                    if (v[1])\n                        this._maxScaleX = v[1];\n                    break;\n                case 'scaleY':\n                    this._minScaleY = this._maxScaleY = v[0];\n                    if (v[1])\n                        this._maxScaleY = v[1];\n                    break;\n                case 'size':\n                    this._minSize = this._maxSize = v[0];\n                    if (v[1])\n                        this._maxSize = v[1];\n                    break;\n                case 'speed':\n                    this._minSpeed = this._maxSpeed = v[0];\n                    if (v[1])\n                        this._maxSpeed = v[1];\n                    break;\n                case 'angularSpeed':\n                    this._minAngularSpeed = this._maxAngularSpeed = v[0];\n                    if (v[1])\n                        this._maxAngularSpeed = v[1];\n                    break;\n                case 'emitterType':\n                    this._particleEmitterType = v;\n                    break;\n                case 'emitterProps':\n                    this._particleEmitterProperties = v;\n                    break;\n                case 'emitterPosition':\n                    this._emitterPosition.x = v[0];\n                    this._emitterPosition.y = v[1];\n                    this._emitterPosition.z = v[2];\n                    break;\n                case 'startColor':\n                    for (var i = 0; i < 4; i++) {\n                        this._startColor[i] = v[i];\n                    }\n                    break;\n                case 'sizeChange':\n                    v.forEach(([key, value]) => {\n                        this.addSizeGradient(parseFloat(key), parseFloat(value));\n                    })\n                    break;\n                case 'speedChange':\n                    v.forEach(([key, value]) => {\n                        this.addSpeedScaleGradient(parseFloat(key), parseFloat(value));\n                    })\n                    break;\n                case 'colorChange':\n                    v.forEach(([key, value]) => {\n                        var valueArray = value.split(' ')\n                        this.addColorGradient(parseFloat(key), xrFrameSystem.Vector4.createFromNumber(\n                            parseFloat(valueArray[0]), parseFloat(valueArray[1]),\n                            parseFloat(valueArray[2]), parseFloat(valueArray[3])));\n                    })\n                    break;\n                case 'startColor2':\n                    this._startColor2 = this._startColor2 || [0, 0, 0, 0];\n                    for (var i = 0; i < 4; i++) {\n                        this._startColor2[i] = v[i];\n                    }\n                    break;\n                case 'endColor':\n                    this._endColor = this._endColor || [0, 0, 0, 0];\n                    for (var i = 0; i < 4; i++) {\n                        this._endColor[i] = v[i];\n                    }\n                    break;\n            }\n        }\n\n        if (useAtlasFrame) {\n            if (!this._atlasObj) {\n                console.log(\"未取得图集信息\");\n            } else {\n                var count = 0;\n                this._startSpriteCellIndex = 0;\n                this._spriteFrameInfo = new Array();\n                this._spriteNameToCellIndex = new Map();\n                for (var name in this._atlasObj.frames) {\n                    atlasFrameArray.forEach((v, k) => {\n                        if (name == v) {\n                            this._spriteNameToCellIndex.set(name, count);\n                            this._spriteFrameInfo.push(this._atlasObj.getUVST(name));\n                            count++;\n                        }\n                    })\n                }\n                this._endSpriteCellIndex = count;\n            }\n        }\n    }\n\n    protected processRenderModel(value){\n        for(const mesh of value.model.meshes) {\n            this._renderMesh = mesh.subMeshes[0].geometry\n        }\n        this.useBillboard = false;\n        this._useRenderMesh = true;\n    }\n\n    protected _chooseEmitterProcess() {\n        if (this._particleEmitter != null) {\n            return;\n        }\n        //Add cache to optimize on onUpdate cycle\n        else {\n            switch (this._particleEmitterType) {\n                case \"SphereShape\":\n                    this._particleEmitter = new SphereShapeEmitter();\n                    break;\n                case \"BoxShape\":\n                    this._particleEmitter = new BoxShapeEmitter();\n                    break;\n                default:\n                    this._particleEmitter = new PointShapeEmitter();\n                    break;\n            }\n        }\n        this._particleEmitter.setProperty(this._particleEmitterProperties);\n    }\n\n    protected _createVertexBuffers() {\n        if (this._useRenderMesh) {\n            const layout = this._renderMesh.getVertexLayout();\n            const stride = layout.stride;\n            const vertexBuffer = this._renderMesh._getRawVertexBuffer();\n            this._vertexCount = vertexBuffer .byteLength / stride;\n            this._vertexSize = this._capacity * this._vertexCount;\n            this._vertexData = new Float32Array(this.particleVertexSize * this._vertexSize);\n        } else {\n            //*4 是因为每一个粒子面片由上下左右四个点构成 \n            this._vertexSize = this._capacity * 4;\n            // 这里构建顶点数据数组的长度，为顶点属性的元素数乘以顶点总数\n            this._vertexData = new Float32Array(this.particleVertexSize * this._vertexSize);\n        }\n    }\n\n    protected _createIndexBuffer() {\n        if (this._useRenderMesh) {\n            const indexBuffer = this._renderMesh._getRawIndiceBuffer();\n            this._eachIndexSize = indexBuffer.byteLength / 2;\n            this._indexSize = this._capacity * this._eachIndexSize;\n            this._indexData = new Uint16Array(this._indexSize);\n            for (let i = 0; i < this._capacity; i++) {\n              var firstIndex = i * this._eachIndexSize;\n              for (let j = 0; j < this._eachIndexSize; j++) {\n                this._indexData[firstIndex + j] = indexBuffer[j] + i * this._vertexCount;\n              }\n            }\n        }else{\n        // 粒子索引数量\n        this._indexSize = this._capacity * 6;\n        this._indexData = new Uint16Array(this._indexSize);\n        for (let i = 0; i < this._capacity; i++) {\n            this._indexData[i * 6] = i * 4;\n            this._indexData[i * 6 + 1] = i * 4 + 1;\n            this._indexData[i * 6 + 2] = i * 4 + 2;\n            this._indexData[i * 6 + 3] = i * 4;\n            this._indexData[i * 6 + 4] = i * 4 + 2;\n            this._indexData[i * 6 + 5] = i * 4 + 3;\n        }\n    }\n    }\n\n    // 创建材质与mesh网络\n    protected _createMesh() {\n        this._material = this.createMaterial()\n        \n        this._mesh = this.particleEl.getComponent(xrFrameSystem.Mesh);\n        if (this._mesh == undefined) {\n            this._mesh = this.particleEl.addComponent(xrFrameSystem.Mesh, {\n                geometry: this._geometry,\n                material: this._material,\n                meshCount: this._renderMesh ? this._renderMesh.getSubMeshCount() : 1,\n            });\n        }\n\n        // 基础库内存在_geometry的bug, 此处先加这么一句\n        this._mesh._geometry = this._geometry\n\n        // 更改geometry\n        this._mesh.setData({\n            geometry: this._geometry,\n            material: this._material,\n            meshCount: this._renderMesh ? this._renderMesh.getSubMeshCount() : 1,\n        });\n    }\n\n    //往顶点数据数组里设置值，分别为四个点设置偏移与uv值\n    protected _appendParticleVertices(offset, instance: ParticleInstance = null) {\n        if (this._useRenderMesh) {\n            const vertexBufferView = this._renderMesh._getRawVertexBuffer();\n            const layout = this._renderMesh.vertexLayout;\n            const stride = layout.stride;\n            for (var i = 0; i < this._vertexCount; i++) {\n              const aUV = layout.getConfigByName(\"a_texCoord\");\n              const aPosition = layout.getConfigByName(\"a_position\");\n              const realStride = stride / 4;\n              const posBase = i * realStride + aPosition.offset / 4;\n              const uvBase = i * realStride + aUV.offset / 4;\n              this._appendParticleVertex(offset++, instance, vertexBufferView[posBase + 0], vertexBufferView[posBase + 1], vertexBufferView[posBase + 2],\n                vertexBufferView[uvBase + 0], vertexBufferView[uvBase + 1]);\n            }\n        }else{\n            this._appendParticleVertex(offset++, instance, -1, -1, 0, 0, 1);\n            this._appendParticleVertex(offset++, instance, 1, -1, 0, 1, 1);\n            this._appendParticleVertex(offset++, instance, 1, 1, 0, 1, 0);\n            this._appendParticleVertex(offset++, instance, -1, 1, 0, 0, 0);\n        }\n    };\n\n    protected _appendParticleVertex(index, instance: ParticleInstance, offsetX, offsetY, offsetZ, u, v) {\n        var offset = index * this.particleVertexSize;\n        this._vertexData[offset++] = instance.position.x;\n        this._vertexData[offset++] = instance.position.y;\n        this._vertexData[offset++] = instance.position.z;\n        this._vertexData[offset++] = u;\n        this._vertexData[offset++] = v;\n        //Offset\n        this._vertexData[offset++] = offsetX * instance.size * instance.scale.x;\n        this._vertexData[offset++] = offsetY * instance.size * instance.scale.y;\n        this._vertexData[offset++] = offsetZ * instance.size;\n        //Color\n        this._vertexData[offset++] = instance.color.x;\n        this._vertexData[offset++] = instance.color.y;\n        this._vertexData[offset++] = instance.color.z;\n        this._vertexData[offset++] = instance.color.w;\n        //Rotation\n        this._vertexData[offset++] = instance.angle * Math.PI / 180;\n\n        if (this._useBillboard && this._billboardMode == BillBoardMode.BILLBOARDMODE_STRETCHED) {\n            this._vertexData[offset++] = instance.direction.x;\n            this._vertexData[offset++] = instance.direction.y;\n            this._vertexData[offset++] = instance.direction.z;\n            this._vertexData[offset++] = this._particleLengthScale;\n        }\n\n        //RampColor\n        if (this._useRampGradients) {\n            this._vertexData[offset++] = instance.rampPos.x;\n            this._vertexData[offset++] = instance.rampPos.y;\n            this._vertexData[offset++] = 0;\n            this._vertexData[offset++] = 1;\n        }\n\n        //SpriteSheet\n        if (this.useSpriteSheet) {\n            var cellIndex = ~~instance.cellIndex;\n            this._vertexData[offset++] = this._spriteFrameInfo[cellIndex].z;\n            this._vertexData[offset++] = this._spriteFrameInfo[cellIndex].w;\n            this._vertexData[offset++] = this._spriteFrameInfo[cellIndex].x;\n            this._vertexData[offset++] = this._spriteFrameInfo[cellIndex].y;\n        }\n    };\n\n    // 更新材质上挂载的effect的属性信息\n    protected _setMeshData(material: Material,\n        uniforms?: [string, string][], states?: [string, string][]\n    ) {\n        if (!uniforms && !states) {\n            this._material = material;\n        } else if (this._sourceMaterial !== material || this._sourceMaterial === this._material) {\n            this._material = material.clone();\n        }\n\n        if (this._textureData) {\n            this._material.setTexture('u_baseColorMap', this._textureData);\n        }\n\n        if (this._atlasTexture) {\n            this._material.setTexture('u_baseColorMap', this._atlasTexture);\n        }\n\n        if (this._useRampGradients) {\n            if (this._rampGradientsTexture)\n                this._material.setTexture('u_rampColorMap', this._rampGradientsTexture);\n        }\n\n        if (this.useSpriteSheet) {\n            this._material.setMacro(\"WX_SPRITESHEET\", true);\n        } else {\n            this._material.setMacro(\"WX_SPRITESHEET\", false);\n        }\n\n        if (this._useRenderMesh) {\n            this._material.setMacro(\"WX_RENDERMESH\", true);\n        } else {\n            this._material.setMacro(\"WX_RENDERMESH\", false);\n        }\n\n        if (this._useBillboard) {\n            this._material.setMacros({ \"WX_BILLBOARD\": true });\n            switch (this._billboardMode) {\n                case BillBoardMode.BILLBOARDMODE_Y:\n                    this._material.setMacros({ \"WX_BILLBOARDMODE_Y\": true });\n                    break;\n                case BillBoardMode.BILLBOARDMODE_STRETCHED:\n                    this._material.setMacros({ \"WX_BILLBOARDMODE_STRETCHED\": true });\n                    break;\n                case BillBoardMode.BILLBOARDMODE_DEFAULT:\n                    this._material.setMacros({ \"WX_BILLBOARDMODE_DEFAULT\": true });\n                    break;\n                default:\n                    break;\n            }\n        } else {\n            this._material.setMacro(\"WX_BILLBOARD\", false);\n            this._material.setMacro(\"WX_BILLBOARDMODE_Y\", false);\n            this._material.setMacro(\"WX_BILLBOARDMODE_STRETCHED\", false);\n            this._material.setMacro(\"WX_BILLBOARDMODE_DEFAULT\", false);\n        }\n\n        if (uniforms) {\n            this._material._parseUniforms(uniforms);\n        }\n\n        if (states) {\n            this._material._parseRenderStates(states);\n        }\n\n        this._sourceMaterial = material;\n\n        const vb = new Float32Array(this._vertexData);\n        const ib = new Uint16Array(this._indexData);\n\n        // 更新顶点与索引信息\n        this._mesh.geometry.uploadVertexBuffer(0, vb);\n        this._mesh.geometry.uploadIndexBuffer(0, ib);\n    }\n\n    /**\n     * 添加粒子运动过程中的颜色变化规则。\n     * @param {number} gradient 指定所处粒子生命周期的阶段\n     * @param {Vector4} color1 指定粒子颜色的左区间\n     * @param {Vector4} color2 指定粒子颜色的右区间\n     */\n    public addColorGradient(gradient: number, color1: Vector4, color2?: Vector4) {\n        if (!this._colorGradients) {\n            this._colorGradients = [];\n        }\n        var colorGradient = new ColorGradient(gradient, color1, color2);\n        this._colorGradients.push(colorGradient);\n        this._colorGradients.sort(function (a, b) {\n            if (a.gradient < b.gradient) {\n                return -1;\n            }\n            else if (a.gradient > b.gradient) {\n                return 1;\n            }\n            return 0;\n        });\n    };\n\n    /**\n    * 添加粒子运动过程中的速度变化规则。\n    * @param {number} gradient 指定所处粒子生命周期的阶段\n    * @param {Vector4} speed 指定粒子速度的左区间\n    * @param {Vector4} speed2 指定粒子速度的右区间\n    */\n    public addSpeedScaleGradient(gradient: number, speed: number, speed2?: number) {\n        if (!this._speedScaleGradients) {\n            this._speedScaleGradients = [];\n        }\n        this.addFactorGradient(this._speedScaleGradients, gradient, speed, speed2);\n    }\n\n    /**\n    * 添加粒子运动过程中的速度限制规则。\n    * @param {number} gradient 指定所处粒子生命周期的阶段\n    * @param {number} limitSpeed 指定粒子限制速度的左区间\n    * @param {number} limitSpeed2 指定粒子限制速度的右区间\n    */\n    public addLimitSpeedGradient(gradient: number, limitSpeed: number, limitSpeed2?: number) {\n        if (!this._limitSpeedGradients) {\n            this._limitSpeedGradients = [];\n        }\n        this.addFactorGradient(this._limitSpeedGradients, gradient, limitSpeed, limitSpeed2);\n    }\n\n    /**\n    * 添加粒子运动过程中的阻力规则。\n    * @param {number} gradient 指定所处粒子生命周期的阶段\n    * @param {number} speed 指定粒子受到的阻力大小的左区间[0-1]\n    * @param {number} speed2 指定粒子受到的阻力大小的右区间[0-1]\n    */\n    public addDragGradient(gradient: number, drag: number, drag2?: number) {\n        if (!this._dragGradients) {\n            this._dragGradients = [];\n        }\n        this.addFactorGradient(this._dragGradients, gradient, drag, drag2);\n    }\n\n    /**\n     * 添加粒子运动过程中的透明度变化规则。\n     * @param {number} gradient 指定所处粒子生命周期的阶段\n     * @param {number} alpha 指定粒子颜色透明度的左区间[0-1]\n     * @param {number} alpha2 指定粒子颜色透明度的右区间[0-1]\n     */\n    public addAlphaGradient(gradient: number, alpha: number, alpha2?: number) {\n        if (!this._alphaGradients) {\n            this._alphaGradients = [];\n        }\n        this.addFactorGradient(this._alphaGradients, gradient, alpha, alpha2);\n    }\n\n    /**\n     * 添加粒子运动过程中的尺寸变化规则。\n     * @param {number} gradient 指定所处粒子生命周期的阶段\n     * @param {number} size 指定粒子尺寸的左区间\n     * @param {number} size2 指定粒子尺寸的右区间\n     */\n    public addSizeGradient(gradient: number, size: number, size2?: number) {\n        if (!this._sizeGradients) {\n            this._sizeGradients = [];\n        }\n        this.addFactorGradient(this._sizeGradients, gradient, size, size2);\n    }\n\n    /**\n    * 添加粒子运动过程中的透明度变化范围。\n    * @param {number} gradient 指定所处粒子生命周期的阶段\n    * @param {number} min 指定粒子透明度值的左区间\n    * @param {number} max 指定粒子透明度值的右区间\n    */\n    public addColorRemapGradient(gradient: number, min: number, max?: number) {\n        if (!this._colorRemapGradients) {\n            this._colorRemapGradients = [];\n        }\n        this.addFactorGradient(this._colorRemapGradients, gradient, min, max);\n    }\n\n    /**\n     * 将存储不同时间段相关属性系数的数组按时间点从小到大进行排序。\n     * @param {Array} factorGradients 存储不同时间段相关属性系数的数组\n     * @param {number} gradient 一般代表粒子所处生命周期的阶段\n     * @param {number} factor 左区间值\n     * @param {number} factor2 右区间值\n     */\n    protected addFactorGradient(factorGradients, gradient, factor, factor2) {\n        var newGradient = new FactorGradient(gradient, factor, factor2);\n        factorGradients.push(newGradient);\n        factorGradients.sort(function (a, b) {\n            if (a.gradient < b.gradient) {\n                return -1;\n            }\n            else if (a.gradient > b.gradient) {\n                return 1;\n            }\n            return 0;\n        });\n    }\n\n    /**\n     * 添加粒子运动过程中的根据透明度影响的颜色变化规则，将通过颜色变化图纹理进行采样。\n     * @param {number} gradient 指定粒子颜色变化图的具体位置，对应具体值应为(1-alpha)\n     * @param {number} color 指定该位置的颜色\n     */\n    public addRampGradient(gradient, color) {\n        if (!this._rampGradients) {\n            this._rampGradients = [];\n        }\n        var rampGradient = new Color3Gradient(gradient, color);\n        this._rampGradients.push(rampGradient);\n\n        this._rampGradients.sort(function (a, b) {\n            if (a.gradient < b.gradient) {\n                return -1;\n            }\n            else if (a.gradient > b.gradient) {\n                return 1;\n            }\n            return 0;\n        });\n        this.createRampGradientTexture();\n    }\n\n    /**\n     * 根据颜色变化数组，生成对应的颜色变化纹理\n     */\n    protected createRampGradientTexture() {\n        var data = new Uint8Array(256 * 4);\n        var tmpColor: Vector3;\n        var loop = (x: number) => {\n            var ratio = x / 256;\n            BasicGradientMethod.GetCurrentGradient(ratio, this._rampGradients, function (currentGradient, nextGradient, lerp) {\n                tmpColor = currentGradient.color.lerp(nextGradient.color, lerp);\n                data[x * 4] = tmpColor.x * 255;\n                data[x * 4 + 1] = tmpColor.y * 255;\n                data[x * 4 + 2] = tmpColor.z * 255;\n                data[x * 4 + 3] = 255;\n            });\n        }\n\n        for (var x = 0; x < 256; x++) {\n            loop(x);\n        }\n\n        this._rampGradientsTexture = this.particleScene.createTexture({\n            width: 256, height: 1,\n            source: [data],\n            pixelFormat: ETextureFormat.RGBA8\n        })\n    }\n\n    /**\n      * 根据数组进行插值\n      */\n    protected lerpNumberArrayToVector(vector, numberArray1, numberArray2, step, length = 4) {\n        let result: number[] = new Array(length);\n        for (var i = 0; i < length; i++)\n            result[i] = numberArray1[i] + (numberArray2[i] - numberArray1[i]) * step;\n        vector.setValue(...result);\n    }\n}\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/SystemProperty/ParticleInstance.ts",
    "content": "\nimport { FactorGradient, ColorGradient } from '../Util/Gradient'\nimport CustomParticle from '../index'\n\nconst xrFrameSystem = wx.getXrFrameSystem();\n\n// 粒子实例，代表每一个粒子的具体属性\nexport default class ParticleInstance {\n    public static count: number = 0;\n    public id: number;\n    public position: xrFrameSystem.Vector3;\n    public direction: xrFrameSystem.Vector3;\n    public speed: number;\n    public color: xrFrameSystem.Vector4;\n    public colorStep: xrFrameSystem.Vector4;\n    public rampPos: xrFrameSystem.Vector4;\n    // 粒子生命周期\n    public lifeTime: number;\n    public age: number;\n    public drag: number;\n\n    public size: number;\n    public startSize: number;\n    public sizeGradientFactor: number;\n\n    public scale: xrFrameSystem.Vector2;\n    public angle: number;\n    public angularSpeed: number;\n    public particleSystem: CustomParticle;\n\n    public currentSize: number;\n    public currentSize2: number;\n    public currentSizeGradient: FactorGradient;\n\n    public currentColor: xrFrameSystem.Vector4;\n    public currentColor2: xrFrameSystem.Vector4;\n    public currentColorGradient: ColorGradient;\n\n    public currentAlpha: number;\n    public currentAlpha2: number;\n    public currentAlphaGradient: FactorGradient;\n\n    public currentSpeedScale: number;\n    public currentSpeedScale2: number;\n    public currentSpeedScaleGradient: FactorGradient;\n\n    public currentLimitSpeed: number;\n    public currentLimitSpeed2: number;\n    public currentLimitSpeedGradient: FactorGradient;\n\n    public currentDrag: number;\n    public currentDrag2: number;\n    public currentDragGradient: FactorGradient;\n\n    public subEmitterMuster;\n    public startSpriteCellIndex: number;\n    public endSpriteCellIndex: number;\n    public cellIndex: number = 0;\n    public randomCellOffset;\n\n    constructor(particle: CustomParticle) {\n        this.particleSystem = particle;\n        this.position = xrFrameSystem.Vector3.createFromNumber(0, 0, 0);\n        this.direction = xrFrameSystem.Vector3.createFromNumber(0, 0, 0);\n        this.speed = 0;\n\n        this.color = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 0);\n        this.colorStep = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 0);\n        this.rampPos = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 1);\n        this.currentSize = 0;\n        this.currentSize2 = 0;\n        this.currentColor = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 0);\n        this.currentColor2 = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 1);\n        this.currentAlpha = 0;\n        this.currentAlpha2 = 0;\n\n        this.startSpriteCellIndex = 0;\n        this.endSpriteCellIndex = 0;\n\n        this.lifeTime = 1.0;\n        this.age = 0;\n        this.drag = 0;\n        this.size = 1;\n        this.startSize = 1;\n        this.sizeGradientFactor = 1;\n        this.scale = xrFrameSystem.Vector2.createFromNumber(0, 0);\n        this.angle = 0;\n        this.angularSpeed = 0;\n        this.id = ParticleInstance.count++;\n    }\n\n    /**\n    * 重置粒子实例的状态。\n    */\n    public reset() {\n        this.age = 0;\n        this.id = ParticleInstance.count++;\n\n        this.randomCellOffset = undefined;\n        this.cellIndex = this.startSpriteCellIndex;\n    }\n\n    /**\n     * 将当前粒子实例的状态拷贝到目标实例。\n     * @param {ParticleInstance} other 目标粒子实例\n     */\n    public copyTo(other: ParticleInstance) {\n        other.position.set(this.position);\n        other.direction.set(this.direction);\n        other.color.set(this.color);\n        other.colorStep.set(this.colorStep);\n        other.rampPos.set(this.rampPos);\n\n        other.speed = this.speed;\n        other.lifeTime = this.lifeTime;\n        other.size = this.size;\n        other.scale.set(this.scale);\n        other.angle = this.angle;\n        other.angularSpeed = this.angularSpeed;\n        other.particleSystem = this.particleSystem;\n        other.id = this.id;\n        other.age = this.age;\n        other.subEmitterMuster = this.subEmitterMuster;\n\n        // 判断是否使用了颜色渐变\n        if (this.currentColorGradient) {\n            other.currentColorGradient = this.currentColorGradient;\n            other.currentColor = this.currentColor.clone();\n            other.currentColor2 = this.currentColor2.clone();\n        }\n\n        // 判断是否使用了大小渐变\n        if (this.currentSizeGradient) {\n            other.currentSizeGradient = this.currentSizeGradient;\n            other.currentSize = this.currentSize;\n            other.currentSize2 = this.currentSize2;\n        }\n\n        // 判断是否使用了透明度渐变\n        if (this.currentAlphaGradient) {\n            other.currentAlphaGradient = this.currentAlphaGradient;\n            other.currentAlpha = this.currentAlpha;\n            other.currentAlpha2 = this.currentAlpha2;\n        }\n\n        // 判断是否使用了速度渐变\n        if (this.currentSpeedScaleGradient) {\n            other.currentSpeedScaleGradient = this.currentSpeedScaleGradient;\n            other.currentSpeedScale = this.currentSpeedScale;\n            other.currentSpeedScale2 = this.currentSpeedScale2;\n        }\n\n        // 判断是否使用了限速渐变\n        if (this.currentLimitSpeedGradient) {\n            other.currentLimitSpeedGradient = this.currentLimitSpeedGradient;\n            other.currentLimitSpeed = this.currentLimitSpeed;\n            other.currentLimitSpeed2 = this.currentLimitSpeed2;\n        }\n\n        // 判断是否使用了阻力渐变\n        if (this.currentDragGradient) {\n            other.currentDragGradient = this.currentDragGradient;\n            other.currentDrag = this.currentDrag;\n            other.currentDrag2 = this.currentDrag2;\n        }\n\n        // 判断是否使用了动画图集\n        if (this.particleSystem.useSpriteCellLoop) {\n            other.randomCellOffset = this.randomCellOffset;\n            other.startSpriteCellIndex = this.startSpriteCellIndex;\n            other.endSpriteCellIndex = this.endSpriteCellIndex;\n        }\n    }\n\n    /**\n     * 更新从动画图集采样的帧序号\n     */\n    public updateCellIndex() {\n        var offset = this.age;\n        // 设置图集变化的速度\n        var changeSpeed = this.particleSystem.spriteChangeSpeed;\n        if (this.particleSystem.useRandomSpriteCellIndex) {\n            if (this.randomCellOffset == undefined) {\n                //随机给图集中的一帧作为初始帧\n                this.randomCellOffset = Math.random() * this.lifeTime;\n            }\n            if (changeSpeed == 0) {\n                // 如果播放速度为0，则不会播放到下一动画帧\n                changeSpeed = 1;\n                offset = this.randomCellOffset;\n            } else {\n                offset += this.randomCellOffset;\n            }\n        }\n        var ratio;\n        var loopDist = this.endSpriteCellIndex - this.startSpriteCellIndex;\n        if (this.particleSystem.useSpriteCellLoop) {\n            // 粒子将循环播放动画图集\n            ratio = this.clamp((offset * changeSpeed) % this.lifeTime / this.lifeTime);\n        } else {\n            ratio = this.clamp(offset * changeSpeed / this.lifeTime);\n        }\n\n        //round\n        this.cellIndex = (this.startSpriteCellIndex + ratio * loopDist) | 0;\n    }\n\n    /**\n     * 限制num的值在left与right的区间内\n     */\n    public clamp(num, left = 0, right = 1) {\n        if (num < left)\n            return left;\n        if (num > right)\n            return right;\n        return num;\n    }\n};"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/SystemProperty/ParticleInterface.ts",
    "content": "/**\n * 组件数据接口，记录粒子系统的成员属性和对应类型\n * 新增的属性字段需要在IParticleData和ParticleSchema中添加\n */\nexport interface IParticleData {\n    neverCull?: boolean;\n    /**\n     * 渲染模式。\n     */\n    renderMode?: string;\n    uniforms?: [string, string][];\n    states?: [string, string][];\n\n    renderModel?: xrFrameSystem.GLTFModel;\n    /**\n     * 纹理信息。\n     */\n    texture?: xrFrameSystem.Texture;\n    /**\n     * 是否使用噪声纹理。\n     */\n    useNoise?: boolean;\n    /**\n     * 使用自定义的噪声纹理。\n     */\n    noiseTexture?: xrFrameSystem.Texture;\n    /**\n     * 最大粒子数目。\n     */\n    capacity?: number;\n    /**\n     * 每秒粒子发射数。\n     */\n    emitRate?: number;\n    /**\n     * 初始角度。\n     */\n    angle?: number[];\n    /**\n     * 粒子系统启动延时秒数。\n     */\n    delay?: number;\n    /**\n     * y轴方向上的每秒位移。\n     */\n    gravity?: number;\n    /**\n     * 初始大小。\n     */\n    size?: number[];\n    /**\n     * 粒子在x轴方向上的大小尺度。\n     */\n    scaleX?: number[];\n    /**\n     * 粒子在y轴方向上的大小尺度。\n     */\n    scaleY?: number[];\n    /**\n     * 速度。\n     */\n    speed?: number[];\n    /**\n     * 生命周期时长。\n     */\n    lifeTime?: number[];\n    /**\n     * 粒子初始颜色左区间。\n     */\n    startColor?: number[];\n    /**\n     * 粒子初始颜色右区间。\n     */\n    startColor2?: number[];\n    /**\n     * 粒子结束时颜色。\n     */\n    endColor?: number[];\n    /**\n     * 角速度。\n     */\n    angularSpeed?: number[];\n    /**\n     * 发射器类型。\n     */\n    emitterType?: string;\n    /**\n     * 发射器属性配置。\n     */\n    emitterProps?: [string, string][];\n    /**\n     * 粒子系统生命周期时长。\n     */\n    stopDuration?: number;\n    /**\n     * 粒子预渲染周期数。\n     */\n    prewarmCycles?: number;\n    /**\n     * 速度阻尼系数。\n     */\n    speedDampen?: number;\n    /**\n     * 动画图集信息。\n     */\n    atlas?: xrFrameSystem.Atlas;\n    /**\n     * 图集切换速度。\n     */\n    atlasSpeed?: number;\n    /**\n     * 是否随机播放图集。\n     */\n    atlasRandom?: boolean;\n    /**\n     * 是否循环播放图集。\n     */\n    atlasLoop?: boolean;\n    /**\n     * 指定图集帧名。\n     */\n    atlasFrames?: string[];\n    /**\n     * 网格信息。\n     */\n    mesh?: xrFrameSystem.Geometry;\n    sizeChange?: [string, string][];\n    colorChange?: [string, string][];\n    speedChange?: [string, string][];\n    burstCount?: number;\n    burstTime?: number;\n    burstCycle?: number;\n    burstInterval?: number;\n}\n\n/**\n * 此处声明属性在框架内运行时的真正类型\n */\nexport const ParticleSchema: xrFrameSystem.IComponentSchema = {\n    renderModel: { type: 'gltf' },\n    neverCull: { type: 'boolean', defaultValue: false },\n    renderMode: { type: 'string', defaultValue: 'default' },\n    uniforms: { type: 'map' },\n    states: { type: 'map' },\n    texture: { type: 'texture' },\n    useNoise: { type: 'boolean' },\n    noiseTexture: { type: 'texture' },\n    capacity: { type: 'number' },\n    emitRate: { type: 'number' },\n    angle: { type: 'number-array' },\n    delay: { type: 'number' },\n    gravity: { type: 'number' },\n    emitterPosition: { type: 'number-array' },\n    size: { type: 'number-array' },\n    scaleX: { type: 'number-array' },\n    scaleY: { type: 'number-array' },\n    speed: { type: 'number-array' },\n    lifeTime: { type: 'number-array' },\n    startColor: { type: 'number-array' },\n    startColor2: { type: 'number-array' },\n    endColor: { type: 'number-array' },\n    angularSpeed: { type: 'number-array' },\n    emitterType: { type: 'string' },\n    emitterProps: { type: 'map' },\n    stopDuration: { type: 'number' },\n    prewarmCycles: { type: 'number' },\n    speedDampen: { type: 'number', defaultValue: 0 },\n    atlas: { type: 'atlas' },\n    atlasSpeed: { type: 'number', defaultValue: 1 },\n    atlasRandom: { type: 'boolean' },\n    atlasLoop: { type: 'boolean', defaultValue: true },\n    atlasFrames: { type: 'array' },\n    mesh: { type: 'geometry' },\n    sizeChange: { type: 'map' },\n    colorChange: { type: 'map' },\n    speedChange: { type: 'map' },\n    burstCount: { type: 'number' },\n    burstTime: { type: 'number' },\n    burstCycle: { type: 'number' },\n    burstInterval: { type: 'number' },\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/Util/Gradient.ts",
    "content": "const xrFrameSystem = wx.getXrFrameSystem();\n\n// 控制粒子颜色渐变\nexport class ColorGradient {\n    public gradient: number;\n    public color: xrFrameSystem.Vector4;\n    public color2: xrFrameSystem.Vector4;\n\n    constructor(gradient, color, color2) {\n        this.gradient = gradient;\n        this.color = color;\n        this.color2 = color2;\n    }\n\n    /**\n    * 获取具体颜色属性值\n    * @param {Vector4} 用于存储结果的临时变量\n    */\n    public getColor(colorTemp: xrFrameSystem.Vector4) {\n        if (!this.color2) {\n            colorTemp.x = this.color.x;\n            colorTemp.y = this.color.y;\n            colorTemp.z = this.color.z;\n            colorTemp.w = this.color.w;\n            return;\n        }\n\n        var lerp = Math.random();\n        colorTemp.x = this.color.x + (this.color2.x - this.color.x) * lerp;\n        colorTemp.y = this.color.y + (this.color2.y - this.color.y) * lerp;\n        colorTemp.z = this.color.z + (this.color2.z - this.color.z) * lerp;\n        colorTemp.w = this.color.w + (this.color2.w - this.color.w) * lerp;\n    }\n}\n\nexport class Color3Gradient {\n    public gradient: number;\n    public color: xrFrameSystem.Vector3;\n\n    constructor(gradient, color) {\n        this.gradient = gradient;\n        this.color = color;\n    }\n}\n\n// 控制粒子变化的属性\nexport class FactorGradient {\n\n    public gradient: number;\n    public factor: number;\n    public factor2: number;\n\n    constructor(gradient, factor, factor2) {\n        this.gradient = gradient;\n        this.factor = factor;\n        this.factor2 = factor2;\n    }\n\n    /**\n     * 获取具体属性值\n     * @return {number} 插值后的属性大小\n     */\n    public getFactor() {\n        if (!this.factor2 || this.factor2 == this.factor) {\n            return this.factor;\n        }\n\n        return this.factor + (this.factor2 - this.factor) * Math.random();\n    }\n}\n\n\nexport class BasicGradientMethod {\n    /**\n     * 从获取具体时刻的属性大小\n     * @param {number} ratio 粒子所处生命周期的阶段\n     * @param {Array} gradients 存储不同时刻指定属性变化的数组\n     * @param {Callback} updateFunc 回调函数\n     */\n    public static GetCurrentGradient(ratio, gradients, updateFunc) {\n        if (gradients[0].graident > ratio) {\n            updateFunc(gradients[0], gradients[0], 1.0)\n            return;\n        }\n\n        var lastIndex = gradients.length - 1;\n\n        for (var index = 0; index < lastIndex; index++) {\n            var currentGradient = gradients[index];\n            var nextGradient = gradients[index + 1];\n            if (ratio >= currentGradient.gradient && ratio <= nextGradient.gradient) {\n                var lerp = (ratio - currentGradient.gradient) / (nextGradient.gradient - currentGradient.gradient);\n                updateFunc(currentGradient, nextGradient, lerp);\n                return;\n            }\n        }\n        updateFunc(gradients[lastIndex], gradients[lastIndex], 1.0);\n    }\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/Util/SubEmitter.ts",
    "content": "import CustomParticle from \"../index\";\n\n\n/**\n * 粒子子发射器的依附状态。\n */\nexport const enum SubEmitterState {\n    /**\n     * 依附于粒子整个生命周期\n     */\n    ATTACH = 0,\n    /**\n    * 在粒子生命周期末出现\n    */\n    END = 1\n}\n\n// 子发射器类\nexport default class SubEmitter {\n\n    public particleSystem: CustomParticle;\n    public state: SubEmitterState;\n\n    constructor(particleSystem) {\n        this.particleSystem = particleSystem;\n        this.state = SubEmitterState.END;\n    }\n\n    /**\n     * 通过克隆，获取指定的粒子子发射器实例\n     * @return {SubEmitter} 克隆后的子发射器实例\n     */\n    public clone() {\n        var cloneParticleSystem = this.particleSystem.clone();\n        cloneParticleSystem.initParticle(cloneParticleSystem.data);\n        var cloneSubEmitter = new SubEmitter(cloneParticleSystem);\n        cloneSubEmitter.state = this.state;\n        return cloneSubEmitter;\n    }\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {},\n  \"renderer\": \"xr-frame\"\n}"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/index.ts",
    "content": "import XrFrame from 'XrFrame';\nimport BasicParticle from './SystemProperty/BasicParticle'\nimport SubEmitter, { SubEmitterState } from './Util/SubEmitter'\nimport ParticleInstance from './SystemProperty/ParticleInstance'\nimport { BasicGradientMethod } from './Util/Gradient'\n\nconst xrFrameSystem = wx.getXrFrameSystem();\n\nconst tempVec1 = xrFrameSystem.Vector3.createFromNumber(0, 0, 0);\nconst tempVec2 = xrFrameSystem.Vector3.createFromNumber(0, 0, 0);\n\nfunction randomBetween(v1, v2, randomSeed = Math.random()) {\n    if (v1 === v2) {\n        return v1;\n    } else {\n        return randomSeed * Math.abs(v1 - v2) + Math.min(v1, v2);\n    }\n};\n\n// 继承了控制粒子系统渲染的基础类，这里将实现粒子运作的逻辑\nexport default class CustomParticle extends BasicParticle {\n    public readonly priority: number = 300;\n    public subEmitters = null;\n\n    private _start: boolean = false;\n    private _stop: boolean = false;\n    private _alive: boolean = false;\n    private _actualFrame: number = 0;\n    private _excessInstance: number = 0;\n    private _emitterWorldMatrix: XrFrame.Matrix4;\n    private _emitterInverseWorldMatrix: XrFrame.Matrix4;\n\n    private _tempEndColor: XrFrame.Vector4 = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 0);\n    private _tempDiffColor: XrFrame.Vector4 = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 0);\n    private _tempAccColorStep: XrFrame.Vector4 = xrFrameSystem.Vector4.createFromNumber(0, 0, 0, 0);\n    private _activeSubEmitterSystem;\n\n    private _rootEmitterSystem;\n\n    get material() {\n        return this._material;\n    }\n\n    set material(value: Material) {\n        if (!this._mesh) {\n            return;\n        }\n    }\n\n    get id() {\n        return this._mesh.id;\n    }\n\n    get data() {\n        return this._data;\n    }\n\n    get particleEmitter() {\n        return this._particleEmitter;\n    }\n\n    set data(value: IParticleData) {\n        this._data = value;\n    }\n\n    /**\n     * 粒子系统开始播放。\n     * \n     * @param delay 设定粒子延时几秒后再播放。\n     */\n    public start(delay) {\n        if (delay) {\n            setTimeout(() => {\n                this.start(0);\n            }, delay);\n            return;\n        }\n\n        this._start = true;\n        this._stop = false;\n\n        if (this._preWarmCycles) {\n            for (var index = 0; index < this._preWarmCycles; index++) {\n                this._updateRenderData(0, true);\n            }\n        }\n    }\n\n    /**\n     * 停止粒子系统与其子发射器的播放。\n     */\n    public stop() {\n        if (this._stop) {\n            return;\n        }\n        this._stop = true;\n        this.stopSubEmitters();\n    }\n\n    /**\n     * 当粒子系统添加到场景中时会执行的函数\n     */\n    public onAdd(parent: Element, data: IParticleData) {\n        if (this._mesh) {\n            return;\n        }\n        // 将元素和粒子所在场景给予对应成员变量\n        this.particleEl = this.el;\n        this.particleScene = this.el.scene;\n        this._data = data;\n        this.initParticle(this._data);\n        // 检查是否存在子发射器\n        this._prepareSubEmitterArray();\n        // 粒子系统开始运行，delay控制几秒后执行\n        this.start(this._delay);\n    }\n\n    /**\n     * 初始化粒子系统的状态。\n     */\n    public initParticle(data: IParticleData) {\n        this._systemId = CustomParticle.count++;\n        this._parseProperties(data);\n        this._parseAttribute();\n        this._createVertexBuffers();\n        this._createIndexBuffer();\n        this._registerGeometry();\n        this._createMesh();\n        this._chooseEmitterProcess();\n        this._setMeshData(this._material, data.uniforms, data.states);\n\n    }\n\n    /**\n  * 获取一个粒子子发射器。\n  */\n    public createSubEmitter(data: IParticleData) {\n        var particleSystem = new CustomParticle();\n        var tempData: IParticleData = {};\n        particleSystem.data = tempData;\n        particleSystem.particleEl = this.particleEl || this.el;\n        particleSystem.particleScene = this.particleScene || this.el.scene;\n\n        for (var key in data) {\n            particleSystem.data[key] = data[key];\n        }\n\n        //此时还未解析后加入的properties数据, 当此subEmitter被clone后成员数据更新生效\n        var subEmitter = new SubEmitter(particleSystem)\n        return subEmitter;\n    }\n\n    /**\n   * 获取一个拷贝的粒子系统。\n   */\n    public clone() {\n        var cloneParticleSystem = new CustomParticle();\n        var tempData: IParticleData = {};\n        for (var key in this._data) {\n            tempData[key] = this._data[key]\n        }\n        cloneParticleSystem.data = tempData;\n        cloneParticleSystem.particleEl = this.particleScene.createElement(xrFrameSystem.XRNode, {\n            position: \"0 0 0\"\n        });\n        this.particleEl.addChild(cloneParticleSystem.particleEl);\n        cloneParticleSystem.particleScene = this.particleScene;\n        return cloneParticleSystem;\n    }\n\n\n    /**\n     * 重置粒子系统的状态。\n     */\n    public resetParticle() {\n        this._stockInstances.length = 0;\n        this._instances.length = 0;\n        // canvas must be redrawed to make right phenomenon\n        this._updateRenderData(0);\n        this._setMeshData(this._material)\n    };\n\n    /**\n     * 检测子发射器的类型\n     */\n    protected _prepareSubEmitterArray() {\n        this._subEmitters = [];\n        if (this.subEmitters) {\n            this.subEmitters.forEach((subEmitter) => {\n                if (subEmitter instanceof CustomParticle) {\n                    this._subEmitters.push([new SubEmitter(subEmitter)]);\n                } else if (subEmitter instanceof SubEmitter) {\n                    this._subEmitters.push([subEmitter]);\n                } else if (subEmitter instanceof Array) {\n                    this._subEmitters.push(subEmitter);\n                }\n            })\n        }\n        if (this._subEmitters && this._subEmitters.length != 0) {\n            this._activeSubEmitterSystem = new Array();\n        }\n    }\n\n    /**\n     * 停止所有粒子子系统的发射状态。\n     */\n    protected stopSubEmitters() {\n        if (!this._activeSubEmitterSystem) {\n            return;\n        }\n\n        this._activeSubEmitterSystem.forEach((subEmitterSystem) => {\n            subEmitterSystem.stop();\n        })\n\n        this._activeSubEmitterSystem = new Array();\n    }\n\n    /**\n     * 粒子子发射系统从依附的粒子系统中剥离。\n     */\n    protected removeFromRoot() {\n        if (!this._rootEmitterSystem) {\n            return;\n        }\n        var index = this._rootEmitterSystem._activeSubEmitterSystem.indexOf(this);\n        if (index !== -1) {\n            this._rootEmitterSystem._activeSubEmitterSystem.splice(index, 1);\n        }\n        this._rootEmitterSystem = null;\n    }\n\n    /**\n     * 每一帧粒子系统更新的逻辑\n     */\n    public onTick(deltaTime: number, data: IParticleData): void {\n        this._updateSpeed = deltaTime / 1000;\n\n        //layout发生变化时，会重置粒子系统\n        if (this._vertexLayoutDirty) {\n            this.onUpdate(data, null);\n        } else {\n            this._updateRenderData(deltaTime);\n            this._setMeshData(this._material, data.uniforms);\n        }\n\n        this._material?._checkTextures(deltaTime);\n    }\n\n    public onUpdate(data: IParticleData, preData: IParticleData) {\n        if (!this._mesh) {\n            return;\n        }\n\n        let startState = this._start;\n        this._start = false;\n\n        // 如果顶点布局发生变化，则需要重置粒子系统\n        if (this._vertexLayoutDirty) {\n            this.resetParticle();\n            this._parseAttribute();\n            this._createVertexBuffers();\n            this._setMeshData(this._material, data.uniforms);\n            this._vertexLayoutDirty = false;\n        } else {\n            //wxml属性更新\n            this.resetParticle();\n            this.initParticle(data);\n        }\n\n        this._start = startState;\n    }\n\n    // 每一帧进行粒子生成和粒子位置与轨迹运算的核心逻辑\n    protected _updateRenderData(deltaTime: number, isPreWarm: boolean = false) {\n        if (!this._start) {\n            return;\n        }\n\n        var newInstanceSum;\n\n        var rate = this._emitRate;\n        var _scaledUpdateSpeed = this._updateSpeed * (isPreWarm ? this._preWarmStepOffset : 1);\n        newInstanceSum = (rate * _scaledUpdateSpeed) >> 0;\n        this._excessInstance += rate * _scaledUpdateSpeed - newInstanceSum;\n\n        if (this._excessInstance > 1.0) {\n            newInstanceSum += this._excessInstance >> 0;\n            this._excessInstance -= this._excessInstance >> 0;\n        }\n\n        //burst mode\n        //控制粒子喷射效果的逻辑\n        if (this._burstCount > 0) {\n            var cycle: boolean = false;\n            var begin: boolean = false;\n\n            //达到喷射时间时，开始第一次喷射\n            if (this._burstCountTime < this._burstTime) {\n                this._burstCountTime += this._updateSpeed;\n            } else {\n                begin = true;\n            }\n\n            if (begin) {\n                // 判断喷射间隙, 如果喷射间隙过短则视为仅喷射一次\n                if (this._burstInterval < 0.01) {\n                    if (this._burstInterval >= 0) {\n                        newInstanceSum += this._burstCount;\n                        this._burstInterval = -1;\n                    }\n                } else {\n                    this._burstCountInterval += this._updateSpeed;\n                    if (this._burstCountInterval > this._burstInterval) {\n                        cycle = true;\n                        this._burstCountInterval = 0\n                    }\n                }\n            }\n\n            // 判断喷射循环的次数\n            if (cycle) {\n                if (this._burstCycle != -1) {\n                    if (this._burstCountCycle >= this._burstCycle >> 0) {\n                        cycle = false;\n                    } else {\n                        this._burstCountCycle++;\n                    }\n                }\n            }\n\n            if (cycle) {\n                newInstanceSum += this._burstCount >> 0;\n            }\n        }\n\n        this._alive = false;\n\n        if (!this._stop) {\n            this._actualFrame += _scaledUpdateSpeed;\n            if (this._stopDuration && this._actualFrame >= this._stopDuration) {\n                this.stop();\n            }\n        }\n        else {\n            newInstanceSum = 0;\n        }\n        this.update(newInstanceSum);\n\n        if (this._stop) {\n            if (!this._alive) {\n                this._start = false;\n                this.resetParticle();\n                this.removeFromRoot();\n            }\n        }\n\n        if (!isPreWarm) {\n            var offset = 0;\n            // 每帧此处需要清空_vertexData\n            this._vertexData.fill(0);\n            for (var index = 0; index < this._instances.length; index++) {\n                var particle = this._instances[index];\n                this._appendParticleVertices(offset, particle);\n                if (this._useRenderMesh) {\n                    offset += this._vertexCount;\n                } else {\n                    offset += 4;\n                }\n                if (particle.subEmitterMuster && particle.subEmitterMuster.length > 0) {\n                    particle.subEmitterMuster.forEach((subEmitter: SubEmitter) => {\n                        subEmitter.particleSystem.onTick(deltaTime, subEmitter.particleSystem.data);\n                    })\n                }\n            }\n\n            if (this._activeSubEmitterSystem && this._activeSubEmitterSystem.length > 0) {\n                this._activeSubEmitterSystem.forEach((particleSystem) => {\n                    particleSystem.onTick(deltaTime, particleSystem.data);\n                })\n            }\n        }\n    }\n\n    /**\n     * 创建一个粒子实例。\n     */\n    protected createParticle() {\n        var instance: ParticleInstance;\n        if (this._stockInstances.length !== 0) {\n            instance = this._stockInstances.pop();\n            instance.reset();\n        }\n        else {\n            instance = new ParticleInstance(this);\n        }\n\n        if (this._subEmitters && this._subEmitters.length > 0) {\n            var subEmitters = this._subEmitters[Math.floor(Math.random() * this._subEmitters.length)];\n            instance.subEmitterMuster = [];\n            subEmitters.forEach((subEmitter) => {\n                if (subEmitter.state == SubEmitterState.ATTACH) {\n                    var tempEmitter = subEmitter.clone();\n                    instance.subEmitterMuster.push(tempEmitter);\n                    tempEmitter.particleSystem.start();\n                }\n            })\n        }\n        return instance;\n    };\n\n    /**\n     * 启动处于END状态的粒子子发射器。\n     * @param {ParticleInstance} instance 粒子实例\n     */\n    protected particleSubEmitter(instance: ParticleInstance) {\n        if (!this._subEmitters || this._subEmitters.length == 0) {\n            return;\n        }\n        var tempIndex = Math.floor(Math.random() * this._subEmitters.length);\n        this._subEmitters[tempIndex].forEach((subEmitter) => {\n            if (subEmitter.state == SubEmitterState.END) {\n                var tempEmitter = subEmitter.clone();\n                tempEmitter.particleSystem._rootEmitterSystem = this;\n                // the position of sub emitter from one particle \n                tempEmitter.particleSystem.emitterPosition = instance.position.clone();\n                this._activeSubEmitterSystem.push(tempEmitter.particleSystem);\n                tempEmitter.particleSystem.start();\n            }\n        })\n    }\n\n    /**\n     * 回收当前粒子实例，并放入储备粒子队列。\n     * @param {ParticleInstance} particle 粒子实例\n     */\n    protected recycleParticle(particle: ParticleInstance) {\n        var lastParticle = this._instances.pop();\n        if (lastParticle !== particle) {\n            lastParticle.copyTo(particle);\n        }\n        this._stockInstances.push(lastParticle);\n    }\n\n    /**\n     * 更新每一个粒子的状态。\n     * @param {number} instancesSum 新生成的粒子数\n     */\n    protected update(instancesSum: number) {\n        // Update current\n        this._alive = this._instances.length > 0;\n\n        if (!this._alive && this._stop) {\n            return;\n        }\n\n\n        var emitterPosition = this._emitterPosition;\n        this._emitterWorldMatrix = xrFrameSystem.Matrix4.IDENTITY.translate(emitterPosition.x, emitterPosition.y, emitterPosition.z);\n        this._emitterWorldMatrix.inverse(this._emitterInverseWorldMatrix);\n\n        var instance: ParticleInstance;\n        var loop = (index) => {\n            if (this._instances.length === this._capacity) {\n                return \"break\";\n            }\n            instance = this.createParticle();\n            this._instances.push(instance);\n            this.initInstanceProperty(instance);\n        };\n        for (var index = 0; index < instancesSum; index++) {\n            var state = loop(index);\n            if (state === \"break\")\n                break;\n        }\n\n        this.updateInstanceProperty(this._instances);\n\n    };\n\n    /**\n     * 初始化粒子实例。\n     * @param {ParticleInstance} instance 需要初始化的粒子实例\n     */\n    protected initInstanceProperty(instance: ParticleInstance) {\n        instance.lifeTime = randomBetween(this._minLifeTime, this._maxLifeTime);\n\n        //Ramp\n        if (this._useRampGradients) {\n            instance.rampPos = xrFrameSystem.Vector4.createFromNumber(0, 1, 0, 1);\n        }\n\n        //Position\n        this._particleEmitter.startPosition(this._emitterWorldMatrix, instance.position);\n\n        //Rotation\n        instance.angularSpeed = randomBetween(this._minAngularSpeed, this._maxAngularSpeed);\n        instance.angle = randomBetween(this._startAngle, this._startAngle2);\n\n        //Direction\n        instance.speed = randomBetween(this._minSpeed, this._maxSpeed);\n        this._particleEmitter.startDirection(this._emitterWorldMatrix, instance.direction, instance.position);\n\n        //Color\n        if (this._colorGradients && this._colorGradients.length > 0) {\n            instance.currentColorGradient = this._colorGradients[0];\n            instance.currentColorGradient.getColor(instance.currentColor);\n            instance.color = instance.currentColor.clone();\n            if (this._colorGradients.length > 1) {\n                this._colorGradients[1].getColor(instance.currentColor2);\n            } else {\n                instance.currentColor2 = instance.currentColor.clone();\n            }\n        } else {\n            var lerpStep = Math.random();\n            var startColor2, endColor;\n\n            startColor2 = this._startColor2 ?? this._startColor;\n            endColor = this._endColor ?? this._startColor;\n\n            this.lerpNumberArrayToVector(instance.color, this._startColor, startColor2, lerpStep);\n            this.lerpNumberArrayToVector(this._tempEndColor, endColor, endColor, lerpStep);\n            this._tempEndColor.sub(instance.color, this._tempDiffColor);\n            this._tempDiffColor.scale(1 / instance.lifeTime, instance.colorStep);\n        }\n\n        //Color-alpha\n        if (this._alphaGradients && this._alphaGradients.length > 0) {\n            instance.currentAlphaGradient = this._alphaGradients[0];\n            instance.currentAlpha = instance.currentAlphaGradient.getFactor();\n            instance.color.w = instance.currentAlpha;\n            if (this._alphaGradients.length > 1) {\n                instance.currentAlpha2 = this._alphaGradients[1].getFactor();\n            } else {\n                instance.currentAlpha2 = instance.currentAlpha;\n            }\n        }\n\n        //Speed\n        if (this._speedScaleGradients && this._speedScaleGradients.length > 0) {\n            instance.currentSpeedScaleGradient = this._speedScaleGradients[0];\n            instance.currentSpeedScale = instance.currentSpeedScaleGradient.getFactor();\n            if (this._speedScaleGradients.length > 1) {\n                instance.currentSpeedScale2 = this._speedScaleGradients[1].getFactor();\n            } else {\n                instance.currentSpeedScale2 = instance.currentSpeedScale;\n            }\n        }\n\n        //Limit-speed\n        if (this._limitSpeedGradients && this._limitSpeedGradients.length > 0) {\n            instance.currentLimitSpeedGradient = this._limitSpeedGradients[0];\n            instance.currentLimitSpeed = instance.currentLimitSpeedGradient.getFactor();\n            if (this._limitSpeedGradients.length > 1) {\n                instance.currentLimitSpeed2 = this._limitSpeedGradients[1].getFactor();\n            } else {\n                instance.currentLimitSpeed2 = instance.currentLimitSpeed;\n            }\n        }\n\n        //Drag\n        if (this._dragGradients && this._dragGradients.length > 0) {\n            instance.currentDragGradient = this._dragGradients[0];\n            instance.currentDrag = instance.currentDragGradient.getFactor();\n            if (this._dragGradients.length > 1) {\n                instance.currentDrag2 = this._dragGradients[1].getFactor();\n            } else {\n                instance.currentDrag2 = instance.currentDrag;\n            }\n        }\n\n        //Scale\n        instance.scale.setValue(randomBetween(this._minScaleX, this._maxScaleX), randomBetween(this._minScaleY, this._maxScaleY));\n\n        if (this._sizeGradients && this._sizeGradients.length > 0) {\n            instance.currentSizeGradient = this._sizeGradients[0];\n            instance.currentSize = instance.currentSizeGradient.getFactor();\n            instance.sizeGradientFactor = instance.currentSize;\n            instance.startSize = randomBetween(this._minSize, this._maxSize);\n            instance.size = instance.startSize * instance.sizeGradientFactor;\n            if (this._sizeGradients.length > 1) {\n                instance.currentSize2 = this._sizeGradients[1].getFactor();\n            } else {\n                instance.currentSize2 = instance.currentSize;\n            }\n        } else {\n            instance.size = randomBetween(this._minSize, this._maxSize);\n        }\n\n        //SpriteSheet\n        if (this.useSpriteSheet) {\n            instance.startSpriteCellIndex = this._startSpriteCellIndex;\n            instance.endSpriteCellIndex = this._endSpriteCellIndex;\n        }\n    }\n\n    protected fetch(u, v, width, height, content) {\n        u = u * 0.5 + 0.5;\n        v = v * 0.5 + 0.5;\n        const wrappedU = (u * width) % width | 0;\n        const wrappedV = (v * height) % height | 0;\n        const position = (wrappedU + wrappedV * width) * 4;\n        return content[position] / 255;\n    }\n\n    /**\n    * 更新运动过程中粒子实例的各项属性以及子发射器状态。\n    * @param {Array} instances 粒子实例数组\n    */\n    protected updateInstanceProperty(instances) {\n        var loop = (index) => {\n            var instance: ParticleInstance = instances[index];\n\n            var scaledUpdateSpeed = this._updateSpeed;\n            var previousAge = instance.age;\n            instance.age += this._updateSpeed;\n\n            if (instance.age > instance.lifeTime) {\n                var diff = instance.age - previousAge;\n                var oldDiff = instance.lifeTime - previousAge;\n                scaledUpdateSpeed = (oldDiff * scaledUpdateSpeed) / diff;\n                instance.age = instance.lifeTime;\n            }\n\n            this.processInstance(instance);\n            if (this._particleEmitter.processInstance) {\n                this._particleEmitter.processInstance(instance, this._updateSpeed);\n            }\n\n            // attached subemitter dynamic position \n            if (instance.subEmitterMuster) {\n                instance.subEmitterMuster.forEach((subEmitter) => {\n                    subEmitter.particleSystem.emitterPosition = instance.position.clone();\n                })\n            }\n\n            if (this.useSpriteSheet) {\n                instance.updateCellIndex();\n            }\n\n            if (instance.age >= instance.lifeTime) {\n                this.particleSubEmitter(instance);\n                if (instance.subEmitterMuster) {\n                    instance.subEmitterMuster.forEach((subEmitter) => {\n                        subEmitter.particleSystem.stop();\n                    })\n                    instance.subEmitterMuster = null;\n                }\n                this.recycleParticle(instance);\n                index--;\n            }\n            popIndex = index;\n        }\n\n        var popIndex;\n        for (var index = 0; index < instances.length; index++) {\n            loop(index);\n            index = popIndex;\n        }\n    }\n\n    /**\n     * 更新粒子实例的各项属性。\n     * @param {ParticleInstance} instance 待更新的粒子实例\n     */\n    protected processInstance(instance: ParticleInstance) {\n        var ratio = instance.age / instance.lifeTime;\n        var scaledUpdateSpeed = this._updateSpeed;\n        //RampColor  \n        if (this._useRampGradients) {\n            if (this._colorRemapGradients && this._colorRemapGradients.length > 0) {\n                BasicGradientMethod.GetCurrentGradient(ratio, this._colorRemapGradients, (currentGradient, nextGradient, lerp) => {\n                    var min = currentGradient.factor + (nextGradient.factor - currentGradient.factor) * lerp;\n                    var max = currentGradient.factor2 + (nextGradient.factor2 - currentGradient.factor2) * lerp;\n                    instance.rampPos.x = min;\n                    instance.rampPos.y = max - min;\n                })\n            }\n        }\n\n\n        //Color \n        if (this._colorGradients && this._colorGradients.length > 0) {\n            BasicGradientMethod.GetCurrentGradient(ratio, this._colorGradients, (currentGradient, nextGradient, lerp) => {\n                if (instance.currentColorGradient != currentGradient) {\n                    instance.currentColor = instance.currentColor2.clone();\n                    nextGradient.getColor(instance.currentColor2);\n                    instance.currentColorGradient = currentGradient;\n                }\n                instance.color.x = instance.currentColor.x + (instance.currentColor2.x - instance.currentColor.x) * lerp;\n                instance.color.y = instance.currentColor.y + (instance.currentColor2.y - instance.currentColor.y) * lerp;\n                instance.color.z = instance.currentColor.z + (instance.currentColor2.z - instance.currentColor.z) * lerp;\n                instance.color.w = instance.currentColor.w + (instance.currentColor2.w - instance.currentColor.w) * lerp;\n            })\n\n        } else {\n            instance.colorStep.scale(scaledUpdateSpeed, this._tempAccColorStep);\n            instance.color.add(this._tempAccColorStep, instance.color);\n            if (instance.color.w < 0) {\n                instance.color.w = 0;\n            }\n\n            if (instance.color.w > 1) {\n                instance.color.w = 1;\n            }\n        }\n\n        //Color Alpha\n        if (this._alphaGradients && this._alphaGradients.length > 0) {\n            BasicGradientMethod.GetCurrentGradient(ratio, this._alphaGradients, (currentGradient, nextGradient, lerp) => {\n                if (instance.currentAlphaGradient != currentGradient) {\n                    instance.currentAlpha = instance.currentAlpha2;\n                    instance.currentAlpha2 = nextGradient.getFactor();\n                    instance.currentAlphaGradient = currentGradient;\n                }\n                instance.color.w = instance.currentAlpha + (instance.currentAlpha2 - instance.currentAlpha) * lerp;\n            })\n        }\n\n        //--- Velocity ---//\n\n        var speed = instance.speed;\n\n        //Speed\n        if (this._speedScaleGradients && this._speedScaleGradients.length > 0) {\n            BasicGradientMethod.GetCurrentGradient(ratio, this._speedScaleGradients, (currentGradient, nextGradient, lerp) => {\n                if (instance.currentSpeedScaleGradient != currentGradient) {\n                    instance.currentSpeedScale = instance.currentSpeedScale2;\n                    instance.currentSpeedScale = nextGradient.getFactor();\n                    instance.currentSpeedScaleGradient = currentGradient;\n                }\n                var currentSpeedScale = instance.currentSpeedScale + (instance.currentSpeedScale2 - instance.currentSpeedScale) * lerp;\n                speed = speed * currentSpeedScale;\n            })\n        }\n\n        //Limit-speed\n        if (this._limitSpeedGradients && this._limitSpeedGradients.length > 0) {\n            BasicGradientMethod.GetCurrentGradient(ratio, this._limitSpeedGradients, (currentGradient, nextGradient, lerp) => {\n                if (instance.currentLimitSpeedGradient != currentGradient) {\n                    instance.currentLimitSpeed = instance.currentSpeedScale2;\n                    instance.currentLimitSpeed = nextGradient.getFactor();\n                    instance.currentLimitSpeedGradient = currentGradient;\n                }\n                var limitSpeed = instance.currentLimitSpeed + (instance.currentLimitSpeed2 - instance.currentLimitSpeed) * lerp;\n                if (Math.abs(instance.speed) > limitSpeed) {\n                    speed = speed * (1 - this._speedDampenFactor);\n                }\n            })\n        }\n\n        //Drag\n        if (this._dragGradients && this._dragGradients.length > 0) {\n            BasicGradientMethod.GetCurrentGradient(ratio, this._dragGradients, (currentGradient, nextGradient, lerp) => {\n                if (instance.currentDragGradient != currentGradient) {\n                    instance.currentDrag = instance.currentSpeedScale2;\n                    instance.currentDrag = nextGradient.getFactor();\n                    instance.currentDragGradient = currentGradient;\n                }\n                instance.drag = instance.currentDrag + (instance.currentDrag2 - instance.currentDrag) * lerp;\n            })\n        }\n\n        var velocity = instance.direction.scale(speed * (1 - instance.drag));\n\n        //--- End Velocity ---//\n\n        //Angle\n        instance.angle += instance.angularSpeed * scaledUpdateSpeed;\n\n        //Gravity\n        var scaledGravityDirection = xrFrameSystem.Vector3.createFromNumber(0, -1 * this._gravity, 0);\n\n        //Direction\n        var scaledDirection = velocity.add(scaledGravityDirection).scale(scaledUpdateSpeed);\n\n        //Position\n        instance.position.add(scaledDirection, instance.position);\n\n        //Size\n        if (this._sizeGradients && this._sizeGradients.length > 0) {\n            BasicGradientMethod.GetCurrentGradient(ratio, this._sizeGradients, (currentGradient, nextGradient, lerp) => {\n                if (instance.currentSizeGradient != currentGradient) {\n                    instance.currentSize = instance.currentSize2;\n                    instance.currentSize2 = nextGradient.getFactor();\n                    instance.currentSizeGradient = currentGradient;\n                }\n                instance.sizeGradientFactor = instance.currentSize + (instance.currentSize2 - instance.currentSize) * lerp;\n                instance.size = instance.startSize * instance.sizeGradientFactor;\n            })\n        }\n    }\n}\nxrFrameSystem.registerComponent('custom-particle', CustomParticle)\n\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/index.wxml",
    "content": "<xr-scene id=\"xr-scene\" bind:ready=\"handleReady\">\n    <xr-assets bind:progress=\"handleAssetsProgress\" bind:loaded=\"handleAssetsLoaded\">\n        <xr-asset-load type=\"texture\" asset-id=\"flarePicture\" src=\"https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/particles/flare.png\" />\n\n    </xr-assets>\n\n    <xr-node>\n        <xr-mesh node-id=\"mesh-plane\" position=\"0 -1 0\" rotation=\"0 0 0\" scale=\"5 0.2 5\" geometry=\"cube\" material=\"blue-mat\" uniforms=\"u_baseColorFactor:0.48 0.78 0.64 1\"></xr-mesh>\n        <xr-env sky-map=\"sky\" is-sky2d />\n\n        <xr-node node-id=\"camera-target\" position=\"0 0 0\"></xr-node>\n\n        <xr-shadow id=\"paritcleSystemRoot\" node-id=\"paritcleSystemRoot\"></xr-shadow>\n\n        <!-- <xr-particle  capacity=\"100\" size=\"0.1\" emit-rate=\"12\" life-time=\"4\" angle=\"0 360\">\n    </xr-particle> -->\n\n\n        <xr-camera id=\"camera\" node-id=\"camera\" position=\"0 6 -6\" clear-color=\"0.1 0.1 0.1 1\" target=\"mesh-plane\" background=\"skybox\" camera-orbit-control=\"\"></xr-camera>\n\n    </xr-node>\n    <xr-node node-id=\"lights\">\n        <xr-light type=\"ambient\" color=\"1 1 1\" intensity=\"1.2\" />\n        <xr-light type=\"directional\" rotation=\"90 0 0\" color=\"1 1 1\" intensity=\"2.5\" />\n    </xr-node>\n\n</xr-scene>"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/components/Particle/index.wxss",
    "content": "/* xr/index.wxss */"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/elements/xr-auto-rotate-touchable-gltf.ts",
    "content": "import XrFrame from 'XrFrame';\nconst xrFrameSystem = wx.getXrFrameSystem();\n\nconst AutoRotateTouchableGLTFDefaultComponents: XrFrame.IEntityComponents = Object.assign({\n  'mesh-shape': {},\n  'auto-rotate': {}\n}, xrFrameSystem.GLTFDefaultComponents);\n\nconst AutoRotateTouchableGLTFDataMapping: {[key: string]: string[];} = Object.assign({\n  speed: ['auto-rotate', 'speed']\n}, xrFrameSystem.GLTFDataMapping);\n\nxrFrameSystem.registerElement('auto-rotate-touchable-gltf', class XRAutoRotateTouchableGLTF extends xrFrameSystem.Element {\n  public readonly defaultComponents: XrFrame.IEntityComponents = AutoRotateTouchableGLTFDefaultComponents;\n  public readonly dataMapping: {[key: string]: string[];} = AutoRotateTouchableGLTFDataMapping;\n});\n"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/elements/xr-custom-particle.ts",
    "content": "import XrFrame from 'XrFrame';\nconst xrFrameSystem = wx.getXrFrameSystem();\n\nexport const CustomParticleDefaultComponents: XrFrame.IEntityComponents = Object.assign({\n    'custom-particle': {}\n  }, xrFrameSystem.NodeDefaultComponents);\n  \n  export const CustomParticleDataMapping: { [key: string]: string[] } = Object.assign({\n    'never-cull': ['custom-particle', 'neverCull'],\n    uniforms: ['custom-particle', 'uniforms'],\n    states: ['custom-particle', 'states'],\n    'atlas': ['custom-particle', 'atlas'],\n    'atlas-frames': ['custom-particle', 'atlasFrames'],\n    'atlas-loop': ['custom-particle', 'atlasLoop'],\n    'atlas-speed': ['custom-particle', 'atlasSpeed'],\n    'atlas-random': ['custom-particle', 'atlasRandom'],\n    angle: ['custom-particle', 'angle'],\n    'angular-speed': ['custom-particle', 'angularSpeed'],\n    'burst-count': ['custom-particle', 'burstCount'],\n    'burst-time': ['custom-particle', 'burstTime'],\n    'burst-cycle': ['custom-particle', 'burstCycle'],\n    'burst-interval': ['custom-particle', 'burstInterval'],\n    capacity: ['custom-particle', 'capacity'],\n    delay: ['custom-particle', 'delay'],\n    'emit-rate': ['custom-particle', 'emitRate'],\n    'emitter-type': ['custom-particle', 'emitterType'],\n    'emitter-props': ['custom-particle', 'emitterProps'],\n    'emitter-position': ['custom-particle', 'emitterPosition'],\n    'end-color': ['custom-particle', 'endColor'],\n    gravity: ['custom-particle', 'gravity'],\n    'life-time': ['custom-particle', 'lifeTime'],\n    'render-mode': ['custom-particle', 'renderMode'],\n    'render-model': ['custom-particle', 'renderModel'],\n    size: ['custom-particle', 'size'],\n    'stop-duration': ['custom-particle', 'stopDuration'],\n    speed: ['custom-particle', 'speed'],\n    'start-color': ['custom-particle', 'startColor'],\n    'start-color2': ['custom-particle', 'startColor2'],\n    texture: ['custom-particle', 'texture'],\n    'scale-x': ['custom-particle', 'scaleX'],\n    'scale-y': ['custom-particle', 'scaleY'],\n    'prewarm-cycles': ['custom-particle', 'prewarmCycles'],\n    'speed-dampen': ['custom-particle', 'speedDampen'],\n    'mesh': ['custom-particle', 'mesh'],\n    'size-change': ['custom-particle', 'sizeChange'],\n    'color-change': ['custom-particle', 'colorChange'],\n    'speed-change': ['custom-particle', 'speedChange'],\n  }, xrFrameSystem.NodeDataMapping);\n  \n  xrFrameSystem.registerElement('custom-particle', class XRCustomParticle extends xrFrameSystem.Element {\n    public readonly defaultComponents: XrFrame.IEntityComponents = CustomParticleDefaultComponents;\n    public readonly dataMapping: { [key: string]: string[] } = CustomParticleDataMapping;\n  })"
  },
  {
    "path": "miniprogram/packageXRFrame/xr-custom/elements/xr-shining-star.ts",
    "content": "import XrFrame from 'XrFrame';\nconst xrFrameSystem = wx.getXrFrameSystem();\n\nxrFrameSystem.registerMaterial('shining', scene => {\n  return scene.createMaterial(scene.assets.getAsset<XrFrame.Effect>('effect', 'shining'));\n});\n\nconst ShiningStarDefaultComponents: XrFrame.IEntityComponents = Object.assign({\n  mesh: {\n    geometry: 'star',\n    material: 'shining'\n  }\n}, xrFrameSystem.NodeDefaultComponents);\n\nconst ShiningStarDataMapping: {[key: string]: string[];} = Object.assign({\n  uniforms: ['mesh', 'uniforms']\n}, xrFrameSystem.NodeDataMapping);\n\nxrFrameSystem.registerElement('shining-star', class XRShiningStar extends xrFrameSystem.Element {\n  public readonly defaultComponents: XrFrame.IEntityComponents = ShiningStarDefaultComponents;\n  public readonly dataMapping: {[key: string]: string[];} = ShiningStarDataMapping;\n});\n"
  },
  {
    "path": "miniprogram/page/API/components/set-tab-bar/set-tab-bar.js",
    "content": "const defaultTabBarStyle = {\n  color: '#7A7E83',\n  selectedColor: '#3cc51f',\n  backgroundColor: '#ffffff',\n}\nconst darkDefaultTabBarStyle = {\n  color: '#FFFFFF',\n  selectedColor: '#51A937',\n  backgroundColor: '#1F1F1F',\n}\n\nconst defaultItemName = '接口'\n\nComponent({\n  data: {\n    hasSetTabBarBadge: false,\n    hasShownTabBarRedDot: false,\n    hasCustomedStyle: false,\n    hasCustomedItem: false,\n    hasHiddenTabBar: false,\n    theme: 'light'\n  },\n\n  attached() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n        if (this.data.theme == 'dark') {\n          wx.setTabBarStyle(darkDefaultTabBarStyle)\n        } else {\n          wx.setTabBarStyle(defaultTabBarStyle)\n        }\n      })\n    }\n    wx.pageScrollTo({\n      scrollTop: 0,\n      duration: 0\n    })\n  },\n\n  detached() {\n    this.removeTabBarBadge()\n    this.hideTabBarRedDot()\n    this.showTabBar()\n    this.removeCustomStyle()\n    this.removeCustomItem()\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  methods: {\n    navigateBack() {\n      this.triggerEvent('unmount')\n    },\n\n    setTabBarBadge() {\n      if (this.data.hasSetTabBarBadge) {\n        this.removeTabBarBadge()\n        return\n      }\n      this.setData({\n        hasSetTabBarBadge: true\n      })\n      wx.setTabBarBadge({\n        index: 1,\n        text: '1',\n      })\n    },\n\n    removeTabBarBadge() {\n      this.setData({\n        hasSetTabBarBadge: false\n      })\n      wx.removeTabBarBadge({\n        index: 1,\n      })\n    },\n\n    showTabBarRedDot() {\n      if (this.data.hasShownTabBarRedDot) {\n        this.hideTabBarRedDot()\n        return\n      }\n      this.setData({\n        hasShownTabBarRedDot: true\n      })\n      wx.showTabBarRedDot({\n        index: 1\n      })\n    },\n\n    hideTabBarRedDot() {\n      this.setData({\n        hasShownTabBarRedDot: false\n      })\n      wx.hideTabBarRedDot({\n        index: 1\n      })\n    },\n\n    showTabBar() {\n      this.setData({ hasHiddenTabBar: false })\n      wx.showTabBar()\n    },\n\n    hideTabBar() {\n      if (this.data.hasHiddenTabBar) {\n        this.showTabBar()\n        return\n      }\n      this.setData({ hasHiddenTabBar: true })\n      wx.hideTabBar()\n    },\n\n    customStyle() {\n      if (this.data.hasCustomedStyle) {\n        this.removeCustomStyle()\n        return\n      }\n      this.setData({ hasCustomedStyle: true })\n      wx.setTabBarStyle({\n        color: '#FFF',\n        selectedColor: '#1AAD19',\n        backgroundColor: '#000000',\n      })\n    },\n\n    removeCustomStyle() {\n      this.setData({ hasCustomedStyle: false })\n      if (this.data.theme == 'dark') {\n        wx.setTabBarStyle(darkDefaultTabBarStyle)\n      } else {\n        wx.setTabBarStyle(defaultTabBarStyle)\n      }\n    },\n\n    customItem() {\n      if (this.data.hasCustomedItem) {\n        this.removeCustomItem()\n        return\n      }\n      this.setData({ hasCustomedItem: true })\n      wx.setTabBarItem({\n        index: 1,\n        text: 'API'\n      })\n    },\n\n    removeCustomItem() {\n      this.setData({ hasCustomedItem: false })\n      wx.setTabBarItem({\n        index: 1,\n        text: defaultItemName\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/page/API/components/set-tab-bar/set-tab-bar.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/page/API/components/set-tab-bar/set-tab-bar.wxml",
    "content": "<!-- FIXME: workaround for glass-easel cross package import reference lookup, remove this ASAP -->\n<import src=\"/common/head.wxml\" />\n<import src=\"/common/foot.wxml\" />\n<!-- end of workaround -->\n\n<import src=\"../../../../common/head.wxml\" />\n<import src=\"../../../../common/foot.wxml\" />\n\n<view class=\"container page\" data-weui-theme=\"{{theme}}\">\n  <template is=\"head\" data=\"{{title: 'tabBar'}}\"/>\n\n  <view class=\"page-body\">\n    <view class=\"btn-area\">\n      <button bindtap=\"setTabBarBadge\">\n        {{ !hasSetTabBarBadge ? '设置tab徽标' : '移除tab徽标' }}\n      </button>\n      <button bindtap=\"showTabBarRedDot\">\n        {{ !hasShownTabBarRedDot ?  '显示红点' : '移除红点'}}\n      </button>\n      <button bindtap=\"customStyle\">\n        {{ !hasCustomedStyle ? '自定义Tab样式' : '移除自定义样式'}}\n      </button>\n      <button bindtap=\"customItem\">\n        {{ !hasCustomedItem ? '自定义Tab信息' : '移除自定义信息' }}\n      </button>\n      <button bindtap=\"hideTabBar\">\n        {{ !hasHiddenTabBar ? '隐藏TabBar' : '显示TabBar' }}\n      </button>\n    </view>\n\n    <view class=\"btn-area\">\n      <button type=\"primary\" bindtap=\"navigateBack\">返回上一级</button>\n    </view>\n  </view>\n\n  <template is=\"foot\" />\n</view>\n"
  },
  {
    "path": "miniprogram/page/API/components/set-tab-bar/set-tab-bar.wxss",
    "content": "\n@import \"../../../../app.wxss\";\n\n.container {\n  width: 100vw;\n}\n.weui-label {\n  width: 5em;\n}\n"
  },
  {
    "path": "miniprogram/page/API/index.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '小程序接口能力展示',\n      path: 'page/API/index'\n    }\n  },\n\n  data: {\n    list: [{\n      id: 'chattool',\n      name: '聊天工具',\n      open: false,\n      pages: [{\n        zh: '活动签到',\n        url: 'activity_assist/activity_assist'\n      }]\n    }, {\n      id: 'api',\n      name: '开放接口',\n      open: false,\n      pages: [{\n        zh: '微信登录',\n        url: 'login/login'\n      }, {\n        zh: '获取用户信息',\n        url: 'get-user-info/get-user-info'\n      }, {\n        zh: '发起支付',\n        url: 'request-payment/request-payment'\n      }, {\n        zh: '跳转',\n        url: 'jump/jump'\n      }, {\n        zh: '公众号',\n        url: 'official-account/official-account'\n      }, {\n        zh: '转发',\n        url: 'share/share'\n      }, {\n        zh: '转发按钮',\n        url: 'share-button/share-button'\n      }, {\n        zh: '客服消息',\n        url: 'custom-message/custom-message'\n      }, {\n        zh: '订阅消息',\n        url: 'subscribe-message/subscribe-message'\n      }, {\n        zh: '收货地址',\n        url: 'choose-address/choose-address'\n      }, {\n        zh: '获取发票抬头',\n        url: 'choose-invoice-title/choose-invoice-title'\n      }, {\n        zh: '生物认证',\n        url: 'soter-authentication/soter-authentication'\n      }, {\n        zh: '设置',\n        url: 'setting/setting'\n      }]\n    }, {\n      id: 'page',\n      name: '界面',\n      open: false,\n      pages: [{\n        zh: '设置界面标题',\n        url: 'set-navigation-bar-title/set-navigation-bar-title'\n      }, {\n        zh: '标题栏加载动画',\n        url: 'navigation-bar-loading/navigation-bar-loading'\n      }, {\n        zh: '设置TabBar',\n        url: '@set-tab-bar'\n      }, {\n        zh: '页面跳转',\n        url: 'navigator/navigator'\n      }, {\n        zh: '下拉刷新',\n        url: 'pull-down-refresh/pull-down-refresh'\n      }, {\n        zh: '创建动画',\n        url: 'animation/animation'\n      }, {\n        zh: '创建绘画',\n        url: 'canvas/canvas'\n      }, {\n        zh: '显示操作菜单',\n        url: 'action-sheet/action-sheet'\n      }, {\n        zh: '显示模态弹窗',\n        url: 'modal/modal'\n      }, {\n        zh: '页面滚动',\n        url: 'page-scroll/page-scroll'\n      }, {\n        zh: '显示消息提示框',\n        url: 'toast/toast'\n      }, {\n        zh: '获取WXML节点信息',\n        url: 'get-wxml-node-info/get-wxml-node-info'\n      }, {\n        zh: 'WXML节点布局相交状态',\n        url: 'intersection-observer/intersection-observer'\n      }]\n    }, {\n      id: 'device',\n      name: '设备',\n      open: false,\n      pages: [{\n        zh: '获取手机网络状态',\n        url: 'get-network-type/get-network-type'\n      }, {\n        zh: '监听手机网络变化',\n        url: 'on-network-status-change/on-network-status-change'\n      }, {\n        zh: '获取手机系统信息',\n        url: 'get-system-info/get-system-info'\n      }, {\n        zh: '获取手机设备电量',\n        url: 'get-battery-info/get-battery-info'\n      }, {\n        zh: '监听重力感应数据',\n        url: 'on-accelerometer-change/on-accelerometer-change'\n      }, {\n        zh: '监听罗盘数据',\n        url: 'on-compass-change/on-compass-change'\n      }, {\n        zh: '打电话',\n        url: 'make-phone-call/make-phone-call'\n      }, {\n        zh: '扫码',\n        url: 'scan-code/scan-code'\n      }, {\n        zh: '剪切板',\n        url: 'clipboard-data/clipboard-data'\n      }, {\n        zh: '蓝牙',\n        url: 'bluetooth/bluetooth'\n      }, {\n        zh: 'iBeacon',\n        url: 'ibeacon/ibeacon'\n      }, {\n        zh: '屏幕亮度',\n        url: 'screen-brightness/screen-brightness'\n      }, {\n        zh: '用户截屏事件',\n        url: 'capture-screen/capture-screen'\n      }, {\n        zh: '振动',\n        url: 'vibrate/vibrate'\n      }, {\n        zh: '手机联系人',\n        url: 'add-contact/add-contact'\n      }, {\n        zh: 'Wi-Fi',\n        url: 'wifi/wifi'\n      }]\n    }, {\n      id: 'performance',\n      name: '性能',\n      open: false,\n      pages: [{\n        zh: '获取性能数据',\n        url: 'get-performance/get-performance'\n      }]\n    }, {\n      id: 'network',\n      name: '网络',\n      open: false,\n      pages: [{\n        zh: '发起一个请求',\n        url: 'request/request'\n      }, {\n        zh: 'WebSocket',\n        url: 'web-socket/web-socket'\n      }, {\n        zh: '上传文件',\n        url: 'upload-file/upload-file'\n      }, {\n        zh: '下载文件',\n        url: 'download-file/download-file'\n      }, {\n        zh: 'UDPSocket',\n        url: 'udp-socket/udp-socket'\n      }, {\n        zh: 'mDNS',\n        url: 'mdns/mdns'\n      }]\n    }, {\n      id: 'media',\n      name: '媒体',\n      open: false,\n      pages: [{\n        zh: '图片',\n        url: 'image/image'\n      }, {\n        zh: '音频',\n        url: 'audio/audio'\n      }, {\n        zh: '录音',\n        url: 'voice/voice'\n      }, {\n        zh: '背景音频',\n        url: 'background-audio/background-audio'\n      }, {\n        zh: '文件',\n        url: 'file/file'\n      }, {\n        zh: '视频',\n        url: 'video/video'\n      }, {\n        zh: '音视频合成',\n        url: 'media-container/media-container'\n      }, {\n        zh: '动态加载字体',\n        url: 'load-font-face/load-font-face'\n      }]\n    }, {\n      id: 'location',\n      name: '位置',\n      open: false,\n      pages: [{\n        zh: '获取当前位置',\n        url: 'get-location/get-location'\n      }, {\n        zh: '使用原生地图查看位置',\n        url: 'open-location/open-location'\n      }, {\n        zh: '使用原生地图选择位置',\n        url: 'choose-location/choose-location'\n      }]\n    }, {\n      id: 'storage',\n      name: '数据',\n      pages: [{\n        zh: '本地存储',\n        url: 'storage/storage'\n      }, {\n        zh: '周期性更新',\n        url: 'get-background-fetch-data/get-background-fetch-data'\n\n      }, {\n        zh: '数据预拉取',\n        url: 'get-background-prefetch-data/get-background-prefetch-data'\n      }],\n    }, {\n      id: 'worker',\n      name: '多线程',\n      url: 'worker/worker'\n    }, {\n      id: 'framework',\n      name: '框架',\n      pages: [{\n        zh: '双向绑定',\n        url: 'two-way-bindings/two-way-bindings',\n      }, {\n        zh: 'WXS',\n        url: 'wxs/wxs'\n      }, {\n        zh: '屏幕旋转',\n        url: 'resizable/resizable'\n      }]\n    }, {\n      id: 'ai',\n      name: '通用AI推理能力',\n      pages: [{\n        zh: 'mobileNet',\n        url: 'mobilenet/index',\n      },\n      {\n        zh: 'style transfer',\n        url: 'style-trans/index',\n      },\n      {\n        zh: 'mobileNetInt8',\n        url: 'mobilenet_int8/index',\n      }\n      ]\n    }, {\n      id: 'ar',\n      name: 'VisionKit视觉能力',\n      pages: [{\n        zh: 'VisionKit基础',\n        url: 'visionkit-basic/visionkit-basic'\n      },\n      {\n        zh: 'VisionKit基础-v2',\n        url: 'visionkit-basic-v2/visionkit-basic-v2'\n      },\n      {\n        zh: '水平面AR',\n        url: 'plane-ar/plane-ar'\n      },\n      {\n        zh: '水平面AR-v2',\n        url: 'plane-ar-v2/plane-ar-v2'\n      },\n      {\n        zh: '水平面AR-v2-marker识别',\n        url: 'plane-ar-v2-marker/plane-ar-v2-marker'\n      },\n      // {\n      //   zh: '水平面AR-v2-虚实遮挡',\n      //   url: 'plane-ar-v2-depth/plane-ar-v2-depth'\n      // },\n      {\n        zh: '水平面AR-v2-附加能力',\n        url: 'plane-ar-v2-options/plane-ar-v2-options'\n      },\n      {\n        zh: '水平面旋转AR',\n        url: 'plane-ar-3dof/plane-ar-3dof'\n      },\n      {\n        zh: '2DMarkerAR',\n        url: '2dmarker-ar/2dmarker-ar'\n      },\n      {\n        zh: '3DMarkerAR-三维识别与重建',\n        url: '3dmarker-ar/3dmarker-ar'\n      },\n      {\n        zh: '单样本检测(OSD)',\n        url: 'osd-ar/osd-ar'\n      },\n      {\n        zh: '相机帧测试',\n        url: 'cameraBuffer-detect/cameraBuffer-detect'\n      },\n      {\n        zh: '相机帧获取jpg图片',\n        url: 'cameraBuffer-jpg/cameraBuffer-jpg'\n      },\n      {\n        zh: '实时深度图检测',\n        url: 'depth-detect/depth-detect'\n      },\n      {\n        zh: '照片深度图检测',\n        url: 'photo-depth-detect/photo-depth-detect'\n      },\n      {\n        zh: '照片OCR检测',\n        url: 'photo-ocr-detect/photo-ocr-detect'\n      },\n      {\n        zh: '照片身份证检测',\n        url: 'photo-idcard-detect/photo-idcard-detect'\n      },\n      {\n        zh: '实时人脸检测',\n        url: 'face-detect/face-detect'\n      },\n      {\n        zh: '实时人脸检测3D',\n        url: 'face-detect-3d/face-detect-3d'\n      },\n      {\n        zh: '实时人脸检测3D-眼镜试戴',\n        url: 'face-detect-3d-glasses/face-detect-3d-glasses'\n      },\n      {\n        zh: '照片人脸检测',\n        url: 'photo-face-detect/photo-face-detect'\n      },\n      {\n        zh: '实时人体检测',\n        url: 'body-detect/body-detect'\n      },\n      {\n        zh: '实时人体检测3D',\n        url: 'body-detect-3d/body-detect-3d'\n      },\n      {\n        zh: '照片人体检测',\n        url: 'photo-body-detect/photo-body-detect'\n      },\n      {\n        zh: '实时手势检测',\n        url: 'hand-detect/hand-detect'\n      },\n      {\n        zh: '实时手势检测3D',\n        url: 'hand-detect-3d/hand-detect-3d'\n      },\n      {\n        zh: '照片手势检测',\n        url: 'photo-hand-detect/photo-hand-detect'\n      },\n      {\n        zh: '实时鞋部检测-AR试鞋',\n        url: 'shoe-detect/shoe-detect'\n      },\n      {\n        zh: 'GassianSplatting 预览',\n        url: 'gaussian-splatting/gaussian-splatting'\n      },\n      {\n        zh: 'GassianSplatting AR预览',\n        url: 'gaussian-splatting/gaussian-splatting-ar'\n      },\n      ],\n    }],\n    isSetTabBarPage: false,\n    theme: 'light'\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({\n        theme\n      }) => {\n        this.setData({\n          theme\n        })\n      })\n    }\n  },\n  onShow() {\n    this.leaveSetTabBarPage()\n  },\n  onHide() {\n    this.leaveSetTabBarPage()\n  },\n  kindToggle(e) {\n    const id = e.currentTarget.id\n    const\n      list = this.data.list\n    for (let i = 0, len = list.length; i < len; ++i) {\n      if (list[i].id === id) {\n        if (list[i].url) {\n          wx.navigateTo({\n            url: `../../packageAPI/pages/${list[i].id}/${list[i].url}`\n          })\n          return\n        }\n        list[i].open = !list[i].open\n      } else {\n        list[i].open = false\n      }\n    }\n    this.setData({\n      list\n    })\n  },\n  enterSetTabBarPage() {\n    this.setData({\n      isSetTabBarPage: true\n    })\n  },\n  leaveSetTabBarPage() {\n    this.setData({\n      isSetTabBarPage: false\n    })\n  },\n})\n"
  },
  {
    "path": "miniprogram/page/API/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"小程序接口能力展示\",\n  \"usingComponents\": {\n    \"set-tab-bar\": \"components/set-tab-bar/set-tab-bar\"\n  },\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/page/API/index.wxml",
    "content": "<mp-navigation-bar title=\"小程序接口能力展示\" back=\"{{false}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<set-tab-bar wx:if=\"{{isSetTabBarPage}}\" bindunmount=\"leaveSetTabBarPage\"></set-tab-bar>\n<view wx:else class=\"index page\" data-weui-theme=\"{{theme}}\">\n  <view class=\"index-hd\">\n    <image class=\"index-logo\" src=\"resources/kind/logo.png\"></image>\n    <text class=\"index-desc\">以下将演示小程序接口能力，具体属性参数详见 <text class=\"weui-agree__link\" bindtap=\"navToDoc\">小程序开发文档</text>。</text>\n  </view>\n  <view class=\"index-bd\">\n    <view class=\"kind-list\">\n      <block wx:for=\"{{list}}\" wx:key=\"{{item.id}}\">\n        <view class=\"kind-list-item\">\n          <view id=\"{{item.id}}\" class=\"kind-list-item-hd {{item.open ? 'kind-list-item-hd-show' : ''}}\" bindtap=\"kindToggle\">\n            <view class=\"kind-list-text\">{{item.name}}</view>\n            <image wx:if=\"{{theme === 'dark'}}\" class=\"kind-list-img\" src=\"resources/kind/{{item.id}}_dark.png\"></image>\n            <image wx:else class=\"kind-list-img\" src=\"resources/kind/{{item.id}}.png\"></image>\n          </view>\n          <view class=\"kind-list-item-bd {{item.open ? 'kind-list-item-bd-show' : ''}}\">\n            <view class=\"navigator-box {{item.open ? 'navigator-box-show' : ''}}\">\n              <block wx:for=\"{{item.pages}}\" wx:for-item=\"page\" wx:key=\"*item\">\n                <view wx:if=\"{{page.url !== '@set-tab-bar'}}\">\n                  <navigator url=\"../../packageAPI/pages/{{item.id}}/{{page.url}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.zh}}</navigator>\n                  <view class=\"navigator-arrow\"></view>\n                </view>\n                <view wx:else bindtap=\"enterSetTabBarPage\">\n                  <view class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.zh}}</view>\n                  <view class=\"navigator-arrow\"></view>\n                </view>\n              </block>\n            </view>\n          </view>\n        </view>\n      </block>\n    </view>\n  </view>\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/page/API/index.wxss",
    "content": "@import \"../../common/reset.wxss\";\n@import \"../common/index-skyline.wxss\";\n\n.weui-agree__link {\n  display: inline;\n  color: #576b95;\n}\n\n[data-weui-theme=dark] .weui-agree__link {\n  color: #7d90a9;\n}\n"
  },
  {
    "path": "miniprogram/page/ad/index.js",
    "content": "let interstitialAd = null\n\nPage({\n  onShareAppMessage() {\n    return {\n      title: '微信广告展示',\n      path: 'page/ad/index'\n    }\n  },\n\n  data: {\n    theme: 'light'\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n\n    // 创建插屏广告\n    if (wx.createInterstitialAd) {\n      interstitialAd = wx.createInterstitialAd({\n        adUnitId: 'adunit-7c0acfb6438237aa'\n      })\n      interstitialAd.onLoad(() => {\n        console.log('插屏广告加载成功')\n      })\n      interstitialAd.onError((err) => {\n        console.error('插屏广告加载失败', err)\n      })\n      interstitialAd.onClose(() => {\n        console.log('插屏广告关闭')\n      })\n    }\n  },\n\n  onShow() {\n    // 显示插屏广告\n    if (interstitialAd) {\n      interstitialAd.show().catch((err) => {\n        console.error('插屏广告显示失败', err)\n      })\n    }\n  },\n\n  onItemTap(e) {\n    const type = e.currentTarget.dataset.type\n    if (type === 'smart') {\n      wx.navigateTo({\n        url: '/page/ad/smart-ad/smart-ad'\n      })\n      return\n    }\n    if (type === 'optimize') {\n      wx.navigateTo({\n        url: '/page/ad/optimize-ad/optimize-ad'\n      })\n      return\n    }\n    const typeMap = {\n      hosting: '广告托管',\n      custom: '自主开发'\n    }\n    wx.showToast({\n      title: '稍后上线',\n      icon: 'none'\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/page/ad/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"广告\",\n  \"renderer\": \"webview\"\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/index.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view class=\"index\">\n    <view class=\"index-hd\">\n      <image class=\"index-logo\" src=\"/image/wechat.png\"></image>\n      <text class=\"index-desc\">微信广告是微信官方提供的广告投放平台，帮助开发者通过小程序实现流量变现。支持多种广告形式，包括 Banner 广告、激励视频广告、插屏广告、原生模板广告等。</text>\n    </view>\n    <view class=\"index-bd\">\n      <view class=\"kind-list\">\n        <view class=\"kind-list-item\">\n          <view class=\"kind-list-item-hd\" bindtap=\"onItemTap\" data-type=\"smart\">\n            <view class=\"kind-list-text\">智能广告</view>\n            <image class=\"kind-list-img\" src=\"resources/kind/logo.png\"></image>\n          </view>\n        </view>\n        <view class=\"kind-list-item\">\n          <view class=\"kind-list-item-hd\" bindtap=\"onItemTap\" data-type=\"optimize\">\n            <view class=\"kind-list-text\">广告调优</view>\n            <image class=\"kind-list-img\" src=\"resources/kind/logo.png\"></image>\n          </view>\n        </view>\n        <view class=\"kind-list-item\">\n          <view class=\"kind-list-item-hd\" bindtap=\"onItemTap\" data-type=\"hosting\">\n            <view class=\"kind-list-text\">广告托管</view>\n            <image class=\"kind-list-img\" src=\"resources/kind/logo.png\"></image>\n          </view>\n        </view>\n        <view class=\"kind-list-item\">\n          <view class=\"kind-list-item-hd\" bindtap=\"onItemTap\" data-type=\"custom\">\n            <view class=\"kind-list-text\">自主开发</view>\n            <image class=\"kind-list-img\" src=\"resources/kind/logo.png\"></image>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/page/ad/index.wxss",
    "content": "@import \"../../common/reset.wxss\";\n@import \"../common/index.wxss\";\n\n.index-logo {\n  display: block;\n  margin: 0 auto;\n}\n\n.kind-list-item-hd {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/home-large-card/home-large-card.js",
    "content": "// 广告调优测试-首页大卡\nPage({\n  data: {\n    theme: 'light'\n  },\n\n  onShareAppMessage() {\n    return {\n      title: '广告调优测试-首页大卡',\n      path: 'page/ad/optimize-ad/home-large-card/home-large-card'\n    }\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad(options) {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  /**\n   * 广告加载成功回调\n   */\n  onadload(e) {\n    console.log('广告加载成功:', e)\n  },\n\n  /**\n   * 广告加载失败回调\n   */\n  onaderror(e) {\n    console.log('广告加载失败:', e)\n  },\n\n  /**\n   * 广告视频结束回调\n   */\n  onvideoended(e) {\n    console.log('广告视频播放结束:', e)\n  }\n})\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/home-large-card/home-large-card.json",
    "content": "{\n  \"navigationBarTitleText\": \"广告调优测试-首页大卡\",\n  \"renderer\": \"webview\"\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/home-large-card/home-large-card.wxml",
    "content": "<!--广告调优测试-首页大卡-->\n<view class=\"container\" data-weui-theme=\"{{theme}}\">\n  <!-- 广告调优测试-首页大卡 -->\n  <view class=\"ad-section\">\n    <text class=\"ad-label\">广告调优测试-首页大卡</text>\n    <ad-custom \n      unit-id=\"adunit-c34f3ed02619f043\" \n      class=\"ad-unit\"\n      bindload=\"onadload\"\n      binderror=\"onaderror\" \n      bindvideoended=\"onvideoended\"\n    ></ad-custom>\n  </view>\n\n  <!-- 填充内容 -->\n  <view class=\"content-section\">\n    <text class=\"content-title\">内容区域</text>\n    <view class=\"content-item\">\n      <text class=\"content-text\">这是一段填充内容，用于页面展示。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">此页面确保只有一个广告组件，符合一个页面只有一个广告的要求。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">小程序广告是微信官方推出的广告组件，支持多种广告形式。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">广告调优可以帮助开发者优化广告展示效果，提升用户体验。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">首页小卡广告适合在首屏位置展示，能够获得更高的曝光率。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">合理的广告布局可以在不影响用户体验的前提下实现流量变现。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">广告组件会根据用户特征自动匹配最合适的广告内容。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">开发者可以通过回调函数监听广告的加载状态和用户交互行为。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">广告收益与曝光量、点击率等多种因素相关。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">建议在合适的场景下展示广告，避免过度打扰用户。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">持续优化广告展示策略，可以获得更好的变现效果。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">感谢您使用微信广告服务，祝您使用愉快！</text>\n    </view>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/home-large-card/home-large-card.wxss",
    "content": "/* 广告调优测试-首页大卡 */\n.container {\n  display: block !important;\n  padding: 0;\n  margin: 0;\n  background-color: #fff;\n  min-height: auto;\n  justify-content: initial;\n}\n\n.ad-section {\n  margin: 0;\n  padding: 0;\n  background-color: #fff;\n}\n\n.ad-label {\n  display: block;\n  font-size: 28rpx;\n  font-weight: bold;\n  color: #333;\n  padding: 20rpx;\n  margin: 0;\n  text-align: center;\n  background-color: #fff;\n}\n\n.ad-unit {\n  width: 100%;\n  display: block;\n}\n\n.content-section {\n  margin: 0;\n  padding: 20rpx;\n  background-color: #fff;\n}\n\n.content-title {\n  display: block;\n  font-size: 32rpx;\n  font-weight: bold;\n  color: #333;\n  margin-bottom: 20rpx;\n  text-align: center;\n}\n\n.content-item {\n  margin: 20rpx 0;\n  padding: 20rpx;\n  background-color: #fafafa;\n  border-radius: 8rpx;\n  border-left: 4rpx solid #007aff;\n}\n\n.content-text {\n  font-size: 28rpx;\n  line-height: 1.6;\n  color: #666;\n}\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/home-small-card/home-small-card.js",
    "content": "// 广告调优测试-首页小卡\nPage({\n  data: {\n    theme: 'light'\n  },\n\n  onShareAppMessage() {\n    return {\n      title: '广告调优测试-首页小卡',\n      path: 'page/ad/optimize-ad/home-small-card/home-small-card'\n    }\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad(options) {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  /**\n   * 广告加载成功回调\n   */\n  onadload(e) {\n    console.log('广告加载成功:', e)\n  },\n\n  /**\n   * 广告加载失败回调\n   */\n  onaderror(e) {\n    console.log('广告加载失败:', e)\n  },\n\n  /**\n   * 广告视频结束回调\n   */\n  onvideoended(e) {\n    console.log('广告视频播放结束:', e)\n  }\n})\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/home-small-card/home-small-card.json",
    "content": "{\n  \"navigationBarTitleText\": \"广告调优测试-首页小卡\",\n  \"renderer\": \"webview\"\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/home-small-card/home-small-card.wxml",
    "content": "<!--广告调优测试-首页小卡-->\n<view class=\"container\" data-weui-theme=\"{{theme}}\">\n  <!-- 广告调优测试-首页小卡 -->\n  <view class=\"ad-section\">\n    <text class=\"ad-label\">广告由小卡免开发切为大卡</text>\n    <ad-custom \n      unit-id=\"adunit-82c73f0511620ff6\" \n      class=\"ad-unit\"\n      bindload=\"onadload\"\n      binderror=\"onaderror\" \n      bindvideoended=\"onvideoended\"\n    ></ad-custom>\n  </view>\n\n  <!-- 填充内容 -->\n  <view class=\"content-section\">\n    <text class=\"content-title\">内容区域</text>\n    <view class=\"content-item\">\n      <text class=\"content-text\">这是一段填充内容，用于页面展示。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">此页面确保只有一个广告组件，符合一个页面只有一个广告的要求。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">小程序广告是微信官方推出的广告组件，支持多种广告形式。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">广告调优可以帮助开发者优化广告展示效果，提升用户体验。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">首页小卡广告适合在首屏位置展示，能够获得更高的曝光率。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">合理的广告布局可以在不影响用户体验的前提下实现流量变现。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">广告组件会根据用户特征自动匹配最合适的广告内容。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">开发者可以通过回调函数监听广告的加载状态和用户交互行为。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">广告收益与曝光量、点击率等多种因素相关。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">建议在合适的场景下展示广告，避免过度打扰用户。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">持续优化广告展示策略，可以获得更好的变现效果。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">感谢您使用微信广告服务，祝您使用愉快！</text>\n    </view>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/home-small-card/home-small-card.wxss",
    "content": "/* 广告调优测试-首页小卡 */\n.container {\n  display: block !important;\n  padding: 0;\n  margin: 0;\n  background-color: #fff;\n  min-height: auto;\n  justify-content: initial;\n}\n\n.ad-section {\n  margin: 0;\n  padding: 0;\n  background-color: #fff;\n}\n\n.ad-label {\n  display: block;\n  font-size: 28rpx;\n  font-weight: bold;\n  color: #333;\n  padding: 20rpx;\n  margin: 0;\n  text-align: center;\n  background-color: #fff;\n}\n\n.ad-unit {\n  width: 100%;\n  display: block;\n}\n\n.content-section {\n  margin: 0;\n  padding: 20rpx;\n  background-color: #fff;\n}\n\n.content-title {\n  display: block;\n  font-size: 32rpx;\n  font-weight: bold;\n  color: #333;\n  margin-bottom: 20rpx;\n  text-align: center;\n}\n\n.content-item {\n  margin: 20rpx 0;\n  padding: 20rpx;\n  background-color: #fafafa;\n  border-radius: 8rpx;\n  border-left: 4rpx solid #007aff;\n}\n\n.content-text {\n  font-size: 28rpx;\n  line-height: 1.6;\n  color: #666;\n}\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/optimize-ad.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '广告调优',\n      path: 'page/ad/optimize-ad/optimize-ad'\n    }\n  },\n\n  data: {\n    theme: 'light'\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/optimize-ad.json",
    "content": "{\n  \"navigationBarTitleText\": \"广告调优\",\n  \"renderer\": \"webview\"\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/optimize-ad.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view class=\"index\">\n    <view class=\"index-hd\">\n      <view class=\"index-title\">广告调优示例</view>\n      <text class=\"index-desc\">以下展示了四种不同类型的广告调优测试示例，点击查看详情。</text>\n    </view>\n    <view class=\"index-bd\">\n      <view class=\"kind-list\">\n        <view class=\"kind-list-item\">\n          <navigator url=\"/page/ad/optimize-ad/home-small-card/home-small-card\" class=\"kind-list-item-hd\">\n            <view class=\"kind-list-text\">首页小卡</view>\n            <view class=\"kind-list-arrow\"></view>\n          </navigator>\n        </view>\n        <view class=\"kind-list-item\">\n          <navigator url=\"/page/ad/optimize-ad/home-large-card/home-large-card\" class=\"kind-list-item-hd\">\n            <view class=\"kind-list-text\">首页大卡</view>\n            <view class=\"kind-list-arrow\"></view>\n          </navigator>\n        </view>\n        <view class=\"kind-list-item\">\n          <navigator url=\"/page/ad/optimize-ad/other-small-card/other-small-card\" class=\"kind-list-item-hd\">\n            <view class=\"kind-list-text\">非首页小卡</view>\n            <view class=\"kind-list-arrow\"></view>\n          </navigator>\n        </view>\n        <view class=\"kind-list-item\">\n          <navigator url=\"/page/ad/optimize-ad/other-large-card/other-large-card\" class=\"kind-list-item-hd\">\n            <view class=\"kind-list-text\">非首页大卡</view>\n            <view class=\"kind-list-arrow\"></view>\n          </navigator>\n        </view>\n      </view>\n    </view>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/optimize-ad.wxss",
    "content": "@import \"../../../common/reset.wxss\";\n@import \"../../common/index.wxss\";\n\n.index-title {\n  font-size: 18px;\n  font-weight: 600;\n  color: var(--weui-FG-0);\n  margin-bottom: 8px;\n}\n\n.kind-list-item-hd {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.kind-list-arrow {\n  width: 8px;\n  height: 8px;\n  border-right: 2px solid var(--weui-FG-2);\n  border-top: 2px solid var(--weui-FG-2);\n  transform: rotate(45deg);\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/other-large-card/other-large-card.js",
    "content": "// 广告调优测试-非首页大卡\nPage({\n  data: {\n    theme: 'light'\n  },\n\n  onShareAppMessage() {\n    return {\n      title: '广告调优测试-非首页大卡',\n      path: 'page/ad/optimize-ad/other-large-card/other-large-card'\n    }\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad(options) {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  /**\n   * 广告加载成功回调\n   */\n  onadload(e) {\n    console.log('广告加载成功:', e)\n  },\n\n  /**\n   * 广告加载失败回调\n   */\n  onaderror(e) {\n    console.log('广告加载失败:', e)\n  },\n\n  /**\n   * 广告视频结束回调\n   */\n  onvideoended(e) {\n    console.log('广告视频播放结束:', e)\n  }\n})\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/other-large-card/other-large-card.json",
    "content": "{\n  \"navigationBarTitleText\": \"广告调优测试-非首页大卡\",\n  \"renderer\": \"webview\"\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/other-large-card/other-large-card.wxml",
    "content": "<!--广告调优测试-非首页大卡-->\n<view class=\"container\" data-weui-theme=\"{{theme}}\">\n  <!-- 首屏填充内容，将广告推到非首屏位置 -->\n  <view class=\"content-section\">\n    <text class=\"content-title\">页面内容区域</text>\n    <view class=\"content-item\">\n      <text class=\"content-text\">这是首屏展示的内容，广告在下方非首屏位置。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">用户需要向下滚动才能看到广告内容。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">这里是一些填充文本，用于占据首屏空间。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">继续添加更多内容，确保广告被推到非首屏。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">丰富的内容展示，提供良好的用户体验。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">更多精彩内容等你发现，向下滚动查看更多。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">这是第七段填充内容，继续占据屏幕空间。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">第八段内容，确保广告完全在非首屏位置。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">第九段内容，页面内容丰富多样。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">第十段内容，广告即将出现在下方。</text>\n    </view>\n  </view>\n\n  <!-- 广告调优测试-非首页大卡 -->\n  <view class=\"ad-section\">\n    <text class=\"ad-label\">广告调优测试-非首页大卡</text>\n    <ad-custom \n      unit-id=\"adunit-4b70a42ff3d811d6\" \n      class=\"ad-unit\"\n      bindload=\"onadload\"\n      binderror=\"onaderror\" \n      bindvideoended=\"onvideoended\"\n    ></ad-custom>\n  </view>\n\n  <!-- 底部填充内容 -->\n  <view class=\"content-section\">\n    <view class=\"content-item\">\n      <text class=\"content-text\">页面底部内容，感谢您的浏览。</text>\n    </view>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/other-large-card/other-large-card.wxss",
    "content": "/* 广告调优测试-非首页大卡 */\n.container {\n  padding: 0;\n  background-color: #f5f5f5;\n}\n\n.ad-section {\n  margin: 20rpx 0;\n  padding: 0;\n  background-color: #fff;\n  box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);\n}\n\n.ad-label {\n  display: block;\n  font-size: 28rpx;\n  font-weight: bold;\n  color: #333;\n  padding: 20rpx;\n  margin-bottom: 0;\n  text-align: center;\n  background-color: #fff;\n}\n\n.ad-unit {\n  width: 100vw;\n  min-height: 200rpx;\n  background-color: #f0f0f0;\n}\n\n.content-section {\n  margin: 20rpx 0;\n  padding: 20rpx;\n  background-color: #fff;\n}\n\n.content-title {\n  display: block;\n  font-size: 32rpx;\n  font-weight: bold;\n  color: #333;\n  margin-bottom: 20rpx;\n  text-align: center;\n}\n\n.content-item {\n  margin: 20rpx 0;\n  padding: 20rpx;\n  background-color: #fafafa;\n  border-radius: 8rpx;\n  border-left: 4rpx solid #007aff;\n}\n\n.content-text {\n  font-size: 28rpx;\n  line-height: 1.6;\n  color: #666;\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/other-small-card/other-small-card.js",
    "content": "// 广告调优测试-非首页小卡\nPage({\n  data: {\n    theme: 'light'\n  },\n\n  onShareAppMessage() {\n    return {\n      title: '广告调优测试-非首页小卡',\n      path: 'page/ad/optimize-ad/other-small-card/other-small-card'\n    }\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad(options) {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  /**\n   * 广告加载成功回调\n   */\n  onadload(e) {\n    console.log('广告加载成功:', e)\n  },\n\n  /**\n   * 广告加载失败回调\n   */\n  onaderror(e) {\n    console.log('广告加载失败:', e)\n  },\n\n  /**\n   * 广告视频结束回调\n   */\n  onvideoended(e) {\n    console.log('广告视频播放结束:', e)\n  }\n})\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/other-small-card/other-small-card.json",
    "content": "{\n  \"navigationBarTitleText\": \"广告调优测试-非首页小卡\",\n  \"renderer\": \"webview\"\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/other-small-card/other-small-card.wxml",
    "content": "<!--广告调优测试-非首页小卡-->\n<view class=\"container\" data-weui-theme=\"{{theme}}\">\n  <!-- 首屏填充内容，将广告推到非首屏位置 -->\n  <view class=\"content-section\">\n    <text class=\"content-title\">页面内容区域</text>\n    <view class=\"content-item\">\n      <text class=\"content-text\">这是首屏展示的内容，广告在下方非首屏位置。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">用户需要向下滚动才能看到广告内容。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">这里是一些填充文本，用于占据首屏空间。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">继续添加更多内容，确保广告被推到非首屏。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">丰富的内容展示，提供良好的用户体验。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">更多精彩内容等你发现，向下滚动查看更多。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">这是第七段填充内容，继续占据屏幕空间。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">第八段内容，确保广告完全在非首屏位置。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">第九段内容，页面内容丰富多样。</text>\n    </view>\n    <view class=\"content-item\">\n      <text class=\"content-text\">第十段内容，广告即将出现在下方。</text>\n    </view>\n  </view>\n\n  <!-- 广告调优测试-非首页小卡 -->\n  <view class=\"ad-section\">\n    <text class=\"ad-label\">广告调优测试-非首页小卡</text>\n    <ad-custom \n      unit-id=\"adunit-03590bdbb839946d\" \n      class=\"ad-unit\"\n      bindload=\"onadload\"\n      binderror=\"onaderror\" \n      bindvideoended=\"onvideoended\"\n    ></ad-custom>\n  </view>\n\n  <!-- 底部填充内容 -->\n  <view class=\"content-section\">\n    <view class=\"content-item\">\n      <text class=\"content-text\">页面底部内容，感谢您的浏览。</text>\n    </view>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/page/ad/optimize-ad/other-small-card/other-small-card.wxss",
    "content": "/* 广告调优测试-非首页小卡 */\n.container {\n  padding: 0;\n  background-color: #f5f5f5;\n}\n\n.ad-section {\n  margin: 20rpx 0;\n  padding: 0;\n  background-color: #fff;\n  box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);\n}\n\n.ad-label {\n  display: block;\n  font-size: 28rpx;\n  font-weight: bold;\n  color: #333;\n  padding: 20rpx;\n  margin-bottom: 0;\n  text-align: center;\n  background-color: #fff;\n}\n\n.ad-unit {\n  width: 100vw;\n  min-height: 200rpx;\n  background-color: #f0f0f0;\n}\n\n.content-section {\n  margin: 20rpx 0;\n  padding: 20rpx;\n  background-color: #fff;\n}\n\n.content-title {\n  display: block;\n  font-size: 32rpx;\n  font-weight: bold;\n  color: #333;\n  margin-bottom: 20rpx;\n  text-align: center;\n}\n\n.content-item {\n  margin: 20rpx 0;\n  padding: 20rpx;\n  background-color: #fafafa;\n  border-radius: 8rpx;\n  border-left: 4rpx solid #007aff;\n}\n\n.content-text {\n  font-size: 28rpx;\n  line-height: 1.6;\n  color: #666;\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/example1/example1.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '示例 1 - 智能推荐广告',\n      path: 'page/ad/smart-ad/example1/example1'\n    }\n  },\n\n  data: {\n    theme: 'light'\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/example1/example1.json",
    "content": "{\n  \"navigationBarTitleText\": \"示例 1\",\n  \"renderer\": \"webview\"\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/example1/example1.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view class=\"container\">\n    <view class=\"example-card\">\n      <view class=\"card-header\">\n        <view class=\"card-title-group\">\n          <view class=\"card-main-title\">智能广告</view>\n          <view class=\"card-sub-title\">微信官方推荐的快速变现方案</view>\n        </view>\n      </view>\n      <view class=\"card-content\">\n        <view class=\"card-tags\">\n          <view class=\"tag tag-primary\">智能分析</view>\n          <view class=\"tag tag-success\">实时预览</view>\n          <view class=\"tag tag-warning\">0代码</view>\n        </view>\n\n        <!-- 功能特点 -->\n        <view class=\"feature-section\">\n          <view class=\"section-title\">核心功能</view>\n          <view class=\"feature-list\">\n            <view class=\"feature-item\">\n              <view class=\"feature-text\">智能插入推荐</view>\n            </view>\n            <view class=\"feature-item\">\n              <view class=\"feature-text\">实时预览编辑</view>\n            </view>\n            <view class=\"feature-item\">\n              <view class=\"feature-text\">免开发上线</view>\n            </view>\n          </view>\n        </view>\n\n        <!-- 接入流程 -->\n        <view class=\"guide-section\">\n          <view class=\"section-title\">快速接入</view>\n          <view class=\"guide-steps\">\n            <view class=\"guide-step\">\n              <view class=\"guide-num\">1</view>\n              <view class=\"guide-text\">登录【微信公众平台 -> 流量主 -> 广告管理 -> 广告位管理】</view>\n            </view>\n            <view class=\"guide-line\"></view>\n            <view class=\"guide-step\">\n              <view class=\"guide-num\">2</view>\n              <view class=\"guide-text\">选择【智能接入】模式</view>\n            </view>\n            <view class=\"guide-line\"></view>\n            <view class=\"guide-step\">\n              <view class=\"guide-num\">3</view>\n              <view class=\"guide-text\">【创建智能广告】</view>\n            </view>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/example1/example1.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.page {\n  min-height: 100vh;\n  display: flex;\n  flex-direction: column;\n}\n\n.container {\n  flex: 1;\n  padding: 20px 15px;\n  display: flex;\n  flex-direction: column;\n  min-height: 700px;\n}\n\n.card-header {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  margin-bottom: 16px;\n}\n\n.card-title-group {\n  text-align: center;\n}\n\n.card-main-title {\n  font-size: 24px;\n  font-weight: 700;\n  color: var(--weui-FG-0);\n  margin-bottom: 6px;\n}\n\n.card-sub-title {\n  font-size: 14px;\n  color: var(--weui-FG-1);\n}\n\n.card-desc {\n  font-size: 13px;\n  color: var(--weui-FG-1);\n  line-height: 1.6;\n  margin-bottom: 10px;\n}\n\n.card-tags {\n  display: flex;\n  flex-direction: row;\n  flex-wrap: nowrap;\n  justify-content: center;\n  gap: 10px;\n  margin-bottom: 16px;\n}\n\n.tag {\n  padding: 4px 10px;\n  border-radius: 10px;\n  font-size: 11px;\n  font-weight: 500;\n}\n\n.tag-primary {\n  background-color: rgba(102, 126, 234, 0.15);\n  color: #667eea;\n}\n\n.tag-success {\n  background-color: rgba(76, 175, 80, 0.15);\n  color: #4caf50;\n}\n\n.tag-warning {\n  background-color: rgba(255, 152, 0, 0.15);\n  color: #ff9800;\n}\n\n.card-content {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n}\n\n/* 通用区块标题 */\n.section-title {\n  font-size: 14px;\n  font-weight: 600;\n  color: var(--weui-FG-0);\n  margin-bottom: 10px;\n  padding-left: 8px;\n  border-left: 3px solid #667eea;\n}\n\n/* 功能特点 */\n.feature-section {\n  margin-top: 16px;\n}\n\n.feature-list {\n  background-color: rgba(255, 255, 255, 0.5);\n  border-radius: 8px;\n  padding: 12px;\n}\n\n[data-weui-theme=dark] .feature-list {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n\n.feature-item {\n  display: flex;\n  align-items: center;\n  padding: 10px 0;\n}\n\n.feature-item:not(:last-child) {\n  border-bottom: 1px dashed rgba(0, 0, 0, 0.08);\n}\n\n[data-weui-theme=dark] .feature-item:not(:last-child) {\n  border-bottom-color: rgba(255, 255, 255, 0.08);\n}\n\n.feature-text {\n  font-size: 13px;\n  color: var(--weui-FG-1);\n}\n\n/* 适用场景 */\n.scene-section {\n  margin-top: 16px;\n}\n\n.scene-grid {\n  display: flex;\n  justify-content: space-between;\n}\n\n.scene-item {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  padding: 12px 8px;\n  background-color: rgba(255, 255, 255, 0.5);\n  border-radius: 8px;\n  margin: 0 4px;\n}\n\n.scene-item:first-child {\n  margin-left: 0;\n}\n\n.scene-item:last-child {\n  margin-right: 0;\n}\n\n[data-weui-theme=dark] .scene-item {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n\n.scene-icon {\n  font-size: 24px;\n  margin-bottom: 6px;\n}\n\n.scene-name {\n  font-size: 11px;\n  color: var(--weui-FG-1);\n}\n\n/* 接入指南 */\n.guide-section {\n  margin-top: 16px;\n}\n\n.guide-steps {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  background-color: rgba(255, 255, 255, 0.5);\n  border-radius: 8px;\n  padding: 16px 12px;\n}\n\n[data-weui-theme=dark] .guide-steps {\n  background-color: rgba(0, 0, 0, 0.2);\n}\n\n.guide-step {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.guide-num {\n  width: 24px;\n  height: 24px;\n  border-radius: 50%;\n  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n  color: #fff;\n  font-size: 12px;\n  font-weight: 600;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 6px;\n}\n\n.guide-text {\n  font-size: 10px;\n  color: var(--weui-FG-1);\n  text-align: center;\n  white-space: nowrap;\n}\n\n.guide-line {\n  flex: 1;\n  height: 2px;\n  background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);\n  margin: 0 4px;\n  margin-bottom: 20px;\n  opacity: 0.5;\n}\n\n.card-footer {\n  display: flex;\n  justify-content: space-around;\n  padding-top: 20px;\n  margin-top: auto;\n  border-top: 1px solid rgba(0, 0, 0, 0.08);\n}\n\n[data-weui-theme=dark] .card-footer {\n  border-top-color: rgba(255, 255, 255, 0.1);\n}\n\n.card-stat {\n  text-align: center;\n}\n\n.stat-value {\n  font-size: 18px;\n  font-weight: 700;\n  color: var(--weui-FG-0);\n  margin-bottom: 3px;\n}\n\n.stat-label {\n  font-size: 11px;\n  color: var(--weui-FG-2);\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/example2/example2.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '示例 2 - 广告投放流程',\n      path: 'page/ad/smart-ad/example2/example2'\n    }\n  },\n\n  data: {\n    theme: 'light'\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/example2/example2.json",
    "content": "{\n  \"navigationBarTitleText\": \"示例 2\",\n  \"renderer\": \"webview\"\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/example2/example2.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view class=\"container\">\n    <view class=\"example-list\">\n      <view class=\"list-header\">智能广告接入流程</view>\n      <view class=\"step-list\">\n        <view class=\"step-item\">\n          <view class=\"step-number\">1</view>\n          <view class=\"step-content\">\n            <view class=\"step-title\">入口指引</view>\n            <view class=\"step-desc\">微信公众平台→流量主→广告管理→广告位管理→选择“智能接入”模式→点击“创建智能广告”。</view>\n          </view>\n          <view class=\"step-status status-done\">已完成</view>\n        </view>\n        <view class=\"step-item\">\n          <view class=\"step-number\">2</view>\n          <view class=\"step-content\">\n            <view class=\"step-title\">扫码预览</view>\n            <view class=\"step-desc\">微信扫码预览，确认广告插入的位置、时机与样式。</view>\n          </view>\n          <view class=\"step-status status-done\">已完成</view>\n        </view>\n        <view class=\"step-item\">\n          <view class=\"step-number\">3</view>\n          <view class=\"step-content\">\n            <view class=\"step-title\">调整与标记</view>\n            <view class=\"step-desc\">若需调整，可点击“编辑类型与位置”；标记“使用/不使用”后，仍需返回后台最终确认是否上线。</view>\n          </view>\n          <view class=\"step-status status-progress\">进行中</view>\n        </view>\n        <view class=\"step-item\">\n          <view class=\"step-number\">4</view>\n          <view class=\"step-content\">\n            <view class=\"step-title\">确认上线</view>\n            <view class=\"step-desc\">手机预览完成后，在管理后台点击“下一步”确认广告位并上线。</view>\n          </view>\n          <view class=\"step-status status-pending\">待处理</view>\n        </view>\n      </view>\n    </view>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/example2/example2.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.container {\n  padding: 20px 15px;\n}\n\n.example-list {\n  background-color: var(--weui-BG-3);\n  border-radius: 8px;\n  padding: 12px;\n}\n\n.list-header {\n  font-size: 15px;\n  font-weight: 600;\n  color: var(--weui-FG-0);\n  margin-bottom: 12px;\n  padding-bottom: 8px;\n  border-bottom: 1px solid var(--weui-FG-3);\n}\n\n.step-list {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n}\n\n.step-item {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: space-between;\n  padding: 12px 10px;\n  background-color: var(--weui-BG-2);\n  border-radius: 6px;\n}\n\n.step-number {\n  width: 28px;\n  height: 28px;\n  border-radius: 50%;\n  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n  color: #fff;\n  font-size: 14px;\n  font-weight: 600;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n}\n\n.step-content {\n  flex: 1;\n  margin: 0 12px;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n}\n\n.step-title {\n  font-size: 14px;\n  font-weight: 500;\n  color: var(--weui-FG-0);\n  margin-bottom: 4px;\n}\n\n.step-desc {\n  font-size: 12px;\n  color: var(--weui-FG-2);\n}\n\n.step-status {\n  font-size: 12px;\n  padding: 4px 10px;\n  border-radius: 10px;\n  flex-shrink: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.status-done {\n  background-color: rgba(76, 175, 80, 0.15);\n  color: #4caf50;\n}\n\n.status-progress {\n  background-color: rgba(33, 150, 243, 0.15);\n  color: #2196f3;\n}\n\n.status-pending {\n  background-color: rgba(158, 158, 158, 0.15);\n  color: #9e9e9e;\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/example3/example3.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '示例 3 - 数据概览',\n      path: 'page/ad/smart-ad/example3/example3'\n    }\n  },\n\n  data: {\n    theme: 'light'\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/example3/example3.json",
    "content": "{\n  \"navigationBarTitleText\": \"示例 3\",\n  \"renderer\": \"webview\"\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/example3/example3.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view class=\"container\">\n    <view class=\"example-dashboard\">\n      <view class=\"dashboard-header\">\n        <view class=\"dashboard-title\">今日数据概览</view>\n        <view class=\"dashboard-date\">2026-01-06</view>\n      </view>\n      <view class=\"dashboard-grid\">\n        <view class=\"dashboard-cell\">\n          <view class=\"cell-value\">12,580</view>\n          <view class=\"cell-label\">展示次数</view>\n          <view class=\"cell-trend trend-up\">↑ 15.2%</view>\n        </view>\n        <view class=\"dashboard-cell\">\n          <view class=\"cell-value\">1,024</view>\n          <view class=\"cell-label\">点击次数</view>\n          <view class=\"cell-trend trend-up\">↑ 8.7%</view>\n        </view>\n        <view class=\"dashboard-cell\">\n          <view class=\"cell-value\">8.14%</view>\n          <view class=\"cell-label\">点击率</view>\n          <view class=\"cell-trend trend-down\">↓ 2.1%</view>\n        </view>\n        <view class=\"dashboard-cell\">\n          <view class=\"cell-value\">¥2,156</view>\n          <view class=\"cell-label\">预估收益</view>\n          <view class=\"cell-trend trend-up\">↑ 12.5%</view>\n        </view>\n      </view>\n      <view class=\"dashboard-chart\">\n        <view class=\"chart-title\">近7日收益趋势</view>\n        <view class=\"chart-bars\">\n          <view class=\"bar-item\">\n            <view class=\"bar\" style=\"height: 60%;\"></view>\n            <view class=\"bar-label\">周一</view>\n          </view>\n          <view class=\"bar-item\">\n            <view class=\"bar\" style=\"height: 45%;\"></view>\n            <view class=\"bar-label\">周二</view>\n          </view>\n          <view class=\"bar-item\">\n            <view class=\"bar\" style=\"height: 75%;\"></view>\n            <view class=\"bar-label\">周三</view>\n          </view>\n          <view class=\"bar-item\">\n            <view class=\"bar\" style=\"height: 55%;\"></view>\n            <view class=\"bar-label\">周四</view>\n          </view>\n          <view class=\"bar-item\">\n            <view class=\"bar\" style=\"height: 85%;\"></view>\n            <view class=\"bar-label\">周五</view>\n          </view>\n          <view class=\"bar-item\">\n            <view class=\"bar\" style=\"height: 90%;\"></view>\n            <view class=\"bar-label\">周六</view>\n          </view>\n          <view class=\"bar-item\">\n            <view class=\"bar bar-active\" style=\"height: 100%;\"></view>\n            <view class=\"bar-label\">周日</view>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n</view>\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/example3/example3.wxss",
    "content": "@import \"../../../../common/reset.wxss\";\n\n.container {\n  padding: 20px 15px;\n}\n\n.example-dashboard {\n  background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);\n  border-radius: 8px;\n  padding: 12px;\n  color: #fff;\n}\n\n.dashboard-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 12px;\n}\n\n.dashboard-title {\n  font-size: 15px;\n  font-weight: 600;\n}\n\n.dashboard-date {\n  font-size: 12px;\n  color: rgba(255, 255, 255, 0.6);\n}\n\n.dashboard-grid {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n  margin-bottom: 12px;\n}\n\n.dashboard-cell {\n  width: calc(50% - 4px);\n  background-color: rgba(255, 255, 255, 0.08);\n  border-radius: 6px;\n  padding: 10px;\n  box-sizing: border-box;\n}\n\n.cell-value {\n  font-size: 18px;\n  font-weight: 700;\n  margin-bottom: 4px;\n}\n\n.cell-label {\n  font-size: 11px;\n  color: rgba(255, 255, 255, 0.6);\n  margin-bottom: 4px;\n}\n\n.cell-trend {\n  font-size: 11px;\n  font-weight: 500;\n}\n\n.trend-up {\n  color: #4caf50;\n}\n\n.trend-down {\n  color: #f44336;\n}\n\n.dashboard-chart {\n  background-color: rgba(255, 255, 255, 0.05);\n  border-radius: 6px;\n  padding: 10px;\n}\n\n.chart-title {\n  font-size: 13px;\n  margin-bottom: 10px;\n  color: rgba(255, 255, 255, 0.8);\n}\n\n.chart-bars {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-end;\n  height: 80px;\n}\n\n.bar-item {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  flex: 1;\n}\n\n.bar {\n  width: 16px;\n  background: linear-gradient(180deg, #667eea 0%, #764ba2 100%);\n  border-radius: 3px 3px 0 0;\n  margin-bottom: 6px;\n  opacity: 0.7;\n}\n\n.bar-active {\n  opacity: 1;\n  box-shadow: 0 0 10px rgba(102, 126, 234, 0.5);\n}\n\n.bar-label {\n  font-size: 10px;\n  color: rgba(255, 255, 255, 0.5);\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/smart-ad.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '智能广告',\n      path: 'page/ad/smart-ad/smart-ad'\n    }\n  },\n\n  data: {\n    theme: 'light'\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/smart-ad.json",
    "content": "{\n  \"navigationBarTitleText\": \"智能广告\",\n  \"renderer\": \"webview\"\n}\n\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/smart-ad.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view class=\"index\">\n    <view class=\"index-hd\">\n      <view class=\"index-title\">智能广告示例</view>\n      <text class=\"index-desc\">以下展示了三种不同类型的智能广告接入示例，点击查看详情。</text>\n    </view>\n    <view class=\"index-bd\">\n      <view class=\"kind-list\">\n        <view class=\"kind-list-item\">\n          <navigator url=\"/page/ad/smart-ad/example1/example1\" class=\"kind-list-item-hd\">\n            <view class=\"kind-list-text\">示例 1</view>\n            <view class=\"kind-list-arrow\"></view>\n          </navigator>\n        </view>\n        <view class=\"kind-list-item\">\n          <navigator url=\"/page/ad/smart-ad/example2/example2\" class=\"kind-list-item-hd\">\n            <view class=\"kind-list-text\">示例 2</view>\n            <view class=\"kind-list-arrow\"></view>\n          </navigator>\n        </view>\n      </view>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/page/ad/smart-ad/smart-ad.wxss",
    "content": "@import \"../../../common/reset.wxss\";\n@import \"../../common/index.wxss\";\n\n.index-title {\n  font-size: 18px;\n  font-weight: 600;\n  color: var(--weui-FG-0);\n  margin-bottom: 8px;\n}\n\n.kind-list-item-hd {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.kind-list-arrow {\n  width: 8px;\n  height: 8px;\n  border-right: 2px solid var(--weui-FG-2);\n  border-top: 2px solid var(--weui-FG-2);\n  transform: rotate(45deg);\n}\n"
  },
  {
    "path": "miniprogram/page/animation/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"小程序交互动画展示\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/page/animation/index.ts",
    "content": "Page({\n  onShow() {\n    wx.reportAnalytics('enter_home_programmatically', {})\n\n    if (wx.canIUse('getExptInfoSync')) {\n      console.log('getExptInfoSync expt_args_1', wx.getExptInfoSync(['expt_args_1']))\n      console.log('getExptInfoSync expt_args_2', wx.getExptInfoSync(['expt_args_2']))\n      console.log('getExptInfoSync expt_args_3', wx.getExptInfoSync(['expt_args_3']))\n    }\n    if (wx.canIUse('reportEvent')) {\n      wx.reportEvent('expt_event_1', { expt_data: 1 })\n      wx.reportEvent('expt_event_2', { expt_data: 5 })\n      wx.reportEvent('expt_event_3', { expt_data: 9 })\n      wx.reportEvent('expt_event_4', { expt_data: 200 })\n\n      wx.reportEvent('weexpt_event_key_1', { option_1: 1, option_2: 10, option_str_1: 'abc' })\n      wx.reportEvent('weexpt_event_key_1', { option_1: 'abc', option_2: '1000', option_str_1: '1' })\n    }\n  },\n  onShareAppMessage() {\n    return {\n      title: '小程序交互动画展示',\n      path: 'page/animation/index'\n    }\n  },\n  onShareTimeline() {\n    '小程序交互动画展示'\n  },\n\n  data: {\n    list: [\n      {\n        id: 'SkylineBase',\n        name: 'Skyline 增强特性',\n        open: false,\n        pages: [\n          { url: 'worklet/animation/index', name: 'worklet 动画' },\n          { url: 'worklet/gesture/index', name: '手势系统' },\n          { url: 'share-element/list/index', name: '共享元素动画' },\n          { url: 'worklet/bottom-sheet/index', name: '手势协商' },\n          { key: 'custom-route', url: '/packageSkyline/pages/half-page/scale-page/index', name: '自定义路由' }\n        ]\n      }, {\n        id: 'SkylineDemo',\n        name: '常见交互组件',\n        open: false,\n        pages: [\n          { url: '/packageSkylineExamples/examples/address-book/pages/index/index', name: '通讯录' },\n          { key: 'custom-route', url: '/packageSkylineExamples/examples/album/pages/album/index', name: '相册' },\n          { url: '/packageSkylineExamples/examples/card_transition/pages/list/list', name: '卡片转场' },\n          { url: '/packageSkylineExamples/examples/half-screen/pages/index/index', name: '半屏弹窗' },\n          { url: '/packageSkylineExamples/examples/segmented-half-screen/pages/index/index', name: '分段式半屏' },\n          { url: '/packageSkylineExamples/examples/tab-indicator/pages/index/index', name: 'Tab 指示条' },\n          { url: '/packageSkylineExamples/examples/product-list/pages/index/index', name: '搜索栏吸附' },\n          { url: '/packageSkylineExamples/examples/expanded-scroll-view/pages/index/index', name: '沉浸式商品浏览' },\n          { url: '/packageSkylineExamples/examples/refresher-two-level/index/index', name: '下拉二楼' },\n          { url: '/packageSkylineExamples/examples/app-bar/pages/index/index', name: '全局工具栏' }\n        ]\n      }, {\n        id: 'SkylineRouter',\n        name: 'Skyline 路由动画',\n        open: false,\n        pages: [\n          { url: 'preset-router/index/index', name: '预设路由' },\n          { url: 'open-container/index/index', name: '容器转场动画' },\n          { url: 'page-return-gesture/index/index', name: '页面返回手势' }\n        ]\n      }, {\n        id: 'XRFrame',\n        name: 'XRFrame 高性能XR解决方案',\n        open: false,\n        pages: [\n          { url: 'pages/index/index', name: '总览' }\n        ]\n      }, {\n        id: 'adaptive',\n        name: '多端适配（需在PC端体验）',\n        open: false,\n        pages: [\n          { name: '左右伸缩', url: 'adapt/telescopic/telescopic' },\n          { name: '换行排列', url: 'adapt/linebreak/linebreak' },\n          { name: '侧边导航栏', url: 'adapt/sidenavigation/sidenavigation' },\n          { name: '分页展现', url: 'adapt/pagination/pagination' },\n          { name: '自由布局', url: 'adapt/freelayout/freelayout' },\n          { name: '分层展现', url: 'adapt/layeredpresentation/layeredpresentation' },\n          { name: '横向拓展', url: 'adapt/horizontalexpansion/horizontalexpansion' }\n        ]\n      }\n    ],\n    theme: 'light'\n  },\n\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n\n  kindToggle(e) {\n    const id = e.currentTarget.id\n    const list = this.data.list\n    for (let i = 0, len = list.length; i < len; ++i) {\n      if (list[i].id === id) {\n        list[i].open = !list[i].open\n      } else {\n        list[i].open = false\n      }\n    }\n    this.setData({\n      list\n    })\n    wx.reportAnalytics('click_view_programmatically', {})\n  },\n\n  navToDoc(e) {\n    wx.navigateTo({\n      url: '/packageComponent/pages/doc-web-view/doc-web-view',\n    })\n  },\n  // 打开自定义路由页面\n  goToCustomRoute: function goToCustomRoute(evt) {\n    const { url } = evt.currentTarget.dataset\n    wx.navigateTo({\n      routeType: 'ScaleTransition',\n      url: `${url}`\n    });\n  },\n})\n"
  },
  {
    "path": "miniprogram/page/animation/index.wxml",
    "content": "<mp-navigation-bar title=\"小程序交互动画展示\" back=\"{{false}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view class=\"index\">\n    <view class=\"index-hd\">\n      <image class=\"index-logo\" src=\"resources/kind/logo.png\"></image>\n      <text class=\"index-desc\">以下将展示小程序实现高级交互动画的能力和示例，包括内置的高级渲染能力和一些常见的交互示例，具体原理及源码详见 <text class=\"weui-agree__link\" bindtap=\"navToDoc\">小程序开发文档</text>。</text>\n    </view>\n    <view class=\"index-bd\">\n      <view class=\"kind-list\">\n        <block wx:for=\"{{list}}\" wx:key=\"{{item.id}}\">\n          <view class=\"kind-list-item\">\n            <view id=\"{{item.id}}\" class=\"kind-list-item-hd {{item.open ? 'kind-list-item-hd-show' : ''}}\" bindtap=\"kindToggle\">\n              <view class=\"kind-list-text\">{{item.name}}</view>\n            </view>\n            <view class=\"kind-list-item-bd {{item.open ? 'kind-list-item-bd-show' : ''}}\">\n              <view class=\"navigator-box {{item.open ? 'navigator-box-show' : ''}}\">\n                <block wx:for=\"{{item.pages}}\" wx:for-item=\"page\" wx:key=\"*item\">\n                  <view wx:if=\"{{page.appid}}\">\n                    <navigator target=\"miniProgram\" open-type=\"navigate\" app-id=\"{{page.appid}}\" path=\"\" extra-data=\"\" version=\"release\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.name}}</navigator>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n                  <!-- custom-route，自定义路由暂时不能用 navigator -->\n                  <view wx:elif=\"{{page.key == 'custom-route'}}\">\n                    <view bindtap=\"goToCustomRoute\" data-url=\"{{page.url}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.name}}</view>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n                  <!-- skyline -->\n                  <view wx:elif=\"{{item.id == 'SkylineBase'}}\">\n                    <navigator url=\"/packageSkyline/pages/{{page.url}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.name}}</navigator>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n                  <!-- 暂时混合，后面会都迁移到 skylineExamples -->\n                  <view wx:elif=\"{{item.id == 'SkylineDemo'}}\">\n                    <navigator url=\"{{page.url}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.name}}</navigator>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n                  <!-- XRFrame -->\n                  <view wx:elif=\"{{item.id == 'XRFrame'}}\">\n                    <navigator url=\"/packageXRFrame/{{page.url}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.name}}</navigator>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n                  <!-- adaptive -->\n                  <view wx:elif=\"{{item.id == 'adaptive'}}\">\n                    <navigator url=\"/packageExtend/pages/{{page.url}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.name}}</navigator>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n                  <!-- 路由动画 -->\n                  <view wx:elif=\"{{item.id == 'SkylineRouter'}}\">\n                    <navigator url=\"/packageSkylineRouter/pages/{{page.url}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.name}}</navigator>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n                  <view wx:else>\n                    <navigator url=\"/packageComponent/pages/{{item.id}}/{{page}}/{{page}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page}}</navigator>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n\n                </block>\n              </view>\n            </view>\n          </view>\n        </block>\n      </view>\n    </view>\n  </view>\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/page/animation/index.wxss",
    "content": "@import \"../../common/reset.wxss\";\n@import \"../common/index-skyline.wxss\";\n\n.weui-agree__link {\n  display: inline;\n  color: #576b95;\n}\n\n[data-weui-theme=dark] .weui-agree__link {\n  color: #7d90a9;\n}\n"
  },
  {
    "path": "miniprogram/page/cloud/README.md",
    "content": "# 云开发示例说明\n\n## 如何使用\n\n要在微信开发者工具上体验云开发示例，请按如下步骤准备所需环境，否则可能报错。\n\n1. 参考 [云开发文档](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html#%E5%BC%80%E9%80%9A%E4%BA%91%E5%BC%80%E5%8F%91) 开通云开发环境。如果已开通，请忽略此步\n2. 开微信开发者工具中，将 `/cloudfunctions/` 下的云函数上传到云端，具体操作方式可参考文档中的云函数相关章节\n3. 打开云开发控制台，进入数据库标签页，添加如下集合：\n  - todos\n  - perm1\n  - perm2\n  - perm3\n  - perm4\n  - serverDate\n4. 对如下集合设置权限：\n  - perm1：所有用户可读，仅创建者及管理员可写\n  - perm2：仅创建者及管理员可读写\n  - perm3：所有用户可读，仅管理员可写\n  - perm4：仅管理员可读写\n5. 部分集合需要初始记录，请把 `resources/db_dump` 下的文件导入到对应集合\n6. 在 `/miniprogram/config.js` 中，修改 `envId` 字段为当前云开发环境 ID\n7. 如要体验存储的相关功能，请在云开发控制台的文件管理标签页中上传自己的 demo 文件（图片、视频），并将文件 ID 填入到 `/miniprogram/config.js` 的相关字段上\n"
  },
  {
    "path": "miniprogram/page/cloud/index.js",
    "content": "Page({\n  onShareAppMessage() {\n    return {\n      title: '小程序云开发展示',\n      path: 'page/cloud/index'\n    }\n  },\n\n  data: {\n    list: [\n      {\n        id: 'user',\n        name: '用户鉴权',\n        open: false,\n        pages: [\n          {\n            zh: '获取 OpenID',\n            url: 'user-authentication/user-authentication'\n          }\n        ]\n      }, {\n        id: 'database',\n        name: '数据库',\n        open: false,\n        pages: [\n          {\n            zh: '基本操作',\n            url: 'crud/crud'\n          }, {\n            zh: '权限管理',\n            url: 'db-permission/db-permission'\n          }, {\n            zh: '服务端时间',\n            url: 'server-date/server-date'\n          }\n        ]\n      }, {\n        id: 'storage',\n        name: '存储',\n        open: false,\n        pages: [\n          {\n            zh: '上传文件',\n            url: 'upload-file/upload-file'\n          }, {\n            zh: '下载文件',\n            url: 'download-file/download-file'\n          }, {\n            zh: '删除文件',\n            url: 'delete-file/delete-file'\n          }, {\n            zh: '换取临时链接',\n            url: 'get-temp-file-url/get-temp-file-url'\n          }, {\n            zh: '组件支持',\n            url: 'cloud-file-component/cloud-file-component'\n          }\n        ]\n      }, {\n        id: 'scf',\n        name: '云函数',\n        open: false,\n        pages: [\n          {\n            zh: 'WXContext',\n            url: 'get-wx-context/get-wx-context'\n          }, {\n            zh: '数据库',\n            url: 'scf-database/scf-database'\n          }, {\n            zh: '存储',\n            url: 'scf-storage/scf-storage'\n          }, {\n            zh: '云调用',\n            url: 'scf-openapi/scf-openapi'\n          }\n        ]\n      }\n    ],\n    theme: 'light'\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onLoad() {\n    this.setData({\n      theme: getApp().globalData.theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  kindToggle(e) {\n    const id = e.currentTarget.id\n    const list = this.data.list\n    console.log(id, list)\n    for (let i = 0, len = list.length; i < len; ++i) {\n      if (list[i].id === id) {\n        if (list[i].url) {\n          console.log(list[i].url)\n          wx.navigateTo({\n            url: `../../packageCloud/pages/${list[i].url}`\n          })\n          return\n        }\n        list[i].open = !list[i].open\n      } else {\n        list[i].open = false\n      }\n    }\n    this.setData({\n      list\n    })\n  },\n})\n"
  },
  {
    "path": "miniprogram/page/cloud/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"小程序云开发展示\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\"\n}\n"
  },
  {
    "path": "miniprogram/page/cloud/index.wxml",
    "content": "<mp-navigation-bar title=\"小程序云开发展示\" back=\"{{false}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view class=\"index\">\n    <view class=\"index-hd\">\n      <image class=\"index-logo\" src=\"resources/kind/logo.png\"></image>\n      <text class=\"index-desc\">以下将演示小程序云开发能力，具体属性参数详见 <text class=\"weui-agree__link\" bindtap=\"navToDoc\">小程序开发文档</text>。</text>\n    </view>\n    <view class=\"index-bd\">\n      <view class=\"kind-list\">\n        <block wx:for=\"{{list}}\" wx:key=\"{{item.id}}\">\n          <view class=\"kind-list-item\">\n            <view id=\"{{item.id}}\" class=\"kind-list-item-hd {{item.open ? 'kind-list-item-hd-show' : ''}}\" bindtap=\"kindToggle\">\n              <view class=\"kind-list-text\">{{item.name}}</view>\n              <image wx:if=\"{{theme === 'dark'}}\" class=\"kind-list-img\" src=\"resources/kind/{{item.id}}_dark.png\"></image>\n              <image wx:else class=\"kind-list-img\" src=\"resources/kind/{{item.id}}.png\"></image>\n            </view>\n            <view class=\"kind-list-item-bd {{item.open ? 'kind-list-item-bd-show' : ''}}\">\n              <view class=\"navigator-box {{item.open ? 'navigator-box-show' : ''}}\">\n                <block wx:for=\"{{item.pages}}\" wx:for-item=\"page\" wx:key=\"*item\">\n                  <view>\n                    <navigator url=\"../../packageCloud/pages/{{item.id}}/{{page.url}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.zh}}</navigator>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n                </block>\n              </view>\n            </view>\n          </view>\n        </block>\n      </view>\n    </view>\n  </view>\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/page/cloud/index.wxss",
    "content": "@import \"../../common/reset.wxss\";\n@import \"../common/index-skyline.wxss\";\n\n.weui-agree__link {\n  display: inline;\n  color: #576b95;\n}\n\n[data-weui-theme=dark] .weui-agree__link {\n  color: #7d90a9;\n}\n"
  },
  {
    "path": "miniprogram/page/cloud/resources/db_dump/perm1.json",
    "content": "{\"_openid\":\"kiki\",\"whatsUp\":\"心情美美哒\"}\n"
  },
  {
    "path": "miniprogram/page/cloud/resources/db_dump/perm2.json",
    "content": "{\"_openid\":\"popo\",\"email\":\"popo@weixin.qq.com\"}\n"
  },
  {
    "path": "miniprogram/page/cloud/resources/db_dump/perm3.json",
    "content": "{\"_openid\":\"admin\",\"price\":\"58\",\"name\":\"微信气泡狗抱枕\"}\n"
  },
  {
    "path": "miniprogram/page/cloud/resources/db_dump/perm4.json",
    "content": "{\"_openid\":\"server\",\"data\":\"DEMO_SERVER_DATA\"}\n"
  },
  {
    "path": "miniprogram/page/common/common.wxss",
    "content": "/*!\n * WeUI v2.3.0 (https://github.com/weui/weui-wxss)\n * Copyright 2020 Tencent, Inc.\n * Licensed under the MIT license\n */\n/* @import '../components/weui-wxss/dist/style/weui.wxss'; */\n\npage {\n  height: 100%;\n  display: flex;\n  justify-content: center;\n}\n\n.page {\n  min-height: 100%;\n  background-color: var(--weui-BG-1);\n  color: var(--weui-FG-0);\n  font-size: 16px;\n  font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif;\n  max-width: 600px;\n}\n\nimage {\n  max-width: 100%;\n  max-height: 100%\n}\n\n.link {\n  display: inline;\n  color: var(--weui-LINK)\n}\n\n.fadeIn {\n  -webkit-animation: a .3s forwards;\n  animation: a .3s forwards\n}\n\n.fadeOut {\n  -webkit-animation: b .3s forwards;\n  animation: b .3s forwards\n}\n\n@-webkit-keyframes a {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n@keyframes a {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n@-webkit-keyframes b {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n@keyframes b {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n.weui-msg__extra-area {\n  position: static\n}\n\n.page__hd {\n  padding: 40px\n}\n\n.page__bd {\n  padding-bottom: 40px\n}\n\n.page__bd_spacing {\n  padding-left: 15px;\n  padding-right: 15px\n}\n\n.page__ft {\n  padding-top: 40px;\n  padding-bottom: 10px;\n  padding-bottom: calc(10px + constant(safe-area-inset-bottom));\n  padding-bottom: calc(10px + env(safe-area-inset-bottom));\n  text-align: center\n}\n\n[data-weui-theme=dark] .page__ft image {\n  -webkit-filter: invert(100) hue-rotate(180deg);\n  filter: invert(100) hue-rotate(180deg)\n}\n\n.page__title {\n  text-align: left;\n  font-size: 20px;\n  font-weight: 400\n}\n\n.page__desc {\n  margin-top: 5px;\n  color: var(--weui-FG-1);\n  text-align: left;\n  font-size: 14px\n}\n\n.weui-cell_example:before {\n  left: 52px\n}\n\n@media (prefers-color-scheme: dark) {\n  page {\n    background-color: #1F1F1F;\n  }\n}"
  },
  {
    "path": "miniprogram/page/common/foot.wxml",
    "content": "<template name=\"foot\">\n  <navigator class=\"page-foot\" openType=\"switchTab\" url=\"/page/component/index\" hover-class=\"none\">\n    <image class=\"icon-foot\" src=\"/image/icon_foot.png\"></image>\n  </navigator>\n</template>"
  },
  {
    "path": "miniprogram/page/common/head.wxml",
    "content": "<template name=\"head\">\n  <view class=\"page-head\">\n    <view class=\"page-head-title\">{{title}}</view>\n    <view class=\"page-head-line\"></view>\n    <view wx:if=\"{{desc}}\" class=\"page-head-desc\">{{desc}}</view>\n  </view>\n</template>\n"
  },
  {
    "path": "miniprogram/page/common/index-skyline.wxss",
    "content": ".index-hd {\n  padding: 40px 40px 20px;\n  text-align: center;\n}\n.index-bd {\n  padding: 0 15px 20px;\n}\n.index-ft {\n  padding-bottom: 10px;\n  text-align: center;\n}\n.index-logo {\n  width: 43px;\n  height: 43px;\n  align-self: center;\n}\n.index-desc {\n  margin-top: 10px;\n  color: rgba(0, 0, 0, .5);\n  font-size: 14px;\n}\n\n\n.navigator-box {\n  opacity: 0;\n  position: relative;\n  background-color: #fff;\n  line-height: 1.41176471;\n  font-size: 17px;\n  transform: translateY(-50%);\n  transition: .3s;\n  border-top: .5px solid rgba(0,0,0,0.1);\n}\n.navigator-box-show {\n  opacity: 1;\n  transform: translateY(0);\n}\n.navigator {\n  padding: 10px 0;\n  margin: 0 15px;\n}\n.navigator-arrow {\n  position: absolute;\n  right: 28px;\n  top: 10px;\n  color: rgba(0, 0, 0, .3);\n  background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.454 6.58l1.06-1.06 5.78 5.779a.996.996 0 010 1.413l-5.78 5.779-1.06-1.061 5.425-5.425-5.425-5.424z' fill='%23B2B2B2' fill-rule='evenodd'/%3E%3C/svg%3E\");\n  width: 12px;\n  height: 24px;\n}\n.navigator-bottom-line {\n  border-bottom: .5px solid rgba(0, 0, 0, 0.1);\n}\n\n\n.kind-list-item {\n  margin: 10px 0;\n  background-color: #fff;\n  border-radius: 2px;\n  overflow: hidden;\n}\n.kind-list-text{\n  flex: 1;\n}\n.kind-list-img {\n  width: 30px;\n  height: 30px;\n}\n.kind-list-item-hd {\n  padding: 15px;\n  display: flex;\n  align-items: center;\n  flex-direction: row;\n  transition: opacity .3s;\n}\n.kind-list-item-hd-show {\n  opacity: .2;\n}\n.kind-list-item-bd {\n  height: 0;\n  overflow: hidden;\n}\n.kind-list-item-bd-show {\n  height: auto;\n}\n\n[data-weui-theme=dark] .index-desc {\n  color: hsla(0, 0%, 100%, .5);\n}\n[data-weui-theme=dark] .navigator-box {\n  background-color: #232323;\n}\n[data-weui-theme=dark] .navigator:before {\n  border-top-color: hsla(0, 0%, 100%, .05);\n  color: hsla(0, 0%, 100%, .05);\n}\n[data-weui-theme=dark] .navigator-arrow:after {\n  border-color: hsla(0, 0%, 100%, .3);\n}\n[data-weui-theme=dark] .kind-list-item {\n  background-color: #232323;\n}\n"
  },
  {
    "path": "miniprogram/page/common/index.wxss",
    "content": ".index-hd {\n  padding: 40px 40px 20px;\n  text-align: center;\n}\n.index-bd {\n  padding: 0 15px 20px;\n}\n.index-ft {\n  padding-bottom: 10px;\n  text-align: center;\n}\n.index-logo {\n  width: 43px;\n  height: 43px;\n}\n.index-desc {\n  margin-top: 10px;\n  color: var(--weui-FG-1);\n  font-size: 14px;\n}\n\n\n.navigator-box {\n  opacity: 0;\n  position: relative;\n  background-color: var(--weui-BG-2);\n  line-height: 1.41176471;\n  /* font-size: 32px; */\n  font-size: 17px;\n\n  transform: translateY(-50%);\n  transition: .3s;\n}\n.navigator-box-show {\n  opacity: 1;\n  transform: translateY(0);\n}\n.navigator {\n  padding: 10px 15px;\n  position: relative;\n  display: flex;\n  align-items: center;\n}\n.navigator:before {\n  content: \" \";\n  position: absolute;\n  left: 15px;\n  top: 0;\n  right: 15px;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n}\n.navigator:first-child:before {\n  display: none;\n}\n.navigator-text {\n  flex: 1;\n}\n.navigator-arrow {\n  padding-right: 13px;\n  position: relative;\n}\n.navigator-arrow:after {\n  content: \" \";\n  display: inline-block;\n  height: 9px;\n  width: 9px;\n  border-width: 1px 1px 0 0;\n  border-color: var(--weui-FG-2);\n  border-style: solid;\n  transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0);\n  position: absolute;\n  top: 50%;\n  margin-top: -4px;\n  right: 14px;\n}\n\n\n.kind-list-item {\n  margin: 10px 0;\n  background-color: var(--weui-BG-2);\n  border-radius: 2px;\n  overflow: hidden;\n}\n.kind-list-item:first-child {\n  margin-top: 0;\n}\n.kind-list-text{\n  flex: 1;\n}\n.kind-list-img {\n  width: 30px;\n  height: 30px;\n}\n.kind-list-item-hd {\n  padding: 15px;\n  display: flex;\n  align-items: center;\n\n  transition: opacity .3s;\n}\n.kind-list-item-hd-show {\n  opacity: .2;\n}\n.kind-list-item-bd {\n  height: 0;\n  overflow: hidden;\n}\n.kind-list-item-bd-show {\n  height: auto;\n}"
  },
  {
    "path": "miniprogram/page/common/lib/weui.wxss",
    "content": "/*!\n * WeUI v2.3.0 (https://github.com/weui/weui-wxss)\n * Copyright 2020 Tencent, Inc.\n * Licensed under the MIT license\n */\n[data-weui-theme=light],\npage {\n  --weui-BTN-DISABLED-FONT-COLOR: rgba(0, 0, 0, .2)\n}\n\n@media(prefers-color-scheme: dark) {\n  page{\n    --weui-BTN-DISABLED-FONT-COLOR: hsla(0, 0%, 100%, .2)\n  }\n}\n\n[data-weui-theme=light],\npage {\n  --weui-BTN-DEFAULT-BG: #f2f2f2\n}\n\n@media(prefers-color-scheme: dark) {\n  page{\n    --weui-BTN-DEFAULT-BG: hsla(0, 0%, 100%, .08)\n  }\n}\n\n[data-weui-theme=light],\npage {\n  --weui-BTN-DEFAULT-COLOR: #06ae56\n}\n\n@media(prefers-color-scheme: dark) {\n  page{\n    --weui-BTN-DEFAULT-COLOR: hsla(0, 0%, 100%, .8)\n  }\n}\n\n[data-weui-theme=light],\npage {\n  --weui-BTN-DEFAULT-ACTIVE-BG: #e6e6e6\n}\n\n@media(prefers-color-scheme: dark) {\n  page{\n    --weui-BTN-DEFAULT-ACTIVE-BG: hsla(0, 0%, 100%, .126)\n  }\n}\n\n[data-weui-theme=light],\npage {\n  --weui-DIALOG-LINE-COLOR: rgba(0, 0, 0, .1)\n}\n\n@media(prefers-color-scheme: dark) {\n  page{\n    --weui-DIALOG-LINE-COLOR: hsla(0, 0%, 100%, .1)\n  }\n}\n\npage {\n  line-height: 1.6;\n  font-family: -apple-system-font, Helvetica Neue, sans-serif\n}\n\nicon {\n  vertical-align: middle\n}\n\n[data-weui-theme=light],\npage {\n  --weui-BG-0: #ededed;\n  --weui-BG-1: #f7f7f7;\n  --weui-BG-2: #fff;\n  --weui-BG-3: #f7f7f7;\n  --weui-BG-4: #4c4c4c;\n  --weui-BG-5: #fff;\n  --weui-FG-0: rgba(0, 0, 0, .9);\n  --weui-FG-HALF: rgba(0, 0, 0, .9);\n  --weui-FG-1: rgba(0, 0, 0, .5);\n  --weui-FG-2: rgba(0, 0, 0, .3);\n  --weui-FG-3: rgba(0, 0, 0, .1);\n  --weui-RED: #fa5151;\n  --weui-ORANGE: #fa9d3b;\n  --weui-YELLOW: #ffc300;\n  --weui-GREEN: #91d300;\n  --weui-LIGHTGREEN: #95ec69;\n  --weui-BRAND: #07c160;\n  --weui-BLUE: #10aeff;\n  --weui-INDIGO: #1485ee;\n  --weui-PURPLE: #6467f0;\n  --weui-WHITE: #fff;\n  --weui-LINK: #576b95;\n  --weui-TEXTGREEN: #06ae56;\n  --weui-FG: #000;\n  --weui-BG: #fff;\n  --weui-TAG-TEXT-ORANGE: #fa9d3b;\n  --weui-TAG-BACKGROUND-ORANGE: rgba(250, 157, 59, .1);\n  --weui-TAG-TEXT-GREEN: #06ae56;\n  --weui-TAG-BACKGROUND-GREEN: rgba(6, 174, 86, .1);\n  --weui-TAG-TEXT-BLUE: #10aeff;\n  --weui-TAG-BACKGROUND-BLUE: rgba(16, 174, 255, .1);\n  --weui-TAG-TEXT-BLACK: rgba(0, 0, 0, .5);\n  --weui-TAG-BACKGROUND-BLACK: rgba(0, 0, 0, .05)\n}\n\n@media(prefers-color-scheme: dark) {\n  page{\n    --weui-BG-0: #191919;\n    --weui-BG-1: #1f1f1f;\n    --weui-BG-2: #232323;\n    --weui-BG-3: #2f2f2f;\n    --weui-BG-4: #606060;\n    --weui-BG-5: #2c2c2c;\n    --weui-FG-0: hsla(0, 0%, 100%, .8);\n    --weui-FG-HALF: hsla(0, 0%, 100%, .6);\n    --weui-FG-1: hsla(0, 0%, 100%, .5);\n    --weui-FG-2: hsla(0, 0%, 100%, .3);\n    --weui-FG-3: hsla(0, 0%, 100%, .05);\n    --weui-RED: #fa5151;\n    --weui-ORANGE: #c87d2f;\n    --weui-YELLOW: #cc9c00;\n    --weui-GREEN: #74a800;\n    --weui-LIGHTGREEN: #28b561;\n    --weui-BRAND: #07c160;\n    --weui-BLUE: #10aeff;\n    --weui-INDIGO: #1196ff;\n    --weui-PURPLE: #8183ff;\n    --weui-WHITE: hsla(0, 0%, 100%, .8);\n    --weui-LINK: #7d90a9;\n    --weui-TEXTGREEN: #259c5c;\n    --weui-FG: #fff;\n    --weui-BG: #000;\n    --weui-TAG-TEXT-ORANGE: rgba(250, 157, 59, .6);\n    --weui-TAG-BACKGROUND-ORANGE: rgba(250, 157, 59, .1);\n    --weui-TAG-TEXT-GREEN: rgba(6, 174, 86, .6);\n    --weui-TAG-BACKGROUND-GREEN: rgba(6, 174, 86, .1);\n    --weui-TAG-TEXT-BLUE: rgba(16, 174, 255, .6);\n    --weui-TAG-BACKGROUND-BLUE: rgba(16, 174, 255, .1);\n    --weui-TAG-TEXT-BLACK: hsla(0, 0%, 100%, .5);\n    --weui-TAG-BACKGROUND-BLACK: hsla(0, 0%, 100%, .05)\n  }\n}\n\n[data-weui-theme=light],\npage {\n  --weui-BG-COLOR-ACTIVE: #ececec\n}\n\n@media(prefers-color-scheme: dark) {\n  page{\n    --weui-BG-COLOR-ACTIVE: #373737\n  }\n}\n\n[class*=\" weui-icon-\"],\n[class^=weui-icon-] {\n  display: inline-block;\n  vertical-align: middle;\n  width: 24px;\n  height: 24px;\n  -webkit-mask-position: 50% 50%;\n  mask-position: 50% 50%;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  background-color: currentColor\n}\n\n.weui-icon-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-download {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M11.25%2012.04l-1.72-1.72-1.06%201.06%202.828%202.83a1%201%200%20001.414-.001l2.828-2.828-1.06-1.061-1.73%201.73V7h-1.5v5.04zm0-5.04V2h1.5v5h6.251c.55%200%20.999.446.999.996v13.008a.998.998%200%2001-.996.996H4.996A.998.998%200%20014%2021.004V7.996A1%201%200%20014.999%207h6.251z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M11.25%2012.04l-1.72-1.72-1.06%201.06%202.828%202.83a1%201%200%20001.414-.001l2.828-2.828-1.06-1.061-1.73%201.73V7h-1.5v5.04zm0-5.04V2h1.5v5h6.251c.55%200%20.999.446.999.996v13.008a.998.998%200%2001-.996.996H4.996A.998.998%200%20014%2021.004V7.996A1%201%200%20014.999%207h6.251z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-info {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.75-12v7h1.5v-7h-1.5zM12%209a1%201%200%20100-2%201%201%200%20000%202z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.75-12v7h1.5v-7h-1.5zM12%209a1%201%200%20100-2%201%201%200%20000%202z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-safe-success {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.6C315.5%2046.7%20180.4%2093.1%2057.6%20132c0%20129.3.2%20231.7.2%20339.7%200%20304.2%20248.3%20471.6%20443.1%20523.7C695.7%20943.3%20944%20775.9%20944%20471.7c0-108%20.2-210.4.2-339.7C821.4%2093.1%20686.3%2046.7%20500.9%204.6zm248.3%20349.1l-299.7%20295c-2.1%202-5.3%202-7.4-.1L304.4%20506.1c-2-2.1-2.3-5.7-.6-8l18.3-24.9c1.7-2.3%205-2.8%207.2-1l112.2%2086c2.3%201.8%206%201.7%208.1-.1l274.7-228.9c2.2-1.8%205.7-1.7%207.7.3l17%2016.8c2.2%202.1%202.2%205.3.2%207.4z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23070202%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.6C315.5%2046.7%20180.4%2093.1%2057.6%20132c0%20129.3.2%20231.7.2%20339.7%200%20304.2%20248.3%20471.6%20443.1%20523.7C695.7%20943.3%20944%20775.9%20944%20471.7c0-108%20.2-210.4.2-339.7C821.4%2093.1%20686.3%2046.7%20500.9%204.6zm248.3%20349.1l-299.7%20295c-2.1%202-5.3%202-7.4-.1L304.4%20506.1c-2-2.1-2.3-5.7-.6-8l18.3-24.9c1.7-2.3%205-2.8%207.2-1l112.2%2086c2.3%201.8%206%201.7%208.1-.1l274.7-228.9c2.2-1.8%205.7-1.7%207.7.3l17%2016.8c2.2%202.1%202.2%205.3.2%207.4z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23070202%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-safe-warn {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.5c-185.4%2042-320.4%2088.4-443.2%20127.3%200%20129.3.2%20231.7.2%20339.6%200%20304.1%20248.2%20471.4%20443%20523.6%20194.7-52.2%20443-219.5%20443-523.6%200-107.9.2-210.3.2-339.6C821.3%2092.9%20686.2%2046.5%20500.9%204.5zm-26.1%20271.1h52.1c5.8%200%2010.3%204.7%2010.1%2010.4l-11.6%20313.8c-.1%202.8-2.5%205.2-5.4%205.2h-38.2c-2.9%200-5.3-2.3-5.4-5.2L464.8%20286c-.2-5.8%204.3-10.4%2010-10.4zm26.1%20448.3c-20.2%200-36.5-16.3-36.5-36.5s16.3-36.5%2036.5-36.5%2036.5%2016.3%2036.5%2036.5-16.4%2036.5-36.5%2036.5z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23020202%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201000%201000%22%3E%3Cpath%20d%3D%22M500.9%204.5c-185.4%2042-320.4%2088.4-443.2%20127.3%200%20129.3.2%20231.7.2%20339.6%200%20304.1%20248.2%20471.4%20443%20523.6%20194.7-52.2%20443-219.5%20443-523.6%200-107.9.2-210.3.2-339.6C821.3%2092.9%20686.2%2046.5%20500.9%204.5zm-26.1%20271.1h52.1c5.8%200%2010.3%204.7%2010.1%2010.4l-11.6%20313.8c-.1%202.8-2.5%205.2-5.4%205.2h-38.2c-2.9%200-5.3-2.3-5.4-5.2L464.8%20286c-.2-5.8%204.3-10.4%2010-10.4zm26.1%20448.3c-20.2%200-36.5-16.3-36.5-36.5s16.3-36.5%2036.5-36.5%2036.5%2016.3%2036.5%2036.5-16.4%2036.5-36.5%2036.5z%22%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20fill%3D%22%23020202%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm-1.172-6.242l5.809-5.808.848.849-5.95%205.95a1%201%200%2001-1.414%200L7%2012.426l.849-.849%202.98%202.98z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm-1.172-6.242l5.809-5.808.848.849-5.95%205.95a1%201%200%2001-1.414%200L7%2012.426l.849-.849%202.98%202.98z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success-no-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-waiting {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.75%2011.38V6h-1.5v6l4.243%204.243%201.06-1.06-3.803-3.804zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.75%2011.38V6h-1.5v6l4.243%204.243%201.06-1.06-3.803-3.804zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-waiting-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.6%2011.503l3.891%203.891-.848.849L11.4%2012V6h1.2v5.503zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.6%2011.503l3.891%203.891-.848.849L11.4%2012V6h1.2v5.503zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-warn {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.763-15.864l.11%207.596h1.305l.11-7.596h-1.525zm.759%2010.967c.512%200%20.902-.383.902-.882%200-.5-.39-.882-.902-.882a.878.878%200%2000-.896.882c0%20.499.396.882.896.882z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-.763-15.864l.11%207.596h1.305l.11-7.596h-1.525zm.759%2010.967c.512%200%20.902-.383.902-.882%200-.5-.39-.882-.902-.882a.878.878%200%2000-.896.882c0%20.499.396.882.896.882z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-info-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zM11.4%2010h1.2v7h-1.2v-7zm.6-1a1%201%200%20110-2%201%201%200%20010%202z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zM11.4%2010h1.2v7h-1.2v-7zm.6-1a1%201%200%20110-2%201%201%200%20010%202z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-cancel {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%20fill-rule%3D%22nonzero%22%2F%3E%3Cpath%20d%3D%22M12.849%2012l3.11%203.111-.848.849L12%2012.849l-3.111%203.11-.849-.848L11.151%2012l-3.11-3.111.848-.849L12%2011.151l3.111-3.11.849.848L12.849%2012z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6z%22%20fill-rule%3D%22nonzero%22%2F%3E%3Cpath%20d%3D%22M12.849%2012l3.11%203.111-.848.849L12%2012.849l-3.111%203.11-.849-.848L11.151%2012l-3.11-3.111.848-.849L12%2011.151l3.111-3.11.849.848L12.849%2012z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-search {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M16.31%2015.561l4.114%204.115-.848.848-4.123-4.123a7%207%200%2011.857-.84zM16.8%2011a5.8%205.8%200%2010-11.6%200%205.8%205.8%200%200011.6%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M16.31%2015.561l4.114%204.115-.848.848-4.123-4.123a7%207%200%2011.857-.84zM16.8%2011a5.8%205.8%200%2010-11.6%200%205.8%205.8%200%200011.6%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-clear {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M13.06%2012l3.006-3.005-1.06-1.06L12%2010.938%208.995%207.934l-1.06%201.06L10.938%2012l-3.005%203.005%201.06%201.06L12%2013.062l3.005%203.005%201.06-1.06L13.062%2012zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M13.06%2012l3.006-3.005-1.06-1.06L12%2010.938%208.995%207.934l-1.06%201.06L10.938%2012l-3.005%203.005%201.06%201.06L12%2013.062l3.005%203.005%201.06-1.06L13.062%2012zM12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-back {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm1.999-6.563L10.68%2012%2014%208.562%2012.953%207.5%209.29%2011.277a1.045%201.045%200%20000%201.446l3.663%203.777L14%2015.437z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm1.999-6.563L10.68%2012%2014%208.562%2012.953%207.5%209.29%2011.277a1.045%201.045%200%20000%201.446l3.663%203.777L14%2015.437z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-delete {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M6.774%206.4l.812%2013.648a.8.8%200%2000.798.752h7.232a.8.8%200%2000.798-.752L17.226%206.4H6.774zm11.655%200l-.817%2013.719A2%202%200%200115.616%2022H8.384a2%202%200%2001-1.996-1.881L5.571%206.4H3.5v-.7a.5.5%200%2001.5-.5h16a.5.5%200%2001.5.5v.7h-2.071zM14%203a.5.5%200%2001.5.5v.7h-5v-.7A.5.5%200%200110%203h4zM9.5%209h1.2l.5%209H10l-.5-9zm3.8%200h1.2l-.5%209h-1.2l.5-9z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M6.774%206.4l.812%2013.648a.8.8%200%2000.798.752h7.232a.8.8%200%2000.798-.752L17.226%206.4H6.774zm11.655%200l-.817%2013.719A2%202%200%200115.616%2022H8.384a2%202%200%2001-1.996-1.881L5.571%206.4H3.5v-.7a.5.5%200%2001.5-.5h16a.5.5%200%2001.5.5v.7h-2.071zM14%203a.5.5%200%2001.5.5v.7h-5v-.7A.5.5%200%200110%203h4zM9.5%209h1.2l.5%209H10l-.5-9zm3.8%200h1.2l-.5%209h-1.2l.5-9z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success-no-circle-thin {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.864%2016.617l-5.303-5.303-1.061%201.06%205.657%205.657a1%201%200%20001.414%200L21.238%206.364l-1.06-1.06L8.864%2016.616z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.864%2016.617l-5.303-5.303-1.061%201.06%205.657%205.657a1%201%200%20001.414%200L21.238%206.364l-1.06-1.06L8.864%2016.616z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-arrow {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-arrow-bold {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20height%3D%2224%22%20width%3D%2212%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10.157%2012.711L4.5%2018.368l-1.414-1.414%204.95-4.95-4.95-4.95L4.5%205.64l5.657%205.657a1%201%200%20010%201.414z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20height%3D%2224%22%20width%3D%2212%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10.157%2012.711L4.5%2018.368l-1.414-1.414%204.95-4.95-4.95-4.95L4.5%205.64l5.657%205.657a1%201%200%20010%201.414z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-back-arrow {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M3.343%2012l7.071%207.071L9%2020.485l-7.778-7.778a1%201%200%20010-1.414L9%203.515l1.414%201.414L3.344%2012z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M3.343%2012l7.071%207.071L9%2020.485l-7.778-7.778a1%201%200%20010-1.414L9%203.515l1.414%201.414L3.344%2012z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-back-arrow-thin {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-close {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2010.586l5.657-5.657%201.414%201.414L13.414%2012l5.657%205.657-1.414%201.414L12%2013.414l-5.657%205.657-1.414-1.414L10.586%2012%204.929%206.343%206.343%204.93%2012%2010.586z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2010.586l5.657-5.657%201.414%201.414L13.414%2012l5.657%205.657-1.414%201.414L12%2013.414l-5.657%205.657-1.414-1.414L10.586%2012%204.929%206.343%206.343%204.93%2012%2010.586z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-close-thin {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-back-circle {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm1.999-5.363L12.953%2016.5%209.29%2012.723a1.045%201.045%200%20010-1.446L12.953%207.5%2014%208.563%2010.68%2012%2014%2015.438z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm0-1.2a8.8%208.8%200%20100-17.6%208.8%208.8%200%20000%2017.6zm1.999-5.363L12.953%2016.5%209.29%2012.723a1.045%201.045%200%20010-1.446L12.953%207.5%2014%208.563%2010.68%2012%2014%2015.438z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-icon-success {\n  color: var(--weui-BRAND)\n}\n\n.weui-icon-waiting {\n  color: var(--weui-BLUE)\n}\n\n.weui-icon-warn {\n  color: var(--weui-RED)\n}\n\n.weui-icon-info {\n  color: var(--weui-BLUE)\n}\n\n.weui-icon-success-circle,\n.weui-icon-success-no-circle,\n.weui-icon-success-no-circle-thin {\n  color: var(--weui-BRAND)\n}\n\n.weui-icon-waiting-circle {\n  color: var(--weui-BLUE)\n}\n\n.weui-icon-circle {\n  color: var(--weui-FG-2)\n}\n\n.weui-icon-download {\n  color: var(--weui-BRAND)\n}\n\n.weui-icon-info-circle {\n  color: var(--weui-FG-2)\n}\n\n.weui-icon-safe-success {\n  color: var(--weui-BRAND)\n}\n\n.weui-icon-safe-warn {\n  color: var(--weui-YELLOW)\n}\n\n.weui-icon-cancel {\n  color: var(--weui-RED)\n}\n\n.weui-icon-search {\n  color: var(--weui-FG-1)\n}\n\n.weui-icon-clear {\n  color: var(--weui-FG-2)\n}\n\n.weui-icon-clear:active {\n  color: var(--weui-FG-1)\n}\n\n.weui-icon-delete.weui-icon_gallery-delete {\n  color: var(--weui-WHITE)\n}\n\n.weui-icon-arrow,\n.weui-icon-arrow-bold,\n.weui-icon-back-arrow,\n.weui-icon-back-arrow-thin {\n  width: 12px\n}\n\n.weui-icon-arrow,\n.weui-icon-arrow-bold {\n  color: var(--weui-FG-2)\n}\n\n.weui-icon-back,\n.weui-icon-back-arrow,\n.weui-icon-back-arrow-thin,\n.weui-icon-back-circle {\n  color: var(--weui-FG-0)\n}\n\n.weui-icon_msg {\n  width: 64px;\n  height: 64px\n}\n\n.weui-icon_msg.weui-icon-warn {\n  color: var(--weui-RED)\n}\n\n.weui-icon_msg-primary {\n  width: 64px;\n  height: 64px\n}\n\n.weui-icon_msg-primary.weui-icon-warn {\n  color: var(--weui-YELLOW)\n}\n\n.weui-link {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-link,\n.weui-link:visited {\n  color: var(--weui-LINK)\n}\n\n.weui-btn {\n  position: relative;\n  display: block;\n  width: 184px;\n  margin-left: auto;\n  margin-right: auto;\n  padding: 8px 24px;\n  box-sizing: border-box;\n  font-weight: 700;\n  font-size: 17px;\n  text-align: center;\n  text-decoration: none;\n  color: #fff;\n  line-height: 1.41176471;\n  border-radius: 4px;\n  overflow: hidden;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-btn_block {\n  width: auto\n}\n\n.weui-btn_inline {\n  display: inline-block\n}\n\n.weui-btn_default {\n  background-color: var(--weui-BTN-DEFAULT-BG)\n}\n\n.weui-btn_default,\n.weui-btn_default:not(.weui-btn_disabled):visited {\n  color: var(--weui-BTN-DEFAULT-COLOR)\n}\n\n.weui-btn_default:not(.weui-btn_disabled):active {\n  background-color: var(--weui-BTN-DEFAULT-ACTIVE-BG)\n}\n\n.weui-btn_primary {\n  background-color: var(--weui-BRAND)\n}\n\n.weui-btn_primary:not(.weui-btn_disabled):visited {\n  color: #fff\n}\n\n.weui-btn_primary:not(.weui-btn_disabled):active {\n  background-color: var(--weui-TAG-TEXT-GREEN)\n}\n\n.weui-btn_warn {\n  background-color: var(--weui-BTN-DEFAULT-BG)\n}\n\n.weui-btn_warn,\n.weui-btn_warn:not(.weui-btn_disabled):visited {\n  color: var(--weui-RED)\n}\n\n.weui-btn_warn:not(.weui-btn_disabled):active {\n  background-color: var(--weui-BTN-DEFAULT-ACTIVE-BG)\n}\n\n.weui-btn_disabled {\n  color: var(--weui-BTN-DISABLED-FONT-COLOR);\n  background-color: var(--weui-BTN-DEFAULT-BG)\n}\n\n.weui-btn_loading .weui-loading {\n  margin: -.2em .34em 0 0\n}\n\n.weui-btn_loading.weui-btn_primary {\n  background-color: var(--weui-TAG-TEXT-GREEN);\n  color: var(--weui-WHITE)\n}\n\n.weui-btn_loading.weui-btn_default,\n.weui-btn_loading.weui-btn_warn {\n  background-color: var(--weui-BTN-DEFAULT-ACTIVE-BG)\n}\n\n.weui-btn_cell {\n  position: relative;\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n  box-sizing: border-box;\n  font-size: 17px;\n  text-align: center;\n  text-decoration: none;\n  color: #fff;\n  line-height: 1.41176471;\n  padding: 16px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  overflow: hidden;\n  background-color: var(--weui-BG-5)\n}\n\n.weui-btn_cell+.weui-btn_cell {\n  margin-top: 16px\n}\n\n.weui-btn_cell:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-btn_cell__icon {\n  display: inline-block;\n  vertical-align: middle;\n  width: 24px;\n  height: 24px;\n  margin: -.2em .34em 0 0\n}\n\n.weui-btn_cell-default {\n  color: var(--weui-FG-0)\n}\n\n.weui-btn_cell-primary {\n  color: var(--weui-LINK)\n}\n\n.weui-btn_cell-warn {\n  color: var(--weui-RED)\n}\n\nbutton.weui-btn,\ninput.weui-btn {\n  border-width: 0;\n  outline: 0;\n  -webkit-appearance: none\n}\n\nbutton.weui-btn:focus,\ninput.weui-btn:focus {\n  outline: 0\n}\n\nbutton.weui-btn_inline,\nbutton.weui-btn_mini,\ninput.weui-btn_inline,\ninput.weui-btn_mini {\n  width: auto\n}\n\n.weui-btn_mini {\n  display: inline-block;\n  width: auto;\n  padding: 0 .75em;\n  line-height: 2;\n  font-size: 16px\n}\n\n.weui-btn:not(.weui-btn_mini)+.weui-btn:not(.weui-btn_mini) {\n  margin-top: 16px\n}\n\n.weui-btn.weui-btn_inline+.weui-btn.weui-btn_inline {\n  margin-top: auto;\n  margin-left: 16px\n}\n\n.weui-btn-area {\n  margin: 48px 16px 8px\n}\n\n.weui-btn-area_inline {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex\n}\n\n.weui-btn-area_inline .weui-btn {\n  margin-top: auto;\n  margin-right: 16px;\n  width: 100%;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-btn-area_inline .weui-btn:last-child {\n  margin-right: 0\n}\n\n.weui-btn_reset {\n  background: transparent;\n  border: 0;\n  padding: 0;\n  outline: 0\n}\n\n.weui-btn_icon {\n  font-size: 0\n}\n\n.weui-btn_icon:active [class*=weui-icon-] {\n  color: var(--weui-FG-1)\n}\n\n.weui-cells {\n  margin-top: 8px;\n  background-color: var(--weui-BG-2);\n  line-height: 1.41176471;\n  font-size: 17px;\n  overflow: hidden;\n  position: relative\n}\n\n.weui-cells:before {\n  top: 0;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-cells:after,\n.weui-cells:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 1px;\n  color: var(--weui-FG-3);\n  z-index: 2\n}\n\n.weui-cells:after {\n  bottom: 0;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-cells__title {\n  margin-top: 16px;\n  margin-bottom: 3px;\n  padding-left: 16px;\n  padding-right: 16px;\n  color: var(--weui-FG-1);\n  font-size: 14px;\n  line-height: 1.4\n}\n\n.weui-cells__title+.weui-cells {\n  margin-top: 0\n}\n\n.weui-cells__tips {\n  margin-top: 8px;\n  color: var(--weui-FG-1);\n  padding-left: 16px;\n  padding-right: 16px;\n  font-size: 14px;\n  line-height: 1.4\n}\n\n.weui-cells__tips a,\n.weui-cells__tips navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-cells__tips navigator {\n  display: inline\n}\n\n.weui-cell {\n  padding: 16px;\n  position: relative;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-cell:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  left: 16px;\n  z-index: 2\n}\n\n.weui-cell:first-child:before {\n  display: none\n}\n\n.weui-cell_active:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-cell_primary {\n  -webkit-box-align: start;\n  -webkit-align-items: flex-start;\n  align-items: flex-start\n}\n\n.weui-cell__bd {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-cell__ft {\n  text-align: right;\n  color: var(--weui-FG-1)\n}\n\n.weui-cell_swiped {\n  display: block;\n  padding: 0\n}\n\n.weui-cell_swiped>.weui-cell__bd {\n  position: relative;\n  z-index: 1;\n  background-color: var(--weui-BG-2)\n}\n\n.weui-cell_swiped>.weui-cell__ft {\n  position: absolute;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  color: #fff\n}\n\n.weui-swiped-btn {\n  display: block;\n  padding: 16px 1em;\n  line-height: 1.41176471;\n  color: inherit\n}\n\n.weui-swiped-btn_default {\n  background-color: var(--weui-BG-0)\n}\n\n.weui-swiped-btn_warn {\n  background-color: var(--weui-RED)\n}\n\n.weui-cell_access {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  color: inherit\n}\n\n.weui-cell_access:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-cell_access .weui-cell__ft {\n  padding-right: 22px;\n  position: relative\n}\n\n.weui-cell_access .weui-cell__ft:after {\n  content: \" \";\n  width: 12px;\n  height: 24px;\n  -webkit-mask-position: 0 0;\n  mask-position: 0 0;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  background-color: currentColor;\n  color: var(--weui-FG-2);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  position: absolute;\n  top: 50%;\n  right: 0;\n  margin-top: -12px\n}\n\n.weui-cell_link {\n  color: var(--weui-LINK);\n  font-size: 17px\n}\n\n.weui-cell_link:first-child:before {\n  display: block\n}\n\n.weui-check__label {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-check__label:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-check {\n  position: absolute;\n  left: -9999px\n}\n\n.weui-cells_radio .weui-cell__ft {\n  padding-left: 16px;\n  font-size: 0\n}\n\n.weui-cells_radio .weui-check+.weui-icon-checked {\n  min-width: 16px;\n  color: transparent\n}\n\n.weui-cells_radio .weui-check:checked+.weui-icon-checked,\n.weui-cells_radio .weui-check[aria-checked=true]+.weui-icon-checked {\n  color: var(--weui-BRAND);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M8.657%2018.435L3%2012.778l1.414-1.414%204.95%204.95L20.678%205l1.414%201.414-12.02%2012.021a1%201%200%2001-1.415%200z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-cells_checkbox .weui-check__label:before {\n  left: 55px\n}\n\n.weui-cells_checkbox .weui-cell__hd {\n  padding-right: 16px;\n  font-size: 0\n}\n\n.weui-cells_checkbox .weui-icon-checked {\n  color: var(--weui-FG-2);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-cells_checkbox .weui-check:checked+.weui-icon-checked,\n.weui-cells_checkbox .weui-check[aria-checked=true]+.weui-icon-checked {\n  color: var(--weui-BRAND);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E)\n}\n\n.weui-label {\n  display: block;\n  width: 105px;\n  word-wrap: break-word;\n  word-break: break-all\n}\n\n.weui-input {\n  width: 100%;\n  border: 0;\n  outline: 0;\n  -webkit-appearance: none;\n  background-color: transparent;\n  font-size: inherit;\n  color: inherit;\n  height: 1.41176471em;\n  line-height: 1.41176471\n}\n\n.weui-input::-webkit-inner-spin-button,\n.weui-input::-webkit-outer-spin-button {\n  -webkit-appearance: none;\n  margin: 0\n}\n\n.weui-input:focus:not(:placeholder-shown)+.weui-btn_input-clear {\n  display: inline\n}\n\n.weui-input::-webkit-input-placeholder,\n.weui-input__placeholder {\n  color: var(--weui-FG-2)\n}\n\n.weui-input::placeholder,\n.weui-input__placeholder {\n  color: var(--weui-FG-2)\n}\n\n.weui-textarea {\n  display: block;\n  border: 0;\n  resize: none;\n  background: transparent;\n  width: 100%;\n  color: inherit;\n  font-size: 1em;\n  line-height: inherit;\n  outline: 0\n}\n\n.weui-textarea-counter {\n  color: var(--weui-FG-2);\n  text-align: right;\n  font-size: 14px\n}\n\n.weui-cell_warn .weui-textarea-counter {\n  color: var(--weui-RED)\n}\n\n.weui-cells_form .weui-cell_disabled:active,\n.weui-cells_form .weui-cell_readonly:active,\n.weui-cells_form .weui-cell_switch:active,\n.weui-cells_form .weui-cell_vcode:active {\n  background-color: transparent\n}\n\n.weui-cells_form .weui-cell__ft {\n  font-size: 0\n}\n\n.weui-cells_form .weui-icon-warn {\n  display: none\n}\n\n.weui-cells_form input,\n.weui-cells_form label[for],\n.weui-cells_form textarea {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-cell_warn {\n  color: var(--weui-RED)\n}\n\n.weui-cell_warn .weui-icon-warn {\n  display: inline-block\n}\n\n.weui-cell_disabled .weui-input:disabled,\n.weui-cell_disabled .weui-textarea:disabled,\n.weui-cell_readonly .weui-input:disabled,\n.weui-cell_readonly .weui-textarea:disabled {\n  opacity: 1;\n  -webkit-text-fill-color: var(--weui-FG-1)\n}\n\n.weui-cell_disabled .weui-input[disabled],\n.weui-cell_disabled .weui-input[readonly],\n.weui-cell_disabled .weui-textarea[disabled],\n.weui-cell_disabled .weui-textarea[readonly],\n.weui-cell_readonly .weui-input[disabled],\n.weui-cell_readonly .weui-input[readonly],\n.weui-cell_readonly .weui-textarea[disabled],\n.weui-cell_readonly .weui-textarea[readonly] {\n  color: var(--weui-FG-1)\n}\n\n.weui-btn_input-clear {\n  display: none;\n  padding-left: 8px\n}\n\n.weui-btn_input-clear [class*=weui-icon-] {\n  width: 18px\n}\n\n.weui-form-preview {\n  position: relative;\n  background-color: var(--weui-BG-2)\n}\n\n.weui-form-preview:before {\n  top: 0;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-form-preview:after,\n.weui-form-preview:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 1px;\n  color: var(--weui-FG-3)\n}\n\n.weui-form-preview:after {\n  bottom: 0;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-form-preview__hd {\n  position: relative;\n  padding: 16px;\n  text-align: right;\n  line-height: 2.5em\n}\n\n.weui-form-preview__hd:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  left: 16px\n}\n\n.weui-form-preview__hd .weui-form-preview__value {\n  font-style: normal;\n  font-size: 1.6em\n}\n\n.weui-form-preview__bd {\n  padding: 16px;\n  font-size: .9em;\n  text-align: right;\n  color: var(--weui-FG-1);\n  line-height: 2\n}\n\n.weui-form-preview__ft {\n  position: relative;\n  line-height: 50px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex\n}\n\n.weui-form-preview__ft:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-DIALOG-LINE-COLOR);\n  color: var(--weui-DIALOG-LINE-COLOR);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-form-preview__item {\n  overflow: hidden\n}\n\n.weui-form-preview__label {\n  float: left;\n  margin-right: 1em;\n  min-width: 4em;\n  color: var(--weui-FG-1);\n  text-align: justify;\n  text-align-last: justify\n}\n\n.weui-form-preview__value {\n  display: block;\n  overflow: hidden;\n  word-break: normal;\n  word-wrap: break-word;\n  color: var(--weui-FG-0)\n}\n\n.weui-form-preview__btn {\n  position: relative;\n  display: block;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  color: var(--weui-LINK);\n  text-align: center;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\nbutton.weui-form-preview__btn {\n  background-color: transparent;\n  border: 0;\n  outline: 0;\n  line-height: inherit;\n  font-size: inherit\n}\n\n.weui-form-preview__btn:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-form-preview__btn:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-DIALOG-LINE-COLOR);\n  color: var(--weui-DIALOG-LINE-COLOR);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-form-preview__btn:first-child:after {\n  display: none\n}\n\n.weui-form-preview__btn_default {\n  color: var(--weui-FG-HALF)\n}\n\n.weui-form-preview__btn_primary {\n  color: var(--weui-LINK)\n}\n\n.weui-cell_select {\n  padding: 0\n}\n\n.weui-cell_select .weui-select {\n  padding-right: 30px\n}\n\n.weui-cell_select .weui-cell__bd:after {\n  content: \" \";\n  width: 12px;\n  height: 24px;\n  -webkit-mask-position: 0 0;\n  mask-position: 0 0;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  background-color: currentColor;\n  color: var(--weui-FG-2);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  position: absolute;\n  top: 50%;\n  right: 16px;\n  margin-top: -12px\n}\n\n.weui-select {\n  -webkit-appearance: none;\n  border: 0;\n  outline: 0;\n  background-color: transparent;\n  width: 100%;\n  font-size: inherit;\n  height: 56px;\n  line-height: 56px;\n  position: relative;\n  z-index: 1;\n  padding-left: 16px;\n  color: var(--weui-FG-0)\n}\n\n.weui-cell_select-before {\n  padding-right: 16px\n}\n\n.weui-cell_select-before .weui-select {\n  width: 105px;\n  box-sizing: border-box\n}\n\n.weui-cell_select-before .weui-cell__hd {\n  position: relative\n}\n\n.weui-cell_select-before .weui-cell__hd:after {\n  content: \" \";\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-right: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 100% 0;\n  transform-origin: 100% 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-cell_select-before .weui-cell__hd:before {\n  content: \" \";\n  width: 12px;\n  height: 24px;\n  -webkit-mask-position: 0 0;\n  mask-position: 0 0;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  background-color: currentColor;\n  color: var(--weui-FG-2);\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M2.454%206.58l1.06-1.06%205.78%205.779a.996.996%200%20010%201.413l-5.78%205.779-1.06-1.061%205.425-5.425-5.425-5.424z%22%20fill%3D%22%23B2B2B2%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E);\n  position: absolute;\n  top: 50%;\n  right: 16px;\n  margin-top: -12px\n}\n\n.weui-cell_select-before .weui-cell__bd {\n  padding-left: 16px\n}\n\n.weui-cell_select-before .weui-cell__bd:after {\n  display: none\n}\n\n.weui-cell_select-before.weui-cell_access .weui-cell__hd {\n  line-height: 56px;\n  padding-left: 32px\n}\n\n.weui-cell_select-after {\n  padding-left: 16px\n}\n\n.weui-cell_select-after .weui-select {\n  padding-left: 0\n}\n\n.weui-cell_select-after.weui-cell_access .weui-cell__bd {\n  line-height: 56px\n}\n\n.weui-cell_vcode {\n  padding-top: 0;\n  padding-right: 0;\n  padding-bottom: 0\n}\n\n.weui-vcode-btn,\n.weui-vcode-img {\n  margin-left: 5px;\n  height: 56px;\n  vertical-align: middle\n}\n\n.weui-vcode-btn {\n  display: inline-block;\n  padding: 0 .6em 0 .7em;\n  line-height: 56px;\n  font-size: 17px;\n  color: var(--weui-LINK);\n  position: relative\n}\n\n.weui-vcode-btn:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\nbutton.weui-vcode-btn {\n  background-color: transparent;\n  border: 0;\n  outline: 0\n}\n\n.weui-vcode-btn:active {\n  color: #767676\n}\n\n.weui-gallery {\n  display: none;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: #000;\n  z-index: 1000\n}\n\n.weui-gallery__img,\n.weui-gallery__opr {\n  position: absolute;\n  left: 0;\n  left: constant(safe-area-inset-left);\n  left: env(safe-area-inset-left);\n  right: 0;\n  right: constant(safe-area-inset-right);\n  right: env(safe-area-inset-right)\n}\n\n.weui-gallery__img {\n  top: 0;\n  top: constant(safe-area-inset-top);\n  top: env(safe-area-inset-top);\n  bottom: 60px;\n  bottom: calc(60px + constant(safe-area-inset-bottom));\n  bottom: calc(60px + env(safe-area-inset-bottom));\n  background: 50% no-repeat;\n  background-size: contain\n}\n\n.weui-gallery__opr {\n  position: absolute;\n  bottom: 0;\n  padding-bottom: 0;\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom);\n  background-color: #0d0d0d;\n  color: var(--weui-WHITE);\n  line-height: 60px;\n  text-align: center\n}\n\n.weui-gallery__del {\n  display: block\n}\n\n.weui-cell_switch {\n  padding-top: 12px;\n  padding-bottom: 12px\n}\n\n.weui-switch {\n  -webkit-appearance: none;\n  appearance: none\n}\n\n.weui-switch,\n.weui-switch-cp__box {\n  position: relative;\n  width: 52px;\n  height: 32px;\n  border: 2px solid var(--weui-FG-3);\n  outline: 0;\n  border-radius: 16px;\n  box-sizing: border-box;\n  -webkit-transition: background-color .1s, border .1s;\n  transition: background-color .1s, border .1s\n}\n\n.weui-switch-cp__box:before,\n.weui-switch:before {\n  content: \" \";\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  border-radius: 15px;\n  background-color: var(--weui-BG-3);\n  -webkit-transition: -webkit-transform .35s cubic-bezier(.45, 1, .4, 1);\n  transition: -webkit-transform .35s cubic-bezier(.45, 1, .4, 1);\n  transition: transform .35s cubic-bezier(.45, 1, .4, 1);\n  transition: transform .35s cubic-bezier(.45, 1, .4, 1), -webkit-transform .35s cubic-bezier(.45, 1, .4, 1)\n}\n\n.weui-switch-cp__box:after,\n.weui-switch:after {\n  content: \" \";\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 28px;\n  height: 28px;\n  border-radius: 15px;\n  background-color: #fff;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, .4);\n  -webkit-transition: -webkit-transform .35s cubic-bezier(.4, .4, .25, 1.35);\n  transition: -webkit-transform .35s cubic-bezier(.4, .4, .25, 1.35);\n  transition: transform .35s cubic-bezier(.4, .4, .25, 1.35);\n  transition: transform .35s cubic-bezier(.4, .4, .25, 1.35), -webkit-transform .35s cubic-bezier(.4, .4, .25, 1.35)\n}\n\n.weui-switch-cp__input:checked+.weui-switch-cp__box,\n.weui-switch-cp__input[aria-checked=true]+.weui-switch-cp__box,\n.weui-switch:checked {\n  border-color: var(--weui-BRAND);\n  background-color: var(--weui-BRAND)\n}\n\n.weui-switch-cp__input:checked+.weui-switch-cp__box:before,\n.weui-switch-cp__input[aria-checked=true]+.weui-switch-cp__box:before,\n.weui-switch:checked:before {\n  -webkit-transform: scale(0);\n  transform: scale(0)\n}\n\n.weui-switch-cp__input:checked+.weui-switch-cp__box:after,\n.weui-switch-cp__input[aria-checked=true]+.weui-switch-cp__box:after,\n.weui-switch:checked:after {\n  -webkit-transform: translateX(20px);\n  transform: translateX(20px)\n}\n\n.weui-switch-cp__input {\n  position: absolute;\n  left: -9999px\n}\n\n.weui-switch-cp__box {\n  display: block\n}\n\n.weui-uploader {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-uploader__hd {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  padding-bottom: 16px;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-uploader__title {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-uploader__info {\n  color: var(--weui-FG-2)\n}\n\n.weui-uploader__bd {\n  margin-bottom: -8px;\n  margin-right: -8px;\n  overflow: hidden\n}\n\n.weui-uploader__files {\n  list-style: none\n}\n\n.weui-uploader__file {\n  float: left;\n  margin-right: 8px;\n  margin-bottom: 8px;\n  width: 96px;\n  height: 96px;\n  background: no-repeat 50%;\n  background-size: cover\n}\n\n.weui-uploader__file_status {\n  position: relative\n}\n\n.weui-uploader__file_status:before {\n  content: \" \";\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: rgba(0, 0, 0, .5)\n}\n\n.weui-uploader__file_status .weui-uploader__file-content {\n  display: block\n}\n\n.weui-uploader__file-content {\n  display: none;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  color: var(--weui-WHITE)\n}\n\n.weui-uploader__file-content .weui-icon-warn {\n  display: inline-block\n}\n\n.weui-uploader__input-box {\n  float: left;\n  position: relative;\n  margin-right: 8px;\n  margin-bottom: 8px;\n  width: 96px;\n  height: 96px;\n  box-sizing: border-box;\n  background-color: #ededed\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-uploader__input-box {\n    background-color: #2e2e2e\n  }\n}\n\n.weui-uploader__input-box:after,\n.weui-uploader__input-box:before {\n  content: \" \";\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  background-color: #a3a3a3\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-uploader__input-box:after,\n  .weui-uploader__input-box:before {\n    background-color: #6d6d6d\n  }\n}\n\n.weui-uploader__input-box:before {\n  width: 2px;\n  height: 32px\n}\n\n.weui-uploader__input-box:after {\n  width: 32px;\n  height: 2px\n}\n\n.weui-uploader__input-box:active:after,\n.weui-uploader__input-box:active:before {\n  opacity: .7\n}\n\n.weui-uploader__input {\n  position: absolute;\n  z-index: 1;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-msg {\n  padding-top: 48px;\n  padding: calc(48px + constant(safe-area-inset-top)) constant(safe-area-inset-right) constant(safe-area-inset-bottom) constant(safe-area-inset-left);\n  padding: calc(48px + env(safe-area-inset-top)) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);\n  text-align: center;\n  line-height: 1.4;\n  min-height: 100%;\n  box-sizing: border-box;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  background-color: var(--weui-BG-2)\n}\n\n.weui-msg a:not(.weui-btn) {\n  color: var(--weui-LINK);\n  display: inline-block;\n  vertical-align: baseline\n}\n\n.weui-msg__icon-area {\n  margin-bottom: 32px\n}\n\n.weui-msg__text-area {\n  margin-bottom: 32px;\n  padding: 0 32px;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  line-height: 1.6\n}\n\n.weui-msg__text-area:first-child {\n  padding-top: 96px\n}\n\n.weui-msg__title {\n  font-weight: 700;\n  font-size: 22px\n}\n\n.weui-msg__desc,\n.weui-msg__title {\n  margin-bottom: 16px;\n  color: var(--weui-FG-0);\n  word-wrap: break-word;\n  word-break: break-all\n}\n\n.weui-msg__desc {\n  font-size: 17px\n}\n\n.weui-msg__desc-primary {\n  font-size: 14px;\n  color: var(--weui-FG-1);\n  word-wrap: break-word;\n  word-break: break-all;\n  margin-bottom: 16px\n}\n\n.weui-msg__opr-area {\n  margin-bottom: 16px\n}\n\n.weui-msg__opr-area .weui-btn-area {\n  margin: 0\n}\n\n.weui-msg__opr-area .weui-btn+.weui-btn {\n  margin-bottom: 16px\n}\n\n.weui-msg__opr-area:last-child {\n  margin-bottom: 96px\n}\n\n.weui-msg__opr-area+.weui-msg__extra-area {\n  margin-top: 48px\n}\n\n.weui-msg__tips-area {\n  margin-bottom: 16px;\n  padding: 0 40px\n}\n\n.weui-msg__opr-area+.weui-msg__tips-area {\n  margin-bottom: 48px\n}\n\n.weui-msg__tips-area:last-child {\n  margin-bottom: 64px\n}\n\n.weui-msg__extra-area,\n.weui-msg__tips {\n  font-size: 12px;\n  color: var(--weui-FG-1)\n}\n\n.weui-msg__extra-area {\n  margin-bottom: 24px\n}\n\n.weui-msg__extra-area a,\n.weui-msg__extra-area navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-msg__extra-area navigator {\n  display: inline\n}\n\n.weui-cells__group_form:first-child .weui-cells__title {\n  margin-top: 0\n}\n\n.weui-cells__group_form .weui-cells__title {\n  margin-top: 24px;\n  margin-bottom: 8px;\n  padding: 0 32px\n}\n\n.weui-cells__group_form .weui-cell:before,\n.weui-cells__group_form .weui-cells:before {\n  left: 32px;\n  right: 32px\n}\n\n.weui-cells__group_form .weui-cells_checkbox .weui-check__label:before {\n  left: 72px\n}\n\n.weui-cells__group_form .weui-cells:after {\n  left: 32px;\n  right: 32px\n}\n\n.weui-cells__group_form .weui-cell {\n  padding: 16px 32px\n}\n\n.weui-cells__group_form .weui-cell:not(.weui-cell_link) {\n  color: var(--weui-FG-0)\n}\n\n.weui-cells__group_form .weui-cell__hd {\n  padding-right: 16px\n}\n\n.weui-cells__group_form .weui-cell__ft {\n  padding-left: 16px\n}\n\n.weui-cells__group_form .weui-cell_warn input {\n  color: var(--weui-RED)\n}\n\n.weui-cells__group_form .weui-label {\n  max-width: 5em;\n  margin-right: 8px\n}\n\n.weui-cells__group_form .weui-cells__tips {\n  margin-top: 8px;\n  padding: 0 32px;\n  color: rgba(0, 0, 0, .3)\n}\n\n.weui-cells__group_form .weui-cells__tips a {\n  font-weight: 700\n}\n\n.weui-cells__group_form .weui-cell_vcode {\n  padding: 12px 32px\n}\n\n.weui-cells__group_form .weui-vcode-btn {\n  font-size: 16px;\n  padding: 0 12px;\n  margin-left: 0;\n  height: auto;\n  width: auto;\n  line-height: 2em;\n  color: var(--weui-BTN-DEFAULT-COLOR);\n  background-color: var(--weui-BTN-DEFAULT-BG)\n}\n\n.weui-cells__group_form .weui-vcode-btn:before {\n  display: none\n}\n\n.weui-cells__group_form .weui-cell_select {\n  padding: 0\n}\n\n.weui-cells__group_form .weui-cell_select .weui-select {\n  padding: 0 32px\n}\n\n.weui-cells__group_form .weui-cell_select .weui-cell__bd:after {\n  right: 32px\n}\n\n.weui-cells__group_form .weui-cell_select-before .weui-label {\n  margin-right: 24px\n}\n\n.weui-cells__group_form .weui-cell_select-before .weui-select {\n  padding-right: 24px;\n  box-sizing: initial\n}\n\n.weui-cells__group_form .weui-cell_select-after {\n  padding-left: 32px\n}\n\n.weui-cells__group_form .weui-cell_select-after .weui-select {\n  padding-left: 0\n}\n\n.weui-cells__group_form .weui-cell_switch {\n  padding: 12px 32px\n}\n\n.weui-form {\n  padding: 56px 0 0;\n  padding: calc(56px + constant(safe-area-inset-top)) constant(safe-area-inset-right) constant(safe-area-inset-bottom) constant(safe-area-inset-left);\n  padding: calc(56px + env(safe-area-inset-top)) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  line-height: 1.4;\n  min-height: 100%;\n  box-sizing: border-box;\n  background-color: var(--weui-BG-2)\n}\n\n.weui-form .weui-footer,\n.weui-form .weui-footer__link {\n  font-size: 14px\n}\n\n.weui-form .weui-agree {\n  padding: 0\n}\n\n.weui-form__text-area {\n  padding: 0 32px;\n  color: var(--weui-FG-0);\n  text-align: center\n}\n\n.weui-form__control-area {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  margin: 48px 0\n}\n\n.weui-form__tips-area {\n  overflow: hidden\n}\n\n.weui-form__extra-area,\n.weui-form__tips-area {\n  margin-bottom: 24px;\n  text-align: center\n}\n\n.weui-form__opr-area {\n  margin-bottom: 64px\n}\n\n.weui-form__opr-area:last-child {\n  margin-bottom: 96px\n}\n\n.weui-form__title {\n  font-size: 22px;\n  font-weight: 700;\n  line-height: 1.36\n}\n\n.weui-form__desc {\n  font-size: 17px;\n  margin-top: 16px\n}\n\n.weui-form__tips {\n  color: var(--weui-FG-1);\n  font-size: 14px\n}\n\n.weui-form__tips a,\n.weui-form__tips navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-form__tips navigator {\n  display: inline\n}\n\n.weui-article {\n  padding: 24px 16px;\n  padding: 24px calc(16px + constant(safe-area-inset-right)) calc(24px + constant(safe-area-inset-bottom)) calc(16px + constant(safe-area-inset-left));\n  padding: 24px calc(16px + env(safe-area-inset-right)) calc(24px + env(safe-area-inset-bottom)) calc(16px + env(safe-area-inset-left));\n  font-size: 17px;\n  color: var(--weui-FG-0)\n}\n\n.weui-article__section {\n  margin-bottom: 1.5em\n}\n\n.weui-article__h1 {\n  font-size: 22px;\n  font-weight: 700;\n  margin-bottom: .9em;\n  line-height: 1.4\n}\n\n.weui-article__h2 {\n  font-size: 17px\n}\n\n.weui-article__h2,\n.weui-article__h3 {\n  font-weight: 700;\n  margin-bottom: .34em;\n  line-height: 1.4\n}\n\n.weui-article__h3 {\n  font-size: 15px\n}\n\n.weui-article__p {\n  margin: 0 0 .8em\n}\n\n.weui-tabbar {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  position: relative;\n  z-index: 500;\n  background-color: var(--weui-BG-1)\n}\n\n.weui-tabbar:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-tabbar__item {\n  display: block;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  padding: 8px 0;\n  padding-bottom: calc(8px + constant(safe-area-inset-bottom));\n  padding-bottom: calc(8px + env(safe-area-inset-bottom));\n  font-size: 0;\n  color: var(--weui-FG-1);\n  text-align: center;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-tabbar__item:first-child {\n  padding-left: constant(safe-area-inset-left);\n  padding-left: env(safe-area-inset-left)\n}\n\n.weui-tabbar__item:last-child {\n  padding-right: constant(safe-area-inset-right);\n  padding-right: env(safe-area-inset-right)\n}\n\n.weui-tabbar__item.weui-bar__item_on .weui-tabbar__icon,\n.weui-tabbar__item.weui-bar__item_on .weui-tabbar__icon>i,\n.weui-tabbar__item.weui-bar__item_on .weui-tabbar__label {\n  color: var(--weui-BRAND)\n}\n\n.weui-tabbar__icon {\n  display: inline-block;\n  width: 28px;\n  height: 28px;\n  margin-bottom: 2px\n}\n\n.weui-tabbar__icon>i,\ni.weui-tabbar__icon {\n  font-size: 24px;\n  color: var(--weui-FG-1)\n}\n\n.weui-tabbar__icon img {\n  width: 100%;\n  height: 100%\n}\n\n.weui-tabbar__label {\n  color: var(--weui-FG-0);\n  font-size: 10px;\n  line-height: 1.4\n}\n\n.weui-navbar {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  position: relative;\n  z-index: 500;\n  background-color: var(--weui-BG-2);\n  padding-top: constant(safe-area-inset-top);\n  padding-top: env(safe-area-inset-top)\n}\n\n.weui-navbar:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-navbar+.weui-tab__panel {\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom)\n}\n\n.weui-navbar__item {\n  position: relative;\n  display: block;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  padding: 16px 0;\n  padding-top: calc(16px + constant(safe-area-inset-top));\n  padding-top: calc(16px + env(safe-area-inset-top));\n  text-align: center;\n  font-size: 17px;\n  line-height: 1.41176471;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-navbar__item.weui-bar__item_on,\n.weui-navbar__item:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-navbar__item:after {\n  content: \" \";\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-right: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 100% 0;\n  transform-origin: 100% 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-navbar__item:first-child {\n  padding-left: constant(safe-area-inset-left);\n  padding-left: env(safe-area-inset-left)\n}\n\n.weui-navbar__item:last-child {\n  padding-right: constant(safe-area-inset-right);\n  padding-right: env(safe-area-inset-right)\n}\n\n.weui-navbar__item:last-child:after {\n  display: none\n}\n\n.weui-tab {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  height: 100%;\n  box-sizing: border-box;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column\n}\n\n.weui-tab__panel {\n  box-sizing: border-box;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch\n}\n\n.weui-tab__content {\n  display: none\n}\n\n.weui-progress {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-progress__bar {\n  background-color: var(--weui-BG-0);\n  height: 3px;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-progress__inner-bar {\n  width: 0;\n  height: 100%;\n  background-color: var(--weui-BRAND)\n}\n\n.weui-progress__opr {\n  display: block;\n  margin-left: 15px;\n  font-size: 0\n}\n\n.weui-panel {\n  background-color: var(--weui-BG-2);\n  margin-top: 10px;\n  position: relative;\n  overflow: hidden\n}\n\n.weui-panel:first-child {\n  margin-top: 0\n}\n\n.weui-panel:before {\n  top: 0;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-panel:after,\n.weui-panel:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 1px;\n  color: var(--weui-FG-3)\n}\n\n.weui-panel:after {\n  bottom: 0;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-panel__hd {\n  padding: 16px 16px 13px;\n  color: var(--weui-FG-0);\n  font-size: 15px;\n  font-weight: 700;\n  position: relative\n}\n\n.weui-panel__hd:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  left: 15px\n}\n\n.weui-media-box {\n  padding: 16px;\n  position: relative\n}\n\n.weui-media-box:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5);\n  left: 16px\n}\n\n.weui-media-box:first-child:before {\n  display: none\n}\n\na.weui-media-box {\n  color: #000;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\na.weui-media-box:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-media-box__title {\n  font-weight: 400;\n  font-size: 17px;\n  color: var(--weui-FG-0);\n  width: auto;\n  white-space: nowrap;\n  word-wrap: normal;\n  word-wrap: break-word;\n  word-break: break-all\n}\n\n.weui-media-box__desc,\n.weui-media-box__title {\n  line-height: 1.4;\n  overflow: hidden;\n  text-overflow: ellipsis\n}\n\n.weui-media-box__desc {\n  color: var(--weui-FG-2);\n  font-size: 14px;\n  padding-top: 4px;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2\n}\n\n.weui-media-box__info {\n  margin-top: 16px;\n  padding-bottom: 4px;\n  font-size: 13px;\n  color: var(--weui-FG-2);\n  line-height: 1em;\n  list-style: none;\n  overflow: hidden\n}\n\n.weui-media-box__info__meta {\n  float: left;\n  padding-right: 1em\n}\n\n.weui-media-box__info__meta_extra {\n  padding-left: 1em;\n  border-left: 1px solid var(--weui-FG-2)\n}\n\n.weui-media-box_appmsg {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-media-box_appmsg .weui-media-box__hd {\n  margin-right: 16px;\n  width: 60px;\n  height: 60px;\n  line-height: 60px;\n  text-align: center\n}\n\n.weui-media-box_appmsg .weui-media-box__thumb {\n  width: 100%;\n  max-height: 100%;\n  vertical-align: top\n}\n\n.weui-media-box_appmsg .weui-media-box__bd {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  min-width: 0\n}\n\n.weui-media-box_small-appmsg {\n  padding: 0\n}\n\n.weui-media-box_small-appmsg .weui-cells {\n  margin-top: 0\n}\n\n.weui-media-box_small-appmsg .weui-cells:before {\n  display: none\n}\n\n.weui-grids {\n  position: relative;\n  overflow: hidden\n}\n\n.weui-grids:before {\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-grids:after,\n.weui-grids:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  color: var(--weui-FG-3)\n}\n\n.weui-grids:after {\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-grid {\n  position: relative;\n  float: left;\n  padding: 20px 10px;\n  width: 33.33333333%;\n  box-sizing: border-box\n}\n\n.weui-grid:before {\n  top: 0;\n  width: 1px;\n  border-right: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 100% 0;\n  transform-origin: 100% 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-grid:after,\n.weui-grid:before {\n  content: \" \";\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  color: var(--weui-FG-3)\n}\n\n.weui-grid:after {\n  left: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-grid:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-grid__icon {\n  width: 28px;\n  height: 28px;\n  margin: 0 auto\n}\n\n.weui-grid__icon img {\n  display: block;\n  width: 100%;\n  height: 100%\n}\n\n.weui-grid__icon+.weui-grid__label {\n  margin-top: 4px\n}\n\n.weui-grid__label {\n  display: block;\n  color: var(--weui-FG-0);\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden\n}\n\n.weui-footer,\n.weui-grid__label {\n  text-align: center;\n  font-size: 14px\n}\n\n.weui-footer {\n  color: var(--weui-FG-2);\n  line-height: 1.4\n}\n\n.weui-footer a,\n.weui-footer navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-footer navigator {\n  display: inline\n}\n\n.weui-footer_fixed-bottom {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  padding-top: 16px;\n  padding-bottom: 16px;\n  padding-bottom: calc(16px + constant(safe-area-inset-bottom));\n  padding-bottom: calc(16px + env(safe-area-inset-bottom));\n  left: constant(safe-area-inset-left);\n  left: env(safe-area-inset-left);\n  right: constant(safe-area-inset-right);\n  right: env(safe-area-inset-right)\n}\n\n.weui-footer__links {\n  font-size: 0\n}\n\n.weui-footer__link {\n  display: inline-block;\n  vertical-align: top;\n  margin: 0 8px;\n  position: relative;\n  font-size: 14px\n}\n\n.weui-footer__link:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5);\n  left: -8px;\n  top: .36em;\n  bottom: .36em\n}\n\n.weui-footer__link:first-child:before {\n  display: none\n}\n\n.weui-footer__text {\n  padding: 0 16px;\n  font-size: 12px\n}\n\n.weui-flex {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex\n}\n\n.weui-flex__item {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-dialog {\n  position: fixed;\n  z-index: 5000;\n  top: 50%;\n  left: 16px;\n  right: 16px;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n  background-color: var(--weui-BG-2);\n  text-align: center;\n  border-radius: 12px;\n  overflow: hidden;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: column;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  flex-direction: column;\n  max-height: 90%\n}\n\n.weui-dialog__hd {\n  padding: 32px 24px 16px\n}\n\n.weui-dialog__title {\n  font-weight: 700;\n  font-size: 17px;\n  line-height: 1.4\n}\n\n.weui-dialog__bd {\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n  padding: 0 24px;\n  margin-bottom: 32px;\n  font-size: 17px;\n  line-height: 1.4;\n  word-wrap: break-word;\n  -webkit-hyphens: auto;\n  hyphens: auto;\n  color: var(--weui-FG-1)\n}\n\n.weui-dialog__bd:first-child {\n  min-height: 40px;\n  padding: 32px 24px 0;\n  font-weight: 700;\n  color: var(--weui-FG-0);\n  -webkit-flex-direction: column;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  flex-direction: column;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center\n}\n\n.weui-dialog__bd:first-child,\n.weui-dialog__ft {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex\n}\n\n.weui-dialog__ft {\n  position: relative;\n  line-height: 56px;\n  min-height: 56px;\n  font-size: 17px\n}\n\n.weui-dialog__ft:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-DIALOG-LINE-COLOR);\n  color: var(--weui-DIALOG-LINE-COLOR);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-dialog__btn {\n  display: block;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  color: var(--weui-LINK);\n  font-weight: 700;\n  text-decoration: none;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  position: relative\n}\n\n.weui-dialog__btn:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-dialog__btn:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid var(--weui-DIALOG-LINE-COLOR);\n  color: var(--weui-DIALOG-LINE-COLOR);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-dialog__btn:first-child:after {\n  display: none\n}\n\n.weui-dialog__btn_default {\n  color: var(--weui-FG-HALF)\n}\n\n.weui-skin_android .weui-dialog {\n  text-align: left;\n  box-shadow: 0 6px 30px 0 rgba(0, 0, 0, .1)\n}\n\n.weui-skin_android .weui-dialog__title {\n  font-size: 22px;\n  line-height: 1.4\n}\n\n.weui-skin_android .weui-dialog__hd {\n  text-align: left\n}\n\n.weui-skin_android .weui-dialog__bd {\n  color: var(--weui-FG-1);\n  text-align: left\n}\n\n.weui-skin_android .weui-dialog__bd:first-child {\n  color: var(--weui-FG-0)\n}\n\n.weui-skin_android .weui-dialog__ft {\n  display: block;\n  text-align: right;\n  line-height: 40px;\n  min-height: 40px;\n  padding: 0 24px 16px\n}\n\n.weui-skin_android .weui-dialog__ft:after {\n  display: none\n}\n\n.weui-skin_android .weui-dialog__btn {\n  display: inline-block;\n  vertical-align: top;\n  padding: 0 .8em\n}\n\n.weui-skin_android .weui-dialog__btn:after {\n  display: none\n}\n\n.weui-skin_android .weui-dialog__btn:last-child {\n  margin-right: -.8em\n}\n\n.weui-skin_android .weui-dialog__btn_default {\n  color: var(--weui-FG-HALF)\n}\n\n@media screen and (min-width:352px) {\n  .weui-dialog {\n    width: 320px;\n    margin: 0 auto\n  }\n}\n\n.weui-half-screen-dialog {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  max-height: 75%;\n  z-index: 5000;\n  line-height: 1.4;\n  background-color: var(--weui-BG-2);\n  border-top-left-radius: 12px;\n  border-top-right-radius: 12px;\n  overflow: hidden;\n  padding: 0 24px;\n  padding: 0 calc(24px + constant(safe-area-inset-right)) constant(safe-area-inset-bottom) calc(24px + constant(safe-area-inset-left));\n  padding: 0 calc(24px + env(safe-area-inset-right)) env(safe-area-inset-bottom) calc(24px + env(safe-area-inset-left))\n}\n\n@media only screen and (max-height:558px) {\n  .weui-half-screen-dialog {\n    max-height: none\n  }\n}\n\n.weui-half-screen-dialog__hd {\n  font-size: 8px;\n  height: 8em;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-half-screen-dialog__hd .weui-icon-btn {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%)\n}\n\n.weui-half-screen-dialog__hd .weui-icon-btn:active {\n  opacity: .5\n}\n\n.weui-half-screen-dialog__hd__side {\n  position: relative;\n  left: -8px\n}\n\n.weui-half-screen-dialog__hd__main {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-half-screen-dialog__hd__side+.weui-half-screen-dialog__hd__main {\n  text-align: center;\n  padding: 0 40px\n}\n\n.weui-half-screen-dialog__hd__main+.weui-half-screen-dialog__hd__side {\n  right: -8px;\n  left: auto\n}\n\n.weui-half-screen-dialog__hd__main+.weui-half-screen-dialog__hd__side .weui-icon-btn {\n  right: 0\n}\n\n.weui-half-screen-dialog__title {\n  display: block;\n  color: var(--weui-FG-0);\n  font-weight: 700;\n  font-size: 15px\n}\n\n.weui-half-screen-dialog__subtitle {\n  display: block;\n  color: var(--weui-FG-1);\n  font-size: 10px\n}\n\n.weui-half-screen-dialog__bd {\n  word-wrap: break-word;\n  -webkit-hyphens: auto;\n  hyphens: auto;\n  overflow-y: auto;\n  padding-top: 4px;\n  padding-bottom: 40px;\n  font-size: 14px;\n  color: var(--weui-FG-0)\n}\n\n.weui-half-screen-dialog__desc {\n  font-size: 17px;\n  font-weight: 700;\n  color: var(--weui-FG-0);\n  line-height: 1.4\n}\n\n.weui-half-screen-dialog__tips {\n  padding-top: 16px;\n  font-size: 14px;\n  color: var(--weui-FG-2);\n  line-height: 1.4\n}\n\n.weui-half-screen-dialog__ft {\n  padding: 0 24px 32px;\n  text-align: center\n}\n\n.weui-half-screen-dialog__ft .weui-btn:nth-last-child(n+2),\n.weui-half-screen-dialog__ft .weui-btn:nth-last-child(n+2)+.weui-btn {\n  display: inline-block;\n  vertical-align: top;\n  margin: 0 8px;\n  width: 120px\n}\n\n.weui-icon-btn {\n  outline: 0;\n  -webkit-appearance: none;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  border-width: 0;\n  background-color: transparent;\n  color: var(--weui-FG-0);\n  font-size: 0\n}\n\n.weui-icon-more {\n  width: 24px;\n  -webkit-mask: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E  %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M5 10.25a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  mask: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E  %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M5 10.25a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5zm7 0a1.75 1.75 0 1 1 0 3.5 1.75 1.75 0 0 1 0-3.5z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  -webkit-mask-size: cover;\n  mask-size: cover\n}\n\n.weui-icon-btn_goback,\n.weui-icon-more {\n  display: inline-block;\n  vertical-align: middle;\n  height: 24px;\n  background-color: currentColor;\n  color: var(--weui-FG-0)\n}\n\n.weui-icon-btn_goback {\n  width: 12px;\n  -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E\") no-repeat 50% 50%;\n  mask: url(\"data:image/svg+xml,%3Csvg%20width%3D%2212%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M10%2019.438L8.955%2020.5l-7.666-7.79a1.02%201.02%200%20010-1.42L8.955%203.5%2010%204.563%202.682%2012%2010%2019.438z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E\") no-repeat 50% 50%;\n  -webkit-mask-size: cover;\n  mask-size: cover\n}\n\n.weui-icon-btn_close {\n  color: var(--weui-FG-0);\n  display: inline-block;\n  vertical-align: middle;\n  width: 14px;\n  height: 24px;\n  -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E\") no-repeat 50% 50%;\n  mask: url(\"data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12.25%2010.693L6.057%204.5%205%205.557l6.193%206.193L5%2017.943%206.057%2019l6.193-6.193L18.443%2019l1.057-1.057-6.193-6.193L19.5%205.557%2018.443%204.5z%22%20fill-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E\") no-repeat 50% 50%;\n  -webkit-mask-size: cover;\n  mask-size: cover;\n  background-color: currentColor\n}\n\n.weui-toast {\n  position: fixed;\n  z-index: 5000;\n  width: 120px;\n  height: 120px;\n  top: 40%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  text-align: center;\n  border-radius: 5px;\n  color: hsla(0, 0%, 100%, .9);\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  background-color: #4c4c4c\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-toast {\n    background-color: #606060\n  }\n}\n\n.weui-icon_toast {\n  display: block\n}\n\n.weui-icon_toast.weui-icon-success-no-circle {\n  color: hsla(0, 0%, 100%, .9);\n  width: 55px;\n  height: 55px\n}\n\n.weui-icon_toast.weui-loading {\n  margin: 8px 0;\n  width: 38px;\n  height: 38px;\n  vertical-align: baseline\n}\n\n.weui-toast__content {\n  font-size: 14px\n}\n\n.weui-mask {\n  background: rgba(0, 0, 0, .6)\n}\n\n.weui-mask,\n.weui-mask_transparent {\n  position: fixed;\n  z-index: 1000;\n  top: 0;\n  right: 0;\n  left: 0;\n  bottom: 0\n}\n\n.weui-actionsheet {\n  position: fixed;\n  left: 0;\n  bottom: 0;\n  -webkit-transform: translateY(100%);\n  transform: translateY(100%);\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  z-index: 5000;\n  width: 100%;\n  background-color: var(--weui-BG-1);\n  -webkit-transition: -webkit-transform .3s;\n  transition: -webkit-transform .3s;\n  transition: transform .3s;\n  transition: transform .3s, -webkit-transform .3s;\n  border-top-left-radius: 12px;\n  border-top-right-radius: 12px;\n  overflow: hidden\n}\n\n.weui-actionsheet__title {\n  position: relative;\n  height: 56px;\n  padding: 0 24px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  text-align: center;\n  font-size: 12px;\n  color: var(--weui-FG-1);\n  line-height: 1.4;\n  background: var(--weui-BG-2)\n}\n\n.weui-actionsheet__title:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-actionsheet__title .weui-actionsheet__title-text {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2\n}\n\n.weui-actionsheet__menu {\n  color: var(--weui-FG-0);\n  background-color: var(--weui-BG-2)\n}\n\n.weui-actionsheet__action {\n  margin-top: 8px;\n  background-color: var(--weui-BG-2);\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom)\n}\n\n.weui-actionsheet__cell {\n  position: relative;\n  padding: 16px;\n  text-align: center;\n  font-size: 17px;\n  line-height: 1.41176471\n}\n\n.weui-actionsheet__cell:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  height: 1px;\n  border-top: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-actionsheet__cell:active {\n  background-color: var(--weui-BG-COLOR-ACTIVE)\n}\n\n.weui-actionsheet__cell:first-child:before {\n  display: none\n}\n\n.weui-actionsheet__cell_warn {\n  color: var(--weui-RED)\n}\n\n.weui-skin_android .weui-actionsheet {\n  position: fixed;\n  left: 50%;\n  top: 50%;\n  bottom: auto;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  width: 274px;\n  box-sizing: border-box;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  background: transparent;\n  -webkit-transition: -webkit-transform .3s;\n  transition: -webkit-transform .3s;\n  transition: transform .3s;\n  transition: transform .3s, -webkit-transform .3s;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0\n}\n\n.weui-skin_android .weui-actionsheet__action {\n  display: none\n}\n\n.weui-skin_android .weui-actionsheet__menu {\n  border-radius: 2px;\n  box-shadow: 0 6px 30px 0 rgba(0, 0, 0, .1)\n}\n\n.weui-skin_android .weui-actionsheet__cell {\n  padding: 16px;\n  font-size: 17px;\n  line-height: 1.41176471;\n  color: var(--weui-FG-0);\n  text-align: left\n}\n\n.weui-skin_android .weui-actionsheet__cell:first-child {\n  border-top-left-radius: 2px;\n  border-top-right-radius: 2px\n}\n\n.weui-skin_android .weui-actionsheet__cell:last-child {\n  border-bottom-left-radius: 2px;\n  border-bottom-right-radius: 2px\n}\n\n.weui-actionsheet_toggle {\n  -webkit-transform: translate(0);\n  transform: translate(0)\n}\n\n.weui-loadmore {\n  width: 65%;\n  margin: 1.5em auto;\n  line-height: 1.6em;\n  font-size: 14px;\n  text-align: center\n}\n\n.weui-loadmore__tips {\n  display: inline-block;\n  vertical-align: middle;\n  color: var(--weui-FG-0)\n}\n\n.weui-loadmore_line {\n  border-top: 1px solid var(--weui-FG-3);\n  margin-top: 2.4em\n}\n\n.weui-loadmore_line .weui-loadmore__tips {\n  position: relative;\n  top: -.9em;\n  padding: 0 .55em;\n  background-color: var(--weui-BG-2);\n  color: var(--weui-FG-1)\n}\n\n.weui-loadmore_dot .weui-loadmore__tips {\n  padding: 0 .16em\n}\n\n.weui-loadmore_dot .weui-loadmore__tips:before {\n  content: \" \";\n  width: 4px;\n  height: 4px;\n  border-radius: 50%;\n  background-color: var(--weui-FG-3);\n  display: inline-block;\n  position: relative;\n  vertical-align: 0;\n  top: -.16em\n}\n\n.weui-badge {\n  display: inline-block;\n  padding: .15em .4em;\n  min-width: 8px;\n  border-radius: 18px;\n  background-color: var(--weui-RED);\n  color: #fff;\n  line-height: 1.2;\n  text-align: center;\n  font-size: 12px;\n  vertical-align: middle\n}\n\n.weui-badge_dot {\n  padding: .4em;\n  min-width: 0\n}\n\n.weui-toptips {\n  display: none;\n  position: fixed;\n  -webkit-transform: translateZ(0);\n  transform: translateZ(0);\n  top: 8px;\n  left: 8px;\n  right: 8px;\n  padding: 10px;\n  border-radius: 8px;\n  font-size: 14px;\n  text-align: center;\n  color: #fff;\n  z-index: 5000;\n  word-wrap: break-word;\n  word-break: break-all\n}\n\n.weui-toptips_warn {\n  background-color: var(--weui-RED)\n}\n\n.weui-search-bar {\n  position: relative;\n  padding: 8px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  box-sizing: border-box;\n  background-color: var(--weui-BG-0);\n  -webkit-text-size-adjust: 100%;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-search-bar.weui-search-bar_focusing .weui-search-bar__cancel-btn {\n  display: block\n}\n\n.weui-search-bar.weui-search-bar_focusing .weui-search-bar__label {\n  display: none\n}\n\n.weui-search-bar .weui-icon-search {\n  width: 16px;\n  height: 16px\n}\n\n.weui-search-bar__form {\n  position: relative;\n  -webkit-box-flex: 1;\n  -webkit-flex: auto;\n  flex: auto;\n  background-color: var(--weui-BG-2);\n  border-radius: 4px\n}\n\n.weui-search-bar__box {\n  position: relative;\n  padding-left: 28px;\n  padding-right: 32px;\n  height: 100%;\n  width: 100%;\n  box-sizing: border-box;\n  z-index: 1\n}\n\n.weui-search-bar__box .weui-search-bar__input {\n  padding: 8px 0;\n  width: 100%;\n  height: 1.14285714em;\n  border: 0;\n  font-size: 14px;\n  line-height: 1.14285714em;\n  box-sizing: content-box;\n  background: transparent;\n  caret-color: var(--weui-BRAND);\n  color: var(--weui-FG-0)\n}\n\n.weui-search-bar__box .weui-search-bar__input:focus {\n  outline: none\n}\n\n.weui-search-bar__box .weui-icon-search {\n  position: absolute;\n  top: 50%;\n  left: 8px;\n  margin-top: -8px\n}\n\n.weui-search-bar__box .weui-icon-clear {\n  position: absolute;\n  top: 50%;\n  right: 0;\n  margin-top: -16px;\n  padding: 8px;\n  width: 16px;\n  height: 16px;\n  -webkit-mask-size: 16px;\n  mask-size: 16px\n}\n\n.weui-search-bar__label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 2;\n  font-size: 0;\n  border-radius: 4px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  color: var(--weui-FG-1);\n  background: var(--weui-BG-2)\n}\n\n.weui-search-bar__label span {\n  display: inline-block;\n  font-size: 14px;\n  vertical-align: middle\n}\n\n.weui-search-bar__label .weui-icon-search {\n  margin-right: 4px\n}\n\n.weui-search-bar__cancel-btn {\n  display: none;\n  margin-left: 8px;\n  line-height: 28px;\n  color: var(--weui-LINK);\n  white-space: nowrap\n}\n\n.weui-search-bar__input:not(:valid)+.weui-icon-clear {\n  display: none\n}\n\ninput[type=search]::-webkit-search-cancel-button,\ninput[type=search]::-webkit-search-decoration,\ninput[type=search]::-webkit-search-results-button,\ninput[type=search]::-webkit-search-results-decoration {\n  display: none\n}\n\n.weui-picker {\n  position: fixed;\n  width: 100%;\n  box-sizing: border-box;\n  left: 0;\n  bottom: 0;\n  z-index: 5000;\n  background-color: var(--weui-BG-2);\n  padding-bottom: constant(safe-area-inset-bottom);\n  padding-bottom: env(safe-area-inset-bottom);\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  -webkit-transform: translateY(100%);\n  transform: translateY(100%);\n  -webkit-transition: -webkit-transform .3s;\n  transition: -webkit-transform .3s;\n  transition: transform .3s;\n  transition: transform .3s, -webkit-transform .3s\n}\n\n.weui-picker__hd {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  padding: 16px;\n  padding: 16px calc(16px + constant(safe-area-inset-right)) 16px calc(16px + constant(safe-area-inset-left));\n  padding: 16px calc(16px + env(safe-area-inset-right)) 16px calc(16px + env(safe-area-inset-left));\n  position: relative;\n  text-align: center;\n  font-size: 17px;\n  line-height: 1.4\n}\n\n.weui-picker__hd:after {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 1px;\n  border-bottom: 1px solid var(--weui-FG-3);\n  color: var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-picker__bd {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  position: relative;\n  background-color: var(--weui-BG-2);\n  height: 240px;\n  overflow: hidden\n}\n\n.weui-picker__group {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  position: relative;\n  height: 100%\n}\n\n.weui-picker__group:first-child .weui-picker__item {\n  padding-left: constant(safe-area-inset-left);\n  padding-left: env(safe-area-inset-left)\n}\n\n.weui-picker__group:last-child .weui-picker__item {\n  padding-right: constant(safe-area-inset-right);\n  padding-right: env(safe-area-inset-right)\n}\n\n.weui-picker__mask {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  margin: 0 auto;\n  z-index: 3;\n  background-image: -webkit-linear-gradient(top, hsla(0, 0%, 100%, .95), hsla(0, 0%, 100%, .6)), -webkit-linear-gradient(bottom, hsla(0, 0%, 100%, .95), hsla(0, 0%, 100%, .6));\n  background-image: linear-gradient(180deg, hsla(0, 0%, 100%, .95), hsla(0, 0%, 100%, .6)), linear-gradient(0deg, hsla(0, 0%, 100%, .95), hsla(0, 0%, 100%, .6));\n  background-position: top, bottom;\n  background-size: 100% 92px;\n  background-repeat: no-repeat;\n  -webkit-transform: translateZ(0);\n  transform: translateZ(0)\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-picker__mask {\n    background-image: -webkit-linear-gradient(top, rgba(35, 35, 35, .95), rgba(35, 35, 35, .6)), -webkit-linear-gradient(bottom, rgba(35, 35, 35, .95), rgba(35, 35, 35, .6));\n    background-image: linear-gradient(180deg, rgba(35, 35, 35, .95), rgba(35, 35, 35, .6)), linear-gradient(0deg, rgba(35, 35, 35, .95), rgba(35, 35, 35, .6))\n  }\n}\n\n.weui-picker__indicator {\n  width: 100%;\n  height: 56px;\n  position: absolute;\n  left: 0;\n  top: 92px;\n  z-index: 3\n}\n\n.weui-picker__indicator:before {\n  top: 0;\n  border-top: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-picker__indicator:after,\n.weui-picker__indicator:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  right: 0;\n  height: 1px;\n  color: var(--weui-FG-3)\n}\n\n.weui-picker__indicator:after {\n  bottom: 0;\n  border-bottom: 1px solid var(--weui-FG-3);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n  -webkit-transform: scaleY(.5);\n  transform: scaleY(.5)\n}\n\n.weui-picker__content {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%\n}\n\n.weui-picker__item {\n  height: 48px;\n  line-height: 48px;\n  text-align: center;\n  color: var(--weui-FG-0);\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden\n}\n\n.weui-picker__item_disabled {\n  color: var(--weui-FG-1)\n}\n\n@-webkit-keyframes a {\n  0% {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0)\n  }\n\n  to {\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0)\n  }\n}\n\n@keyframes a {\n  0% {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0)\n  }\n\n  to {\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0)\n  }\n}\n\n.weui-animate-slide-up {\n  -webkit-animation: a ease .3s forwards;\n  animation: a ease .3s forwards\n}\n\n@-webkit-keyframes b {\n  0% {\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0)\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0)\n  }\n}\n\n@keyframes b {\n  0% {\n    -webkit-transform: translateZ(0);\n    transform: translateZ(0)\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0)\n  }\n}\n\n.weui-animate-slide-down {\n  -webkit-animation: b ease .3s forwards;\n  animation: b ease .3s forwards\n}\n\n@-webkit-keyframes c {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n@keyframes c {\n  0% {\n    opacity: 0\n  }\n\n  to {\n    opacity: 1\n  }\n}\n\n.weui-animate-fade-in {\n  -webkit-animation: c ease .3s forwards;\n  animation: c ease .3s forwards\n}\n\n@-webkit-keyframes d {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n@keyframes d {\n  0% {\n    opacity: 1\n  }\n\n  to {\n    opacity: 0\n  }\n}\n\n.weui-animate-fade-out {\n  -webkit-animation: d ease .3s forwards;\n  animation: d ease .3s forwards\n}\n\n.weui-agree {\n  display: block;\n  padding: 8px 15px 0;\n  font-size: 14px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n}\n\n.weui-agree a,\n.weui-agree navigator {\n  color: var(--weui-LINK)\n}\n\n.weui-agree navigator {\n  display: inline\n}\n\n.weui-agree__text {\n  color: var(--weui-FG-1);\n  margin-left: 2px\n}\n\n.weui-agree__checkbox {\n  -webkit-appearance: none;\n  appearance: none;\n  display: inline-block;\n  border: 0;\n  outline: 0;\n  vertical-align: middle;\n  background-color: currentColor;\n  -webkit-mask-position: 0 0;\n  mask-position: 0 0;\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100%;\n  mask-size: 100%;\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%221000%22%20height%3D%221000%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M500%20916.667C269.881%20916.667%2083.333%20730.119%2083.333%20500%2083.333%20269.881%20269.881%2083.333%20500%2083.333c230.119%200%20416.667%20186.548%20416.667%20416.667%200%20230.119-186.548%20416.667-416.667%20416.667zm0-50c202.504%200%20366.667-164.163%20366.667-366.667%200-202.504-164.163-366.667-366.667-366.667-202.504%200-366.667%20164.163-366.667%20366.667%200%20202.504%20164.163%20366.667%20366.667%20366.667z%22%20fill-rule%3D%22evenodd%22%20fill-opacity%3D%22.9%22%2F%3E%3C%2Fsvg%3E);\n  color: var(--weui-FG-2);\n  width: 1em;\n  height: 1em;\n  font-size: 17px;\n  margin-top: -.2em\n}\n\n.weui-agree__checkbox-check {\n  position: absolute;\n  left: -9999px\n}\n\n.weui-agree__checkbox-check[aria-checked=true]+.weui-agree__checkbox,\n.weui-agree__checkbox:checked {\n  -webkit-mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);\n  mask-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2022C6.477%2022%202%2017.523%202%2012S6.477%202%2012%202s10%204.477%2010%2010-4.477%2010-10%2010zm-1.177-7.86l-2.765-2.767L7%2012.431l3.119%203.121a1%201%200%20001.414%200l5.952-5.95-1.062-1.062-5.6%205.6z%22%2F%3E%3C%2Fsvg%3E);\n  color: var(--weui-BRAND)\n}\n\n.weui-agree_animate {\n  -webkit-animation: e .3s 1;\n  animation: e .3s 1\n}\n\n@-webkit-keyframes e {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  16% {\n    -webkit-transform: translateX(-8px);\n    transform: translateX(-8px)\n  }\n\n  28% {\n    -webkit-transform: translateX(-16px);\n    transform: translateX(-16px)\n  }\n\n  44% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  59% {\n    -webkit-transform: translateX(-16px);\n    transform: translateX(-16px)\n  }\n\n  73% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  82% {\n    -webkit-transform: translateX(16px);\n    transform: translateX(16px)\n  }\n\n  94% {\n    -webkit-transform: translateX(8px);\n    transform: translateX(8px)\n  }\n\n  to {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n}\n\n@keyframes e {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  16% {\n    -webkit-transform: translateX(-8px);\n    transform: translateX(-8px)\n  }\n\n  28% {\n    -webkit-transform: translateX(-16px);\n    transform: translateX(-16px)\n  }\n\n  44% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  59% {\n    -webkit-transform: translateX(-16px);\n    transform: translateX(-16px)\n  }\n\n  73% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n\n  82% {\n    -webkit-transform: translateX(16px);\n    transform: translateX(16px)\n  }\n\n  94% {\n    -webkit-transform: translateX(8px);\n    transform: translateX(8px)\n  }\n\n  to {\n    -webkit-transform: translateX(0);\n    transform: translateX(0)\n  }\n}\n\n.weui-loading {\n  width: 20px;\n  height: 20px;\n  display: inline-block;\n  vertical-align: middle;\n  -webkit-animation: f 1s steps(12) infinite;\n  animation: f 1s steps(12) infinite;\n  background: transparent url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E9E9E9' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23989697' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%239B999A' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23A3A1A2' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23ABA9AA' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23B2B2B2' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23BAB8B9' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23C2C0C1' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23CBCBCB' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23D2D2D2' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23DADADA' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E2E2E2' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E\") no-repeat;\n  background-size: 100%\n}\n\n.weui-btn_loading.weui-btn_primary .weui-loading,\n.weui-loading.weui-loading_transparent {\n  background-image: url(\"data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect xmlns='http://www.w3.org/2000/svg' width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.56)' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.5)' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.43)' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.38)' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.32)' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.28)' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.25)' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.2)' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.17)' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.14)' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.1)' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.03)' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E\")\n}\n\n@-webkit-keyframes f {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg)\n  }\n\n  to {\n    -webkit-transform: rotate(1turn);\n    transform: rotate(1turn)\n  }\n}\n\n@keyframes f {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg)\n  }\n\n  to {\n    -webkit-transform: rotate(1turn);\n    transform: rotate(1turn)\n  }\n}\n\n.weui-slider {\n  padding: 15px 18px;\n  -webkit-user-select: none;\n  user-select: none\n}\n\n.weui-slider__inner {\n  position: relative;\n  height: 2px;\n  background-color: var(--weui-FG-3)\n}\n\n.weui-slider__track {\n  height: 2px;\n  background-color: var(--weui-BRAND);\n  width: 0\n}\n\n.weui-slider__handler {\n  position: absolute;\n  left: 0;\n  top: 50%;\n  width: 28px;\n  height: 28px;\n  margin-left: -14px;\n  margin-top: -14px;\n  border-radius: 50%;\n  background-color: #fff;\n  box-shadow: 0 0 4px var(--weui-FG-3)\n}\n\n.weui-slider-box {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-slider-box .weui-slider {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1\n}\n\n.weui-slider-box__value {\n  margin-left: .5em;\n  min-width: 24px;\n  color: var(--weui-FG-1);\n  text-align: center;\n  font-size: 14px\n}\n\n.wx_dot_loading,\n.wx_dot_loading:after,\n.wx_dot_loading:before {\n  display: inline-block;\n  vertical-align: middle;\n  width: 6px;\n  height: 6px;\n  border-radius: 50%;\n  background-color: rgba(0, 0, 0, .3);\n  font-size: 0;\n  -webkit-animation: h 1.6s step-start infinite;\n  animation: h 1.6s step-start infinite\n}\n\n.wx_dot_loading {\n  position: relative\n}\n\n.wx_dot_loading:before {\n  content: \"\";\n  position: absolute;\n  left: -12px;\n  background-color: rgba(0, 0, 0, .1);\n  -webkit-animation: g 1.6s step-start infinite;\n  animation: g 1.6s step-start infinite\n}\n\n.wx_dot_loading:after {\n  content: \"\";\n  position: absolute;\n  right: -12px;\n  background-color: rgba(0, 0, 0, .5);\n  -webkit-animation: i 1.6s step-start infinite;\n  animation: i 1.6s step-start infinite\n}\n\n@-webkit-keyframes g {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .1)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .3)\n  }\n}\n\n@keyframes g {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .1)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .3)\n  }\n}\n\n@-webkit-keyframes h {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .3)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .1)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .5)\n  }\n}\n\n@keyframes h {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .3)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .1)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .5)\n  }\n}\n\n@-webkit-keyframes i {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .3)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .1)\n  }\n}\n\n@keyframes i {\n\n  0%,\n  to {\n    background-color: rgba(0, 0, 0, .5)\n  }\n\n  30% {\n    background-color: rgba(0, 0, 0, .3)\n  }\n\n  60% {\n    background-color: rgba(0, 0, 0, .1)\n  }\n}\n\n.wx_dot_loading_white {\n  background-color: hsla(0, 0%, 100%, .3);\n  -webkit-animation: k 1.6s step-start infinite;\n  animation: k 1.6s step-start infinite\n}\n\n.wx_dot_loading_white:before {\n  background-color: hsla(0, 0%, 100%, .5);\n  -webkit-animation: j 1.6s step-start infinite;\n  animation: j 1.6s step-start infinite\n}\n\n.wx_dot_loading_white:after {\n  background-color: hsla(0, 0%, 100%, .1);\n  -webkit-animation: l 1.6s step-start infinite;\n  animation: l 1.6s step-start infinite\n}\n\n@-webkit-keyframes j {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n}\n\n@keyframes j {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n}\n\n@-webkit-keyframes k {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n}\n\n@keyframes k {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n}\n\n@-webkit-keyframes l {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n}\n\n@keyframes l {\n\n  0%,\n  to {\n    background-color: hsla(0, 0%, 100%, .1)\n  }\n\n  30% {\n    background-color: hsla(0, 0%, 100%, .3)\n  }\n\n  60% {\n    background-color: hsla(0, 0%, 100%, .5)\n  }\n}\n\n:host {\n  width: 100%\n}\n\n.weui-slideview {\n  position: relative;\n  overflow: hidden\n}\n\n.weui-slideview__left {\n  position: relative;\n  z-index: 10\n}\n\n.weui-slideview__right {\n  position: absolute;\n  z-index: 1;\n  left: 100%;\n  top: 0;\n  height: 100%\n}\n\n.weui-slideview__btn__wrp {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  text-align: center;\n  min-width: 69px;\n  height: 100%;\n  white-space: nowrap\n}\n\n.weui-slideview__btn {\n  color: #fff;\n  padding: 0 17px\n}\n\n.weui-slideview__btn-group_default .weui-slideview__btn {\n  background: #c7c7cc\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-slideview__btn-group_default .weui-slideview__btn {\n    background: var(--weui-BG-4)\n  }\n}\n\n.weui-slideview__btn-group_default~.weui-slideview__btn-group_default:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid #fff;\n  color: #fff;\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-slideview__btn-group_default~.weui-slideview__btn-group_default:before {\n    border-left-color: var(--weui-FG-3)\n  }\n}\n\n.weui-slideview__btn-group_default:first-child:before {\n  display: none\n}\n\n.weui-slideview__btn-group_warn .weui-slideview__btn {\n  background: #fe3b30\n}\n\n.weui-slideview__btn-group_warn~.weui-slideview__btn-group_warn:before {\n  content: \" \";\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 1px;\n  bottom: 0;\n  border-left: 1px solid #fff;\n  color: #fff;\n  -webkit-transform-origin: 0 0;\n  transform-origin: 0 0;\n  -webkit-transform: scaleX(.5);\n  transform: scaleX(.5)\n}\n\n.weui-slideview__btn-group_warn:first-child:before {\n  display: none\n}\n\n.weui-slideview_icon .weui-slideview__btn__wrp {\n  background: transparent;\n  font-size: 0\n}\n\n.weui-slideview_icon .weui-slideview__btn__wrp:first-child {\n  padding-left: 16px\n}\n\n.weui-slideview_icon .weui-slideview__btn__wrp:last-child {\n  padding-right: 8px\n}\n\n.weui-slideview_icon .weui-slideview__btn {\n  width: 48px;\n  height: 48px;\n  line-height: 48px;\n  padding: 0;\n  display: inline-block;\n  vertical-align: middle;\n  border-radius: 50%;\n  background-color: #fff\n}\n\n@media(prefers-color-scheme: dark) {\n  .weui-slideview_icon .weui-slideview__btn {\n    background-color: var(--weui-BG-4)\n  }\n}\n\n.weui-slideview_icon .weui-slideview__btn__icon {\n  display: inline-block;\n  vertical-align: middle;\n  width: 22px;\n  height: 22px\n}\n\npage {\n  --height: 44px;\n  --right: 95px\n}\n\n.weui-navigation-bar {\n  overflow: hidden;\n  color: var(--weui-FG-0)\n}\n\n.weui-navigation-bar .android {\n  --height: 48px;\n  --right: 221px\n}\n\n.weui-navigation-bar__inner {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 5001;\n  height: var(--height);\n  padding-right: var(--right);\n  width: calc(100% - var(--right))\n}\n\n.weui-navigation-bar__inner,\n.weui-navigation-bar__inner .weui-navigation-bar__left {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left {\n  position: relative;\n  width: var(--right);\n  padding-left: 16px\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left .weui-navigation-bar__btn {\n  display: inline-block;\n  vertical-align: middle;\n  background-repeat: no-repeat\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left .weui-navigation-bar__btn_goback {\n  font-size: 12px;\n  width: 1em;\n  height: 2em;\n  -webkit-mask: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='24' viewBox='0 0 12 24'%3E  %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M10 19.438L8.955 20.5l-7.666-7.79a1.02 1.02 0 0 1 0-1.42L8.955 3.5 10 4.563 2.682 12 10 19.438z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  mask: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='24' viewBox='0 0 12 24'%3E  %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M10 19.438L8.955 20.5l-7.666-7.79a1.02 1.02 0 0 1 0-1.42L8.955 3.5 10 4.563 2.682 12 10 19.438z'/%3E%3C/svg%3E\") no-repeat 50% 50%;\n  -webkit-mask-size: cover;\n  mask-size: cover;\n  background-color: currentColor\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__left .weui-navigation-bar__btn_goback:active {\n  opacity: .5\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__center {\n  font-size: 17px;\n  text-align: center;\n  position: relative;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__loading {\n  margin-right: 4px;\n  font-size: 0\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__loading .weui-loading {\n  margin-left: 0\n}\n\n.weui-navigation-bar__inner .weui-navigation-bar__right {\n  margin-right: 16px\n}\n\n.weui-navigation-bar__placeholder {\n  height: var(--height);\n  background: var(--weui-BG-1);\n  position: relative;\n  z-index: 50\n}\n\n.weui-uploader__hd {\n  display: block\n}\n\n.weui-uploader__overview {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center\n}\n\n.weui-uploader__tips {\n  color: var(--weui-FG-2);\n  font-size: 14px;\n  line-height: 1.4;\n  padding-top: 4px\n}\n\n.weui-uploader__img {\n  display: block;\n  width: 100%;\n  height: 100%\n}\n\n.weui-gallery {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -webkit-flex-wrap: nowrap;\n  flex-wrap: nowrap\n}\n\n.weui-gallery__info {\n  color: #fff;\n  font-size: 17px;\n  line-height: 60px;\n  min-height: 60px;\n  text-align: center\n}\n\n.weui-gallery__img__wrp {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  position: relative;\n  font-size: 0\n}\n\n.weui-gallery__img {\n  position: absolute;\n  width: 100%;\n  height: 100%\n}\n\n.weui-gallery__opr {\n  position: static\n}\n\n.weui-search-bar .weui-search-bar__box .weui-search-bar__input {\n  height: inherit;\n  line-height: inherit\n}\n\n.weui-search-bar .weui-search-bar__box .weui-icon-clear {\n  display: block\n}\n\n.weui-loadmore .weui-loading {\n  margin-right: .3em\n}\n\n.weui-btn_input-clear {\n  display: block\n}"
  },
  {
    "path": "miniprogram/page/component/index.js",
    "content": "Page({\n  onLoad() {\n    console.log('renderer', this.renderer)\n\n    this.setData({\n      theme: wx.getSystemInfoSync().theme || 'light'\n    })\n\n    if (wx.onThemeChange) {\n      wx.onThemeChange(({ theme }) => {\n        this.setData({ theme })\n      })\n    }\n  },\n  onShow() {\n    // 仅在 app-bar demo 页面展示\n    if (typeof this.getAppBar === 'function') {\n      const appBarComp = this.getAppBar()\n      // component.getAppBar 在 Skyline 中返回 appBar 组件实例，在 webview 中返回 null\n      if (appBarComp !== null) {\n        appBarComp.setData({\n          showAppbar: false\n        })\n      }\n    }\n\n    wx.reportAnalytics('enter_home_programmatically', {})\n\n    if (wx.canIUse('getExptInfoSync')) {\n      console.log('getExptInfoSync expt_args_1', wx.getExptInfoSync(['expt_args_1']))\n      console.log('getExptInfoSync expt_args_2', wx.getExptInfoSync(['expt_args_2']))\n      console.log('getExptInfoSync expt_args_3', wx.getExptInfoSync(['expt_args_3']))\n    }\n    if (wx.canIUse('reportEvent')) {\n      wx.reportEvent('expt_event_1', { expt_data: 1 })\n      wx.reportEvent('expt_event_2', { expt_data: 5 })\n      wx.reportEvent('expt_event_3', { expt_data: 9 })\n      wx.reportEvent('expt_event_4', { expt_data: 200 })\n\n      wx.reportEvent('weexpt_event_key_1', { option_1: 1, option_2: 10, option_str_1: 'abc' })\n      wx.reportEvent('weexpt_event_key_1', { option_1: 'abc', option_2: '1000', option_str_1: '1' })\n    }\n  },\n  onUnload() {\n    if (wx.offThemeChange) {\n      wx.offThemeChange()\n    }\n  },\n  onShareAppMessage() {\n    return {\n      title: '小程序官方组件展示',\n      path: 'page/component/index'\n    }\n  },\n  onShareTimeline() {\n    '小程序官方组件展示'\n  },\n\n  data: {\n    list: [\n      {\n        id: 'view',\n        name: '视图容器',\n        open: false,\n        pages: ['view', 'swiper', 'scroll-view', 'root-portal', 'page-container', 'match-media', 'movable-view', 'cover-view', 'grid-view', 'sticky']\n      }, {\n        id: 'content',\n        name: '基础内容',\n        open: false,\n        pages: ['text', 'icon', 'progress', 'rich-text', 'selection']\n      }, {\n        id: 'form',\n        name: '表单组件',\n        open: false,\n        pages: ['button', 'checkbox', 'form', 'input', 'label', 'picker', 'picker-view', 'radio', 'slider', 'switch', 'textarea', 'editor']\n      }, {\n        id: 'nav',\n        name: '导航',\n        open: false,\n        pages: ['navigator']\n      }, {\n        id: 'media',\n        name: '媒体组件',\n        open: false,\n        pages: ['image', 'video', 'camera', 'live-pusher', 'live-player', 'channel-live', 'channel-video']\n      }, {\n        id: 'map',\n        name: '地图',\n        open: false,\n        pages: ['map', { appid: 'wxe3f314db2e921db0', name: '腾讯位置服务示例中心' }]\n      }, {\n        id: 'canvas',\n        name: '画布',\n        open: false,\n        pages: ['canvas-2d', 'webgl']\n      }, {\n        id: 'open',\n        name: '开放能力',\n        open: false,\n        pages: ['ad', 'open-data', 'web-view']\n      }, {\n        id: 'obstacle-free',\n        name: '无障碍访问',\n        open: false,\n        pages: ['aria-component']\n      }\n    ],\n    theme: 'light'\n  },\n\n  kindToggle(e) {\n    const id = e.currentTarget.id\n    const list = this.data.list\n    for (let i = 0, len = list.length; i < len; ++i) {\n      if (list[i].id === id) {\n        list[i].open = !list[i].open\n      } else {\n        list[i].open = false\n      }\n    }\n    this.setData({\n      list\n    })\n    wx.reportAnalytics('click_view_programmatically', {})\n  },\n\n  navToDoc(e) {\n    wx.navigateTo({\n      url: '/packageComponent/pages/doc-web-view/doc-web-view',\n    })\n  },\n  // 打开自定义路由页面\n  goToCustomRoute: function goToCustomRoute(evt) {\n    const { url } = evt.currentTarget.dataset\n    wx.navigateTo({\n      routeType: 'ScaleTransition',\n      url: `/packageSkyline/pages/${url}`\n    })\n  },\n})\n"
  },
  {
    "path": "miniprogram/page/component/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"小程序官方组件展示\",\n  \"componentFramework\": \"glass-easel\",\n  \"renderer\": \"skyline\",\n  \"disableScroll\": true,\n  \"navigationStyle\": \"custom\",\n  \"usingComponents\": {\n    \"app-bar-course\": \"../../components/app-bar-course\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/page/component/index.wxml",
    "content": "<mp-navigation-bar title=\"小程序官方组件展示\" back=\"{{false}}\"></mp-navigation-bar>\n<scroll-view class=\"page-scroll-view\" scroll-y type=\"list\">\n<view class=\"page\" data-weui-theme=\"{{theme}}\">\n  <view class=\"index\">\n    <view class=\"index-hd\">\n      <image class=\"index-logo\" src=\"resources/kind/logo.png\"></image>\n      <text class=\"index-desc\">以下将展示小程序官方组件能力，组件样式仅供参考，开发者可根据自身需求自定义组件样式，具体属性参数详见 <text class=\"weui-agree__link\" bindtap=\"navToDoc\">小程序开发文档</text>。</text>\n    </view>\n    <view class=\"index-bd\">\n      <view class=\"kind-list\">\n        <block wx:for=\"{{list}}\" wx:key=\"{{item.id}}\">\n          <view class=\"kind-list-item\">\n            <view id=\"{{item.id}}\" class=\"kind-list-item-hd {{item.open ? 'kind-list-item-hd-show' : ''}}\" bindtap=\"kindToggle\">\n              <view class=\"kind-list-text\">{{item.name}}</view>\n              <image wx:if=\"{{theme === 'dark'}}\" class=\"kind-list-img\" src=\"resources/kind/{{item.id}}_dark.png\"></image>\n              <image wx:else class=\"kind-list-img\" src=\"resources/kind/{{item.id}}.png\"></image>\n            </view>\n            <view class=\"kind-list-item-bd {{item.open ? 'kind-list-item-bd-show' : ''}}\">\n              <view class=\"navigator-box {{item.open ? 'navigator-box-show' : ''}}\">\n                <block wx:for=\"{{item.pages}}\" wx:for-item=\"page\" wx:key=\"*item\">\n                  <view wx:if=\"{{page.appid}}\">\n                    <navigator target=\"miniProgram\" open-type=\"navigate\" app-id=\"{{page.appid}}\" path=\"\" extra-data=\"\" version=\"release\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.name}}</navigator>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n                  <!-- custom-route，自定义路由暂时不能用 navigator -->\n                  <view wx:elif=\"{{page.key == 'custom-route'}}\">\n                    <view bindtap=\"goToCustomRoute\" data-url=\"{{page.url}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.name}}</view>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n                  <!-- skyline -->\n                  <view wx:elif=\"{{item.id == 'Skyline'}}\">\n                    <navigator url=\"/packageSkyline/pages/{{page.url}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.name}}</navigator>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n                  <!-- skyline -->\n                  <view wx:elif=\"{{item.id == 'XRFrame'}}\">\n                    <navigator url=\"/packageXRFrame/{{page.url}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page.name}}</navigator>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n                  <view wx:else>\n                    <navigator url=\"/packageComponent/pages/{{item.id}}/{{page}}/{{page}}\" class=\"navigator {{index + 1 === item.pages.length ? '' : 'navigator-bottom-line'}}\">{{page}}</navigator>\n                    <view class=\"navigator-arrow\"></view>\n                  </view>\n\n                </block>\n              </view>\n            </view>\n          </view>\n        </block>\n      </view>\n    </view>\n  </view>\n</view>\n</scroll-view>\n"
  },
  {
    "path": "miniprogram/page/component/index.wxss",
    "content": "@import \"../../common/reset.wxss\";\n@import \"../common/index-skyline.wxss\";\n\n.weui-agree__link {\n  display: inline;\n  color: #576b95;\n}\n\n[data-weui-theme=dark] .weui-agree__link {\n  color: #7d90a9;\n}\n"
  },
  {
    "path": "miniprogram/page/extend/base/CustomPage.js",
    "content": "import themeMixin from './behaviors/theme'\n\nconst CustomPage = function (options) {\n  return Page(\n    {\n      ...options,\n      behaviors: [themeMixin].concat(options.behaviors || []),\n      onLoad(query) {\n        const app = getApp()\n        if (this.themeChanged) {\n          this.themeChanged(app.globalData.theme)\n          if (app.watchThemeChange) app.watchThemeChange(this.themeChanged)\n          if (options.onLoad) options.onLoad.call(this, query)\n        }\n      },\n      onUnload() {\n        const app = getApp()\n        if (this.themeChanged) {\n          if (app.unWatchThemeChange) app.unWatchThemeChange(this.themeChanged)\n          if (options.onUnload) options.onUnload.call(this)\n        }\n      }\n    }\n  )\n}\n\nexport default CustomPage\n"
  },
  {
    "path": "miniprogram/page/extend/base/behaviors/theme.js",
    "content": "module.exports = Behavior({\n  data: {\n    theme: 'light'\n  },\n  methods: {\n    themeChanged(theme) {\n      this.setData({\n        theme\n      })\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/page/extend/index.js",
    "content": "import CustomPage from './base/CustomPage'\n\nCustomPage({\n  onShareAppMessage() {\n    return {\n      title: '扩展能力',\n      path: 'page/extend/index'\n    }\n  },\n  data: {\n    list: [\n      {\n        id: 'form',\n        name: '表单',\n        open: false,\n        father: 'form', // 父文件夹\n        pages: ['cell', 'slideview', 'form', 'uploader']\n      },\n      {\n        id: 'widget',\n        name: '基础组件',\n        open: false,\n        father: 'base', // 父文件夹\n        pages: [\n          'article',\n          'icons',\n          'badge',\n          'flex',\n          'footer',\n          'gallery',\n          'grid',\n          'loadmore',\n          'loading',\n          'panel',\n          'preview'\n        ]\n      },\n      {\n        id: 'feedback',\n        name: '操作反馈',\n        open: false,\n        father: 'operate', // 父文件夹\n        pages: ['dialog', 'msg', 'half-screen-dialog', 'actionsheet', 'toptips']\n      },\n      {\n        id: 'nav',\n        name: '导航相关',\n        open: false,\n        father: 'navigation', // 父文件夹\n        pages: ['navigation', 'tabbar']\n      },\n      {\n        id: 'search',\n        name: '搜索相关',\n        open: false,\n        father: 'search', // 父文件夹\n        pages: ['searchbar']\n      },\n      {\n        id: 'extended',\n        name: '扩展组件',\n        open: false,\n        father: 'extend', // 父文件夹\n        pages: ['video-swiper', 'index-list', 'recycle-view', 'sticky', 'tabs', 'vtabs', 'barrage', 'select-text', 'wxml-to-canvas']\n      },\n      {\n        id: 'adaptive',\n        name: '多端适配（需在PC端体验）',\n        open: false,\n        pages: [\n          { zh: '左右伸缩', url: 'adapt/telescopic/telescopic' },\n          { zh: '换行排列', url: 'adapt/linebreak/linebreak' },\n          { zh: '侧边导航栏', url: 'adapt/sidenavigation/sidenavigation' },\n          { zh: '分页展现', url: 'adapt/pagination/pagination' },\n          { zh: '自由布局', url: 'adapt/freelayout/freelayout' },\n          { zh: '分层展现', url: 'adapt/layeredpresentation/layeredpresentation' },\n          { zh: '横向拓展', url: 'adapt/horizontalexpansion/horizontalexpansion' }\n        ]\n      }\n    ],\n    extendedList: [\n      {\n        id: 'extended',\n        name: '扩展组件',\n        open: false,\n        pages: ['emoji', 'video-swiper', 'index-list', 'recycle-view', 'sticky', 'tabs', 'vtabs', 'barrage', 'select-text', 'wxml-to-canvas']\n      }\n    ]\n  },\n  kindToggle(e) {\n    const id = e.currentTarget.id\n    const list = this.data.list\n    for (let i = 0, len = list.length; i < len; ++i) {\n      if (list[i].id === id) {\n        list[i].open = !list[i].open\n      } else {\n        list[i].open = false\n      }\n    }\n    // const extendedList = this.data.extendedList.map((item) => ({...item, open: false}))\n    this.setData({\n      list,\n      // extendedList,\n\n    })\n  },\n  kindExtenedListToggle(e) {\n    const id = e.currentTarget.id\n    const extendedList = this.data.extendedList\n    for (let i = 0, len = extendedList.length; i < len; ++i) {\n      if (extendedList[i].id === id) {\n        extendedList[i].open = !extendedList[i].open\n      } else {\n        extendedList[i].open = false\n      }\n    }\n    const list = this.data.list.map((item) => ({ ...item, open: false }))\n    this.setData({\n      extendedList,\n      list,\n    })\n  },\n  themeToggle() {\n    const App = getApp()\n\n    if (App.themeChanged) {\n      if (App.globalData.theme === 'light') {\n        App.themeChanged('dark')\n      } else {\n        App.themeChanged('light')\n      }\n    }\n  },\n  openPage(e) {\n    const { url, father, page } = e.currentTarget.dataset\n    const nextUrl = url ? `/packageExtend/pages/${url}` : `/packageExtend/pages/${father}/${page}/${page}`\n    wx.navigateTo({\n      url: nextUrl,\n      fail: console.error,\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/page/extend/index.json",
    "content": "{\n  \"usingComponents\": {\n\t\t\"mp-navigation-bar\": \"weui-miniprogram/navigation-bar/navigation-bar\",\n\t\t\"mp-cell\": \"weui-miniprogram/cell/cell\"\n\t},\n  \"navigationStyle\": \"custom\"\n}"
  },
  {
    "path": "miniprogram/page/extend/index.wxml",
    "content": "<view class=\"page\" data-weui-theme=\"{{theme}}\">\n    <mp-navigation-bar title=\"小程序扩展能力展示\" back=\"{{false}}\" />\n    <scroll-view type=\"list\" scroll-y class=\"page-height\">\n        <view class=\"page__hd\">\n            <view class=\"page__desc\">以下是对小程序内置组件能力的补充，包括 WeUI 组件库和一些常见的功能组件</view>\n        </view>\n        <view class=\"page__bd page__bd_spacing\">\n            <view class=\"kind-list\" role=\"menubar\">\n                <block wx:for=\"{{list}}\" wx:key=\"id\">\n                    <view class=\"kind-list__item\">\n                        <view\n                            id=\"{{item.id}}\"\n                            class=\"weui-flex kind-list__item-hd {{item.open ? 'kind-list__item-hd_show' : ''}}\"\n                            bind:tap=\"kindToggle\"\n                            aria-role=\"button\"\n                            aria-haspopup\n                            aria-expanded=\"{{item.open}}\"\n                        >\n                            <view class=\"weui-flex__item\">{{item.name}}</view>\n                            <image class=\"kind-list__img\" src=\"images/icon_nav_{{item.id}}.png\"></image>\n                        </view>\n                        <view\n                            class=\"kind-list__item-bd {{item.open ? 'kind-list__item-bd_show' : ''}}\"\n                            aria-role=\"menu\"\n                            aria-hidden=\"{{!item.open}}\"\n                        >\n                            <view class=\"weui-cells {{item.open ? 'weui-cells_show' : ''}}\" tabindex=\"0\">\n                                <block wx:for=\"{{item.pages}}\" wx:for-item=\"page\" wx:key=\"*this\">\n                                    <view aria-role=\"menuitem\" bind:tap=\"openPage\" data-url=\"{{page.url}}\" data-father=\"{{item.father}}\" data-page=\"{{page}}\">\n                                        <mp-cell link aria-role=\"link\">{{page.zh || page}}</mp-cell>\n                                    </view>\n                                </block>\n                            </view>\n                        </view>\n                    </view>\n                </block>\n            </view>\n        </view>\n        <view class=\"page__ft\">\n            <view class=\"ft-img-cnt\" bind:tap=\"themeToggle\">\n                <image src=\"images/icon_footer.png\" style=\"width: 84px; height: 19px;\"></image>\n            </view>\n        </view>\n    </scroll-view>\n</view>"
  },
  {
    "path": "miniprogram/page/extend/index.wxss",
    "content": "/* @import \"../../common/reset.wxss\"; */\n\npage{height:100%}.page{min-height:100%;background-color:var(--weui-BG-0);color:var(--weui-FG-0);font-size:0.9411764705882353rem;font-family:system-ui,-apple-system,Helvetica Neue,sans-serif}image{max-width:100%;max-height:100%}.link{display:inline;color:var(--weui-LINK)}.fadeIn{-webkit-animation:fadeIn .3s forwards;animation:fadeIn .3s forwards}.fadeOut{-webkit-animation:fadeOut .3s forwards;animation:fadeOut .3s forwards}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.weui-msg__extra-area{position:static}.page__hd{padding:40px}.page__bd{padding-bottom:40px}.page__bd_spacing{padding-left:15px;padding-right:15px}.page__ft{padding-top:20px;padding-bottom:10px;padding-bottom:calc(10px + constant(safe-area-inset-bottom));padding-bottom:calc(10px + env(safe-area-inset-bottom));text-align:center}[data-weui-theme=\"dark\"] .page__ft image{-webkit-filter:invert(100) hue-rotate(180deg);filter:invert(100) hue-rotate(180deg)}.page__title{text-align:left;font-size:1.1764705882352942rem;font-weight:400}.page__desc{margin-top:5px;color:var(--weui-FG-1);text-align:left;font-size:0.8235294117647058rem}.weui-cell_example::before{left:52px}.page_bottom_tips{color:var(--weui-FG-4);font-size:0.7058823529411765rem;line-height:1.4;margin-top:4px}\n\n.weui-flex{-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-cells{margin-top:0;opacity:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:.3s;transition:.3s}.weui-cells::after,.weui-cells::before{display:none}.weui-cells_show{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}.weui-cell::before{right:15px}.kind-list__item{margin:10px 0;background-color:var(--weui-BG-2);border-radius:2px;overflow:hidden}.kind-list__item:first-child{margin-top:0}.kind-list__img{width:30px;height:30px}[data-weui-theme=\"dark\"] .kind-list__img{-webkit-filter:invert(100) hue-rotate(180deg);filter:invert(100) hue-rotate(180deg)}.kind-list__item-hd{padding:20px;-webkit-transition:opacity .3s;transition:opacity .3s}.kind-list__item-hd_show{opacity:.4}.kind-list__item-bd{height:0;overflow:hidden}.kind-list__item-bd_show{height:auto}\n\n.page {\n  display: flex;\n  width: 100vw;\n  height: 100vh;\n  flex-direction: column;\n}\n.page-height {\n  height: 100%;\n  flex: 1 1 0;\n  overflow: hidden;\n}\nnavigator text,\ntext text,\ntext navigator {\n  display: inline;\n}\n.wx-scroll-view-flex:is(div):not(.wx-scroll-view-flex) {\n  width: auto !important;\n}\n\n.ft-img-cnt {\n\tdisplay: inline-block;\n\theight: 20px;\n}\n"
  },
  {
    "path": "miniprogram/sitemap.json",
    "content": "{\n  \"desc\": \"关于本文件的更多信息，请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html\",\n  \"rules\": [{\n  \"action\": \"allow\",\n  \"page\": \"*\"\n  }]\n}"
  },
  {
    "path": "miniprogram/util/fps_helper.ts",
    "content": "/**\n * 统计开始到现在/结束的fps\n */\nclass FpsHelper {\n  startTime = 0;\n  frameCount = 0;\n  endTime = 0;\n\n  tempFrameCount = 0;\n  tempStartTime = 0;\n\n  /** 更新fps, 回调1秒内的平均fps */\n  updateFPS(onTempFPS: (fps: number) => any) {\n    const now = Date.now();\n\n    //更新全局fps记录\n    if (this.frameCount == 0) {\n      this.startTime = now;\n    }\n    this.frameCount++;\n    this.endTime = now;\n\n    //更新临时fps记录\n    this.tempFrameCount++;\n    if (this.tempStartTime > 0) {\n      const interval = now - this.tempStartTime;\n      if (interval > 1000) {\n        const fps = Math.round(1000 / (interval / this.tempFrameCount));\n        this.tempFrameCount = 0;\n        this.tempStartTime = now;\n        onTempFPS && onTempFPS(fps);\n      }\n    } else {\n      this.tempStartTime = now;\n      onTempFPS && onTempFPS(0);\n    }\n  }\n\n  /** 获得开始到当前的平均fps */\n  getAverageFps() {\n    const duration = this.endTime - this.startTime;\n    if (duration > 1000) {\n      return Math.round((1000 * this.frameCount) / duration);\n    }\n    return 0;\n  }\n\n  /** 重置所有的计算 */\n  reset() {\n    this.startTime = 0;\n    this.frameCount = 0;\n    this.endTime = 0;\n\n    this.tempFrameCount = 0;\n    this.tempStartTime = 0;\n  }\n\n  /** 执行上报fps */\n  doReport(record: boolean = false, face: boolean = false) {\n    const duration = this.endTime - this.startTime;\n    if (duration > 5000) {\n      const fps = Math.round((1000 * this.frameCount) / duration);\n      const info = wx.getSystemInfoSync();\n      wx.report('skip_fps', {\n        fps,\n        duration,\n        record: record ? 1 : 0,\n        face: face ? 1 : 0,\n        up_platform: info.platform,\n        up_brand: info.brand,\n        up_model: info.model,\n        up_benchmark: info.benchmarkLevel\n      });\n      this.reset();\n    }\n  }\n}\n\nexport { FpsHelper };\n"
  },
  {
    "path": "miniprogram/util/util.js",
    "content": "export const lightBlue = {\n  // 0: '#E1F5FE',\n  // 100: '#B3E5FC',\n  // 200: '#81D4FA',\n  // 300: '#4FC3F7',\n  // 400: '#29B6F6',\n  // 500: '#03A9F4',\n  // 600: '#039BE5',\n  // 700: '#0288D1',\n  // 800: '#0277BD',\n  // 900: '#01579B',\n  0: '#efefef',\n  100: '#d7d7d7',\n  200: '#bdbdbd',\n  300: '#a3a3a3',\n  400: '#8f8f8f',\n  500: '#7b7b7b',\n  600: '#989898;',\n  700: '#747474',\n  800: '#696969',\n  900: '#5f5f5f',\n}\n\nexport const generateList = (childCount) => {\n  const ans = []\n  for (let i = 0; i < childCount; i++) {\n    ans.push({\n      id: i,\n      color: lightBlue[`${100 * (i % 9)}`],\n    })\n  }\n  return ans\n}\n\nfunction formatTime(time) {\n  if (typeof time !== 'number' || time < 0) {\n    return time\n  }\n\n  const hour = parseInt(time / 3600, 10)\n  time %= 3600\n  const minute = parseInt(time / 60, 10)\n  time = parseInt(time % 60, 10)\n  const second = time\n\n  return ([hour, minute, second]).map(function (n) {\n    n = n.toString()\n    return n[1] ? n : `0${n}`\n  }).join(':')\n}\n\nfunction formatLocation(longitude, latitude) {\n  if (typeof longitude === 'string' && typeof latitude === 'string') {\n    longitude = parseFloat(longitude)\n    latitude = parseFloat(latitude)\n  }\n\n  longitude = longitude.toFixed(2)\n  latitude = latitude.toFixed(2)\n\n  return {\n    longitude: longitude.toString().split('.'),\n    latitude: latitude.toString().split('.')\n  }\n}\n\nfunction fib(n) {\n  if (n < 1) return 0\n  if (n <= 2) return 1\n  return fib(n - 1) + fib(n - 2)\n}\n\nfunction formatLeadingZeroNumber(n, digitNum = 2) {\n  n = n.toString()\n  const needNum = Math.max(digitNum - n.length, 0)\n  return new Array(needNum).fill(0).join('') + n\n}\n\nfunction formatDateTime(date, withMs = false) {\n  const year = date.getFullYear()\n  const month = date.getMonth() + 1\n  const day = date.getDate()\n  const hour = date.getHours()\n  const minute = date.getMinutes()\n  const second = date.getSeconds()\n  const ms = date.getMilliseconds()\n\n  let ret = `${[year, month, day].map(value => formatLeadingZeroNumber(value, 2)).join('-')} ${[hour, minute, second].map(value => formatLeadingZeroNumber(value, 2)).join(':')}`\n  if (withMs) {\n    ret += `.${formatLeadingZeroNumber(ms, 3)}`\n  }\n  return ret\n}\n\nfunction compareVersion(v1, v2) {\n  v1 = v1.split('.')\n  v2 = v2.split('.')\n  const len = Math.max(v1.length, v2.length)\n\n  while (v1.length < len) {\n    v1.push('0')\n  }\n  while (v2.length < len) {\n    v2.push('0')\n  }\n\n  for (let i = 0; i < len; i++) {\n    const num1 = parseInt(v1[i], 10)\n    const num2 = parseInt(v2[i], 10)\n\n    if (num1 > num2) {\n      return 1\n    } else if (num1 < num2) {\n      return -1\n    }\n  }\n\n  return 0\n}\n\nlet safeAreaInsetBottom = null\nfunction getSafeAreaInsetBottom() {\n  if (safeAreaInsetBottom === null) {\n    const { safeArea, screenHeight } = wx.getSystemInfoSync()\n    safeAreaInsetBottom = screenHeight - safeArea.bottom\n  }\n  return safeAreaInsetBottom\n}\n\nlet statusBarHeight = null\nfunction getStatusBarHeight() {\n  if (statusBarHeight === null) {\n    const menuButton = wx.getMenuButtonBoundingClientRect()\n    statusBarHeight = menuButton.top\n  }\n  return statusBarHeight\n}\n\nfunction getFrameSliceOptions(frameWidth, frameHeight, displayWidth, displayHeight) {\n  const result = {\n    start: [0, 0, 0],\n    size: [-1, -1, 3]\n  }\n\n  const ratio = displayHeight / displayWidth\n\n  if (ratio > frameHeight / frameWidth) {\n    result.start = [0, Math.ceil((frameWidth - Math.ceil(frameHeight / ratio)) / 2), 0]\n    result.size = [-1, Math.ceil(frameHeight / ratio), 3]\n  } else {\n    result.start = [Math.ceil((frameHeight - Math.floor(ratio * frameWidth)) / 2), 0, 0]\n    result.size = [Math.ceil(ratio * frameWidth), -1, 3]\n  }\n\n  return result\n}\n\nfunction getRandomInt(max) {\n  return Math.floor(Math.random() * max)\n}\n\nexport const generateGridList = (childCount, columns) => {\n  const ans = []\n  for (let i = 0; i < childCount; i++) {\n    ans.push({\n      id: i,\n      sub: getRandomInt(columns) + 1,\n    })\n  }\n  return ans\n}\n\nmodule.exports = {\n  formatTime,\n  formatLocation,\n  fib,\n  formatDateTime,\n  compareVersion,\n  getSafeAreaInsetBottom,\n  getStatusBarHeight,\n  getFrameSliceOptions,\n  getRandomInt,\n  generateList,\n  generateGridList\n}\n"
  },
  {
    "path": "miniprogram/workers/fib/index.js",
    "content": "function fib(n) {\n  if (n < 1) return 0\n  if (n <= 2) return 1\n  return fib(n - 1) + fib(n - 2)\n}\n\nworker.onMessage(function (msg) {\n  if (msg.type === 'execFunc_fib') {\n    worker.postMessage({\n      type: 'execFunc_fib',\n      result: fib(msg.params[0])\n    })\n  }\n})\n"
  },
  {
    "path": "miniprogram/workers/gaussianSplatting/index.js",
    "content": "const data = {}\nlet gaussians\nlet depthIndex\n\nconst sortingAlgorithm = 'count sort'\n\nlet loopTime = 0\n\nfunction init(plyInfo, config) {\n  console.log('[Worker] gaussianSplatting init')\n\n  // console.log('plyInfo', plyInfo);\n  gaussians = plyInfo\n  gaussians.totalCount = plyInfo.count\n  gaussians.count = gaussians.totalCount\n\n  depthIndex = new Uint32Array(gaussians.count)\n\n  console.log(`[Worker] Received ${gaussians.count} gaussians`)\n\n  data.positions = new Float32Array(gaussians.count * 3)\n  data.opacities = new Float32Array(gaussians.count)\n  data.cov3Da = new Float32Array(gaussians.count * 3)\n  data.cov3Db = new Float32Array(gaussians.count * 3)\n  data.colors = new Float32Array(gaussians.count * 3)\n\n  // data.positions = new Float32Array(config.sabPositions.buffer);\n  // data.opacities = new Float32Array(config.sabOpacities.buffer);\n  // data.cov3Da = new Float32Array(config.sabCov3Da.buffer);\n  // data.cov3Db = new Float32Array(config.sabCov3Db.buffer);\n  // data.colors = new Float32Array(config.sabcolors.buffer);\n\n  // console.log(`[Worker] init data positions`, data.positions)\n  // console.log(`[Worker] init data opacities`, data.opacities)\n  // console.log(`[Worker] init data cov3Da`,data.cov3Da)\n  // console.log(`[Worker] init data cov3Db`, data.cov3Db)\n  // console.log(`[Worker] init data colors`, data.colors)\n}\n\nfunction sort(params) {\n  // console.log('[worker] gaussianSplatting sort');\n\n  loopTime++\n\n  const { viewProjectionMatrix } = params\n\n  const start = new Date().getTime()\n\n  // console.log('viewProjectionMatrix', viewProjectionMatrix)\n  // console.log('viewProjectionMatrix 2 6 10', viewProjectionMatrix[2], viewProjectionMatrix[6], viewProjectionMatrix[10])\n  // console.log('viewProjectionMatrix 8 9 10', viewProjectionMatrix[8], viewProjectionMatrix[9], viewProjectionMatrix[10])\n\n  // Sort the gaussians!\n  sortGaussiansByDepth(depthIndex, gaussians, viewProjectionMatrix)\n\n  const sortEnd = new Date().getTime()\n\n  const sortTime = `${((sortEnd - start) / 1000).toFixed(3)}s`\n\n  // Update arrays containing the data\n  for (let j = 0; j < gaussians.count; j++) {\n    const i = depthIndex[j]\n\n    data.colors[j * 3] = gaussians.colors[i * 3]\n    data.colors[j * 3 + 1] = gaussians.colors[i * 3 + 1]\n    data.colors[j * 3 + 2] = gaussians.colors[i * 3 + 2]\n\n    data.positions[j * 3] = gaussians.positions[i * 3]\n    data.positions[j * 3 + 1] = gaussians.positions[i * 3 + 1]\n    data.positions[j * 3 + 2] = gaussians.positions[i * 3 + 2]\n\n    data.opacities[j] = gaussians.opacities[i]\n\n    // Split the covariance matrix into two vec3\n    // so they can be used as vertex shader attributes\n    data.cov3Da[j * 3] = gaussians.cov3Ds[i * 6]\n    data.cov3Da[j * 3 + 1] = gaussians.cov3Ds[i * 6 + 1]\n    data.cov3Da[j * 3 + 2] = gaussians.cov3Ds[i * 6 + 2]\n\n    data.cov3Db[j * 3] = gaussians.cov3Ds[i * 6 + 3]\n    data.cov3Db[j * 3 + 1] = gaussians.cov3Ds[i * 6 + 4]\n    data.cov3Db[j * 3 + 2] = gaussians.cov3Ds[i * 6 + 5]\n  }\n\n  const end = new Date().getTime()\n\n  const writeTime = `${((end - sortEnd) / 1000).toFixed(3)}s`\n  // console.log(`[Worker] Sorted ${gaussians.count} gaussians in ${sortTime}.`)\n  // console.log(`[Worker] Writed ${gaussians.count} gaussians in ${writeTime}.`)\n\n  return {\n    data: {\n      colors: data.colors.buffer,\n      positions: data.positions.buffer,\n      opacities: data.opacities.buffer,\n      cov3Da: data.cov3Da.buffer,\n      cov3Db: data.cov3Db.buffer,\n      gaussiansCount: gaussians.count,\n    }\n  }\n}\n\n// count排序， 这里本质就是从近到远排序\nfunction sortGaussiansByDepth(depthIndex, gaussians, viewProjectionMatrix) {\n  const calcDepth = (i) => gaussians.positions[i * 3] * viewProjectionMatrix[2] +\n                             gaussians.positions[i * 3 + 1] * viewProjectionMatrix[6] +\n                             gaussians.positions[i * 3 + 2] * viewProjectionMatrix[10]\n\n  let maxDepth = -Infinity\n  let minDepth = Infinity\n  const sizeList = new Int32Array(gaussians.count)\n\n  for (let i = 0; i < gaussians.count; i++) {\n    const depth = (calcDepth(i) * 4096) | 0\n\n    sizeList[i] = depth\n    maxDepth = Math.max(maxDepth, depth)\n    minDepth = Math.min(minDepth, depth)\n  }\n\n  const depthInv = (256 * 256) / (maxDepth - minDepth)\n  const counts0 = new Uint32Array(256 * 256)\n  for (let i = 0; i < gaussians.count; i++) {\n    sizeList[i] = ((sizeList[i] - minDepth) * depthInv) | 0\n    counts0[sizeList[i]]++\n  }\n  const starts0 = new Uint32Array(256 * 256)\n  for (let i = 1; i < 256 * 256; i++) starts0[i] = starts0[i - 1] + counts0[i - 1]\n  for (let i = 0; i < gaussians.count; i++) depthIndex[starts0[sizeList[i]]++] = i\n}\n\nworker.onMessage(function (msg) {\n  if (msg.type === 'execFunc_init') {\n    worker.postMessage({\n      type: 'execFunc_init',\n      result: init(msg.params[0], msg.params[1])\n    })\n  } else if (msg.type === 'execFunc_sort') {\n    worker.postMessage({\n      type: 'execFunc_sort',\n      result: sort(msg.params[0])\n    })\n  }\n})\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"miniprogram-demo\",\n  \"version\": \"1.0.0\",\n  \"description\": \"WeChat miniprogram demo\",\n  \"scripts\": {\n    \"init\": \"npm run sync && cd cloudfunctions/ && npm i --production && cd ../miniprogram/ && npm i --production\",\n    \"lint\": \"eslint .\",\n    \"wxss:transform-vars\": \"gulp transform-css-vars\",\n    \"sync\": \"git submodule update --init --recursive\",\n    \"pull\": \"git submodule foreach --recursive git pull origin\",\n    \"gco\": \"git submodule foreach --recursive git checkout\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/wechat-miniprogram/miniprogram-demo.git\"\n  },\n  \"author\": \"wechat-miniprogram\",\n  \"license\": \"MIT\",\n  \"private\": true,\n  \"bugs\": {\n    \"url\": \"https://github.com/wechat-miniprogram/miniprogram-demo/issues\"\n  },\n  \"homepage\": \"https://github.com/wechat-miniprogram/miniprogram-demo#readme\",\n  \"devDependencies\": {\n    \"@typescript-eslint/eslint-plugin\": \"^8.26.1\",\n    \"@typescript-eslint/parser\": \"^8.26.1\",\n    \"babel-eslint\": \"^10.1.0\",\n    \"eslint\": \"^8.57.1\",\n    \"eslint-config-airbnb-base\": \"^15.0.0\",\n    \"eslint-config-prettier\": \"^6.15.0\",\n    \"eslint-plugin-import\": \"^2.31.0\",\n    \"eslint-plugin-node\": \"^7.0.1\",\n    \"eslint-plugin-promise\": \"^4.0.0\",\n    \"eslint-plugin-typescript\": \"^0.14.0\",\n    \"gulp\": \"^5.0.0\",\n    \"gulp-if\": \"^3.0.0\",\n    \"gulp-ignore\": \"^3.0.0\",\n    \"gulp-postcss\": \"^9.0.1\",\n    \"gulp-rename\": \"^2.0.0\",\n    \"gulp-replace\": \"^1.1.3\",\n    \"jest\": \"^29.7.0\",\n    \"miniprogram-automator\": \"^0.5.1\",\n    \"postcss\": \"^8.3.11\",\n    \"postcss-css-variables\": \"^0.18.0\",\n    \"typescript\": \"^5.8.2\",\n    \"typescript-eslint-parser\": \"^18.0.0\"\n  },\n  \"dependencies\": {\n    \"miniprogram-ci\": \"^1.3.13\"\n  }\n}\n"
  },
  {
    "path": "project.config.json",
    "content": "{\n  \"description\": \"项目配置文件，详见文档：https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html\",\n  \"miniprogramRoot\": \"miniprogram/\",\n  \"cloudfunctionRoot\": \"cloudfunctions/\",\n  \"setting\": {\n    \"urlCheck\": true,\n    \"es6\": true,\n    \"enhance\": true,\n    \"postcss\": true,\n    \"preloadBackgroundData\": true,\n    \"minified\": true,\n    \"newFeature\": true,\n    \"coverView\": true,\n    \"nodeModules\": true,\n    \"autoAudits\": false,\n    \"showShadowRootInWxmlPanel\": true,\n    \"scopeDataCheck\": false,\n    \"uglifyFileName\": false,\n    \"checkInvalidKey\": true,\n    \"checkSiteMap\": true,\n    \"uploadWithSourceMap\": true,\n    \"compileHotReLoad\": false,\n    \"useMultiFrameRuntime\": true,\n    \"babelSetting\": {\n      \"ignore\": [],\n      \"disablePlugins\": [],\n      \"outputPath\": \"\"\n    },\n    \"useIsolateContext\": false,\n    \"userConfirmedBundleSwitch\": false,\n    \"packNpmManually\": false,\n    \"packNpmRelationList\": [],\n    \"minifyWXSS\": true,\n    \"disableUseStrict\": false,\n    \"showES6CompileOption\": false,\n    \"useCompilerPlugins\": [\n      \"typescript\",\n      \"less\"\n    ],\n    \"ignoreDevUnusedFiles\": false,\n    \"ignoreUploadUnusedFiles\": false,\n    \"minifyWXML\": true,\n    \"lazyloadPlaceholderEnable\": false,\n    \"useStaticServer\": true,\n    \"localPlugins\": false,\n    \"condition\": false,\n    \"skylineRenderEnable\": true,\n    \"compileWorklet\": true,\n    \"swc\": false,\n    \"disableSWC\": true\n  },\n  \"compileType\": \"miniprogram\",\n  \"simulatorType\": \"wechat\",\n  \"simulatorPluginLibVersion\": {},\n  \"cloudfunctionTemplateRoot\": \"cloudfunctionTemplate/\",\n  \"condition\": {\n    \"miniprogram\": {\n      \"list\": [\n        {\n          \"name\": \"page/API/pages/storage/storage\",\n          \"pathName\": \"page/API/pages/storage/storage\",\n          \"query\": \"\",\n          \"scene\": null\n        }\n      ]\n    }\n  },\n  \"srcMiniprogramRoot\": \"miniprogram/\",\n  \"editorSetting\": {\n    \"tabIndent\": \"insertSpaces\",\n    \"tabSize\": 2\n  },\n  \"packOptions\": {\n    \"ignore\": [],\n    \"include\": []\n  },\n  \"appid\": \"wxe5f52902cf4de896\",\n  \"projectname\": \"miniprogram-demo-master\",\n  \"libVersion\": \"3.7.6\"\n}"
  },
  {
    "path": "project.private.config.json",
    "content": "{\n  \"libVersion\": \"3.13.0\",\n  \"condition\": {},\n  \"projectname\": \"miniprogram-demo\",\n  \"setting\": {\n    \"urlCheck\": true,\n    \"coverView\": true,\n    \"lazyloadPlaceholderEnable\": false,\n    \"skylineRenderEnable\": true,\n    \"preloadBackgroundData\": true,\n    \"autoAudits\": false,\n    \"useApiHook\": true,\n    \"showShadowRootInWxmlPanel\": true,\n    \"useStaticServer\": true,\n    \"useLanDebug\": false,\n    \"showES6CompileOption\": false,\n    \"compileHotReLoad\": true,\n    \"checkInvalidKey\": true,\n    \"ignoreDevUnusedFiles\": false,\n    \"bigPackageSizeSupport\": false,\n    \"useIsolateContext\": false\n  }\n}"
  },
  {
    "path": "sitemap.json",
    "content": "{\n  \"desc\": \"关于本文件的更多信息，请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html\",\n  \"rules\": [{\n  \"action\": \"allow\",\n  \"page\": \"*\"\n  }]\n}"
  },
  {
    "path": "test/index.spec.js",
    "content": "const automator = require('miniprogram-automator')\n\nautomator.launch({\n  cliPath: 'path/to/cli', // 工具 cli 位置，如果你没有更改过默认安装位置，可以忽略此项\n  projectPath: 'E:/mini/demo', // 项目文件地址\n}).then(async miniProgram => {\n  const page = await miniProgram.reLaunch('/page/component/index')\n  await page.waitFor(500)\n  const element = await page.$('.kind-list-item-hd')\n  console.log(await element.attribute('class'))\n  await element.tap()\n\n  await miniProgram.close()\n})\n"
  }
]